Python2转Python3实现Modbus温控箱Socket控制问题求助
解决方案:Python3下实现Modbus UDP写入温控箱
1. 正确的字节串生成方式
Python2中chr(item)生成单字符字符串,对应Python3里直接用bytes(array)就能把整数列表转换成符合要求的二进制字节串,这是最简洁且准确的方式:
import socket HOST = "你的温控箱IP" PORT = 502 # 默认Modbus UDP端口,按实际设备调整 session = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) session.connect((HOST, PORT)) array = [1, 6, 0, 2, 11, 184, 47, 72] # 注:原注释"how many registers->2"有误,0x06是写单个寄存器,11和184是寄存器值的高低字节(11*256+184=3000) # 直接将整数列表转为二进制字节串 binstring = bytes(array) # 此时binstring为b'\x01\x06\x00\x02\x0b\xb8/H',与Python2的结果完全一致 session.sendall(binstring) session.close()
2. 你之前方法的错误点
- 方法1:循环中先把
array[i]转为bytes([array[i]]),随即被method2的代码覆盖,且拼接时错误重复了array[1],导致功能码被重复写入,数据帧格式完全错误。 - 方法2:把
bytes([item])转成字符串再编码,相当于把二进制数据转成了字符串描述再编码,完全偏离了Modbus需要的二进制帧格式,必然无效。
3. 更可靠的替代方案:使用成熟Modbus库
手动拼接字节串容易出现CRC校验、功能码格式等细节错误,推荐用专门的Modbus库pymodbus,Python3支持完善,能自动处理底层细节:
安装库
pip install pymodbus
写入示例代码
from pymodbus.client import ModbusUdpClient client = ModbusUdpClient("你的温控箱IP", port=502) client.connect() # 写单个寄存器:参数为(寄存器地址, 写入值, 从站ID) client.write_register(address=2, value=3000, unit=1) # 3000对应原数组的11和184(11*256+184) client.close()
内容的提问来源于stack exchange,提问作者KKC
相关产品推荐
相关产品推荐

