0

我正在尝试使用 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 中的十六进制值并通过十六进制到 ascii 转换器运行它时,您会得到:00050104FF00F7。第一个“00”是单元号,这是正确的,05是功能代码,是pymodbus添加的,接下来的四个字符是地址-是0104应该是0260,接下来的四个是值-in这种情况下FF00代表ON,这是正确的。我使用整数作为地址,但显然这是不正确的。我找不到有关地址格式的任何信息 - 所有示例似乎都是整数。如果有人有 pymodbus 经验,或者您认为我应该放弃 pymodbus 并转到 minimummodbus 或 modbus-tk,我将不胜感激任何帮助/建议。

4

2 回答 2

0

看起来地址是十六进制的:0x0104 = 256 + 4 = 260

于 2018-02-21T00:30:20.393 回答
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)

对我来说,这一切看起来都是正确的。

于 2018-02-21T03:04:35.807 回答