RTU Modbus Slave 的 Python 脚本 [英] Python script for RTU Modbus Slave

查看:23
本文介绍了RTU Modbus Slave 的 Python 脚本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am working on a automation test case for a system and need a automated modbus input device.

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

My use case here is to implement a Raspberry pi based RTU modbus slave and connected to a modbus master.

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

I want this Raspberry Pi based slave to populate and send a response to master when ever master requests for a register value.

我是这个协议和环境的新手,我无法在我们有 modbus 从客户端的地方找到任何 python 脚本或库.

I am new to this protocol and environment, I am not able to find any python script or libraries where we have a modbus slave client.

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

I came across this below Serial python code and I could successfully decode modbus requests from the Master,

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 数据包...

The problem I am facing here is this block of code just prints a seris of serial bits and I am not sure how to decode modbus packets from these...

输出:b'x1ex03x00x19x00x01Wxa2x1ex10x00x0fx00x01x02x03 +xb7x1ex03x00 'b'x00x02xe6fx1ex03x00 x00x01Vgx1ex10x00x10x00x01x02x01,(xbdx1ex03x00 'b'x00x02xe6fx1ex03x00 x00x01Vgx1ex10x00x11x00x01x02x03 ( x1ex03x00 'b'x00x02xe6fx1ex03x00 x00x01Vgx1ex10x00x12x00x01x02x01,)_x1ex03x00 'b'x00x02xe6fx1ex03x00 x00x01Vgx1ex03x00 'b'x00x02xe6fx1ex03x00 x00x01Vgx1ex03x00 '

OUTPUT: b'x1ex03x00x19x00x01Wxa2x1ex10x00x0fx00x01x02x03 +xb7x1ex03x00 ' b'x00x02xe6fx1ex03x00 x00x01Vgx1ex10x00x10x00x01x02x01,(xbdx1ex03x00 ' b'x00x02xe6fx1ex03x00 x00x01Vgx1ex10x00x11x00x01x02x03 ( x1ex03x00 ' b'x00x02xe6fx1ex03x00 x00x01Vgx1ex10x00x12x00x01x02x01,)_x1ex03x00 ' b'x00x02xe6fx1ex03x00 x00x01Vgx1ex03x00 ' b'x00x02xe6fx1ex03x00 x00x01Vgx1ex03x00 '

推荐答案

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

Pymodbus library has several examples for server/slave/responder (usually devices are a server/slave) and master/client/requester. The procedure in the Modbus protocol is such that the server/slave must give a request from the master/client side, then response to it.

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

Here is a Modbus RTU client (master) snippet code to read from a Modbus RTU server (slave) or a Modbus device by the pymodbus library:

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 异步服务器示例.
  • 这是一个 Pymodbus 同步服务器示例.

    • Here is a Pymodbus Asynchronous Server Example.
    • And here is a Pymodbus Synchronous Server Example.
    • 这篇关于RTU Modbus Slave 的 Python 脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