欧姆龙PLC_CP1H_CRC校验

1.简介

欧姆龙CP1H PLC的CRC校验。CP1H没有CRC校验指令或者功能块,在串口自由协议通信中,如果涉及到CRC校验,需要手动计算CRC值,本程序是一个输入数据,自动计算CRC校验码的程序。

Mov #xx D100   #号表示16进制数据

Mov &xx D100   &号表示10进制数据

2.关键指令

2.1 MOVD_数据传送

以位(4 位)单位进行传送,具体用法请查询CP1H编程手册,此处不做具体描述,仅举例说明。

例: D200=#AABB(16进制)

   D201=#0000

   D202=#0000

   MOVD D200 #0010 D201

   MOVD D200 #0212 D202

执行后 D201=#00AA

       D202=#BB00

扫描二维码关注公众号,回复: 7365988 查看本文章

2.2ASR_右移

数据右移一位,相当于原数据除以2. 具体用法请查询CP1H编程手册,此处不做具体描述,仅举例说明。

例:D200=#0003(二进制:0000 0000 0000 0011)

ASR D200

执行结果:D200=#0001(二进制:0000 0000 0000 0001)

2.3XORW_字异或运算

异或运算。字的异或运算。既位与位不同=1.

例:D200=#0001(二进制:0000 0000 0000 0001)

D201=#0003(二进制:0000 0000 0000 0011)

XORW D200 D201 D202

执行后D202=#0002(0000 0000 0000 0010)

2.4ANDW_字与运算

字内的位进行与运算,既两个位都为1则结过=1.

例:D200=#0001(二进制:0000 0000 0000 0001)

D201=#0003(二进制:0000 0000 0000 0011)

ANDW D200 D201 D202

执行后:D202=#0001(二进制:0000 0000 0000 0001)

2.5指针

此处严格来说,不应该叫指针,但是功能与指针类似,姑且称之为‘指针’。

此处指针仅针对D区域。

例如:MOV &1122 D100

      MOV &100 D200

此时,D200中数值为100.

 MOV @D200 D300

执行后,D300的值应为&1122而不是&100。因为@D200表示是将D200中的数据作为地址编号,把该地址里的内容传送给D300。相当于间接寻址。

这样的话有个优势,我仅对D200进行运算,就可对相应的数据区进行间接操作,在对地址是连续的数据处理非常方便。

2.6FOR…NEXT_循环指令

循环处理指令。具体用法不做阐述,仅以示例说明。

例:

MOV #0 D100

FOR 6

++ D100

NEXT

执行后D100=6.

需要注意的是,在循环指令未执行完前,一般FOR循环体外面的指令将不会执行(此处不严谨,仅仅是个人测试出来的)。

2.7 全局子程序

CRC校验程序放在全局子程序里,值得注意的是,全局子程序需要放在中断任务0里。如图2-1所示

图2-1 中断程序设置

3.程序简解

图3-1

GSBN 10:全局子程入口  编号10

W500.0:校验开始

D7000:开始指针。如数据从D200开始,则:MOV &200 D7000

D7002:结束指针。如数据在D205结束,则:MOV &205 D7002

D7005:CRC寄存器。

使用示例:

图3-2 字节校验示例

下面用调试软件验证下,校验是否正确

图3-3 调试软件校验

从调试软件看,似乎PLC程序计算出来的校验码5C86和调试软件计算出来的校验码865C不一致,没关系,如果需要CRC高低位互换,可以使用已经高低位互换过的值它保存在D7018中。

4.字校验

  字校验和字节校验一样,只不过把高8位和低位拆分出来分别计算而已。具体不做详述,请参照示例程序。

示例程序链接:https://pan.baidu.com/s/18oMd2YzUpfvRhK9RNkytnw

能力有限,部分解释的不是很清楚,还有可能有一些错误之处,欢迎大家指出。

有什么疑惑的地方,可留言交流。

猜你喜欢

转载自www.cnblogs.com/chenenfu/p/11578032.html