-
2020-12-21 08:40:28
注:目前的开发只涉及 modbus master即 client端的开发,未涉及 slave端服务器的开发,slave服务器的设计,一般开发嵌入式设备作为数据采集器的时候用到,市面上有现成的slave数据采集器使用。
python封装的modbus库有这几个:
modbus_tk :完整modbus协议栈的实现,支持modbus tcp/RTU{1.提供slave模拟器,即模拟modbus server:502), web-based hmi master支持}
pymodbus:使用twisted实现的modbus完整协议(支持异步通讯)
MinimalModbus :只支持modbus rtu
使用modbus tcp模式通讯是推荐modbus_tk库
==============================================================================
modbus master 为client,连接远程的slave来请求采集到的数据。
modbus slave 为 server ,监听502端口,一般slave为plc,plc为嵌入式设备从modbus网络上采集数据。master发送modbus协议数据请求salve获取数据。
1.连接到远程的slave(即modbus server的502端口服务器)
master = modbus_tcp.TcpMaster("192.168.2.20",502)
master.set_timeout(5.0)
2.进行调用modbus_tk库的接口,向slave请求采集的数据
类TcpMaster下有如下接口:
set_timeout(秒)
_send(modbus请求) modbus请求,即:需要自己封装modbus协议头和请求命令
_recv() 返回modbus协议数据
open()
close()
execute(slave,功能代码,开始地址,quantity_of_x=0,output_value=0,data_format="",指定长度=-1)//execute为线程安全函数
使用例子:
import modbus_tk.defines as de
master.execute(slave_id=1,de.READ_HOLDING_REGISTERS,100,3)
slave_id:1
slave_id : identifier of the slave. from 1 to 247. 0为广播所有的slave
功能代码:de.READ_HOLDING_REGISTE 定义见:defines.py
开始地址为: 100
quantity_of_x = 3 (寄存器或者线圈的数量)
output_value: (一个整数或者可迭代的值) 如:
output_value = 1或 54 或 output_value=[1,1,0,1,1,0,1,1] 或者 output_value = xrange(12)
返回的一个元祖类型的数据,返回的元祖取决于查询的功能码,参考详细的modbus协议说明书来构造data_format
modbus 功能代码: defines.py
#modbus 异常代码
ILLEGAL_FUNCTION = 1 功能代码不合法
ILLEGAL_DATA_ADDRESS = 2 数据地址不合法
ILLEGAL_DATA_VALUE = 3 数据值不合法
SLAVE_DEVICE_FAILURE = 4 slave设备失败
COMMAND_ACKNOWLEDGE = 5 命令已收到
SLAVE_DEVICE_BUSY = 6 slave设备忙
MEMORY_PARITY_ERROR = 8 内存奇偶误差
#supported modbus 功能代码
READ_COILS = 1 读线圈
READ_DISCRETE_INPUTS = 2 读离散输入
READ_HOLDING_REGISTERS = 3 【读乘法寄存器】
READ_INPUT_REGISTERS = 4 读输入寄存器
WRITE_SINGLE_COIL = 5 写单一线圈
WRITE_SINGLE_REGISTER = 6 写单一寄存器
WRITE_MULTIPLE_COILS = 15 写多个线圈 【强制多点线圈】
WRITE_MULTIPLE_REGISTERS = 16 写多寄存器 【写乘法寄存器】
#supported block types 支持的块类型
COILS = 1 线圈
DISCRETE_INPUTS = 2 离散输入(数字量输入)
HOLDING_REGISTERS = 3 乘法寄存器
ANALOG_INPUTS = 4 模拟量输入
下面这段话来自网络
The master uses function codes 5, 6, 15 & 16 to send data to the slave.Function code 5 allows the master to write a single coil (address 00001->) to the slave device
Function code 15 allows the master to write multiple coils (address 00001->) to the slave device
Function code 6 allows the master to write a single holding register (address 40001->) to the slave device
Function code 16 allows the master to write multiple holding registers (address 40001->) to the slave device
3.接下来的工作就是进行modbus协议的封装 和 对接受的modbus数据解析
更多相关内容 -
x64下封装modbus_tcp库,测试可用!!!附带modbus_tk脚本用于测试
2018-01-16 11:12:441.该测试模块用于测试上位机使用modbus-tcp协议,对PLC寄存器读写测试; 2.x64下封装modbus协议栈,为modbus协议添加了多线程使用安全; 3.modbus类使用单例模式,...5.README.py用modbus-tk仿真plc行为。 -
python_modbus_tk_linux
2022-04-25 13:35:52python_modbus_tk_linux -
modbus-tk:使用Python轻松创建Modbus应用
2021-05-13 16:12:17modbus-tk:使用Python轻松创建Modbus应用 下载/安装 当前版本为1.1.2,可在PyPI 执照 这是在GNU LGPL许可下分发的 描述 使编写modbus TCP和RTU主站和从站成为可能。 它可以用于测试目的:它带有从属模拟器和带有... -
python使用modbus_tk写入modbus异或检验报文,没有响应?
2021-03-23 10:36:55<p>python使用modbus_tk调用modbus报文,要给航姿传感器一个输入报文,使用串口调试程序有用 <p style="text-align:center"><img alt="" height="375" src=... -
使用modbus_tk发送特殊功能码
2021-08-04 10:49:33我需要发送这样一个指令到串口, 02 1A 81 EB(后者问,有没有其它办法帮我发送这个指令呀,搞好久了) 但是modbus_tk并不支持这个功能码 -
modbus_tk模块详细使用
2021-02-24 14:20:38使用及例子modbus_tk模块安装Demo功能码及使用说明: modbus_tk模块 通过modbus-RTU 读取地址,调用后返回反馈数值和故障信息。 modbus_tk模块安装 pip install pymodbus_tk Demo # -*- coding: utf_8 -*- ...源码:Github
modbus_tk模块 通过modbus-RTU 读取地址,调用后返回反馈数值和故障信息。
modbus_tk模块安装
pip install pymodbus_tk
Demo
# -*- coding: utf_8 -*- import serial import modbus_tk import modbus_tk.defines as cst from modbus_tk import modbus_rtu def mod(PORT="com10"): #print("加载modbus_tk 完成") red = [] alarm = "" try: #设定串口为从站 master = modbus_rtu.RtuMaster(serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0)) master.set_timeout(5.0) master.set_verbose(True) #读保持寄存器 03H 1站号 地址2700 长度0-42 red = master.execute(1, cst.READ_HOLDING_REGISTERS, 2700, 43) #这里可以修改需要读取的功能码 #print(red) alarm="正常" return list(red),alarm except Exception as exc: #print(str(exc)) alarm = (str(exc)) return red, alarm ##如果异常就返回[],故障信息 if __name__ == "__main__": mod()
功能码及使用说明:
- READ_COILS H01 读线圈
- READ_DISCRETE_INPUTS H02 读离散输入
- READ_HOLDING_REGISTERS H03 读寄存器
- READ_INPUT_REGISTERS H04 读输入寄存器
- WRITE_SINGLE_COIL H05 写单一线圈
- WRITE_SINGLE_REGISTER H06 写单一寄存器
- WRITE_MULTIPLE_COILS H15 写多个线圈
- WRITE_MULTIPLE_REGISTERS H16 写多寄存器
#读保持寄存器 03H 1站号 0地址 长度2 logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 2)) #01 03 00 00 00 02 C4 0B # 读输入寄存器 04H logger.info(master.execute(1, cst.READ_INPUT_REGISTERS, 0, 8)) #反馈:01 04 00 00 00 08 F1 CC # 读线圈寄存器 01H logger.info(master.execute(1, cst.READ_COILS, 0, 6)) #反馈:01 01 00 00 00 06 BC 08 #读离散输入寄存器 02H logger.info(master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 16)) #反馈:01 02 00 00 00 10 79 C6 # 单个读写寄存器操作 06H # 写寄存器地址为0的保持寄存器 06H logger.info(master.execute(1, cst.WRITE_SINGLE_REGISTER, 0, output_value=6)) #反馈:01 06 00 00 00 06 09 C8 logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 1)) #反馈:01 03 00 00 00 01 84 0A # 写寄存器地址为0的线圈寄存器,写入内容为0(位操作) 05H logger.info(master.execute(1, cst.WRITE_SINGLE_COIL, 0, output_value=0)) #反馈:01 05 00 00 00 00 CD CA logger.info(master.execute(1, cst.READ_COILS, 0, 1)) #反馈:01 01 00 00 00 01 FD CA # 多个寄存器读写操作 10H # 写寄存器起始地址为0的保持寄存器,操作寄存器个数为4 logger.info(master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 11, output_value=[20,21,22,23])) #反馈:01 10 00 0B 00 04 08 00 14 00 15 00 16 00 17 AB A9 logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 4)) #反馈:01 03 00 00 00 04 44 09
-
modbus_tk模块——modbusRTU测试
2020-08-19 15:23:00modbus_tk模块——modbusRTU测试 这次使用RTU做测试,配置杀昂与modbusTCP的方式类似, 源代码直接使用的官方示例代码 https://github.com/ljean/modbus-tk/blob/master/examples/rtuslave_example.py #!/usr/bin/...modbus_tk模块——modbusRTU测试
这次使用RTU做测试,配置杀昂与modbusTCP的方式类似,
源代码直接使用的官方示例代码
https://github.com/ljean/modbus-tk/blob/master/examples/rtuslave_example.py#!/usr/bin/env python # -*- coding: utf_8 -*- import sys import modbus_tk import modbus_tk.defines as cst from modbus_tk import modbus_rtu import serial PORT = 'COM5' #PORT = '/dev/ptyp5' def main(): """main""" logger = modbus_tk.utils.create_logger(name="console", record_format="%(message)s") #Create the server server = modbus_rtu.RtuServer(serial.Serial(PORT)) try: logger.info("running...") logger.info("enter 'quit' for closing the server") server.start() slave_1 = server.add_slave(1) slave_1.add_block('0', cst.HOLDING_REGISTERS, 0, 100) while True: cmd = sys.stdin.readline() args = cmd.split(' ') if cmd.find('quit') == 0: sys.stdout.write('bye-bye\r\n') break elif args[0] == 'add_slave': slave_id = int(args[1]) server.add_slave(slave_id) sys.stdout.write('done: slave %d added\r\n' % (slave_id)) elif args[0] == 'add_block': slave_id = int(args[1]) name = args[2] block_type = int(args[3]) starting_address = int(args[4]) length = int(args[5]) slave = server.get_slave(slave_id) slave.add_block(name, block_type, starting_address, length) sys.stdout.write('done: block %s added\r\n' % (name)) elif args[0] == 'set_values': slave_id = int(args[1]) name = args[2] address = int(args[3]) values = [] for val in args[4:]: values.append(int(val)) slave = server.get_slave(slave_id) slave.set_values(name, address, values) values = slave.get_values(name, address, len(values)) sys.stdout.write('done: values written: %s\r\n' % (str(values))) elif args[0] == 'get_values': slave_id = int(args[1]) name = args[2] address = int(args[3]) length = int(args[4]) slave = server.get_slave(slave_id) values = slave.get_values(name, address, length) sys.stdout.write('done: values read: %s\r\n' % (str(values))) else: sys.stdout.write("unknown command %s\r\n" % (args[0])) finally: server.stop() if __name__ == "__main__": main()
运行前,先在本机配置好两个虚拟串口,使用的是VSPD将两个虚拟串口进行连接直接在右边COM5与COM6进行添加端口就可以了。配置好后如下所示
代码中选用的是COM5,则MODSCAN选择COM6
然后和另一篇文章一样,输入set_values 1 0 1 12 34 56 ,则可以看到modscan读到的数据有变化 -
Python Modbus_tk在树莓派上实现rtu master
2020-12-21 08:39:44Python Modbus 协议工具目前有下面三种:pymodbusMinimalModbusModbus-tkmodbus_tk:完整modbus协议栈的实现,支持modbus tcp/rtu{1.提供slave模拟器,即模拟modbus server:502), web-based hmi master支持}py...利用 python modbus工具实现modbus从站的数据采集,很方便简单。Python Modbus 协议工具目前有下面三种:
pymodbus
MinimalModbus
Modbus-tk
modbus_tk:完整modbus协议栈的实现,支持modbus tcp/rtu{1.提供slave模拟器,即模拟modbus server:502), web-based hmi master支持}
pymodbus:使用twisted实现的modbus完整协议(支持异步通讯)
MinimalModbus:只支持modbusrtu
至于那个更好,可以参考stack overflaw上的一个回答http://stackoverflow.com/questions/17081442/python-modbus-library
Modbus_tk是很简单易用的工具。相关资料查看:https://pypi.python.org/pypi/modbus_tk
Modbsu_tk库使用
execute(slave,功能代码,开始地址,quantity_of_x=0,output_value=0,data_format="",指定长度=-1)
实现数据读与写,用功能码很容易实现。
READ_COILS = 1读线圈READ_DISCRETE_INPUTS = 2读离散输入READ_HOLDING_REGISTERS = 3【读保持寄存器】READ_INPUT_REGISTERS = 4读输入寄存器WRITE_SINGLE_COIL = 5写单一线圈WRITE_SINGLE_REGISTER = 6写单一寄存器WRITE_MULTIPLE_COILS = 15写多个线圈 【强制多点线圈】WRITE_MULTIPLE_REGISTERS = 16写多寄存器 【写乘法寄存器】
master.execute(1,cst.READ_HOLDING_REGISTERS, 0, 3)
1—从设备地址
cst.READ_HOLDING_REGISTERS—读保持寄存器
0—开始地址
3—读三个字节
下面来一个简单的例子。
#!/usr/bin/env python
# -*- coding: utf_8 -*-
"""
Modbus TestKit: Implementation of Modbus protocol in python
(C)2009 - Luc Jean - [email protected]
(C)2009 - Apidev - http://www.apidev.fr
This is distributed under GNU LGPL license, see license.txt
"""
import serial
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
#PORT = 1
PORT = "/dev/ttyUSB0"
def main():
"""main"""
logger = modbus_tk.utils.create_logger("console")
try:
#Connect to the slave
master = modbus_rtu.RtuMaster(
serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0)
)
master.set_timeout(5.0)
master.set_verbose(True)
logger.info("connected")
logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 1, 1))
#send some queries
#logger.info(master.execute(1, cst.READ_COILS, 0, 10))
#logger.info(master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 8))
#logger.info(master.execute(1, cst.READ_INPUT_REGISTERS, 100, 3))
#logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 100, 12))
#logger.info(master.execute(1, cst.WRITE_SINGLE_COIL, 7, output_value=1))
#logger.info(master.execute(1, cst.WRITE_SINGLE_REGISTER, 100, output_value=54))
#logger.info(master.execute(1, cst.WRITE_MULTIPLE_COILS, 0, output_value=[1, 1, 0, 1, 1, 0, 1, 1]))
#logger.info(master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 100, output_value=xrange(12)))
except modbus_tk.modbus.ModbusError as exc:
logger.error("%s- Code=%d", exc, exc.get_exception_code())
if __name__ == "__main__":
main()
用modsim在window下充当slave设置如下:
在树莓派下运行结果如下:
-
modbus_tk库的应用
2020-12-10 10:17:38modbus_tk库的应用 import sys import logging import modbus_tk import modbus_tk.defines as cst import modbus_tk.modbus_tcp as modbus_tcp logger = modbus_tk.utils.create_logger(“console”) if name == ... -
使用python制作MODBUS RTU主站调试工具(二)—— modbus_tk配置
2020-09-06 11:26:25modbus_tk是使用python实现的modbus协议栈,通过调用modbus_tk可以很方便的实现modbus通信。 在VS CODE中需要先通过pip安装modbus_tk库,其方法可参见:vscode 如何导入python库 modbus_tk支持以下功能码: -
modbus_tk与Modubs Slave结合使用
2020-12-09 18:49:34下载两个软件:Modbus Slave/PollModbus Slave(用来模拟客户端(从))和Modbus Poll(用来模拟服务端(主))Modbus Poll是非常流行的Modbus Master模拟器,用于测试和调试从设备。支持Modbus RTU/ASCII和Modbus TCP/IP。... -
python modbus_tk模块学习笔记(rtu slaver例程)
2021-01-13 19:52:01GIT地址:https://github.com/ljean/modbus-tk找到modbus rtu slaver 例程用宝塔将例程复制到centos目录#!/usr/bin/env python# -*- coding: utf_8 -*-"""Modbus TestKit: Implementation of Modbus protocol in ... -
python中使用modbus_tk操作浮点数
2020-03-28 11:44:10自己学习python的过程中,偶然接触到 modbus_tk 这个库,以前经常接触,在一个新的环境下学习,权当复习了,记录下过程,感谢各位道友的分享,让我也少走了很多弯路。 modbus_tk 搭建modbu_rtu 主站 :... -
Python Modbus_tk slave invalid CRC request 问题研究
2020-03-05 21:52:20参照modbus_tk中的例子建立起了Master 和 Slave 的测试环境。Master 建立在win10 virtualbox的树莓派x86虚拟机中,Slave用的是树莓派3B。两者都是终端模式下在参照例子的基础上简单修改了一下便开始了测试。串口设备... -
[原创]python下通过modbus_tk实现modbus主机
2018-11-29 11:50:44pip3 install modbus_tk 否则使用 pip install modbus_tk 直接贴Python代码 系统:win10 IDE:pycharm + Qtdesigner 目标:实现简单modbus通信 import serial import serial.tools.list_ports import modbus_tk ... -
python库modbus_tk的一些解析用法
2020-10-15 12:35:43用法参考: 我的学习主要参考: ... ...考虑数据格式: ...注意:modbus在这里的数据格式 unsigned,单独字节的转换用后面的data_format可以进行转换,对于多个数据,需要形成list, -
modbus_tk 读取浮点数的处理
2018-12-03 00:53:17modbus_tk 读取浮点数的处理 前言: 这是给信捷PLC用的 数据转换模块,用来转换modbus_tk读取的10进制数。(modbus_tk返回的是10进制数) 转换读写浮点数 还有 双字寄存器。 使用: modbus_tk读取的数据元祖直接给... -
modbus_tk库的使用和分析
2018-08-22 16:22:51目录 modbus_tk库的使用和分析 如何使用modbus_tk的主机和从机?...下载地址:https://github.com/ljean/modbus-tk 1:应用示例程序 2:web形式的主机端(bottle搭建的后台) 3:modbus_tk... -
modbus_tk模块
2018-12-21 18:50:00modbus_tk模块 通过modbus-RTU 读取地址,调用后返回反馈数值和故障信息。 modbus_tk模块安装 pip install pymodbus_tk 下面代码功能;读取地址为0x42700 长度为43个数值。 1 # -*- coding: utf_8 -*- 2 ... -
PYTHON3 Modbus_tk
2018-12-06 14:33:38pip install modbus_tk 无法安装,去官网下载在 PIP Modbus Slave / Poll Modbus Slave(用来模拟客户端(从))和Modbus Poll(用来模拟服务端(主)) Modbus Poll是非常流行的Modbus Master模拟器,用于... -
Python modbus_tk官方slave例子使用方法
2020-04-11 09:22:24看懂官方的例子和实际...https://github.com/ljean/modbus-tk/blob/master/examples/tcpslave_example.py 标题1.set_values 1 0 1 2 3 6 12解释 第一个参数1是从站的号,第二个参数0是从站的块序号,第三个参数... -
关于python Modbus_tk 报错Response length is invalid 0
2021-04-12 16:32:00master = modbus_rtu.RtuMaster(serial.Serial(port="com1", baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0)) master.set_timeout(1.0) #!!!!!!!!!!!!解决方法!!!!!!!!!!!... -
python获取modbus_tk数据解析为十进制可读数据
2019-12-26 14:46:36Python获取modbus_tk数据,获取值为16进制数据,机器方便读取,程序员不可读取,故解析为10进制方便读取。 -
python获取modbus数据演示,modbus_tk上传数据,这一切的前提是我用的485通信
2019-05-24 11:33:42import time import serial import serial.tools.list_ports import modbus_tk import modbus_tk.defines as ...from modbus_tk import modbus_rtu from binascii import * from crcmod import * def crc16Add(re... -
python modbus_tk库学习记录
2020-12-15 18:55:47注:目前的开发只涉及 modbus master即 client端的开发,未涉及 slave端服务器...python封装的modbus库有这几个:modbus_tk :完整modbus协议栈的实现,支持modbus tcp/RTU{1.提供slave模拟器,即模拟modbus serve... -
[原创]PyQT基于Modbus_tk开发Modbus上位机
2018-12-05 20:07:31一句废话:之前说不搞PyQT了,可是python的库实在太强大,...pip3 install modbus_tk 就OK了 但是有个问题,pip安装的库默认在python安装路径下,而Pycharm新建工程则默认去识别当前工程所在的目录包含的库。因此,... -
利用Python(pyserial、minimalmodbus、modbus_tk)进行单片机通信
2020-10-30 08:55:55InvalidArgumentError#参数不满足 modbus_tcp创建对象类似: tk_ser = modbus_tk.TcpMaster(host="127.0.0.1", port=502, timeout_in_sec=5.0) host和port改为连接设备的ip和port就好,具体使用方法和modbus_rtu...