西门子S7-200如何进行CRC计算啊

因为需要进行modbus RTU通讯,所以请问,S7-200如何进行CRC计算啊?

最佳答案

看下这个http://www.ad.siemens.com.cn/club/bbs/post.asp?b_id=3&a_id=189361&s_id=0&num=7#anch 
或者http://www.ad.siemens.com.cn/club/bbs/post.asp?b_id=3&a_id=45850&s_id=0&num=20#anch 
或者方法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

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

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

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

相关推荐

  • AIW 赋值

    给一个ON信号,想给AIW2通道赋值为6400. 不知道怎么弄。 最佳答案 楼主可以这样:将AIW2传送到一个VW100,M0.0 ON的时候将6400传送至V…

    SIMATIC S7-200 2020年10月31日
  • S7-200PLC怎么驱动声音?以及接收温度传感器信号??

    我有S7-200PLC   224XP型号一个,自带模拟量输入输出,我想做个可以发声音的东西出来,比如接个什么小喇叭之类,可以让喇叭唱出旋律来,,能够…

    SIMATIC S7-200 2017年7月25日
  • S7-200模拟量(0-20MA)

    S7-200模拟量模块EM235是不是只能接输入0-20MA的传感器,不能接4-20MA的传感器? 最佳答案 都可以,S7 200模拟量输入处理方法:以4~20mA电流信…

    SIMATIC S7-200 2020年11月1日
  • 程序中这个指令的意思

    200PLC中有这样一个程序vw200与-32768相比,如果相等就输出条件。但加一段程序中用v201.0去输出一个线圈,请问这样做在程序中起什么作用啊? 问题补充:程序中用v20…

    SIMATIC S7-200 2017年11月1日
  • S7-200数据线和上位机连接长度

    我有S7-200要和远离35米的上位机连接用市场上的四芯线(假的不带数据盒)可以吗?会有什么问题 问题补充:原来的是4芯线啊 最佳答案 可以  RS-485&n…

    SIMATIC S7-200 2021年7月5日
  • 请教从200PLC读取数据方法

    现有设备改造,增加一台上位机做显示。下位机是224XPCN。没有原设备厂家的程序,只有变量表(比如温度存于VD100、压力值存于VD104、超温报警M10.0)现要将这些变量读取在…

    SIMATIC S7-200 2017年11月19日
  • 增益控制

    如何用S7200 smart PLC实现增益调度控制 钻石用户推荐最佳答案 你是说想要手动修改控制增益的值是吧,可以的,使用PID向导,进行功能编程。对应参数是…

    2021年7月5日
  • S7-200与KTP700 DP通讯线

    如果自己做,是否只需对应焊接3.8.5即可? 最佳答案 3-3、8-8,屏蔽层焊接第三方 9 针头的外壳,请参考官方文档《屏与PLC通信用什么电缆》http:/…

    SIMATIC S7-200 2021年7月5日
  • 装完STEP7后,图标问题

    装完编程软件STEP7后,电脑桌面有编程的图标快捷方式,但我发现,在开始—程序菜单中没有西门子编程软件的快捷方式,请问各位大虾,正常状态下是这样吗?还是我装的有点问题呢? 最佳…

    SIMATIC S7-200 2020年11月1日
  • cpu226 触摸屏KTP1000 V区数据永久记录

    使用cpu226编程,触摸屏是KTP1000,想将操作历史数据保留下来,比如说V区的数据一个500,下一次操作的600数据值等,以后可以通过触摸屏查看历史操作记录的数值,不知道怎么…

    SIMATIC S7-200 2017年8月1日