crc校验如何做?

一组数据如何进行crc校验呢  如何做?

最佳答案

方法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

 
 

提问者对于答案的评价:
xiexie

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年11月5日 上午11:54
下一篇 2020年11月5日 上午11:54

相关推荐

  • 请教s7-200的问题

    大家好!我对s7-200不熟。请问一下s7-300中的I,Q,M,DB1.DBD0,DB1.DBX6.0在S7-200中怎么表示呢?谢谢! 最佳答案 建议先看看S7-200系统手册…

    SIMATIC S7-200 2020年11月5日
  • s7-200模拟量数据采集存取

    使用中断程序在允许中断的过程中,间隔10ms采集一次AIW0的数据,放到VW100为首地址的寄存器里面,我知道可以使用指针存取,这个指针的程序怎么编写,能够第一次中断保存在VW10…

    2021年7月5日
  • 永久保存存储区

    设备移动过程中产生一个数据VD1000,代表某部件的移动位置,在触摸屏上能直观显示,如何将VD1000在停电时写入永久保存存储区,再次来电时将保存的数据恢复到VD1000,使得该数…

    SIMATIC S7-200 2020年11月1日
  • PID自整定

    S7-200  PLC是否有PID自整定的功能?参考书上有关于PID的例子,但是都是要求有经验值的输入,例如:微分时间,积分时间等。  &n…

    SIMATIC S7-200 2021年7月5日
  • modbus从站轮询的问题

    S7-200PLC做主站和4个从站做通讯。我用上一条的MBUS_MSG的done作为启动下一条MBUS-MSG的信号。问题是如果某个从站断电,整个轮询就会出问题。怎么样避免这个问题…

    SIMATIC S7-200 2020年11月1日
  • PLC指令中16#0E 什么意思

    PLC指令中16#0E 什么意思  例如 VW100中16#0F 是是什么意思  循环右移指令 怎么…

    SIMATIC S7-200 2021年7月4日
  • PLC是否是单片机

    PLC是否是单片机。 最近我周围的同事都疯了似的,老说手机是单片机的,还说键盘是单片机的,电脑也是单片机的。天啊,我就不知道了,这单片机的能耐咋就那大呢?今天我就此一问,…

    SIMATIC S7-200 2021年7月5日
  • 如何通过人机界面该变PLC内的程序参数而从启后参数不会改变

    请问大家如何可以通过PROTOOL修改200中程序的参数,而在重启时此参数不会消失,比如通过 em231测试温度,而当温度超过A度时,200有一个输出信号,我打算通过pr…

    SIMATIC S7-200 2021年7月5日
  • 交流输入及脉宽控制

    cpu224 xp.cn     I0.3以上可以输入5V交流并测量间隔时间及频率,说明也可以测量过零信号,只时不会准确…

    SIMATIC S7-200 2021年7月5日
  • 各位大哥们,请教!救命啊~

    我想做二个按钮控制压力信号上升和下降,我按上升按钮信号就上升,松开信号停,按下降按钮信号就下降,松开信号停 压力信号为4-20mA 我是才接触PLC的新人,呵呵…

    SIMATIC S7-200 2021年7月5日