签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
怎么用S7-1200用SCL语言写CRC检验码
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1517404&b_id=50&s_id=0&num=6
之前论坛一个大师写的,名字不记得了,今天分享给你:
FUNCTION FC16 : WORD
// ModBus CRC16算法
CONST
ARRAY_COUNT := 32;
END_CONST
VAR_INPUT
Byte_Array : ARRAY[0..ARRAY_COUNT-1] OF BYTE;
Count : INT;
END_VAR
VAR_TEMP
CRC16Lo, CRC16Hi, CL, CH, UseHi, UseLo: WORD;
i, index: INT;
CRC16Lo := 16#FF; //CRC16Lo为CRC寄存器低8位
CRC16Hi := 16#FF; //CRC16Hi为CRC寄存器高8位
CL := 16#01;
CH := 16#A0; // A001 H 是CRC-16多项式代码
FOR i := 0 TO Count-1 DO
CRC16Lo := CRC16Lo XOR Byte_Array[i]; //每一个数据与CRC寄存器异或
FOR index := 0 TO 7 DO
UseHi := CRC16Hi;
UseLo := CRC16Lo;
CRC16Hi := SHR (IN:=CRC16Hi, N:=1);
CRC16Lo := SHR (IN:=CRC16Lo, N:=1); //右移一位
IF ((UseHi AND 16#1) = 16#1) THEN //如果高位字节最后一位是1的话
CRC16Lo := CRC16Lo OR 16#80; //低位字节右移后前面补1
END_IF;
IF ((UseLo AND 16#1) = 16#1) THEN //如果LSB 为1,则与多项式进行异或
CRC16Hi := CRC16Hi XOR CH;
CRC16Lo := CRC16Lo XOR CL;
END_FOR;
FC16 := SHL(IN:=CRC16Lo, N:=8) OR CRC16Hi;
END_FUNCTION
LGF里面有现成的校验方法。
谢谢!已解决
http://blog.sina.com.cn/s/blog_556b9e3c0102ynda.html
用记事本保存为XXX.scl,按照上述网站方案,添加外部文件,生成块后调用就可以,非常感谢!技术大伽们!
查表法是不是会更快点
查表法怎么弄呢?
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录