使用了modbus协议的程序,如何进行CRC校验

使用了modbus协议的PLC。上位机发送了一组数据,这组数据遵循modbus协议的格式,那么数据里边是有CRC校验的对吧。而下位机PLC需要对这组除了CRC校验码的那些数据,进行再次校验此时得到的校验码与接收来的CRC检验相比较。若相同则正确,若不同说明出现了数据遗失,则不让PLC产生响应。请问PLC处的CRC校验该怎么做呢?我modbus协议部分写好了。

最佳答案

方法1:计算法
 主程序:OB1
 Network 1 

 LD     M0.0
 EU

 CALL   SBR0, AC0                   /
 INCB   VB0
 INCB   VB0

 XMT    发送接收缓冲区, 0

 Network 2 
 LD     M0.1
 EU
 CALL   SBR0, AC0
 AW<>   AC0, +0
 MOVB   1, AC0

 
 SBR_0:SBR0
 VAR_OUTPUT
 crc:INT;
 END_VAR
 VAR
 count:INT;
 ptr:DWORD;
 END_VAR
 BEGIN
 Network 1 
 // MOVW   AC0, *#ptr  用于发送,直接将CRC写入发送缓冲区,然后mmodbusBufr加2。
 // 
 LD     SM0.0
 MOVW   16#FFFF, AC0                
 BTI    VB0, LW2                   
 MOVD   &VB0, LD4                  
 INCD   LD4                         

 FOR    AC2, +1, LW2                
 XORB   *LD4, AC0                  

 FOR    AC1, +1, +8                
 SRW    AC0, 1                     
 LD     SM1.1                       
 XORW   16#A001, AC0                
 NEXT                               

 LD     SM0.0
 INCD   LD4                        
 NEXT                              

 Network 2 
 // MOVW   AC0, #crc  用于接收
 // 如果程序无须接收,则可删除这一行,删除crc这个OUT参数。
 // 
 // 
 // 
 // MOVW   AC0, *#ptr  用于发送
 // 直接将CRC写入发送缓冲区,然后mmodbusBufr加2。
 // 如果程序无须发送,则可删除这一行。
 LD     SM0.0                     
 SWAP   AC0                         
 MOVW   AC0, LW0                   
 MOVW   AC0, *LD4                  

 Network 3 // 网络标题
 // 网络注释
 END_SUBROUTINE_BLOCK
 INTERRUPT_BLOCK INT_0:INT0
 TITLE=中断程序注释
 BEGIN
 Network 1 // 网络标题
 // 网络注释
 END_INTERRUPT_BLOCK

 
 方法2:查表法
 ORGANIZATION_BLOCK 主程序:OB1
 TITLE=和方法1不同的是多了个初始化,简化了CRC计算过程,缩短了时间。
 // 调用方法和方法1一样
 BEGIN
 Network 1 // 网络标题
 // 初始化CRC表,需要512个字节。VB2256---------VB2767
 LD     SM0.1
 CALL   SBR0
 Network 2 // 网络标题
 // 发送
 LD     M0.0
 EU

 CALL   SBR1, AC0                   //AC0在此无用
 INCB   VB2000
 INCB   VB2000

 XMT    发送接收缓冲区, 0

 Network 3 
 // 接收完成后检查接收的数据对错,如果计算结果为0,则说明传输正确。
 LD     M0.1
 EU
 CALL   SBR1, AC0
 AW<>   AC0, +0
 MOVB   1, AC0

 END_ORGANIZATION_BLOCK
 SUBROUTINE_BLOCK SBR_0:SBR0
 TITLE=子程序注释
 VAR
 index1:INT;
 index2:INT;
 END_VAR
 BEGIN
 Network 1 
 LD     SM0.0                      
 MOVD   &VB2256, AC3                
 MOVD   +0, AC2                     

 FOR    LW0, +1, +256              
 MOVW   AC2, AC0                    
 FOR    LW2, +1, +8                
 SRW    AC0, 1                     
 Network 2 
 LD     SM1.1                      
 XORW   16#A001, AC0               
 Network 3 
 NEXT                             
 Network 4 
 LD     SM0.0                      
 MOVW   AC0, *AC3                   
 INCW   AC2                      
 +I     +2, AC3                    
 Network 5 
 NEXT                            
 Network 6 // 网络标题
 // 网络注释
 END_SUBROUTINE_BLOCK
 SUBROUTINE_BLOCK SBR_1:SBR1
 TITLE=子程序注释
 VAR_OUTPUT
 crc:INT;
 END_VAR
 VAR
 count:INT;
 ptr:DWORD;
 END_VAR
 BEGIN
 Network 1 

 LD     SM0.0                      
 BTI    VB2000, LW2                
 MOVD   &VB2000, LD4              
 INCD   LD4                       
 XORD   AC0, AC0                    
 MOVD   16#FFFF, AC2                

 FOR    AC1, +1, LW2                
 MOVB   *LD4, AC0                 
 XORW   AC2, AC0                   
 ANDW   16#FF, AC0                
 SLW    AC0, 1                      
 MOVD   &VB2256, AC3                
 +I     AC0, AC3                   
 SWAP   AC2                        
 ANDW   16#FF, AC2                  
 XORW   *AC3, AC2                   
 INCD   LD4                       
 Network 2 
 NEXT                              
 Network 3 
 LD     SM0.0                       
 SWAP   AC2                         
 MOVW   AC2, LW0                    
 MOVW   AC2, *LD4                  
 Network 4 // 网络标题
 // 网络注释
 END_SUBROUTINE_BLOCK
 INTERRUPT_BLOCK INT_0:INT0
 TITLE=中断程序注释
 BEGIN
 Network 1 // 网络标题
 // 网络注释
 END_INTERRUPT_BLOCK

 
 

