python玩转modbus
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⽀持}
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="", e
xpected_length=-1, write_starting_address_FC23=0)
slave:从机站号 ,0为⼴播所有的slave
function_code:功能码
code function
1READ_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怎么读取串口数据图1:
图2:
output_value:⼀个整数(单个写⼊)或可迭代的值(批量写⼊)
data_format:读取的数据进⾏格式化,参考下图unpcak中的格式字符串内容
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)
# port:串⼝
# baudrate:波特率
# bytesize:字节⼤⼩
# parity:校验位
# stopbits:停⽌位
# timeout:读超时设置
# writeTimeout:写超时
# xonxoff:软件流控
# rtscts:硬件流控
# dsrdtr:硬件流控
# 读保持寄存器 03H 1站号地址0 长度0-10
res_tuple = ute(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 = ute(1, cst.READ_COILS,0,10)
res2 = ute(2, cst.READ_DISCRETE_INPUTS,0,8)
res3 = ute(3, cst.READ_INPUT_REGISTERS,100,3)
res4 = ute(4, cst.READ_HOLDING_REGISTERS,100,12)
res5 = ute(5, cst.WRITE_SINGLE_COIL,7, output_value=1)
res6 = ute(6, cst.WRITE_SINGLE_REGISTER,100, output_value=54)
res7 = ute(7, cst.WRITE_MULTIPLE_COILS,0, output_value=[1,1,0,1,1])
res8 = ute(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 dbus_tcp as modbus_tcp
server = modbus_tcp.TcpMaster(host:str, port:int)
server.set_timeout(1.0)
# host: ip地址
# port:端⼝
# 读保持寄存器 03H 1站号地址0 长度0-10
res1 = ute(1, cst.READ_HOLDING_REGISTERS,0,10)
⽰例
import modbus_tk.defines as cst
import dbus_tcp as modbus_tcp
def demo(ip,port):
server = modbus_tcp.TcpMaster(host:str, port:int)
server.set_timeout(1.0)
res1 = ute(1, cst.READ_COILS,0,10)
res2 = ute(2, cst.READ_DISCRETE_INPUTS,0,8)
res3 = ute(3, cst.READ_INPUT_REGISTERS,100,3)
res4 = ute(4, cst.READ_HOLDING_REGISTERS,100,12)
res5 = ute(5, cst.WRITE_SINGLE_COIL,7, output_value=1)
res6 = ute(6, cst.WRITE_SINGLE_REGISTER,100, output_value=54)
res7 = ute(7, cst.WRITE_MULTIPLE_COILS,0, output_value=[1,1,0,1,1])
res8 = ute(8, cst.WRITE_MULTIPLE_REGISTERS,100, output_value=xrange(12))
if __name__ =='__main__':
demo('192.168.2.1',102)
* 错误码
modbus exception codes notes
1ILLEGAL_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. 模拟测试
环境需要:
安装 ⽤于模拟串⼝ (主要测试RTU模式代码,如果是测试TCP模式就不⽤下载串⼝模拟器)
modbus slave ⽤于模拟从机
安装包地址:
链接:pan.baidu/s/1BLxTjG6ZFv65R6pfhHD3kg
提取码:xynb
软件模拟操作流程
1. 串⼝模拟,打开串⼝模拟软件,点击添加串⼝
2. 左侧看见已添加的串⼝
3. 从机数据模拟。打开从机模拟软件,点击F8,进⾏,箭头从上到下依次是从站id设置,功能码设置,起始地址,数据长度,直接默认
就可以点击ok
4. 然后就会看见,双击对应的地址数据就可以赋值,必须是整数
5. 从机链接模式设置 点击F3,进⾏设置,更据⾃⼰的主机代码是rtu还是tcp就选那种模式,rtu就⽤Serial Port,tcp模式就⽤modbus
tcp/ip,
6. 主机就可以⽤ide编辑代码测试了
⽤上⾯的⽰例代码就可以进⾏读写测试了
* 下⼀篇我⽤实体硬件设备给⼤家带来更详细的⽰例⽤法
主机:树莓派加485扩展版
系统RASPBERRY PI OS(32-BIT)
从机:ABB变频器
型号 ACS510-01
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论