Modbus协议 / Modbus Protocol


目录

  1. Modbus 协议简介
  2. Modbus RTU协议
  3. Modbus TCP协议与 Python 实现
  4. Modbus 功能码
  5. Modbus TCP/RTU对比

1 Modbus 协议简介

Modbus协议MODICON公司1979年开发的一种通信协议,是一种工业现场总线协议标准,1996年施耐德公司推出了基于以太网TCP/IP的Modbus协议—ModbusTCP。

Modbus协议是一项应用层报文传输协议,包括ASCII / RTU / TCP三种报文类型,协议本身不定义物理层,只定义了控制器能够认识和使用的消息结构,而不管消息是经过何种网络进行通信的。

标准的Modbus协议物理层接口主要有RS232 / RS422 / RS485和以太网。采用Master/Slave主从方式通信。

2 Modbus RTU协议 / Modbus RTU Protocol

Modbus RTU协议报文格式主要如下,

名称              字节数   位号       描述

------------       ---------   ------      ------

设备地址   1            1

功能码       1         2            03H读寄存器/06H写单个寄存器/10H写多个寄存器

寄存器地址  2            3-4         高位在前

数据长度         2            5-6         传送数据总长度

CRC校验         2            7-8

下面是不同操作时使用的报文格式

3 Modbus TCP协议 / Modbus TCP Protocol

3.1 Modbus TCP协议格式

Modbus TCP协议报文格式主要可分为两段,MBAP和PDU,

MBAP:

名称              字节数   位号       描述

------------      ---------   ------       ------

事物标识符   2            1-2         由服务器复制返回,通常为\x00\x00

协议表示符   2      3-4         通常为\x00\x00

数据长度       2         5-6         传送数据总长度,高位通常\x00(数据不超过256),低位为后续字节长度

单元标识符   1         7            通常为\x00

PDU:

名称              字节数   位号       描述

------------      ---------   ------       ------

功能码           1            8            定义功能

起始寄存器   2         9-10       操作的寄存器起始位

寄存器/数据  2         11-12     读/多个写模式下,为寄存器数量,单个写模式为写入数据

3.2 Modbus TCP 加解码的 Python 实现 / Modbus TCP Encode and Decode by Python

 import struct

 class ModbusCodeC():
"""
This CodeC class implement partly of Modbus encode and decode
The chamber only offer 03H and 06H function-code for using
""" @staticmethod
def MBAP_encode():
transFlagHi = b'\x00'
transFlagLo = b'\x00'
protoFlag = b'\x00\x00'
length = b'\x00\x06'
unitFlag = b'\x00'
mbap = transFlagHi + transFlagLo + protoFlag + length + unitFlag
return mbap @staticmethod
def PDU_encode(func, regi, num=1, data=None):
funcList = {'r': b'\x03',
'w': b'\x06'}
funcCode = funcList[func]
registerStart = struct.pack('!H', regi)
registerNum = struct.pack('!H', num)
if data and func == 'w':
dataCode = struct.pack('!H', data)
pdu = funcCode + registerStart + dataCode
return pdu
pdu = funcCode + registerStart + registerNum
return pdu @staticmethod
def encode(func, regi, num, data=None):
return ModbusCodeC.MBAP_encode() + ModbusCodeC.PDU_encode(func, regi, num, data) @staticmethod
def MBAP_decode(s):
m = {}
m['transFlagHi'] = s[:1]
m['transFlagLo'] = s[1:2]
m['protoFlag'] = s[2:4]
m['length'] = s[4:6]
m['unitFlag'] = s[6:]
return m @staticmethod
def PDU_decode(s):
p = {}
'''
p['funcCode'] = s[:1]
p['registerStart'] = s[1:3]
p['registerNum'] = s[3:5]
p['data'] = s[5:]
'''
# TODO: Add bit number and data length check here
p['funcCode'] = s[:1]
p['bitNum'] = s[1:2]
p['data'] = s[2:]
return p @staticmethod
def decode(msg):
msg_de = {}
mbap, pdu = msg[:7], msg[7:]
msg_de['MBAP'] = ModbusCodeC.MBAP_decode(mbap)
msg_de['PDU'] = ModbusCodeC.PDU_decode(pdu)
return msg_de if __name__ == '__main__':
print(ModbusCodeC.encode('r', 5, 3))
print(ModbusCodeC.encode('w', 5, 1, 8))

4 Modbus 功能码/ Modbus Function Code

在Modbus功能码中,1-65位为公共功能码,定义了一些通用的功能

5 Modbus TCP/RTU对比 / Modbus TCP/RTU Comparison

5.1 Modbus RTUModbus TCP读指令对比

MBAP报文头

地址码

功能码

寄存器地址

寄存器数量

CRC校验

Modbus   RTU

01

03

01   8E

00   04

25   DE

Modbus   TCP

00   00 00 00 00 06 00

03

01   8E

00   04

指令的涵义:从地址码为01(TCP协议单元标志为00)的模块0x18E(01 8E)寄存器地址开始读(03)四个(00 04)寄存器。

5.2 Modbus RTUModbus TCP写指令对比

MBAP报文头

地址码

功能码

寄存器地址

寄存器数量

数据长度

正文

CRC校验

RTU

01

10

01   8E

00   01

02

00   00

A8   7E

TCP

00   00 00 00 00 09 00

10

01   8E

00   01

02

00   00

指令的涵义:从地址码为01(TCP协议单元标志为00)的模块0x18E(01 8E)寄存器地址开始写(10)一个(00 01)寄存器,具体数据长度为2个字节(02),数据正文内容为00 00(00 00)。

