RTU模式下双EM340电表连接时MinimalModbus校验和错误求助
问题描述
使用树莓派通过USB CH340适配器连接单台EM340电能表时,代码运行正常。但连接两台EM340电能表(已按官方手册完成接线)时,出现RTU模式下的校验和错误,错误日志如下:
pi@raspberrypi:~ $ python3 modbus_test.py Traceback (most recent call last): File "modbus_test.py", line 21, in <module> freq2 = instrument.read_register(0x0033,1) # Registernumber, number of decimals File "/home/pi/.local/lib/python3.7/site-packages/minimalmodbus.py", line 486, in read_register payloadformat=_Payloadformat.REGISTER, File "/home/pi/.local/lib/python3.7/site-packages/minimalmodbus.py", line 1245, in _generic_command payload_from_slave = self._perform_command(functioncode, payload_to_slave) File "/home/pi/.local/lib/python3.7/site-packages/minimalmodbus.py", line 1330, in _perform_command response, self.address, self.mode, functioncode File "/home/pi/.local/lib/python3.7/site-packages/minimalmodbus.py", line 1867, in _extract_payload raise InvalidResponseError(text) minimalmodbus.InvalidResponseError: Checksum error in rtu mode: '6ý' instead of '\x99ò' . The response is: '\x01\x01\x00\x00\x166ý' (plain response: '\x01\x01\x00\x00\x166ý')
测试代码如下:
import minimalmodbus import serial instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1) # port name, slave address (in decimal) #instrument.serial.port # this is the serial port name instrument.serial.baudrate = 9600 # Baud instrument.serial.bytesize = 8 #instrument.serial.parity = serial.PARITY_NONE instrument.serial.stopbits = 1 instrument.serial.timeout = 0.2 # seconds instrument.address = 1 # this is the slave address number #instrument.mode = minimalmodbus.MODE_ASCII # rtu or ascii mode instrument.mode = minimalmodbus.MODE_RTU instrument.clear_buffers_before_each_transaction = True instrument.close_port_after_each_call = True ## Read data ## freq2 = instrument.read_register(0x0033,1) # Registernumber, number of decimals txt = "Frekvens: {} Hz".format(freq2) kwh_total = instrument.read_register(0x0400) kwh_total_2 = instrument.read_register(0x0402) txt2 = "Total forbrug: {0}.{1} kWh".format(kwh_total,kwh_total_2) w_l1 = instrument.read_register(0x0012,1) # Registernumber, number of decimals txt3 = "Nuværende forbrug: {} W".format(w_l1) print(txt) print(txt2) print(txt3)
请问为何会出现RTU模式下的校验和错误?
可能的原因及解决办法
- 从站地址冲突:两台EM340默认Modbus地址大概率都是1,发送请求时两台设备会同时响应,返回的数据混杂在一起,直接导致校验和不匹配。进入电能表设置界面,将两台设备的地址修改为不同值(比如1和2),代码中分别创建对应地址的
minimalmodbus.Instrument实例访问每台设备。 - 总线缺少终端电阻:Modbus RTU是半双工总线,多设备连接时总线两端必须接120Ω终端电阻抑制信号反射,否则信号畸变会导致数据传输错误。检查电能表接线端子,启用终端电阻(部分设备需手动短接对应端子)。
- 串口参数不匹配:确认两台电能表的串口参数(波特率、奇偶校验、停止位)和代码设置完全一致。代码中注释了
serial.PARITY_NONE,但EM340默认可能为偶校验,需核对设备手册后开启对应设置,避免参数不一致导致数据解析错误。 - 串口缓冲区残留数据:虽然代码开启了
clear_buffers_before_each_transaction,但多设备环境下可能仍有残留响应数据干扰后续请求。可以延长串口超时时间(比如设为0.5秒),给设备足够响应传输时间;也可在每次请求前手动调用instrument.serial.reset_input_buffer()清空缓冲区。 - 适配器或供电稳定性问题:部分廉价CH340适配器在多设备场景下可能出现信号丢包或干扰,建议更换质量可靠的USB转串口适配器。另外,树莓派供电不足会导致串口信号不稳定,确保使用足够功率的电源给树莓派供电。
内容的提问来源于stack exchange,提问作者jvels
相关产品推荐
相关产品推荐

