CRC校验计算流程:
1).预置16位的CRC寄存器为0xFFFF;
2).把要计算的第一个字节数据的低八位与CRC寄存器相异或,结果放在CRC寄存器;
3).把CRC寄存器的数据向右移一位,然后用0填补最高位;
4).判断CRC寄存器右移后的溢出位:
如果为1,用CRC寄存器数据与多项式0xA001异或,结果放在CRC寄存器;
如果为0,则CRC寄存器数据不变;
5).重复第三和第四步,直到右移8次,这样要计算的第一个8位数据就全部都进行了处理;
6).重复第二到第五步,直到所有要计算的的数据都处理过;
7).把最终的CRC寄存器的高低字节进行交换,得到的内容即为CRC码.
一).打开三菱GX Works2软件,工程>新建>工程类型选择<简单工程>,勾选<标签>,程序语言选择<梯形图>,点击<确定>;
二). 双击打开<全局标签>和<局部标签>;
三).在<局部标签>中添加以下标签:
四).在<全局标签>中添加以下标签:
五).编写主程序:
添加ST框:在需要添加的地方右击>编辑>内嵌ST框插入,即可;
CRC计算ST程序语句:
(*CRC校验计算*)
缓冲循环:=0;
字节循环:=0;
CRC_INIT:= 16#FFFF;(*CRC初始值*)
CRC_POLY:=16#A001;(*多项式:把0x8005的位左右颠倒过来就是0xA001*)
FOR 缓冲循环:=0 TO 计算数量-1 BY 1 DO (*计算所有数据*)
WAND(M8000,计算缓冲[缓冲循环],16#0FF,缓冲低八位);(*取出低八位数据*)
WXOR(M8000,CRC_INIT,缓冲低八位,CRC_INIT); (*低八位和CRC寄存器进行异或*)
FOR 字节循环:=0 TO 7 BY 1 DO (*每个字节八位都要计算*)
WAND(M8000,CRC_INIT,16#0001,溢出位); (*先取出最低的溢出位*)
ROR(M8000,1,CRC_INIT); (*CRC寄存器先整体右移一位*)
WAND(M8000,CRC_INIT,16#7FFF,CRC_INIT); (*然后最高位用0填充*)
IF 溢出位 = 1 THEN (*判断溢出位如果是1,和A001进行异或*)
WXOR(M8000,CRC_INIT,CRC_POLY,CRC_INIT);
ELSE; (*如果不是1,结果不变*)
END_IF;
END_FOR;
END_FOR;
WAND(M8000,CRC_INIT,16#00FF,CRC高字节); (*取高字节*)
WAND(M8000,CRC_INIT,16#FF00,CRC低字节); (*取低字节,还需要右移8位*)
ROR(M8000,8,CRC低字节);
六).转换+全部编译,然后下载进PLC;
七).进入监视模式,设置D0=3,D1=1,D2=2,D3=3,再设置M2=ON,送入测试数据;
八).设置M1=ON,计算CRC校验数据,观察得出的结果和CRC在线工具计算出来的结果是否一致;