基础知识

硬件层协议:解决0和1的可靠传输,常有RS232、RS485、CAN、IIC、SPI …

软件层协议:解决传输目的,常有Modbus、TCP/IP、CANopen …

协议优点:

  • Modbus协议标准开放、公开发表且无版权要求
  • Modbus协议支持多种电气接口,包括RS232、RS485、TCP/IP等,还可以在各种介质上传输,如双绞线、光纤、红外、无线等
  • Modbus协议消息帧格式简单、紧凑、通俗易懂。用户理解和使用简单,厂商容易开发和集成,方便形成工业控制网络

Modbus是一主多从的通信协议

Modbus通信中只有一个设备可以发送请求。其他从设备接收主机发送的数据来进行响应,从机是任何外围设备,如I/O传感器,阀门,网络驱动器,或其他测量类型的设备,从站处理信息和使用Modbus将其数据发送给主站。不能Modbus同步进行通信,主机在同一时间内只能向一个从机发送请求,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。 从机不会自己发送消息给主站,只能回复从主机发送的消息请求。

RTU协议

Modbus报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容

Modbus协议在串行链路上的报文格式如下所示:

  • 从机地址: 每个从机都有唯一地址,占用一个字节,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答)
  • 功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改从机的数据,所以不同功能码对应不同功能.
  • 数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。
  • 校验: 在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确

Modbus功能码

Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读写,如下表所示:

功能码 功能说明
01H 读取输出线圈
02H 读取输入线圈
03H 读取保持寄存器
04H 读取输入寄存器
05H 写入单线圈
06H 写入单寄存器
0FH 写入多线圈
10H 写入多寄存器

当然我们用的最多的就是03和06 一个是读取数据,一个是修改数据。

1、主机对从机读数据操作

主机发送报文格式如下:

从站地址 功能码 起始(高) 起始(低) 数量(高) 数量(低) 校验
0x01 0x03 0x00 0x01 0x00 0x01 0xD5 0xCA

含义:

0x01:从机的地址

0x03:查询功能,读取从机寄存器的数据

0x00 0x01: 代表读取的起始寄存器地址.说明从0x0001开始读取.

0x00 0x01: 查询的寄存器数量为0x0001个 Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据; 寄存器地址对应着从机实际的存储地址

0xD5 0xCA: 循环冗余校验 CRC

从机回复报文格式如下:

从站地址 功能码 字节计数 字节1 字节2 校验
0x01 0x03 0x02 0x00 0x00 0xB8 0x44

含义:

0x01:从机的地址

0x03:查询功能,读取从机寄存器的数据

0x02: 返回字节数为2个 一个寄存器2个字节

0x00 0x00:寄存器的值是0000

0xB8 0x44: 循环冗余校验 CRC

2、主机对从机写数据操作

主机发送报文格式如下:

从站地址 功能码 数据地址(高) 数据地址(低) 数据(高) 数据(低) 校验
0x01 0x06 0x00 0x01 0x00 0x17 0x98 0x04

含义:

0x01:从机的地址

0x06:修改功能,修改从机寄存器的数据

0x00 0x01: 代表修改的起始寄存器地址.说明修改0x0001-0x0003的存储内容

0x00 0x17: 要修改的数据值为0017

0x98 0x04: 循环冗余校验 CRC

从机回复报文格式如下:

从站地址 功能码 数据地址(高) 数据地址(低) 数据(高) 数据(低) 校验
0x01 0x06 0x00 0x01 0x00 0x17 0x98 0x04

含义:

0x01:从机的地址

0x06:修改功能,修改从机寄存器的数据

0x00 0x01: 代表修改的起始寄存器地址.说明是0x0000

0x00 0x17:修改的值为0017

0x98 0x04: 循环冗余校验 CRC

从机的回复和主机的发送是一样的,如果不一样说明出现了错误

python库 modbus_tk

import serial
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu class Modbus:
def __init__(self, port: str, baud: int):
"""
初始化modbus
默认的slave_id为1
:param port: 串口号
:param baud: 波特率
"""
self.port = port
self.baud = int(baud)
self.master = None def open(self):
try:
self.master = modbus_rtu.RtuMaster(
serial.Serial(port=self.port, baudrate=self.baud, bytesize=8, parity='N', stopbits=1))
self.master.set_timeout(5.0)
except Exception as err:
print("---异常---", err) def master_write_single_coil(self, slave_id: int, register_address: int, output_value: int) -> tuple:
"""
05指令
向slave从机中写寄存器
:param slave_id: 从机id
:param register_address: 从机寄存器的地址 十进制
:param output_value: 要写入的数值 十进制
:return: (0, 32762) 类似元组(写入的从机寄存器地址,写入的值)
"""
result = self.master.execute(slave_id, cst.WRITE_SINGLE_COIL, register_address, output_value=output_value)
return result def master_write_single_register(self, slave_id: int, register_address: int, output_value: int) -> tuple:
"""
06指令
向slave从机中写寄存器
:param slave_id: 从机id
:param register_address: 从机寄存器的地址 十进制
:param output_value: 要写入的数值 十
:return: (0, 32762) 类似元组(写入的从机寄存器地址,写入的值)
"""
# 写入操作当对动作指令寄存器写入对应动作参数,就会立刻进行执行动作
# 站点号;cst.WRITE_SINGLE_REGISTER写入单个寄存器;寄存器写入地址;output_value写入的值
result = self.master.execute(slave_id, cst.WRITE_SINGLE_REGISTER, register_address, output_value=output_value)
return result

