基于Python的ModbusTCP客户端实现详解


Posted in Python onJuly 13, 2019

前言

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客户端实现详解

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

基于Python的ModbusTCP客户端实现详解

Python中提供了支持Modbus协议的第三方库——modbus_tk,下载地址为:https://pypi.org/project/modbus_tk/。使用时需要先导入modbus_tk库,然后简单地依照Modbus协议配置参数即可。当实现客户端功能时,需要配置如下参数:

slave:Modbus从站ID地址 。

function_code:寄存器的功能码,主要的寄存器功能码如下所示:

基于Python的ModbusTCP客户端实现详解

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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现信用卡系统(支持购物、转账、存取钱)
Jun 24 Python
Python书单 不将就
Jul 11 Python
Python学习之Anaconda的使用与配置方法
Jan 04 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
Python拼接字符串的7种方法总结
Nov 01 Python
Pytorch反向求导更新网络参数的方法
Aug 17 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
Mar 11 Python
通过Python实现一个简单的html页面
May 16 Python
使用Python通过oBIX协议访问Niagara数据的示例
Dec 04 Python
详解Python 中的 defaultdict 数据类型
Feb 22 Python
python 中[0]*2与0*2的区别说明
May 10 Python
Python Numpy库datetime类型的处理详解
Jul 13 #Python
Python3内置模块random随机方法小结
Jul 13 #Python
简单了解python的一些位运算技巧
Jul 13 #Python
简单了解python PEP的一些知识
Jul 13 #Python
python爬虫神器Pyppeteer入门及使用
Jul 13 #Python
Python 分享10个PyCharm技巧
Jul 13 #Python
简单了解Python3里的一些新特性
Jul 13 #Python
You might like
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
Laravel框架实现超简单的分页效果示例
2019/02/08 PHP
php-fpm中max_children的配置
2019/03/15 PHP
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
2010/03/14 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
纯js实现背景图片切换效果代码
2010/11/14 Javascript
JavaScript 原型继承
2011/12/26 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
AngularJS手动表单验证
2016/02/01 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
vue计算属性get和set用法示例
2019/02/08 Javascript
详解JavaScript的变量
2019/04/04 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
2020/07/24 Javascript
[00:52]DOTA2第二届亚洲邀请赛预选赛宣传片
2017/01/13 DOTA
Python编写检测数据库SA用户的方法
2014/07/11 Python
Python计算三维矢量幅度的方法
2015/06/15 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
python语言元素知识点详解
2019/05/15 Python
Pytorch中.new()的作用详解
2020/02/18 Python
如何在python中实现线性回归
2020/08/10 Python
python 实现单例模式的5种方法
2020/09/23 Python
Bjorn Borg官方网上商店:国际运动时尚品牌
2016/08/27 全球购物
2014财务人员自我评价范文
2014/09/21 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
单位委托函范文
2015/01/29 职场文书
学生会辞职信
2015/03/02 职场文书
大学生活感想
2015/08/10 职场文书
市场营销计划书
2019/04/24 职场文书
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android