运维开发网

[Modbus] 如何看懂 Modbus TCP 通讯协定

运维开发网 https://www.qedev.com 2020-07-21 09:26 出处:网络 作者:运维开发网整理
最近笔者接了一个工控系统,其中PLC所使用的是Modbus TCP的通讯协定。 由于这个部分因为从来没有接触过,所以花了一点时间研究。 趁著现在记忆犹新,赶紧写下来,方便日后对照,也让读者们能够快速看懂Modbus TCP协定。 Modbus为工业上常用的通讯协定之一,也是目前工业领域通讯协定常用的标准协定。 一般来说,Modbus主要可以再细分为两种协定(Modbus?RTU?、Modbus A

最近笔者接了一个工控系统,其中PLC所使用的是Modbus TCP的通讯协定。

由于这个部分因为从来没有接触过,所以花了一点时间研究。

趁著现在记忆犹新,赶紧写下来,方便日后对照,也让读者们能够快速看懂Modbus TCP协定。

Modbus为工业上常用的通讯协定之一,也是目前工业领域通讯协定常用的标准协定。

一般来说,Modbus主要可以再细分为两种协定(Modbus?RTU?、Modbus ASCII 、Modbus TCP)

Modbus?RTU?是一种为使用二进制表示法来进行数据的传递与交换,也是比较多人使用的,因为方便,也不需要转换为ASCII

Modbus ASCII 则是一种对于人类来说,可读性较高的协定。

而以上两种方式在传递数据的结尾皆需要加上 CRC (错误检查机制)。

其中 Modbus 也可以借由以太网路 TCP/IP 的方式来进行传递数据,叫做?Modbus TCP

也是我们今天主要要介绍的协定。

此种通讯格式不需要计算CRC,取而代之的是使用识别码的方式来进行数据验证。

在学习 Modbus协定之前,我们需要先了解每一个Byte各代表的意思为何

以下为 Modbus TCP request 的封包格式:

TCP Header Address Function Code Start register addr data
6bytes 1byte 1byte 2byte N bytes
TCP Header

其中我们会发现?TCP Header 一共占了6Byte

这6个Byte主要是由三个字段所组成,每一个字段都占2Byte

本次通讯的识别码(Transaction ID):会产生2个Byte的随机值,用来识别该次通讯。

通讯方式(Protocal ID):基本上都是0,用来表示采用哪种通讯协定。0表示为 Modbus / TCP

数据长度(Length):用来定义从Address开始 ~ data字段结束,所占的总长度为何。

Address

共占1Byte,用来记录该次通讯要存取?slave端位址

Function Code

共占1Byte,用来定义该次通讯是要做哪种操作。

其中常见的Function Code有以下几种:

01: 读取当前 digital out status

02: 读取当前 digital input status

03: 读取当前 analog out status

04: 读取当前 analog input status

05: 写入单个??digital out value

06: 写入单个??analog out value

15: 写入多个??digital out value

16: 写入多个??analog out value

Start register addr

共占2Byte,用来定义寄存器起始位址

data

长度为非固定,由传送的数据长度而定。

以上为每一个字段的解说,接下来笔者撷取了一张从WireShark所侧录到的 Modbus封包来做解说。

[Modbus] 如何看懂 Modbus TCP 通讯协定

上图为, 由WireShark所侧录到的Modbus封包,用来开启LED指示灯的控制代码。

从ac开始到 01结束是整个Modbus的封包内容。

封包内容如下:ac 70 00 00 00 06 58 06 00 c8 00 01

其中我们刚刚有说到,Modbus的Header 共占 6Byte,也就是:

本次通讯的识别码(Transaction ID):ac 70

通讯方式(Protocal ID):00 00

数据长度(Length):00 06 ?其中?06代表接下来一共有 6Byte的封包内容

上述的三个字段均为Modbus的Header,每一个都占2Byte,共占6Byte。

slave端位址(Address):58?

操作码(Function Code):06 代表写入单一数值

寄存器起始位址(Start register addr):00 c8?

传送数据(Data): 00 01

最后,附上一张Modbus控制的表格来做个结束。

操作码 06: 写入LED开灯资讯

Transaction ID Protocal ID Length Address Function Code Start register addr Data
ac 70 00 00 00 06 58 06 00 c8 00 01

意思为:Master要求写入数据到设备位址58的寄存器位址 00c8,写入的资讯为 00 01。

以上文章叙述如有错误及观念不正确,请不吝啬指教:)

有任何家教、案子 或技术相关问题 请都欢迎联系我

http://www.zhenghui.idv.tw/

原文:大专栏  [Modbus] 如何看懂 Modbus TCP 通讯协定

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号