参考链接


http://blog.csdn.net/yangbingzhou/article/details/39504015

http://www.485-can-tcp.com/technology/232485/Modbus.htm

Python的网络编程[6] -> Modbus 协议 -> Modbus 的基本理论与 Python 实现的更多相关文章

  1. Python的网络编程[3] -> BOOTP 协议[0] -> BOOTP 的基本理论

    BOOTP协议 / BOOTP Protocol 目录 基本理论 BOOTP 与 DHCP 通信流程 数据报文格式 报文加解码实现 1. 基本理论 / Basic Theory BOOTP(Boots ...

  2. Python的网络编程[4] -> DHCP 协议[0] -> DHCP 的基本理论

    DHCP协议 / DHCP Protocol 目录 DHCP 基本理论 DHCP 通信流程 DHCP 完整报文 DHCP 的 Optional 字段 DHCP 的报文类型 1 DHCP 基本理论 DH ...

  3. Python的网络编程[1] -> FTP 协议[0] -> FTP 的基本理论

    FTP协议 / FTP Protocol FTP全称为File Transfer Protocol(文件传输协议),常用于Internet上控制文件的双向传输,常用的操作有上传和下载.基于TCP/IP ...

  4. Python的网络编程[2] -> TFTP 协议[0] -> TFTP 的基本理论

    TFTP 的基本理论 目录 通信流程 数据报文格式 传输终结 异常处理 数据丢失和超时 TFTP(Trivial File Transfer Protocol,简单文件传输协议)是UDP协议族中的一个 ...

  5. Python的网络编程[1] -> FTP 协议[2] -> 使用 ftplib 建立 FTP 客户端

    使用 ftplib 建立 FTP 客户端 用于建立FTP Client,与 pyftplib 建立的 Server 进行通信. 快速导航 1. 模块信息 2. 建立 FTP 客户端 1. 模块信息 1 ...

  6. Python的网络编程[3] -> BOOTP 协议[1] -> BOOTP 的 Python 实现

    BOOTP实现 / BOOTP Implement 目录 BOOTP 的服务器建立过程 BOOTP 的客户端建立过程 Note: 理论部分请参考文末相关阅读链接 1 BOOTP 的服务器建立过程 服务 ...

  7. Python的网络编程[1] -> FTP 协议[1] -> 使用 pyftplib 建立 FTP 服务器

    使用 pyftplib 建立 FTP 服务器 pyftplib 主要用于建立 FTP Server,与 ftplib 建立的 Client 进行通信. 快速导航 1. 模块信息 2. 建立 FTP 服 ...

  8. Python的网络编程[2] -> TFTP 协议[1] -> TFTP 的 Python 实现

    TFTP实现 / TFTP Implement 目录 TFTP 的服务器建立过程 TFTP 的客户端建立过程 1 TFTP 的服务器建立过程 服务器建立步骤主要有: (1)      设定服务器IP和 ...

  9. Python的网络编程[4] -> DHCP 协议[1] -> DHCP 的 Python 实现

    DHCP实现 / DHCP Implement 目录 DHCP 服务器建立过程 DHCP 报文加码实现过程 下面介绍建立一个简单的DHCP服务器,主要用于对基本的DHCP请求进行响应,目前只提供一个I ...

随机推荐

  1. Java基础-4变量与数据类型

    变量:变量是Java程序中的一个基本存储单元.变量是一个标识符.类型及一个可选初始值的组合定义.所有的变量都有一个作用域,即变量在某一区域有效. 基本的变量声明方式如下: int a; float b ...

  2. input()报错:TypeError: '>=' not supported between instances of 'str' and 'int'

    今天学习python基础—分支与循环,接触到了if.在练习一个if语句的时候,出现了错误. 题目是: 根据分数划分成四个级别:优秀.良好.及格.不及格,分数是72: grade = 72if grad ...

  3. paramiko类Fabric主机管理

    环境:Linux python3.5 要求:类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/ ...

  4. Alpha 冲刺(5/10)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 已经解决登录注册等基本功能的界面. 完成了主界面的基本布局 ...

  5. 如何将查询到的数据显示在DataGridView中

    背景介绍: 数据库中的T_Line_Info表中存放着学生上机的记录,也就是我们需要查询上机记录的表,其中具体内容为: 界面设计如下: 右击DataGridView控件,选择编辑列,设计它的列名. 代 ...

  6. Axios & Interceptors & Serialization & CORS & cookie

    Axios https://github.com/axios/axios#config-defaults Global axios defaults axios.defaults.baseURL = ...

  7. 【Luogu】P3288方伯伯运椰子(消圈定理)

    题目链接 分数规划题,详见luogu题解 #include<cstdio> #include<cstring> #include<cctype> #include& ...

  8. [CF482B]Interesting Array

    题目大意:构造一个序列$S$,有$m$条限制,每条为$l\;r\;q$,表示$\&_{i=l}^r S_i=q$ 题解:每条限制就把$[l,r]$内的数或上$q$,最后判断就行了 卡点:我又写 ...

  9. Avito Cool Challenge 2018 :E. Missing Numbers

    E. Missing Numbers 题目链接:https://codeforces.com/contest/1081/problem/E 题意: 现在有n个数(n为偶数),但只给出a2,a4.... ...

  10. 02 Java 基础语法

    在开始 Java 基本语法之前,先说明 Java 程序的基本规范: 大小写敏感,例如 Person 和 person 是不同的 类名首字母大写,如果类名由多个单词组成,每个单词首字母都大写,例如 He ...