Modbus协议及python库实现的更多相关文章

  1. Python的网络编程[6] -> Modbus 协议 -> Modbus 的基本理论与 Python 实现

    Modbus协议 / Modbus Protocol 目录 Modbus 协议简介 Modbus RTU协议 Modbus TCP协议与 Python 实现 Modbus 功能码 Modbus TCP ...

  2. Python爬虫:HTTP协议、Requests库(爬虫学习第一天)

    HTTP协议: HTTP(Hypertext Transfer Protocol):即超文本传输协议.URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源. HTTP协议 ...

  3. Python爬虫:HTTP协议、Requests库

    HTTP协议: HTTP(Hypertext Transfer Protocol):即超文本传输协议.URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源. HTTP协议 ...

  4. Python 库大全

    作者:Lingfeng Ai链接:http://www.zhihu.com/question/24590883/answer/92420471来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...

  5. 【阿里聚安全·安全周刊】Python库现后门 可窃取用户SSH信息|Facebook再曝300万用户数据泄露

    本周七个关键词:Python库现后门丨Facebook再曝数据泄露丨加密协议被曝严重漏洞丨英国报摊将出售"色情通行证"丨HTTPS的绿色锁图标丨机器学习和预测应用的API丨Ecli ...

  6. 哪些 Python 库让你相见恨晚?【转】

    原文链接:https://www.zhihu.com/question/24590883/answer/92420471 原文链接:Python 资源大全 ---------------- 这又是一个 ...

  7. Python库资源大全

    转载地址:https://zhuanlan.zhihu.com/p/27350980 本文是一个精心设计的Python框架.库.软件和资源列表,是一个Awesome XXX系列的资源整理,由BigQu ...

  8. Python 库/模块/工具收集

    1 算法 1.1 字符串处理 re 正则表达式的标准库. StringIO / cStringIO 以读写文件的方式来操作字符串(有点类似于内存文件). cStringIO 是 C 语言实现的,提供高 ...

  9. Python库,让你相见恨晚的第三方库

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具.pyenv – 简单的 Python 版本管理工具.Vex – 可以在虚拟环境中执行命令.virt ...

随机推荐

  1. 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。

    有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ...

  2. 第六十九篇:vue项目的运行过程

    好家伙, 1.vue的目录结构分析 来看看项目的目录 (粗略的大概的解释) 2.vue项目的运行流程 在工程化项目中,vue要做的事情很单纯:通过main.js把App.vue渲染到index.htm ...

  3. eBackup备份服务器安装及配置

    ####### 原博客地址 创建虚拟机 选择第一个 分配硬盘 其余默认 导入压缩包安装eBackup备份软件 用户名root 密码Cloud12#$ 查看ip地址 连接xftp导入包 安装备份软件 # ...

  4. Oracle_FDW 使用介绍

    本文以例子的形式介绍 KingbaseES(Postgresql)数据库如何通过 oracle_fdw 扩展访问Oracle数据库.以下例子在PG12.3 与 KingbaseES V8R6进行过实际 ...

  5. 利用c++编写bp神经网络实现手写数字识别详解

    利用c++编写bp神经网络实现手写数字识别 写在前面 从大一入学开始,本菜菜就一直想学习一下神经网络算法,但由于时间和资源所限,一直未展开比较透彻的学习.大二下人工智能课的修习,给了我一个学习的契机. ...

  6. Kratos漫游指南 1 - 概览

    您好,地球人,欢迎来到Kratos漫游指南. 对于刚开始研究Kratos框架的开发者来说,目前的文档有些零散,这与我们的模块化设计有一些关系,不过Don't panic,从这篇文章开始,我将试图打破这 ...

  7. Kibana:运用索引模式的 formatter 来探索 IP 信息

    文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/107484674

  8. 车辆稳定性辅助(VSA)系统

    当车辆转弯大于或小于预期时,VSA有助于在转弯时稳定车辆. 同时还有助于在湿滑路面上保持牵引力. VSA 打开和关闭 禁用: 请长按按钮直至听到哔的一声.VSA 关闭指示灯点亮. 恢复: 按下按钮直至 ...

  9. k8s中安装redis6集群

    注意:第二步不用操作了,yaml文件仅供参考 1.创建Namespace kubectl apply -f Namespace.yaml apiVersion: v1 kind: Namespace ...

  10. 利用python对websocket进行并发压测

    简述 产品经理鉴于运营反馈并对程序的websocket长连接保持怀疑的态度,让我对websocket服务器进行压力测试,我内心是拒绝的. 开发思路 查阅websocket的相关资料,查到python的 ...