stm32 作为主站,与ModBus Slave怎么调试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32 作为主站,与ModBus Slave怎么调试相关的知识,希望对你有一定的参考价值。

参考技术A

确定哪边是稳定的,

确定通信协议内容,

分开调试,最好用软件模拟,例如调试modbus slave,可以用类似格西烽火等通信协议测试软件,快速定义协议数据进行测试,调通后再接stm32主站。

本回答被提问者和网友采纳
参考技术B 关注这个。

RTU Modbus Slave 的 Python 脚本

【中文标题】RTU Modbus Slave 的 Python 脚本【英文标题】:Python script for RTU Modbus Slave 【发布时间】:2019-06-17 08:39:25 【问题描述】:

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

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

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

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

我在下面的串行 python 代码中遇到了这个,我可以成功地解码来自 Master 的 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

我在这里面临的问题是这段代码只打印了一系列串行位,我不知道如何从这些中解码 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'

【问题讨论】:

Pymodbus 库有很多server/slave/responder(通常设备是服务器/从设备)和master/client/requester 的示例。 Modbus 协议中的过程是这样的,服务器/从机必须从主/客户端发出请求,然后对其进行响应。有了这个定义,您在 RPi 上实现的目的是什么?奴隶还是主人?服务器还是客户端? 嗨@BenyaminJafari,感谢您的回复。我对 Master 和 Slave 的 Modbus 术语感到很困惑。但据我了解,请求寄存器值的设备是主设备(客户端/请求者),响应该寄存器值的设备将是服务器(从设备/响应者)。所以在我的用例中,RPi 是 Server/Slave/Responder。 嗨,所以你需要一个我的回答中提到的异步 ModbusRtuServer。有问题请联系我。 @BenyaminJafari 嗨,非常感谢您为我指出正确的方向,Async ModbusRtuServer 非常完美,它处理了我的用例。我确实对库文件进行了一些调整,以便根据需要格式化数据包。图书馆里仍然没有问题。再次感谢您的时间:P 【参考方案1】:

Pymodbus 库有几个用于服务器/从属/响应者(通常设备是服务器/从属)和主/客户端/请求者的示例。 Modbus协议中的流程是,服务器/从机必须从主/客户端发出请求,然后响应。


这是一个 Modbus RTU 客户端(主)sn-p 代码,用于通过pymodbus 库从 Modbus RTU 服务器(从)或 Modbus 设备读取:

from pymodbus.client.sync import ModbusSerialClient

client = ModbusSerialClient(
    method='rtu',
    port='/dev/ttyUSB0',
    baudrate=115200,
    timeout=3,
    parity='N',
    stopbits=1,
    bytesize=8
)

if client.connect():  # Trying for connect to Modbus Server/Slave
    '''Reading from a holding register with the below content.'''
    res = client.read_holding_registers(address=1, count=1, unit=1)

    '''Reading from a discrete register with the below content.'''
    # res = client.read_discrete_inputs(address=1, count=1, unit=1)

    if not res.isError():
        print(res.registers)
    else:
        print(res)

else:
    print('Cannot connect to the Modbus Server/Slave')

这是一个Pymodbus Asynchronous Server 示例。 这是一个Pymodbus Synchronous Server 示例。

【讨论】:

以上是关于stm32 作为主站,与ModBus Slave怎么调试的主要内容,如果未能解决你的问题,请参考以下文章

RTU Modbus Slave 的 Python 脚本

Modbus库开发笔记之五:Modbus RTU Slave开发

MPI转以太网Plus模块Modbus主站连接两台变频器通信案例

Modbus Slave是指啥意思

Modbus TCP 中的多主站

Modbus 模式下缺少 STM32CubeMX UART 设置