西门子SMART200PLC如何实现CRC-CCITT(Xmodem)检验
作者:互联网
最近做一个项目客户需要把工业现场层的数据上传到控制中心,中间有个协议转换网关是串口转 MVB 从站网卡
S7-200SMART PLC和网卡自由协议通讯,校验计算方式为CRC,在网上搜了半天,发现有哥们儿已经通过梯形图编写出来了CRC检验子程序,于是拿来测试。
编完后发现,结果始终和协议报文说明不一致。
于是找了一个CRC在线生成器比对着客户提供的网关说明书中的案例计算发现也不对,后来仔细阅读发现, 上述图片表达的是CRC16(MODBUS)算法,才知道原来CRC校验也分很多种。
比如:
CRC-16 | 0xB55B |
CRC-16 (Modbus) | 0xB57F |
CRC-16 (Sick) | 0xAC51 |
CRC-CCITT (XModem) | 0xE08C |
CRC-CCITT (0xFFFF) | 0xF180 |
CRC-CCITT (0x1D0F) | 0x1142 |
CRC-CCITT (Kermit) | 0x4A86 |
CRC-DNP | 0xFA0C |
CRC-32 | 0x86DA17D |
网关需求的是CRC-CCITT(XModem)类型,于是在论坛中搜了一下此种校验方式的C语言表达
如下:
u16 CRC_XModem(__IO u8 para[])
{
u16 crc = 0x00;
u16 polynomial = 0x1021;
u16 index,i;
u8 b;
u16 bit;
u16 c15;
u16 len;
len = (para[2]-2);
for(index = 0 ; index<len; index++)
{
b = para[index];
for(i = 0; i < 8; i++)
{
bit = (((b>>(7-i))&1) == 1);
c15 = (((crc>>15)&1) == 1);
crc <<= 1;
if(c15 ^ bit)
{
crc ^= polynomial;
}
}
}
crc &= 0xffff;
return crc;
}
将以上C表达通过西门子S7 200 SMART PLC子程序的方式再次表达出来,测试OK!!!
很开心,分享给大家!!!。
熟悉IT高级语言和工控PLC是越来越重要的事情!!!
标签:index,CCITT,SMART200PLC,crc,校验,CRC,u16 来源: https://blog.csdn.net/ZHAOMENG_1/article/details/120346774