Modbus协议及基于Python的ModbusTCP客户端实现

您所在的位置:网站首页 tcp服务端和客户端ip Modbus协议及基于Python的ModbusTCP客户端实现

Modbus协议及基于Python的ModbusTCP客户端实现

2024-06-10 00:54| 来源: 网络整理| 查看: 265

Modbus 协议是由 Modicon 公司(现在的施耐德电气 Schneider Electric )于1979年为使用可编程逻辑控制器(PLC)通信而推出,主要建立在物理串口、以太网 TCP/IP 层之上,目前已经成为工业领域通信协议的业界标准,广泛应用在工业电子设备之间的互联。

Modbus技术文档

1 网络模型

Modbus 是OSI模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。

Modbus 是一个请求/应答协议,并且提供功能码规定的服务。

2 Modbus 协议描述

Modbus 主要有 4 种通信模式:

Modbus 协议类型描述RTU 模式(串口)二进制表示数据,采用循环冗余校验的校验和ASCII 模式(串口)采用人类可读的、冗长的表示输入,采用纵向冗余校验的校验和TCP 模式(网口)基于TCP通信,与Modbus RTU相似,取消循环冗余校验的校验和UDP 模式(网口)基于UDP通信,与Modbus RTU相似,取消循环冗余校验的校验和

协议格式:

Modbus 协议类型协议格式Modbus RTU[地址码] [功能码] [数据] [CRC校验码]Modbus ASCII[起始冒号] [地址码] [功能码] [数据] [LRC校验码] [回车换行]Modbus TCP[事务处理标识] [协议标识] [长度] [单元标识符] [功能码] [数据]Modbus UDP[事务处理标识] [协议标识] [长度] [单元标识符] [功能码] [数据]

Modbus 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。

PDU = [功能码] [数据] ,功能码为1字节,数据长度不定,由具体功能决定。

标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。

modbus-RTU (Remote Terminal Unit 远程终端单元)是数据在串口RS485等链路上传输的。

modbus-TCP 是使用以太网TCP网络进行通信的,使用502端口,客户端和服务端模式。

Modbus-RTU 数据格式

modbus-RTU 数据包格式=PDU+CRC

PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。

CRC为校验码,为2个字节。

Modbus-TCP 数据格式

modbus-TCP 数据帧格式=MBAP+PDU

MBAP为报文头,长度为7字节,由事务处理标识+协议标识符+长度+单元标识符组成:

示例内容长度描述事务处理标识00 002字节可以理解为报文的序列号,一般每次通信之后就要加1协议标识符00 002字节00 00表示ModbusTCP协议长度00 062字节表示接下来的数据长度,单位为字节单元标识符011字节串行链路或其它总线上连接的远程从站的识别码 3 数据模型

Modbus 协议中一个重要的概念是寄存器,所有的数据均存放于寄存器中。最初Modbus协议借鉴了PLC中寄存器的含义,但是随着Modbus协议的广泛应用,寄存器的概念进一步泛化,不再是指具体的物理寄存器,也可能是一块内存区域。Modbus寄存器根据存放的数据类型以及各自读写特性,将寄存器分为4个部分,这4个部分可以连续也可以不连续,由开发者决定。

寄存器种类数据类型访问类型功能码含义线圈状态(Coil Status)位读写0x01 0x05 0x0FPLC的输出位,开关量0x离散输入状态(Input Status)位只读0x02PLC的输入位,开关量1x输入寄存器(Input Register)字只读0x04PLC中只能从模拟量输入端改变的寄存器4x保持寄存器(Holding Register)字读写0x03 0x06 0x10PLC中用于输出模拟量信号的寄存器3x 4 功能码

Modbus 功能码分三类:公共功能码、用户定义功能码、保留功能码。

Modbus 的常用公共功能码有:

功能码名称英文名位操作/字操作操作数量0x01读线圈状态READ COIL STATUS位操作单个或多个0x02读离散输入状态READ INPUT STATUS位操作单个或多个0x03读保持寄存器READ HOLDING REGISTER字操作单个或多个0x04读输入寄存器READ INPUT REGISTER字操作单个或多个0x05写单个线圈状态WRITE SINGLE COIL位操作单个0x06写单个保持寄存器WRITE SINGLE REGISTER字操作单个0x0F写多个线圈WRITE MULTIPLE COIL位操作多个0x10写多个保持寄存器WRITE MULTIPLE REGISTER字操作多个 字节序及数据类型

字节序分类:

存储模式data_fromat前缀说明大端模式>数据的高字节保存在寄存器的低地址中,数据的低字节保存在寄存器的高地址中小端模式f 中的 > 表示大端模式,f表示1个float,共有4个字节,占用2个寄存器。

>dd 中的 > 表示大端模式,dd表示两个double,共有16个字节,占用8个寄存器。

5 Python示例

Java 的 modbus4j、Python 的 modbus_tk 等第三方库对 modbus 做了很好的封装,开发者通常不需要关注请求、响应、错误的报文解析,第三方库已经根据功能码、数据类型、数据数量等对报文进行了解析。

下面是 Python3 的 modbus 使用示例:

import modbus_tk.modbus_tcp as mt import modbus_tk.defines as cst if __name__ == '__main__': master = mt.TcpMaster('127.0.0.1', 502) master.set_timeout(5) # 参数说明 # slave: Modbus从站地址. from 1 to 247. 0为广播所有的slave # function_code:功能码 # starting_address:寄存器起始地址 # quantity_of_x:寄存器读写的数量,写寄存器时数量可为 0,读寄存器时数量至少为 1; 一个寄存器=2字节, 1字节=8位 # output_value:输出内容,读操作无效,写操作是一个整数或可迭代的list值:1 / [1,1,1,0,0,1] / xrange(12) # data_format:对数据进行格式化 >表示大端模式,


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3