技术论坛

crc校验

作者 主题
eq
游民

经验值: 60
发帖数: 6
精华帖: 1
主题:crc校验


只看楼主 只看精华 楼主 2014-06-15 20:03:41
单位需要与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;
 
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1152168&b_id=50&s_id=0&num=8

eq
游民

经验值: 60
发帖数: 6
精华帖: 1
回复:crc校验


只看楼主 只看精华 楼主 1楼 2014-06-15 20:14:04
VAR_INPUT
输入起始地址:INT ;
字节数:INT;
END_VAR

VAR_OUTPUT
crc_value:WORD;
END_VAR
VAR_TEMP
flag:WORD
i, j:INT;
END_VAR

BEGIN
#j:=0 ;
FOR #j:=0 TO (#字节数-1) BY 1 DO
#crc_value:=PEEK(area:=b#16#84, dbNumber:=#输入起始地址, byteOffset:=#j) ;
#crc_value:= #crc_value XOR 16#ffff ;
FOR #i:= 0 TO 7 BY 1DO
#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;
ELSIF #flag=1 THEN
#crc_value:= #crc_value XOR 16#a001;
END_IF;
END_FOR;
END_FOR;
END_FUNCTION
 
以下网友喜欢您的帖子:

  
eq
游民

经验值: 60
发帖数: 6
精华帖: 1
回复:crc校验
精华帖精华帖星级2级


只看楼主 只看精华 楼主 2楼 2014-06-20 19:59:01
自己搞定了,分享一下

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
 
以下网友喜欢您的帖子:

  
至圣

经验值: 11781
发帖数: 2003
精华帖: 22
回复:crc校验


只看楼主 只看精华 3楼 2014-07-01 20:56:54
谢楼主的分享,怎么 没人顶下呢,可能大家用的系统自带的Modbus库多些!
 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2466
发帖数: 756
精华帖: 10
回复:crc校验


只看楼主 只看精华 4楼 2014-07-02 07:57:39
以下是引用刚刚入门在2014-07-01 20:56:54的发言 >3楼:谢楼主的分享,怎么 没人顶下呢,可能大家用的系统自带的Modbus库多些!
不是没人顶,crc校验老早有人(很多人)写过了,计算法和查表法都有

最后顶一下吧^_^
有生之年,狭路相逢,终不能幸免
以下网友喜欢您的帖子:

  
侠士

经验值: 1106
发帖数: 138
精华帖: 0
回复:crc校验


只看楼主 只看精华 5楼 2014-07-07 13:12:29
Peek和Pork是以字节为单位的,LZ一开始问题出在这里了
 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2684
发帖数: 633
精华帖: 4
回复:crc校验


只看楼主 只看精华 6楼 2014-11-27 00:02:41
太复杂了,还是用点现成的吧,但是感谢分享
S7
以下网友喜欢您的帖子:

  
侠士

经验值: 1237
发帖数: 253
精华帖: 2
回复:crc校验


只看楼主 只看精华 7楼 2014-11-27 08:49:24
SCL的CRC校验,不错的帖子,感谢楼主分享
每天进步一点点,成功源于积累!
以下网友喜欢您的帖子:

  
游民

经验值: 140
发帖数: 20
精华帖: 0
回复:crc校验


只看楼主 只看精华 8楼 2014-11-27 13:13:32
最近正在学习wincc的mscom控件来进行Modbus通讯,感谢楼主分享的CRC校验程序.....
 
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
crc校验
×
扫描打开手机版
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。