从pymodbus.client。同步导入ModbusSerialClient ModbusClient导入结构导入时间= argparse进口datetime进口argparse解析器。ArgumentParser(描述=“Modbus数据记录器”)解析器。add_argument(“端口”,帮助=“探头连接的串行通讯端口”)解析器。add_argument (“- f”,“——文件”,帮助=“文件名存储数据(默认data.csv)”默认=“data.csv”)解析器。add_argument(“——”“——地址”,帮助=”探测器的地址(默认240)”类型、默认= 240 = int)解析器。add_argument (' - r ',”——率”,帮助=“秒的民意测验率”(默认为1),默认= 1,类型=浮动)解析器。add_argument (“- l”,“——长度”,帮助=“小时数据日志的时间(默认9999999)”类型=浮动,默认= 9999999)args = parser.parse_args()打印(args)探针= ModbusClient(方法= rtu,端口=参数。港口,超时= 1,波特率= 19200,stopbits = 2,平价= ' N ') = datetime.datetime.now () + datetime.timedelta(小时= args.length)打印(“结束日期和时间:结束)#两个寄存器的数据转换为一个32位的浮动#需要保持寄存器数据和索引寄存器的输入#返回32位浮点def data_from_register(寄存器,我):返回struct.unpack (”!f ', bytes.fromhex (' {0:04x} ' .format(寄存器[我])+“{0:04x}”.format(寄存器(张))))[0]#读取寄存器的探针和返回值作为32位浮点数#返回True,相对湿度、温度和露点#如果读成功返回False,没有,没有,没有如果不是def holding_registers_data():试题:寄存器=调查。read_holding_registers(地址= 0,数= 10,单位= args.address)。寄存器除了异常e:打印(e)返回False,没有,没有,没有一个试题:rh = data_from_register(寄存器,1)t = data_from_register(寄存器,3)dp = data_from_register(寄存器,9)除了异常e:打印(e)返回False,没有,没有,没有返回True, rh, t, dp #读相对湿度,温度和露点holding_registers_data()并将值写入一个csv文件的日期和时间def data_logger (): probe.connect()成功,rh, t, dp = holding_registers_data()如果(成功):dt = datetime.datetime.now()尝试:张开(arg游戏。文件,“a”)作为f:行= f”{dt}, {rh}, {t}, {dp} \ n”打印(线)f.write(线)除了异常e:打印(e) probe.close () time . sleep (args.rate)其他:probe.close () time . sleep (0.5) def主要():当datetime.datetime.now() <结束:data_logger () if __name__ = =“__main__”:主要()