You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:45:34