我试图用pymodbus从Raspberry Pi 3b写入PCON控制器。我有python3.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(线圈以位表示)。当您查看调试中的十六进制值并通过十六进制到ascii转换器运行它时,您将得到:00050104F00F00F7。第一个"00“是单位号,这是正确的,05是函数代码,由pymodbus添加,接下来的四个字符是地址-是0104,应该是0260,下四个是值--在本例中,FF00表示的值是正确的。我使用整数作为地址,但显然这是不正确的。我找不到任何关于地址格式的信息--所有的例子都是整数。如果有人有pymodbus的经验,或者如果您认为我应该放弃pymodbus,去minimalmodbus或modbus-tk,我将感谢您的任何帮助/建议。
发布于 2018-02-21 00:30:20
看起来地址是十六进制的: 0x0104 = 256 +4= 260
发布于 2018-02-21 03:04:35
我添加了这个作为另一个答案,这样我就可以正确地设置格式。
根据你的说法“我在这里展示的是阿西”。调试输出似乎是一个ASCII Modbus数据包,它是十六进制0-9,an (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)在我看来,一切都是正确的。
https://stackoverflow.com/questions/48896396
复制相似问题