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. HA集群基本概念详解

    一.高可用集群的定义 二.高可用集群的衡量标准 三.高可用集群的层次结构 四.高可用集群的分类 五.高可用集群常用软件 六.共享存储 七.集群文件系统与集群LVM 八.高可用集群的工作原理 一.高可用 ...

  2. Ubuntu系列问题

    一.Ubuntu16.04 intel_rapl : no valid rapl domains found in packge0 echo 'blacklist intel_rapl' >&g ...

  3. shell文本处理工具总结

    shell文本处理工具总结 为了效率,应该熟练的掌握自动化处理相关的知识和技能,能力就表现在做同样的一件事情,可以做的很好的同时,耗时还很短. 再次总结shell文本处理的相关规则,对提高软件调试效率 ...

  4. [Leetcode/Javascript] 461.Hamming Distance

    [Leetcode/Javascript] 461.Hamming Distance 题目 The Hamming distance between two integers is the numbe ...

  5. JS正则表达式 简单应用

    知识点: 先生成一个正则规则的对象,使用test()对传入的字符串进行验证,返回布尔类型 代码: <!doctype html><html><head> <m ...

  6. 安装bcc

    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys D4284CDD echo "deb https://repo.i ...

  7. P4342 [IOI1998]Polygon

    题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条边 ...

  8. 牛客 2018NOIP 模你赛2 T2 分糖果 解题报告

    分糖果 链接:https://www.nowcoder.com/acm/contest/173/B 来源:牛客网 题目描述 \(N\) 个小朋友围成一圈,你有无穷个糖果,想把其中一些分给他们. 从某个 ...

  9. swiper使用案例一

    // 初始化函数 var mySwiper_a = new Swiper('.se3 .left', { direction: 'vertical', loop: true, autoplay: 50 ...

  10. 如何禁用Eclipse的Validating

    使用Eclipse开发项目,在加载项目.刷新项目.修改了某个代码的时候,经常出现Eclipse正在Validating的提示.项目比较大文件(js)较多的情况下,甚至出现Validating几分钟的盛 ...