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. 能加载文件或程序集 HRESULT:0x80070057 (E_INVALIDARG)的异常的解决方案

    今天下午由于机器蓝屏后,导致我的VS不能够调试我的网站了. 症状就是 : VS无法调试,但是可以编译和发布.而且只是 我在调试时蓝屏的那个项目 不能调试. 出现的错误就是: 能加载文件或程序集“Eny ...

  2. ssh.sh_for_ubuntu1404

    #!/bin/bash sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/g' /etc/ssh/sshd_config s ...

  3. HDU 4057 Rescue the Rabbit ( AC自动机 + 状态压缩DP )

    模板来自notonlysuccess. 模式串只有10个,并且重复出现的分值不累加,因此很容易想到状态压缩. 将模式串加入AC自动机,最多有10*100个状态. dp[i][j][k]:串长为i,在T ...

  4. HTML5初识Canvas

    HTML5初识Canvas <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  5. 【转】Itween 贝塞尔曲线(一)

    原地址:点击打开链接 1.回调函数 回调函数,即当动画完成时那瞬间需要执行一次的一个函数,it中默认有一个onComplete函数,当动画完成时会自动执行,且你可以提供需要传递的一些参数.见如下代码: ...

  6. 如何进入百度、阿里,一个6年Android老司机的面经

    花絮 也许会有人感叹某些人的运气比较好,但是他们不曾知道对方吃过多少苦,受过多少委屈.某些时候就是需要我们用心去发现突破点,然后顺势而上,抓住机遇,那么你将会走向另外一条大道,成就另外一个全新的自我. ...

  7. POJ 1389 Area of Simple Polygons | 扫描线

    请戳此处 #include<cstdio> #include<algorithm> #include<cstring> #define N 1010 #define ...

  8. 电阻 (resistance)

    电阻 (resistance) 题目描述 每次小x物理作业没做完时,总是会去和老师交流感情,他们之间由此建立起来良好的师生关系.于是有一天,老师带着一道物理难题来见小x. 这道题给出了一个有n个电阻的 ...

  9. 【ZBH选讲·树变环】

    [问题描述] 你是能看到第三题的friends呢.——aoao 树是个好东西,删掉树一条边要1的代价,随便再加一条边有1的代价,求最小的代价把树变成环.[输入格式] 第一行一个整数,代表树的点数.接下 ...

  10. 【CZY选讲·一道图论神题】

    题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的 ...