回复:CP340 modbus通讯编程

火麒麟

西门子1847工业学习平台

  • 帖子

    571
  • 精华

    18
  • 被关注

    20

论坛等级:侠圣

注册时间:2006-09-21

普通 普通 如何晋级?

发布于 2011-04-07 23:41:56

3楼

CP340,你自己可以写个CRC校验,那样就容易多了。
CRC校验算法:
1.预置16位寄存器为16进制FFFF,作为CRC寄存器;
2.把第一个字节与CRC寄存器的低位相异或,结果放在CRC寄存器;
3.把寄存器的内容右移一位,用0填补最高位,检查移出位;
4.如果移出位为0,重复第3步,如果最低位为1,CRC寄存器与多项式AOO1进行异或;
5.重复步骤3、4,直到右移8次,这样整个8位数据全部进行了处理;
6.重复步骤2-5,进行下一个字节的处理;
7.最后得到的CRC寄存器即为CRC校验码;
我写过一个CRC校验,现场用没发现问题。楼主可以参考一下:
自定义一个FC:
参数如下:
IN:
DB_NO:INT,DB块
DBB_Start:INT,字节起始地址
DBB_Counts:INT,要校验的字节数

OUT:
CRC_H:BYTE;
CRC_L:BYTE;

TEMP:
CRC_REG:WORD;
DB_NO_TEMP:INT;
BytesChecked:INT;
BitsChecked:INT;
程序如下:
L W#16#FFFF
T #CRC_REG //预置CRC寄存器
L #DB_NO
T #DB_NO_TEMP
OPN DB [#DB_NO_TEMP]
L #DBB_Start //读入校验起始字节
SLD 3
LAR1

L #DBB_Counts //读入校验字节数量
_A: T #BytesChecked //字节处理循环
L DBB [AR1,P#0.0]
L LB 1
XOW
T LB 1

L 8
_B: T #BitsChecked //位处理循环
L #CRC_REG
SRW 1
T #CRC_REG
JZ _C //检验移出位是否为1
L #CRC_REG
L W#16#A001
XOW
T #CRC_REG

_C: L #BitsChecked //校验下个位
LOOP _B

+AR1 P#1.0 //校验下个字节
L #BytesChecked
LOOP _A

L LB 1 //输出校验码
T #CRC_H
L LB 0
T #CRC_L
业精于勤,行成于思
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54652条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。