作为工程师,经常会用到各种品牌的设备,PLC等。而且在现场,经常会遇到不同设备之间需要走通讯的需求,但不同公司的设备支持的协议不尽相同。类似于来自不同国家的学生在同一公司协同工作,这时候我们怎么才能做到让不同的人能相互理解别人的意思呢?以往经常使用的方式是采用安装第三方或厂家自带的协议转换模块。类似于给设备安装不同的翻译器。这时候会增加很多成本,让预算紧张的项目雪上加霜。这时,有一个不成熟的想法在脑海中成型,既然物理口一样,要么是RS485,要么RJ45,要么CAN等,那我们是不是可以利用自带的功能,实现协议的相互认识?说干就干,接下来,让我们以Modbus为例,理解如何使用PLC自带功能实现不同厂家PLC之间的协议的解析及转达。
第一步:解读Modbus协议Modbus通信协议由Modicon公司(现已经为施耐德公司并购,成为其旗下的子品牌)于1979年发明的,是全球最早用于工业现场的总线规约。由于其免费公开发行,使用该协议的厂家无需缴纳任何费用,Modbus通信协议采用的是主从通信模式(即Master/Slave通信模式),其在分散控制方面应用极其广泛,从而使得Modbus协议在全球得到了广泛的应用。
1、Modbus协议解析
1.1ModbusRTU协议中的指令由地址码(1Byte),功能码(1Byte),起始地址(2Byte),数据(N个Byte),校验码(2Byte)五个部分组成,其中数据又由数据长度(2Byte,表示的是寄存器个数,假定内容为M)和数据正文(M乘以2个Byte)组成,而且RTU协议是采用3.5个Byte的空闲时间作为指令的起始和结束,一般而言,只有当从机返回数据或者主机写操作的时候,才会有数据正文,而其他时候比如主机读操作指令的时候,没有数据正文,只需要数据长度即可。

Modbus通用帧
1.2ModbusTCP协议是在RTU协议上加一个MBAP报文头,由于TCP是基于可靠连接的服务,RTU协议中的CRC校验码就不再需要,所以在ModbusTCP协议中是没有CRC校验码,用一句比较通俗的话说就是:ModbusTCP协议就是ModbusRTU协议在前面加上五个0以及一个6,然后去掉两个CRC校验码Byte就OK了。
2、长度计算:
早期串行链路上MODBUS执行的长度约束限制了MODBUSPDU大小(最大RS485ADU=256Byte).因此可以得到RTU及TCP的长度:
RTUMODBUSADU=253Byte+从站地址(1Byte)+CRC(2Byte)=256Byte。
TCPMODBUSADU=249Byte+MBAP(7Byte)=256Byte。
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异常码。
ModbusTCP与ModbusRTU协议转换实例对比:
发送:

接收

3、超时时间计算:该计算与波特率、设备运算能力、数据量等参数相关,本文主要以TCP为主,这里就不做赘述。有感兴趣的小伙伴们可以自行了解。
第二步:实例解读本文以RA官网提供的Demo程序进行ModbusTCPSlave梯形图实现解读。
1、前提准备
实验设备:
硬件:
ABPLC:1769-L33ERM
西门子PLC:S7-1517
编译PC:DELLLatitudeE5501
软件:
ModbusSlavePC端仿真:Modsim
ModbusMasterPC端仿真:Modscan
ABPLC程序编译环境:
西门子PLC程序编译环境:TIAV16
注意点:
1、ModbusTCP任务放在50-100ms的低优先级周期任务
2、西门子PLC可使用MB_SERVER及MB_CLIENT进行ModbusTCP通讯。
2、ABPLC程序流程
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程序进行讲解如何使用ABControlLogix及CompactLogix系列PLC通过Socket方式进行ModbusTCP协议编写。由此可类比可制作其他基于Socket协议的协议解析及通讯。