西门子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

相关推荐

  • 伺服电机控制定位问题

    伺服电机直连滚珠丝杆,带负载运动,采用脉冲+方向控制方式。设备运行一段时间都正常,但现在发现,负载运动到位之后,定位出现偏差了,不能准确定位。 请问:这是什么原因呢?是伺…

    SIMATIC S7-200 2021年7月4日
  • EM223继电器输出指示灯亮,可实际上没有输出

    EM223继电器输出指示灯亮,可实际上没有输出。比如Q1.2灯亮,是不是Q1.2应该与1L接通对吗?如何检查问题? 问题补充:EM223继电器输出部分应该怎样接线?是1L、2L接2…

    SIMATIC S7-200 2021年7月4日
  • 组态软件如何在线状态下向S7200PLC中写入数据的

    在S7200数据块中更改后的数据,均需要STOP下下载数据到PLC中,而组态软件上更改一些数据参数设定值时,可及时生效无需STOP,两者是什么区别?存储位置不一样的吗? 问题补充:…

    SIMATIC S7-200 2017年6月29日
  • PTO包络表各个字段的意思

    根据向导生成的PTO包络表里面各个字段代表的意思,我不是很清楚,那位大虾指教一下,SS_SPEED:500MAX_SPEED:5000加速时间和减速时间都是1000ms包络0的操作…

    SIMATIC S7-200 2020年11月1日
  • S7-200PLC高速计数器的应用

    我用S7-200PLC连接增量型编码器来模拟现场PLC中的程序(现场PLC中的程序看不懂),但是在模拟的时候感觉计数器根本没有工作,旋转编码器能检测到PLC的I点在闪烁,但是编码器…

    SIMATIC S7-200 2021年7月5日
  • 请各位提供一个Micro/WIN32 V3.2 Instruction Library(指令库)软件包

    请各位提供一个Micro/WIN32 V3.2 Instruction Library(指令库)软件包我想用功能块设置modbus通信参数,却在编程软…

    SIMATIC S7-200 2021年7月5日
  • S7-200 RTD PID

    在S7-200中用PID向导,过程值是RTD通道值,那么设定值是多少度呢?是不是-200~850度呢。RTD的通道值是不是-200-8500呢。 最佳答案 看看这个,一定有收获:《…

    SIMATIC S7-200 2020年11月1日
  • 想不通啊

    我知道VW是不能带小数点的,VD才可以。因为小数就是浮点数,要32位才可以。最近利用才触摸屏往VW里面写值,我往里面写小数也可以写进去啊,并没有任何错误提示。我想知道,比如我把32…

    2017年11月20日
  • CP243-1可以同时作为客户机和服务器么?

    现在有三个站,其中两个站是200的(1号和2号),一个站是300的(3号)。1,我想把1号作为客户机2号作为服务器,这两个站进行以太网通讯。2,2号作为客户机,3号作为服务器进行以…

    SIMATIC S7-200 2017年11月26日
  • PC ACCESS 无法保存

    PC  ACCESS 安装完毕后,无法保存 提示“出现意外错误”,目录中没有中文。杀毒软件全部拆除了。试过很多次都一样没有用。都是出现无法保…

    SIMATIC S7-200 2020年10月31日