python玩转modbus

1. modbus协议简介

Modbus协议是一项应用层报文传输协议,包括ASCII / RTU / TCP三种报文类型,协议本身不定义物理层,只定义了控制器能够认识和使用的 消息结构,而 不管消息是经过何种网络进行通信的。

标准的Modbus协议物理层接口主要有RS232 / RS422 / RS485和以太网。采用Master/Slave主从方式通信

关于modbus协议更多更详细的介绍,可自行查阅

2. 环境配置

py3

python 目前主流使用操作modbus协议的库有三个

  • pymodbus
  • 使用twisted实现的modbus完整协议(支持异步通讯)
  • MinimalModbus
  • 只支持modbusrtu
  • modbus_tk
  • 完整modbus协议栈的实现,支持modbus tcp/rtu{1.提供slave模拟器,即模拟modbus server:502), web-based hmi master支持}

今天主要使用modbus_tk库,versions=1.1.2。相关资料https://pypi.python.org/pypi/modbus_tk

*

pip3 install modbus_tk==1.1.2

3. 主要函数

不管是通过串口(RTU/ASCII )还是以太网(TCP)模式读写数据modbus_tk库提供的唯一函数,所以我们先介绍这个函数

  • execute(slave, function_code, starting_address, quantity_of_x=0, output_value=0, data_format=””, expected_length=-1, write_starting_address_FC23=0)
  • slave:从机站号 ,0为广播所有的slave
  • function_code:功能码codefunction1READ_COILS 读线圈2READ_DISCRETE_INPUTS 读离散输入3READ_HOLDING_REGISTERS 读保持寄存器4READ_INPUT_REGISTERS读输入寄存器5WRITE_SINGLE_COIL写单一线圈6WRITE_SINGLE_REGISTER写单一寄存器15WRITE_MULTIPLE_COILS写多个线圈16WRITE_MULTIPLE_REGISTERS 写多寄存器还有其它不常用大家可自己看源码
  • starting_address:起始地址
  • quantity_of_x:读取数据长度,RTU模式数据长度如下图1,TCP模式数据长度是和不同模块的cpu限制有关如下图2
    python玩转modbus
    图2:
    python玩转modbus
  • output_value:一个整数(单个写入)或可迭代的值(批量写入)
    python玩转modbus
  • expected_length:没用过
  • write_starting_address_FC23:没用过

4. RTU模式

硬件链接方式通过物理485或232口

modbus_tk库提供了一个RtuMaster类,实例化一个RtuMaster对象,需要初始化封装一个Serial对象

import serial
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu

master = modbus_rtu.RtuMaster(serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0))
master.set_timeout(1.0)

res_tuple = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 10)
import serial
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu

def demo(PORT):
    master = modbus_rtu.RtuMaster(serial.Serial(port=PORT, baudrate=9600, bytesize=8,                                                       parity='N', stopbits=1, xonxoff=0))
    master.set_timeout(1.0)

    res1 = master.execute(1, cst.READ_COILS, 0, 10)
    res2 = master.execute(2, cst.READ_DISCRETE_INPUTS, 0, 8)
    res3 = master.execute(3, cst.READ_INPUT_REGISTERS, 100, 3)
    res4 = master.execute(4, cst.READ_HOLDING_REGISTERS, 100, 12)
    res5 = master.execute(5, cst.WRITE_SINGLE_COIL, 7, output_value=1)
    res6 = master.execute(6, cst.WRITE_SINGLE_REGISTER, 100, output_value=54)
    res7 = master.execute(7, cst.WRITE_MULTIPLE_COILS, 0, output_value=[1, 1, 0, 1, 1])
    res8 = master.execute(8, cst.WRITE_MULTIPLE_REGISTERS, 100, output_value=xrange(12))
if __name__ == '__main__':
    demo('com1')

5. TCP模式

硬件链接方式通过以太网口

相同modbus_tk库提供了一个TcpMaster类,实例化一个TcpMaster对象,需要初始化封装ip地址和端口号

import modbus_tk.defines as cst
import modbus_tk.modbus_tcp as modbus_tcp

server = modbus_tcp.TcpMaster(host:str, port:int)
server.set_timeout(1.0)

res1 = server.execute(1, cst.READ_HOLDING_REGISTERS, 0, 10)
import modbus_tk.defines as cst
import modbus_tk.modbus_tcp as modbus_tcp

def demo(ip,port):
    server = modbus_tcp.TcpMaster(host:str, port:int)
    server.set_timeout(1.0)

    res1 = master.execute(1, cst.READ_COILS, 0, 10)
    res2 = master.execute(2, cst.READ_DISCRETE_INPUTS, 0, 8)
    res3 = master.execute(3, cst.READ_INPUT_REGISTERS, 100, 3)
    res4 = master.execute(4, cst.READ_HOLDING_REGISTERS, 100, 12)
    res5 = master.execute(5, cst.WRITE_SINGLE_COIL, 7, output_value=1)
    res6 = master.execute(6, cst.WRITE_SINGLE_REGISTER, 100, output_value=54)
    res7 = master.execute(7, cst.WRITE_MULTIPLE_COILS, 0, output_value=[1, 1, 0, 1, 1])
    res8 = master.execute(8, cst.WRITE_MULTIPLE_REGISTERS, 100, output_value=xrange(12))
if __name__ == '__main__':
    demo('192.168.2.1',102)

* 错误码

modbus exception codesnotes1ILLEGAL_FUNCTION = 1 功能代码不合法2ILLEGAL_DATA_ADDRESS = 2 数据地址不合法3ILLEGAL_DATA_VALUE = 3 数据值不合法4SLAVE_DEVICE_FAILURE = 4 slave设备失败5COMMAND_ACKNOWLEDGE = 5 命令已收到6SLAVE_DEVICE_BUSY = 6 slave设备忙8MEMORY_PARITY_ERROR = 8 内存奇偶误差

6. 模拟测试

环境需要:

  • 安装vspd.exe 用于模拟串口 (主要测试RTU模式代码,如果是测试TCP模式就不用下载串口模拟器)
  • modbus slave 用于模拟从机

安装包地址:

链接:https://pan.baidu.com/s/1BLxTjG6ZFv65R6pfhHD3kg
提取码:xynb

软件模拟操作流程

* 下一篇我用实体硬件设备给大家带来更详细的示例用法

  • 主机:树莓派加485扩展版
  • 系统RASPBERRY PI OS(32-BIT)
  • 从机:ABB变频器
  • 型号 ACS510-01

Original: https://blog.csdn.net/pista/article/details/121911024
Author: pista
Title: python玩转modbus

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/731798/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球