| 作者 | 主题 |
|---|---|
|
eq 游民 经验值:60 发帖数:6 精华帖:1 |
楼主
主题:crc校验
单位需要与3台ABBY变频器通讯,又要跟1台三菱伺服通讯,搞了二天,crc值g一直有问题,跪请各位大侠指点迷津,
#j:=0 ; FOR #j:=0 TO (#字节数-1) DO #crc_value:=PEEK(area:=b#16#84, dbNumber:=#输入起始地址, byteOffset:=#j) ; #crc_value:= #crc_value XOR 16#ffff ; FOR #i:= 0 TO 7 DO #flag := #crc_value AND 16#0001 ; #crc_value:=SHR(IN:=#crc_value, N:=1); IF #flag=0 THEN #crc_value:= #crc_value XOR 16#00; ELSE #crc_value:= #crc_value XOR 16#a001; END_IF; END_FOR; #j:= #j+1; END_FOR; |
|
eq 游民 经验值:60 发帖数:6 精华帖:1 |
2楼
主题:回复:crc校验
自己搞定了,分享一下
FUNCTION "CRC校验" : Void { S7_Optimized_Access := 'TRUE' } VERSION : 0.1 VAR_INPUT db_no : DInt; // 数据块号 db_offset : DInt; // 数据块起始位置 length : Int; // 字节个数 END_VAR VAR_OUTPUT low_crc : Byte; high_crc : Byte; END_VAR VAR_TEMP i : Int; j : Int; data_value : Byte; // 需要发送的数据字节 crc_value : Word; flag : Word; END_VAR BEGIN #crc_value:=16#ffff;//预置CRC寄存器 FOR #j:=0 TO (#length-1) BY 1 DO #data_value:=PEEK(area:=b#16#84, dbNumber:=#db_no, byteOffset:=(#j+#db_offset));//第一个8位二进制数据 #crc_value:= #data_value XOR #crc_value;// 把第一个8位二进制数据(既通讯信息帧的第一个字节)与CRC寄存器相异或 FOR #i:= 0 TO 7 BY 1 DO IF (#crc_value AND 16#0001)=0 THEN//移出位为0,把CRC寄存器的内容右移一位 #crc_value:=SHR(IN:=#crc_value ,N:=1); ELSIF (#crc_value AND 16#0001)=1 THEN//移出位为1,CRC寄存器与多项式A001进行异或,再右移一位 #crc_value:=SHR(IN:=(#crc_value),N:=1)XOR 16#a001; END_IF; END_FOR; END_FOR; #low_crc:=WORD_TO_BYTE(#crc_value AND 16#00ff); #high_crc:=WORD_TO_BYTE(SWAP(#crc_value AND 16#ff00)); END_FUNCTION |