PyModbus RTU 服务器- rtu_framer 不能正确分离帧

问题描述

我正在研究 pyModbus 服务器示例,我的 PC 通过 USB-UART 接口连接到 RS485 网络。当我的服务器单独工作时一切正常,当连接其他设备时,rtu_framer 出现问题。

场景: 主设备通过发送:读取保持寄存器命令从每个设备的第一个地址读取(检查设备是否存在于 modbus 网络)。

在我的情况下,pyModbus 服务器在地址 0x07 上工作,而 modbus 网络上的其他设备是 0x06。 总线上的二进制数据如下所示:

(master) [06] [03] [00 00] [00 01] [85 BD] - addres:6,fun_code: 3,start:0,len:1,crc:0xbd85
(slave) [06] [03] [02] [00 00] [0d 84]- addres:6,f_code:3,len:2,data: 0x0000,CRC:0x840d

another master to slave request
(master) [07] [03] [00 00] [00 01] [84 6C] - addres:6,crc:0x6c84

在这种情况下,来自设备 0x06 的响应破坏了 rtu_framer 读取的消息。 因为消息被破坏服务器不响应并且在网络中是不可见的。

在日志中,我看到成帧器接受每个字节(也来自其他从站响应)但没有正确分隔帧,即使每个帧间隔 500 毫秒(9600 波特 4 毫秒就足够了)。

来自调试控制台的日志:

2021-07-07 16:01:18,802 MainThread      DEBUG    asynchronous   :64       Data Received: 0x6
2021-07-07 16:01:18,802 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x06'] not ready
2021-07-07 16:01:18,803 MainThread      DEBUG    asynchronous   :64       Data Received: 0x3
2021-07-07 16:01:18,803 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x03'] not ready
2021-07-07 16:01:18,804 MainThread      DEBUG    asynchronous   :64       Data Received: 0x0
2021-07-07 16:01:18,804 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x00'] not ready
2021-07-07 16:01:18,805 MainThread      DEBUG    asynchronous   :64       Data Received: 0x0
2021-07-07 16:01:18,805 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x00'] not ready
2021-07-07 16:01:18,806 MainThread      DEBUG    asynchronous   :64       Data Received: 0x0
2021-07-07 16:01:18,806 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x00'] not ready
2021-07-07 16:01:18,807 MainThread      DEBUG    asynchronous   :64       Data Received: 0x1
2021-07-07 16:01:18,807 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x01'] not ready
2021-07-07 16:01:18,808 MainThread      DEBUG    asynchronous   :64       Data Received: 0x85
2021-07-07 16:01:18,808 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x85'] not ready
2021-07-07 16:01:18,809 MainThread      DEBUG    asynchronous   :64       Data Received: 0xbd
2021-07-07 16:01:18,809 MainThread      DEBUG    rtu_framer     :234      Not a valid unit id - 6,ignoring!!
2021-07-07 16:01:18,809 MainThread      DEBUG    rtu_framer     :120      Resetting frame - Current Frame in buffer - 0x6 0x3 0x0 0x0 0x0 0x1 0x85 0xbd
2021-07-07 16:01:18,819 MainThread      DEBUG    asynchronous   :64       Data Received: 0x6
2021-07-07 16:01:18,819 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x06'] not ready
2021-07-07 16:01:18,820 MainThread      DEBUG    asynchronous   :64       Data Received: 0x3
2021-07-07 16:01:18,820 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x03'] not ready
2021-07-07 16:01:18,821 MainThread      DEBUG    asynchronous   :64       Data Received: 0x2
2021-07-07 16:01:18,821 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x02'] not ready
2021-07-07 16:01:18,822 MainThread      DEBUG    asynchronous   :64       Data Received: 0x0
2021-07-07 16:01:18,822 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x00'] not ready
2021-07-07 16:01:18,823 MainThread      DEBUG    asynchronous   :64       Data Received: 0x0
2021-07-07 16:01:18,823 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x00'] not ready
2021-07-07 16:01:18,824 MainThread      DEBUG    asynchronous   :64       Data Received: 0xd
2021-07-07 16:01:18,824 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\r'] not ready
2021-07-07 16:01:18,825 MainThread      DEBUG    asynchronous   :64       Data Received: 0x84
2021-07-07 16:01:18,825 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x84'] not ready
2021-07-07 16:01:18,932 MainThread      DEBUG    asynchronous   :64       Data Received: 0x7
2021-07-07 16:01:18,932 MainThread      DEBUG    rtu_framer     :237      Frame check Failed,932 MainThread      DEBUG    rtu_framer     :120      Resetting frame - Current Frame in buffer - 0x6 0x3 0x2 0x0 0x0 0xd 0x84 0x7
2021-07-07 16:01:18,932 MainThread      DEBUG    asynchronous   :64       Data Received: 0x3
2021-07-07 16:01:18,933 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x03'] not ready
2021-07-07 16:01:18,934 MainThread      DEBUG    asynchronous   :64       Data Received: 0x0
2021-07-07 16:01:18,934 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x00'] not ready
2021-07-07 16:01:18,935 MainThread      DEBUG    asynchronous   :64       Data Received: 0x0
2021-07-07 16:01:18,935 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x00'] not ready
2021-07-07 16:01:18,936 MainThread      DEBUG    asynchronous   :64       Data Received: 0x0
2021-07-07 16:01:18,936 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x00'] not ready
2021-07-07 16:01:18,937 MainThread      DEBUG    asynchronous   :64       Data Received: 0x1
2021-07-07 16:01:18,937 MainThread      DEBUG    rtu_framer     :237      Frame check Failed,937 MainThread      DEBUG    rtu_framer     :120      Resetting frame - Current Frame in buffer - 0x3 0x0 0x0 0x0 0x1
2021-07-07 16:01:18,938 MainThread      DEBUG    asynchronous   :64       Data Received: 0x84
2021-07-07 16:01:18,938 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x84'] not ready
2021-07-07 16:01:18,939 MainThread      DEBUG    asynchronous   :64       Data Received: 0x6c
2021-07-07 16:01:18,939 MainThread      DEBUG    rtu_framer     :240      Frame - [b'l'] not ready
2021-07-07 16:01:18,992 MainThread      DEBUG    asynchronous   :64       Data Received: 0x8
2021-07-07 16:01:18,992 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x08'] not ready
2021-07-07 16:01:18,993 MainThread      DEBUG    asynchronous   :64       Data Received: 0x3
2021-07-07 16:01:18,993 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x03'] not ready
2021-07-07 16:01:18,994 MainThread      DEBUG    asynchronous   :64       Data Received: 0x0
2021-07-07 16:01:18,994 MainThread      DEBUG    rtu_framer     :237      Frame check Failed,994 MainThread      DEBUG    rtu_framer     :120      Resetting frame - Current Frame in buffer - 0x84 0x6c 0x8 0x3 0x0
2021-07-07 16:01:18,995 MainThread      DEBUG    asynchronous   :64       Data Received: 0x0
2021-07-07 16:01:18,995 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x00'] not ready
2021-07-07 16:01:18,996 MainThread      DEBUG    asynchronous   :64       Data Received: 0x0
2021-07-07 16:01:18,996 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x00'] not ready
2021-07-07 16:01:18,997 MainThread      DEBUG    asynchronous   :64       Data Received: 0x1
2021-07-07 16:01:18,997 MainThread      DEBUG    rtu_framer     :240      Frame - [b'\x01'] not ready

