import serial,time,struct import modbus_tk.defines as cst from modbus_tk import modbus_rtu # from modbus_tk.utils import create_master_string def main(): # 打开两个串口 com1 = serial.Serial(port='com2', baudrate=38400, bytesize=8, parity='N', stopbits=1) com2 = serial.Serial(port='com3', baudrate=38400, bytesize=8, parity='N', stopbits=1) # 创建Modbus RTU主机(master) master = modbus_rtu.RtuMaster(com1) master.set_timeout(1.0) master.set_verbose(True) # time.sleep(2) # 读取保持寄存器数据 red = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 9) print(red) # red1 = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 9)[0] # # 这里可以修改需要读取的功能码 # print(red1) # new = int(red1 * 0.98) # print(new) # red = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 9) # print(red,0) # 读取输入寄存器数据 input_regs = master.execute(1, cst.READ_INPUT_REGISTERS, 0, 9) print(input_regs, 1) # 读取输入线圈数据 input_bits = master.execute(1, cst.READ_COILS, 0, 9) print(input_bits, 2) # 读取输出线圈数据 output_bits = master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 9) print(output_bits, 3) # 将所有读取数据打包为Modbus RTU消息并写入com2串口 data = struct.pack('>HH' + 'H' * len(red) + 'H' * len(input_regs) + 'B' * len(input_bits) + 'B' * len(output_bits), 1, cst.READ_HOLDING_REGISTERS, *red, *input_regs, *input_bits, *output_bits) # 将数据发送到com3串口 com2.write(data) # 关闭串口 com1.close() com2.close() while True: main() time.sleep(1)串口com4是com3串口的映射,与com4通讯的时候,报错Response address 0 is different from request address 1。帮我查下哪里代码写错了
时间: 2023-11-27 12:05:57 浏览: 65
根据你提供的代码,错误可能是在以下这行代码引起的:
```
data = struct.pack('>HH' + 'H' * len(red) + 'H' * len(input_regs) + 'B' * len(input_bits) + 'B' * len(output_bits),1, cst.READ_HOLDING_REGISTERS, *red, *input_regs, *input_bits, *output_bits)
```
在这行代码中,你使用 `struct.pack` 函数将读取的数据打包为 Modbus RTU 消息,并写入到 com2 串口中。但是,你在打包数据时,将请求的从站地址设置为了 1,这可能与你实际使用的从站地址不一致,导致返回的响应报文中从站地址是 0,从而引发报错。
为了解决这个问题,你需要在打包数据时,将请求的从站地址设置为实际使用的从站地址。例如,如果你要与从站地址为 2 的设备通信,你可以将打包数据的代码改为:
```
data = struct.pack('>BB' + 'H' * len(red) + 'H' * len(input_regs) + 'B' * len(input_bits) + 'B' * len(output_bits), 2, cst.READ_HOLDING_REGISTERS, *red, *input_regs, *input_bits, *output_bits)
```
具体来说,这里将 `'>HH'` 改为了 `'>BB'`,将请求的从站地址设置为了 2。
希望这些提示能够帮助你解决问题。
阅读全文