最近笔者接了一个工控系统,其中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封包来做解说。
上图为, 由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 通讯协定
原文地址:https://www.cnblogs.com/chinatrump/p/11516503.html