Python的网络编程[6] -> Modbus 协议 -> Modbus 的基本理论与 Python 实现
Modbus协议 / Modbus Protocol
目录
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 RTU与Modbus 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 RTU与Modbus 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 实现的更多相关文章
- Python的网络编程[3] -> BOOTP 协议[0] -> BOOTP 的基本理论
BOOTP协议 / BOOTP Protocol 目录 基本理论 BOOTP 与 DHCP 通信流程 数据报文格式 报文加解码实现 1. 基本理论 / Basic Theory BOOTP(Boots ...
- Python的网络编程[4] -> DHCP 协议[0] -> DHCP 的基本理论
DHCP协议 / DHCP Protocol 目录 DHCP 基本理论 DHCP 通信流程 DHCP 完整报文 DHCP 的 Optional 字段 DHCP 的报文类型 1 DHCP 基本理论 DH ...
- Python的网络编程[1] -> FTP 协议[0] -> FTP 的基本理论
FTP协议 / FTP Protocol FTP全称为File Transfer Protocol(文件传输协议),常用于Internet上控制文件的双向传输,常用的操作有上传和下载.基于TCP/IP ...
- Python的网络编程[2] -> TFTP 协议[0] -> TFTP 的基本理论
TFTP 的基本理论 目录 通信流程 数据报文格式 传输终结 异常处理 数据丢失和超时 TFTP(Trivial File Transfer Protocol,简单文件传输协议)是UDP协议族中的一个 ...
- Python的网络编程[1] -> FTP 协议[2] -> 使用 ftplib 建立 FTP 客户端
使用 ftplib 建立 FTP 客户端 用于建立FTP Client,与 pyftplib 建立的 Server 进行通信. 快速导航 1. 模块信息 2. 建立 FTP 客户端 1. 模块信息 1 ...
- Python的网络编程[3] -> BOOTP 协议[1] -> BOOTP 的 Python 实现
BOOTP实现 / BOOTP Implement 目录 BOOTP 的服务器建立过程 BOOTP 的客户端建立过程 Note: 理论部分请参考文末相关阅读链接 1 BOOTP 的服务器建立过程 服务 ...
- Python的网络编程[1] -> FTP 协议[1] -> 使用 pyftplib 建立 FTP 服务器
使用 pyftplib 建立 FTP 服务器 pyftplib 主要用于建立 FTP Server,与 ftplib 建立的 Client 进行通信. 快速导航 1. 模块信息 2. 建立 FTP 服 ...
- Python的网络编程[2] -> TFTP 协议[1] -> TFTP 的 Python 实现
TFTP实现 / TFTP Implement 目录 TFTP 的服务器建立过程 TFTP 的客户端建立过程 1 TFTP 的服务器建立过程 服务器建立步骤主要有: (1) 设定服务器IP和 ...
- Python的网络编程[4] -> DHCP 协议[1] -> DHCP 的 Python 实现
DHCP实现 / DHCP Implement 目录 DHCP 服务器建立过程 DHCP 报文加码实现过程 下面介绍建立一个简单的DHCP服务器,主要用于对基本的DHCP请求进行响应,目前只提供一个I ...
随机推荐
- 《Cracking the Coding Interview》——第17章:普通题——题目14
2014-04-29 00:20 题目:给定一个长字符串,和一个词典.如果允许你将长串分割成若干个片段,可能会存在某些片段在词典里查不到,有些则查得到.请设计算法进行分词,使得查不到的片段个数最少. ...
- PHP字符串word末字符大小写互换
要求 给出一个字符串如 “A journey of, a thousand 'miles' must can't \"begin\" with a single step.” ,通 ...
- selenium界面元素定位
一. Selenium界面元素定位 本文元素定位以das2为例 #导入包 from selenium import webdriver #打开火狐驱动 driver=webdriver ...
- mongoDB坑
1 mongodb.cnf文件中有个选项为bind_id:127.0.0.1,如果是测试环境,需要远程访问的话,就先改成0.0.0.1 auth:如果只是学习的话,建议先改成false,否则后面会有各 ...
- 常用模块(shutil copy、压缩、解压)
作用与功能 主要用于文件的copy,压缩,解压 导入shuitl模块: import shutil copy方法 1 1.shutil.copyfileobj() 打开file1,并copy写入fi ...
- 软件架构---.net框架介绍
https://www.cnblogs.com/hgmyz/p/5313983.html 自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生 ...
- redis的socket event loop
很早之前就因为nosql就听说了redis,直到去年才真正去了解,只能说相见恨晚. 因为数据库相关,我以为这应该是个庞然大物,万万没想到,源码不到2M,所以,我不知道该说啥了... 还是来点靠谱的: ...
- ZOJ 1280 Interesting Lines | 求两直线交点
原题: 求两直线交点 思路借鉴于:http://blog.csdn.net/zxy_snow/article/details/6341282 感谢大佬 #include<cstdio> # ...
- Codeforces 498D Traffic Jams in the Land | 线段树
题目大意: 给坐标轴1~n的点,每个点有一个权值,从一个点走到下一个点需要1s,如果当前时间是权值的倍数就要多花1s 给出q组操作,C表示单点修改权值,A表示询问0时刻x出发到y的时间 题解:因为权值 ...
- BZOJ1823 [JSOI2010]满汉全席 【2-sat】
题目 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过专家 ...