| 作者 | 主题 |
|---|---|
|
妍妍 游士 经验值:261 发帖数:149 精华帖:0 |
楼主
主题:贴一段CRC校验程序,请看看哪里有错误?
将论坛里“学生在此”用户贴出的程序做了一些改动,用逐位法计算CRC,同样的程序在单片机里计算出来的CRC校验码跟PLC计算出的不一样,用网上下载的CRC校验软件得出的结果与单片机运行结果一样,不知道哪里出错了,希望大家指点指点!G(X)简记为1021.
FUNCTION_BLOCK "WCRC_FB" TITLE = VERSION : 0.1 VAR_INPUT db_no : INT ; dbb_no : INT ; byte_len : INT ; END_VAR VAR_OUTPUT wcrc : WORD ; END_VAR VAR old_wcrc : WORD ; c : BYTE ; j : INT ; END_VAR VAR_TEMP db_no1 : INT ; END_VAR BEGIN NETWORK TITLE = L #db_no T #db_no1 OPN DB [#db_no1] // 发送指令的起始字节放在指针AR1中 L #dbb_no LAR1 //初始化old_wcrc=0xffff; L W#16#FFFF T #old_wcrc // 进入大循环,byte_len:需要计算CRC的字节个数 loop: L #byte_len L 0 <=I JC end //c:字节 L DBB [AR1,P#0.0] T #c //字节与crc寄存器异或 L #old_wcrc L #c XOW T #old_wcrc //j:位个数 L 0 T #j //判断一个字节是否计算完,j是否为8 a: L #j L 8 >=I JC b //得到lsb位 L #old_wcrc L W#16#1 AW //判断lsb,为1:右移一位;为0:右移一位与1021异或。位指针加1 JZ c L #old_wcrc SRW 1 L W#16#1021 XOW T #old_wcrc c: L #old_wcrc SRW 1 T #old_wcrc L 1 L #j +I T #j JU a b: L -1 L #byte_len +I T #byte_len //指向下一个字节 +AR1 P#1.0 //输出最终的CRC值 JU loop end: L #old_wcrc T #wcrc BE END_FUNCTION_BLOCK |
|
dcount107 侠圣 经验值:2840 发帖数:1737 精华帖:55 |
3楼
主题:回复:贴一段CRC校验程序,请看看哪里有错误?
在判断lsb位的时候犯了一个小小的错误,呵呵
//得到lsb位 L #old_wcrc L W#16#1 AW //判断lsb,为1:右移一位;为0:右移一位与1021异或。位指针加1 JZ c L #old_wcrc SRW 1 L W#16#1021 XOW T #old_wcrc ju d c: L #old_wcrc SRW 1 T #old_wcrc d: nop 0
非淡泊无以明志,非宁静无以致远
|