我正在尝试使用pymodbus从Raspberry Pi 3b写入PCON控制器。我有python 3.5和pymodbus 1.4。我通过连接运行modbus编程工具的笔记本电脑验证了通过硬件的通信路径(这是用于控制电动缸夹紧零件的应用程序)我能够打开/关闭伺服,我能够慢跑圆筒。
我创建了一个非常简单的脚本来测试与控制器的通话并打开伺服。 #!/ usr / bin / env python3 # - - 编码:utf-8 - -
import pymodbus
import serial
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
client = ModbusClient(method="rtu", port="/dev/serial0", stopbits=1,
bytesize=8, parity='N', bauderate = 38400, timeout=.5)
connection=client.connect()
#read/write to coils
client.write_coil(260,1,unit=0x00) #address, value, unit
这是调试输出
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:send: 0x3a 0x30 0x30 0x30 0x36 0x30 0x31 0x30
0x34 0x30 0x30 0x30 0x31 0x46 0x34 0xd 0xa
DEBUG:pymodbus.transaction:recv:
DEBUG:pymodbus.transaction:getting transaction 1
线圈的地址是260(来自供应商),单位是#0,数据值是1(一位线圈)。当您查看DEBUG中的十六进制值并通过Hex to ascii转换器运行它时,您将获得:00050104FF00F7。第一个" 00"是单位数,这是正确的,05是功能代码,由pymodbus添加,接下来的四个字符是地址 - 是0104,应该是0260,接下来的四个是值 - 在这种情况下,FF00代表ON哪个是对的。我使用整数作为地址,但显然这是不正确的。我找不到有关地址格式的任何信息 - 所有示例都显示为整数。如果有人有pymodbus经验,或者你认为我应该放弃pymodbus并转到minimalmodbus或modbus-tk,我将不胜感激任何帮助/建议。
答案 0 :(得分:0)
看起来地址是十六进制:0x0104 = 256 + 4 = 260
答案 1 :(得分:0)
我将此添加为另一个答案,因此我可以正确格式化。
根据您的陈述“我在这里展示的是ascii”。 Debug输出似乎是ASCII Modbus数据包,它是十六进制0-9,A-F(ASCII编码)。在下面解码它,一切看起来都正确,你想写地址260,这就是它的作用。
: start
00 device address = 0 (broadcast)
05 write single coil function (5)
0104 address 0104 (hex) = 1x256 + 4 = 260 (this is what you wanted)
FF00 output value FF00 (hex) = ON
F7 LRC (longitudinal redundancy check)
对我来说,一切看起来都是正确的。