我的示例代码

#!/usr/bin/env python

from pymodbus.version import version
from pymodbus.server.asynchronous import StartTcpserver
from pymodbus.server.asynchronous import StartUdpServer
from pymodbus.server.asynchronous import StartSerialServer

from pymodbus.device import Modbusdeviceidentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext,ModbusServerContext
from pymodbus.transaction import (ModbusRtuFramer)
# --------------------------------------------------------------------------- # 
# configure the service logging
# --------------------------------------------------------------------------- # 
import logging
FORMAT = ('%(asctime)-15s %(threadName)-15s'
          ' %(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
logging.basicConfig(format=FORMAT)
log = logging.getLogger()
log.setLevel(logging.DEBUG)


def run_async_server():

    block = ModbusSequentialDataBlock(0x00,[0]*0xff)
    store = {0x07: ModbusSlaveContext(di=block,co=block,hr=block,ir=block)}
    context = ModbusServerContext(slaves=store,single=False)
    
    # ----------------------------------------------------------------------- # 
    # initialize the server information
    # ----------------------------------------------------------------------- # 
    # If you don't set this or any fields,they are defaulted to empty strings.
    # ----------------------------------------------------------------------- # 
    identity = Modbusdeviceidentification()
    identity.vendorName = 'Pymodbus'
    identity.ProductCode = 'PM'
    identity.vendorUrl = 'http://github.com/riptideio/pymodbus/'
    identity.ProductName = 'Pymodbus Server'
    identity.ModelName = 'Pymodbus Server'
    identity.MajorMinorRevision = version.short()
    
    # ----------------------------------------------------------------------- # 
    # run the server 
    # ----------------------------------------------------------------------- # 
    # RTU Server
    StartSerialServer(context,identity=identity,port='/dev/ttyUSB1',parity='N',baudrate=9600,framer=ModbusRtuFramer)

if __name__ == "__main__":
    run_async_server()

如何为 rtu_framer 设置诸如超时之类的东西以正确分隔帧?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...