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:功能码

      code function
      1 READ_COILS 读线圈
      2 READ_DISCRETE_INPUTS 读离散输入
      3 READ_HOLDING_REGISTERS 读保持寄存器
      4 READ_INPUT_REGISTERS读输入寄存器
      5 WRITE_SINGLE_COIL写单一线圈
      6 WRITE_SINGLE_REGISTER写单一寄存器
      15 WRITE_MULTIPLE_COILS写多个线圈
      16 WRITE_MULTIPLE_REGISTERS 写多寄存器
      还有其它不常用大家可自己看源码
    • starting_address:起始地址

    • quantity_of_x:读取数据长度,RTU模式数据长度如下图1,TCP模式数据长度是和不同模块的cpu限制有关如下图2
      图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_rtumaster = 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 = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 10)  # 返回元组

示例

import serial
import modbus_tk.defines as cst
from modbus_tk import modbus_rtudef 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_tcpserver = modbus_tcp.TcpMaster(host:str, port:int)
server.set_timeout(1.0)# host: ip地址
# port: 端口# 读保持寄存器 03H 1站号 地址0 长度0-10
res1 = server.execute(1, cst.READ_HOLDING_REGISTERS, 0, 10)

示例

import modbus_tk.defines as cst
import modbus_tk.modbus_tcp as modbus_tcpdef 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 codes notes
1 ILLEGAL_FUNCTION = 1 功能代码不合法
2 ILLEGAL_DATA_ADDRESS = 2 数据地址不合法
3 ILLEGAL_DATA_VALUE = 3 数据值不合法
4 SLAVE_DEVICE_FAILURE = 4 slave设备失败
5 COMMAND_ACKNOWLEDGE = 5 命令已收到
6 SLAVE_DEVICE_BUSY = 6 slave设备忙
8 MEMORY_PARITY_ERROR = 8 内存奇偶误差

6. 模拟测试

环境需要:

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

  • modbus slave 用于模拟从机

安装包地址:

链接:https://pan.baidu.com/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

python玩转modbus相关推荐

  1. python开发pc软件_程序员带你十天快速入门Python,玩转电脑软件开发(二)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  2. 大学python选择题题库及答案_大学慕课用Python玩转数据题库及答案

    大学慕课用Python玩转数据题库及答案 更多相关问题 (19分)电解原理在化学工业中有广泛应用.右图表示一个电解池,装有电解液c :A.B是两块电极板,通过导线与直流 用铂电极电解CuCl2与CuS ...

  3. python做电脑软件-程序员带你十天快速入门Python,玩转电脑软件开发(二)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  4. python入门教程软件-程序员带你十天快速入门Python,玩转电脑软件开发(四)

    本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结.本篇文章主要是基于上一篇的程序员带你十天快速入门Python,玩转电脑软件开发(三)的基础之上, ...

  5. python好学吗mooc中文网-2020年大学mooc用Python玩转数据作业答案

    2020年大学mooc用Python玩转数据作业答案 更多相关问题 一台电脑先涨价着一%,后降价2一%,这台电脑一现价同原价相比是()A.一样的B.降低了C.提高了直接写出9数 3÷地下%=6×3下% ...

  6. python好学吗mooc中文网-用Python玩转数据

    spContent=欢迎来到<用Python玩转数据>,这是第10次开课,大壮老师会尽量用非计算机专业(需要有一些编程基础,最好学过一门程序设计语言,但不一定是Python)小伙伴们能听懂 ...

  7. pythonzerojudge题库及答案_大学mooc2020用Python玩转数据试题及答案

    大学mooc2020用Python玩转数据试题及答案 更多相关问题 胆汁酸生成的限速酶是: [单选题]以下哪个是结核治疗策略: [单选题]胆汁酸生成的限速酶是: [判断题]仰光大金塔塔体是在3层大台基 ...

  8. python 微信_wxpy: 用 Python 玩微信

    wxpy: 用 Python 玩微信¶ 微信机器人 / 可能是最优雅的微信个人号 API wxpy 在 itchat 的基础上,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展 注意 强烈建议 ...

  9. 确实会玩!教你用Python玩转数据~

    向大家推荐一个南京大学的公开课--用Python玩转数据 授课老师张莉博士是南京大学计算机科学与技术系副教授,主要研究领域为数据挖掘和自然语言处理.张老师上课走亲切风冷幽默路线,跟同学们相处愉快,常常 ...

最新文章

  1. access oracle sql语句,在 Access 中使用 SQL 建索引
  2. C#把TextBox.Text的几万条数据按数据格式导出Excel报错:Insufficient memory to continue the execution of the program.
  3. 深度学习(十五)基于级联卷积神经网络的人脸特征点定位
  4. GoF23种设计模式之行为型模式之策略模式
  5. Linux里的/dev/null和21和基本符号
  6. Go语言---字符串的基本操作
  7. Groovy(一)安装和基础环境配置
  8. 边缘检测之非极大值抑制原理
  9. 树的深度优先和广度优先
  10. 基于SSM框架CRM客户管理系统
  11. 论频谱中负频率的物理意义
  12. 当PCB设计师遇到爱情,猜猜他板内的阻抗有多大变化
  13. 垂直距页边距5厘米_Word页面设置,含纸张大小与方向、页边距和文字方向
  14. 办公能手教你pdf如何设置背景颜色
  15. 如何查找专用 IP 地址?
  16. “云计算机”是什么?
  17. Ubuntu 16.04通过无线网卡使用桥接模式上网
  18. 2022年全国最新中级消防设施操作员模拟题库及答案
  19. 第十讲 克服面试紧张的四个方法
  20. Zeno节点系统中的C++最佳实践

热门文章

  1. python中引入sql的优点_引用sql-和引用sql相关的内容-阿里云开发者社区
  2. Redis——Info指令
  3. 爬取教学立方的所有课件下载链接
  4. ncm格式文件转换为mp3格式文件
  5. 【解决】小米/红米手机 Miui内测版/公测版系统申请通过后没有手动选择安装包按钮
  6. JS--图片轮播效果
  7. libgdx API之Gdx.XXX:无处不在
  8. 古代的监察制度、任职制度和被称为 “中国第五大发明的” 科举制度
  9. 10.经典快排和快排加速
  10. html lorem自动填充,使用 lorem 快捷生成随机文本填充页面