当前位置: 首页 > news >正文

基于Python的ModbusTCP客户端实现

Modbus协议是由Modicon公司(现在的施耐德电气Schneider Electric)推出,主要建立在物理串口、以太网TCP/IP层之上,目前已经成为工业领域通信协议的业界标准,广泛应用在工业电子设备之间的互联。
Modbus Poll和Modbus Slave是两款非常流行的Modbus设备仿真软件,支持Modbus RTU/ASCII和Modbus TCP/IP协议 ,经常用于测试和调试Modbus设备,观察Modbus通信过程中的各种报文。
当用于支持Modbus RTU/ASCII协议时,ModbusPoll作为一个主站设备, ModbusSlave作为一个从站设备,从站设备接收主站设备的命令并返回数据。而当用于支持Modbus TCP/IP时,ModbusSlave作为一个服务器, ModbusPoll作为一个客户端,服务器接收客户端的命令并返回数据。客户端需要填写指定连接的远程服务器IP地址和端口号。

图片描述
这里主要介绍下用Python实现ModbusTCP客户端功能,同时使用ModbusSlave模拟一个服务器,用于互联调试。

图片描述
Python中提供了支持Modbus协议的第三方库——modbus_tk,下载地址为:https://pypi.org/project/modbus_tk/。使用时需要先导入modbus_tk库,然后简单地依照Modbus协议配置参数即可。当实现客户端功能时,需要配置如下参数:
slave:Modbus从站ID地址 。电动叉车
function_code:寄存器的功能码,主要的寄存器功能码如下所示:

图片描述
starting_address:寄存器起始地址,从0开始。
quantity_of_x:寄存器连续个数。
output_value:写命令时的数值。
Scan Rate:读取数据的周期,程序中体现为执行 execute()方法的周期。

如下例程实现了01和03两条命令读取服务器的数据,如下所示:

import modbus_tk.modbus_tcp as mt
import modbus_tk.defines as md

# 远程连接到服务器端
master = mt.TcpMaster("192.168.1.10", 502)
master.set_timeout(5.0)

# @slave=1 : identifier of the slave. from 1 to 247.  0为广播所有的slave
# @function_code=READ_HOLDING_REGISTERS:功能码
# @starting_address=1:开始地址
# @quantity_of_x=3:寄存器/线圈的数量
# @output_value:一个整数或可迭代的值:1/[1,1,1,0,0,1]/xrange(12)
# @data_format
# @expected_length
Hold_value = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=1, quantity_of_x=3, output_value=5)
Hold_value = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=1, quantity_of_x=3, output_value=5)
Coils_value = master.execute(slave=1, function_code=md.READ_COILS, starting_address=1,  quantity_of_x=3, output_value=5)

print(Hold_value)  # 取到的寄存器的值格式为元组(55, 12, 44)
print(Hold_value)  # 取到的寄存器的值格式为元组(1, 1, 1)
            

转载于:https://www.cnblogs.com/xyou/p/10416375.html

相关文章:

  • 人月神话读书笔记(3)
  • Nacos系列:Nacos的Java SDK使用
  • matlab-线性代数 矩阵转置(共轭、非共轭)
  • 力扣(LeetCode)22
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • crond定时任务
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Python爬虫入门教程 40-100 博客园Python相关40W博客抓取 scrapy
  • Druid 在有赞的实践
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 如何免费的让网站启用https
  • request和response
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • CAP 一致性协议及应用解析
  • asp.net core系列 32 EF查询数据 必备知识(1)
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • Centos6.8 使用rpm安装mysql5.7
  • Intervention/image 图片处理扩展包的安装和使用
  • Promise面试题2实现异步串行执行
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • supervisor 永不挂掉的进程 安装以及使用
  • Webpack 4 学习01(基础配置)
  • 码农张的Bug人生 - 初来乍到
  • 那些年我们用过的显示性能指标
  • 普通函数和构造函数的区别
  • HanLP分词命名实体提取详解
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • #### go map 底层结构 ####
  • ###C语言程序设计-----C语言学习(6)#
  • #pragma pack(1)
  • #pragma预处理命令
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (windows2012共享文件夹和防火墙设置
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (转)linux 命令大全
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • *2 echo、printf、mkdir命令的应用
  • .apk文件,IIS不支持下载解决
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net经典笔试题
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET开源项目介绍及资源推荐:数据持久层
  • :中兴通讯为何成功
  • @Service注解让spring找到你的Service bean
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [20150629]简单的加密连接.txt
  • [20170705]diff比较执行结果的内容.txt
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [Android]Tool-Systrace
  • [Android]竖直滑动选择器WheelView的实现
  • [BUUCTF 2018]Online Tool
  • [BZOJ1178][Apio2009]CONVENTION会议中心