Modbus TCP

关于Modbus

Modbus 本身就是一种讯息交换的规范,而Modbus TCP 则是透过TCP/IP 来实现Modbus 的一种方式,因此所有的讯息都是透过TCP/IP 来传输。

Modbus 属于Client/Server 架构,在工业上会有一个Server 来存放所有要被读取的工业设备数据,如温度、湿度、距离等资料;而Client 则会传送一定的讯息格式当做指令,来读取设备资料(读),或是叫设备去做些什么事情(写)。

无论是对Modbus Server 发送读或写的指令,Server 都会回传一个确认讯息,让Client 知道指令是否成功。整个Modbus 的沟通就是建构在这个一来一回的讯息交换上。

在传输过程中,Client 与Server 的讯息最少会有「Function Code」与「Data」两个部分:

  • Function Code:代表要执行的动作代码,如读取或写入。
  • Data:代表执行动作代码的相关参数,例如读取某个位址上的资料,或是回传某个位址上的资料作为结果。

Function Code 和Data 是整个Modbus 沟通最基本的单元,也称为Protocol Data Unit (PDU)。

除此之外,根据传输方式不同可能还会再头尾加上一些附加资讯,附加后的整个讯息称为Application Data Unit (ADU)。

Modbus 定义了许多的内建的Function Code,每个Function Code 伴随着特定规则的Data,在阅读文件时,可以跟具我们要处理的Function Code 找到对应的Data 规则。

Modbus TCP封包格式

Port

Modbus TCP 规范预设的连接port 号为502。

Header格式

所有的Modbus TCP 讯息都会一组固定7 个bytes 的Header,它的规则如下:

  • Transaction Identifier (2 bytes): 用来识别这次送出的封包代码,通常会是一个连续的数字,之后Server 回传时也会包含这个代码。
  • Protocol Identifier (2 bytes): 用来识别这个封包是使用哪个协定,Modbus TCP 的协定代码是0,所以固定就好,同时Server 也会回传一样的内容。
  • Length (2 bytes): 用来表示这个接下来资料的长度(bytes);Client 和Server 回传的内容通常不同,所以header 中的length 在Client 和Server 内容通常也不会相同。
  • Unit Identifier (1 byte): 当设备后面有串连多个设备时,用来记录这个封包是要传送给哪个设备;Server 会回传一样的内容。

Function Code

Function Code 用来告诉Server 要执行什么动作,只会站一个byte。

Data

Data 就是实际上要传送的资料,长度会根据Function Code 的规则而定。

在写程序时需要管理超时,应对可能不会出现的应答

对于串行链路通信来说 TCP MODBUS ADU=249字节 + MBAP(7字节)= 256字节

最后修改:2023 年 03 月 16 日
如果觉得我的文章对你有用,请随意赞赏