反复探究Modbus TCP协议它是如何与众多通讯协议共存的
深入解析Modbus TCP通信机制:揭秘其与众多通讯协议共存的奥秘
在工业自动化领域,Modbus总线以其三种主要协议——Modbus RTU、Modbus ASCII和Modbus TCP而闻名。这些协议各自擅长不同的通信方式,RTU和ASCII适用于串行通信,如RS485或RS232,而TCP则专注于以太网传输。由于底层结构差异,每种应用数据单元(Application Data Unit, ADU)都有所不同。
为了实现数据交换,Modbus定义了一个称为“Protocol Data Unit”(PDU)的简单数据结构。这一单元由功能码和数据组成,功能码长度为1字节,表示要执行的操作;数据部分长度可达252字节,以0开始,不同功能码对应不同的数据格式。例如,对于读取线圈的01功能码,其后跟随4个字节,其中前两个字节指明要读取的地址,以及后面两位代表要读取数量;对于05写入线圈的命令,其后也跟随4个字节,但前两个指明写入地址,后两位是待写入值。
PDU分为请求型、应答型及异常应答型三种类型,并且不论是哪一种物理网络支持,它们都使用相同的PDU格式。不过,由于需要映射到物理网络上,这导致ADU结构因底层网络差异而变化。在串行链路下,如RTU和ASCII,在TCP/IP环境中如TCP的情况下,都有各自独特的ADU构造。
对于TCP/IP版本,即使在ADU基础上添加MBAP头部(MBAPHeader),这也是唯一区别之处。每个MBAP头由7个字符构成:
传输标识符,为配对请求与响应提供标识;
协议标识符系统间用以辨认;
长度字段指示接下来要发送信息长度,以字节计;
单元标识符供寻址用途,比如在以太网+串行链路中的远程站点地址。
最后,我们来探讨一下为什么没有IP地址和端口号出现,这是因为它们属于更低级别的传输层/网络层,而不是应用层级别。而我们所说的MODBUS-TCP实际上是在TCP/IP协议栈上的应用程序的一部分,因此它会将自己的消息封装进更低级别协议,然后通过套接口(Sockets)进行编程实现。在PLC编程时,大多数厂家已经将底层逻辑封装成了库函数,只需调用即可。但若从PC进行编程,则需要使用Socket技术来完成这一过程。此外,还有一点不可忽视的是,当你使用MODBUS-TCP进行通信时,你应该确保端口号502不会被其他程序占用。