提问者对于答案的评价:
多谢了,好久不见了。可是程序没明白,有点乱。请问您有写在PLC软件上的程序吗?发给我吧。我的邮箱是jinzihan1984@sina.com

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc350577.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2021年7月5日
下一篇 2021年7月5日

相关推荐

  • 通讯口的问题?

    我用的CPU226,因为我要用一个口和屏通讯,一个口和变频器通讯,还有方法扩展一个口用电脑来在线监控吗? 最佳答案 不知道你所谓的在线监控是长期还是临时调试使用? 1如果…

    SIMATIC S7-200 2021年7月5日
  • 200USB编成电线可以给屏幕下程序用吗?

    请问下200的USB编程线,定货号码是6ES7-901-3BD30-0XA0这个电线可以把电脑中的组太下到KTP178中去吗?如果不可以是不是只有用232/485的了?有用过的告诉…

    SIMATIC S7-200 2021年7月5日
  • 有谁有画好的跟S7-200的连的CAD图吗

    发我一份非常感谢!943388503@qq.com 问题补充:200的模块图我都有,而且各种型号都很全!我的意思是输入输出连出来的很多元器件不知道怎么画,谢谢大家加我QQ&nbsp…

    SIMATIC S7-200 2021年7月5日
  • 编程软件选择

    64位Win7系统笔记本适合装哪个版本的PLC编程软件,便于以后修改程序。 钻石用户推荐最佳答案 你是什么PLC的啊?200的话,安装SP9版本就好200smart有2.3300的…

    SIMATIC S7-200 2021年7月5日
  • S7-200模拟量编程方法

    现在有一个压力传感器(0-35MPa)和温度传感器(-50-150度)接入S7-200中,由于初学,不太明白怎样写程序,想让专家给指点一下,希望输出为整数型怎么写?最好能给写个,示…

    SIMATIC S7-200 2018年12月5日
  • ET200 CAD图库

    请问谁有ET200 CAD图库  谢谢,找了好久找不到 钻石用户推荐最佳答案 https://www.automation.siemens.com/b…

    2021年7月5日
  • s7-200PLC与电脑的连接问题

    用USB/PPI电缆连接S7-200PLC时,点击通讯连接,报警不能找到指定访问点。更改PG/PC设置时报警不能更改访问路径。把PLC打到STOP,本地连接IP地址改为自动,还是出…

    2021年7月5日
  • s7-200与电脑通讯问题

    大家好,我想用一台台式电脑控制一台CPU222的启动I0.3、停止I0.2,电脑和PLC距离为500米,PLC一个485口,电脑和500米光仟线是线路上可利用的资源。这样走什么通讯…

    SIMATIC S7-200 2020年10月31日
  • EM253定位精度

    请教各位   用EM253控制安川伺服电机做往返运动,程序在向导生成,是相对脉冲数,各个参数设置都对。程序中用GOTO指今,往返运动时有时会多走一点,…

    SIMATIC S7-200 2020年11月1日
  • S7-200怎样通过EM277上传和下载程序

    因为CPU只有一个通讯口接了触摸屏幕,后加一个EM277,希望在运行的时候监控程序以便修改,EM277是加在热电偶7PD22的后面,现在用西门子6ES7-972-0CB20-OXA…

    SIMATIC S7-200 2018年12月9日

发表回复

登录后才能评论