标签: pymodbus

pymodbus“单元”参数是什么意思?

我有一些在 pymodbus 1.2 下编写的 modbus TCP 代码,相关代码是

result = modbus_client.read_holding_registers(40093, 3)

更新到 pymodbus 1.4.0 后,它无法工作,直到我将新的单元参数放入函数调用中(示例中都包含 unit=1):

result = modbus_client.read_holding_registers(40093, 3, unit=1)

pymodbus read_holding_registers() 中的单元参数是什么意思?我似乎无法在任何地方找到解释。消息来源说“:param unit:这个请求所针对的从属单元”,但我不明白这是什么意思,也不明白除了 1 之外还有什么选择。

python modbus modbus-tcp pymodbus

5
推荐指数
1
解决办法
1407
查看次数

pymodbus 异常响应(131, 3, IllegalAddress)

我正在尝试运行这段代码:

from pymodbus.client.sync import ModbusSerialClient as ModbusClient
import logging

logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

client = ModbusClient(method='rtu', baudrate=9600, parity='E', port='/dev/ttyUSB0', timeout=1)
client.connect()

rr = client.read_holding_registers(40000, 7, unit=0x01)
print rr
client.close()
Run Code Online (Sandbox Code Playgroud)

但我只得到这个:

DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.factory:Factory Response[131]
DEBUG:pymodbus.transaction:adding transaction 0
DEBUG:pymodbus.transaction:getting transaction 1
Exception Response(131, 3, IllegalAddress)
Run Code Online (Sandbox Code Playgroud)

另一方面,这个 C 代码(使用 libmodbus)正在工作:

modbus_t *mb;
int16_t hregs[9];
mb = modbus_new_rtu('/dev/ttyUSB0', 9600, 'E', 8, 1);
modbus_set_slave(mb, 1);
modbus_read_registers(mb, 0x40000, 7, hregs)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

python modbus pymodbus

5
推荐指数
1
解决办法
1万
查看次数

Modbus 错误:[输入/输出] 未收到来自远程设备的响应

我尝试使用“安装”/dev/cu.SLAB_USBtoUART.

这是我的代码:

import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

from pymodbus.constants import Endian
from pymodbus.constants import Defaults
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
from pymodbus.transaction import ModbusRtuFramer

# settings for USB-RS485 adapter
SERIAL = '/dev/cu.SLAB_USBtoUART'
BAUD = 19200

# set Modbus defaults

Defaults.UnitId = 1
Defaults.Retries = 5

client = ModbusClient(method='rtu', port=SERIAL, stopbits=1, bytesize=8, timeout=3, baudrate=BAUD, parity='E')

connection = client.connect()
print "Readout started"

#result = client.read_discrete_inputs(0)
#result = client.read_holding_registers(12,19)
result = client.read_input_registers(0,1)
print(result) …
Run Code Online (Sandbox Code Playgroud)

python modbus pymodbus3 pymodbus

4
推荐指数
1
解决办法
1万
查看次数

pymodbus和pymodbus3模块有什么区别?

希望你过得很好!我最近开始使用python进行modbus通信.我想澄清一些疑惑.

  1. 什么模块更适合使用Python的modbus实现 - minimalmodbus,pymodbus,pymodbus3或其他.
  2. 我使用python3.4但无法使用pip或任何方式安装pymodbus模块.所以我安装了pymodbus3.
  3. 使用pymodbus3模块时,我能够使用以下代码编写线圈:

    import pymodbus3
    import serial
    from pymodbus3.pdu import ModbusRequest
    from pymodbus3.client.sync import ModbusSerialClient as ModbusClient 
    from pymodbus3.transaction import ModbusRtuFramer
    from serial.tools.list_ports import comports
    
    client = ModbusClient(method = "rtu", port = 'COM4',stopbits = 1, bytesize = 8, parity = 'N', baudrate= 19200)
    connection = client.connect()
    client.write_coil(1000, 1, unit = 0x01)
    
    Run Code Online (Sandbox Code Playgroud)

用于读取线圈状态(功能0x01):

result = client.read_coils(1000,1)
print(result)
client.close()
Run Code Online (Sandbox Code Playgroud)

它返回无.

或者写入注册和阅读也不起作用:

client.write_register(0, 1000, unit=0x01)
resu= client.read_holding_registers(0, 1, unit=0x01)
print(resu)
client.close()
Run Code Online (Sandbox Code Playgroud)

欢迎积极响应!

python python-3.x pymodbus3 pymodbus

2
推荐指数
1
解决办法
2546
查看次数

RTU Modbus Slave 的 Python 脚本

我正在为系统开发一个自动化测试用例,需要一个自动化的 modbus 输入设备。

我的用例是实现一个基于 Raspberry pi 的 RTU modbus 从站并连接到 modbus 主站。

我希望这个基于 Raspberry Pi 的从机在主机请求寄存器值时填充并向主机发送响应。

我是这个协议和环境的新手,我找不到任何有 modbus 从客户端的 python 脚本或库。

我在下面的串行 python 代码中遇到了这个,我可以成功解码来自主站的 modbus 请求,

import serial
import time

receiver = serial.Serial(     
     port='/dev/ttyUSB0',        
     baudrate = 115200,
     parity=serial.PARITY_NONE,
     stopbits=serial.STOPBITS_ONE,
     bytesize=serial.EIGHTBITS,
     timeout=1
     )

while 1:
      x = receiver.readline()
      print x
Run Code Online (Sandbox Code Playgroud)

我在这里面临的问题是这段代码只打印一系列串行位,我不知道如何从这些串行位中解码 modbus 数据包...

输出: b'\x1e\x03\x00\x19\x00\x01W\xa2\x1e\x10\x00\x0f\x00\x01\x02\x03 +\xb7\x1e\x03\x00\n' b'\x00 \x02\xe6f\x1e\x03\x00\t\x00\x01Vg\x1e\x10\x00\x10\x00\x01\x02\x01,(\xbd\x1e\x03\x00\n' b'\x00\ x02\xe6f\x1e\x03\x00\t\x00\x01Vg\x1e\x10\x00\x11\x00\x01\x02\x03 (\t\x1e\x03\x00\n' b'\x00\x02\ xe6f\x1e\x03\x00\t\x00\x01Vg\x1e\x10\x00\x12\x00\x01\x02\x01,)_\x1e\x03\x00\n' b'\x00\x02\xe6f\ x1e\x03\x00\t\x00\x01Vg\x1e\x03\x00\n' b'\x00\x02\xe6f\x1e\x03\x00\t\x00\x01Vg\x1e\x03\x00\n'

python modbus raspberry-pi minimalmodbus pymodbus

2
推荐指数
1
解决办法
3万
查看次数