三菱FX3SA用ST语言编写CRC校验计算

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在线工具计算出来的结果是否一致;

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值