如何使用PLC自带功能实现不同厂家PLC之间的协议的解析及转达

2021-11-09 15:26:56 浏览数 (1)

JZGKCHINA

工控技术分享平台

尊重原创 勿抄袭

勿私放其他平台

作为工程师,经常会用到各种品牌的设备,PLC等。而且在现场,经常会遇到不同设备之间需要走通讯的需求,但不同公司的设备支持的协议不尽相同。类似于来自不同国家的学生在同一公司协同工作,这时候我们怎么才能做到让不同的人能相互理解别人的意思呢?

以往经常使用的方式是采用安装第三方或厂家自带的协议转换模块。类似于给设备安装不同的翻译器。这时候会增加很多成本,让预算紧张的项目雪上加霜。

这时,有一个不成熟的想法在脑海中成型,既然物理口一样,要么是RS485,要么RJ45,要么CAN等,那我们是不是可以利用自带的功能,实现协议的相互认识?说干就干,接下来,让我们以Modbus为例,理解如何使用PLC自带功能实现不同厂家PLC之间的协议的解析及转达

第一步:解读Modbus协议

Modbus通信协议由Modicon公司(现已经为施耐德公司并购,成为其旗下的子品牌)于1979年发明的,是全球最早用于工业现场的总线规约。由于其免费公开发行,使用该协议的厂家无需缴纳任何费用,Modbus通信协议采用的是主从通信模式(即Master/Slave通信模式),其在分散控制方面应用极其广泛,从而使得Modbus协议在全球得到了广泛的应用。

1、Modbus协议解析

1.1 Modbus RTU协议中的指令由地址码(1Byte),功能码(1Byte),起始地址(2Byte),数据(N个Byte),校验码(2Byte)五个部分组成,其中数据又由数据长度(2Byte,表示的是寄存器个数,假定内容为M)和数据正文(M乘以2个Byte)组成,而且RTU协议是采用3.5个Byte的空闲时间作为指令的起始和结束,一般而言,只有当从机返回数据或者主机写操作的时候,才会有数据正文,而其他时候比如主机读操作指令的时候,没有数据正文,只需要数据长度即可。

Modbus 通用帧

1.2 Modbus TCP协议是在RTU协议上加一个MBAP报文头,由于TCP是基于可靠连接的服务,RTU协议中的CRC校验码就不再需要,所以在Modbus TCP协议中是没有CRC校验码,用一句比较通俗的话说就是:Modbus TCP协议就是Modbus RTU协议在前面加上五个0以及一个6,然后去掉两个CRC校验码Byte就OK了。

2、长度计算:

早期串行链路上MODBUS 执行的长度约束限制了MODBUS PDU大小(最大RS485 ADU=256Byte).因此可以得到RTU及TCP的长度:

  • RTU MODBUS ADU = 253Byte 从站地址(1Byte) CRC (2 Byte) = 256 Byte。
  • TCP MODBUS ADU = 249Byte MBAP (7 Byte) = 256 Byte。

MODBUS 协议定义了三种 PDU。它们是:

  • MODBUS 请求 PDU,mb_req_pdu
  • MODBUS 响应 PDU,mb_resp_pdu
  • MODBUS 异常响应 PDU,mb_excep_resp_pdu

定义 mb_req_pdu 为:

  • mb_req_pdu = { function_code, request_data},其中
  • function_code - [1个Byte] MODBUS 功能码
  • request_data - [n个Byte],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。

定义 mb_resp_pdu 为:

  • mb_resp_pdu = { function_code, response_ data},其中
  • function_code - [1个Byte] MODBUS 功能码
  • response_data - [n 个Byte],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。

定义 mb_excep_resp_pdu 为:

  • mb_excep_resp_pdu = { function_code, request_data},其中
  • function_code - [1个Byte] MODBUS 功能码 0x80
  • exception_code - [1个Byte],在下表中定义了 MODBUS 异常码。

Modbus TCP与Modbus RTU协议转换实例对比:

发送:

接收

3、超时时间计算:该计算与波特率、设备运算能力、数据量等参数相关,本文主要以TCP为主,这里就不做赘述。有感兴趣的小伙伴们可以自行了解。

第二步:实例解读

本文以RA官网提供的Demo程序进行Modbus TCP Slave梯形图实现解读。

1、前提准备

实验设备:

硬件:

  • AB PLC :1769-L33ERM
  • 西门子PLC :S7-1517
  • 编译PC :DELL Latitude E5501

软件:

  • Modbus Slave PC端仿真:Modsim
  • Modbus Master PC端仿真:Modscan
  • AB PLC程序编译环境:Studio5000 V32.11
  • 西门子PLC程序编译环境:TIA V16

注意点:

1、ModbusTCP 任务放在50-100ms的低优先级周期任务

2、西门子PLC可使用MB_SERVER 及MB_CLIENT 进行Modbus TCP通讯。

2、AB PLC程序流程

2.1:清空链接

2.2:创建Socket链接

2.3:Socket参数设定

2.4:获取网卡连接数

2.5:创建接收连接

2.6:Socket数据读取:读取到MBTI_Read_Resp字符组

2.7:协议解析和封装:

2.7.1:判断接收字符串是否为标准modbus格式

2.7.2:解析读取到的Modbus字符串,并根据命令字,利用不同标签进行应答数据处理

2.7.3:根据命令进行不同处理,线圈跳转到线圈处理处;寄存器跳转到寄存器处理处;

2.7.4:根据需要读取的起始地址、长度、将对应数据获取出来并复制到发送缓存区;

2.7.5:数据打包,将PDU打包成ADU

2.8 :Socket数据发送:将MBTI_Write_Data_Out数据发送到Socket

以上是实例是根据RA官网提供的Demo程序进行讲解如何使用 AB ControlLogix及CompactLogix系列PLC通过Socket方式进行Modbus TCP协议编写。由此可类比可制作其他基于Socket协议的协议解析及通讯。

协议解析类似于套娃行为,主要行为为创建连接,设定连接参数、等待连接、确认连接、获取数据包、按套娃模式一步步解包,根据命令及需求对协议进行解包分析、根据来的命令包,根据数据包进行数据转化,执行,并将处理完的数据进行指定格式封装后进行响应。遇到未知数据包则丢弃,等待下一数据包。超时后关闭连接,并重启链接。

此案例以简单的Modbus做解析,更好的理解协议的执行流程,相同思路可用于上位机协议栈开发、远程通讯等方式。当然程序过程中还有更多需要考虑的问题,需要考虑互斥、原子性、唯一性、同步、异步、批量等处理。后续如果有感兴趣,我会继续进行相关讲解。

第一次编写此类文章,如有不对,欢迎帮忙指出其中问题。

总结

2021年3月

作者简介

Borje Zhou:

专业从事于提供工厂自动化及信息化解决方案。

0 人点赞