接口超时后程序还会继续执行嘛_从一段STL程序出发,介绍几个“硬核”概念,并谈几点感想...

在文章《S7-300/400进阶笔记5.1:300系列PLC的装载存储器的类别及方法》一文后,有小伙伴在评论区提了个问题,驼子决定有必要写一篇文章,和大家一起讨论一下。也希望小伙伴们能向"@maintenance乔"学习,有问题及时提出来,大家一起讨论、一起进步。

b56865332e073dc54e559a284879ecf2.png

程序如下:

f1cba8610a385a3ed0fbb353f11e6875.png

注意:原问题的红框部分是:置位指令"S #OUT7"。由于只给了我部分程序,没有复位"#OUT7"的指令,信号无法翻转,因此为了方便仿真测试和理解,这里将程序略作改动。


一、相关参数说明

程序编写在一个FC中,接口定义如下:

b0e1386c469ac0238ec1b6b7e5a1a0b2.png

二、捋一捋主逻辑

36090cf54c87ebc16b6835f1e44c8798.png

其实,本程序的难点如图中的"红框"所示。如果将其"注释"掉(即在指令前面打"//",使该指令不执行),则程序就编程简单的逻辑控制指令了,如下图所示。

8809ac85d25c34a19cba8e9be4e8d475.png

逻辑比较简单,不需要赘述了。重点分析一下注释掉的判断与跳转指令。


三、判断与跳转指令

在解读程序之前,先解释几个STL语句。

  1. 状态字寄存器
5a9b770b71d8b8348fc1403a4a21300b.png

状态字寄存器是一个16位的寄存器,用于存储CPU执行指令时的状态。状态字的某些位用于决定某些指令是否执行和以什么方式执行,执行指令时可能改变状态字中的某些位,用位逻辑指令和字逻辑指令可以访问和检测它们。

本程序主要用到了其中的两位:溢出位OV和二进制结果位BR

(1)二进制结果位BR

二进制结果位BR用来表示操作结果是否正确。用户编写的FB、FC程序,最好对BR位进行管理,功能块正确执行后,BR为1,否则为0。

(2)溢出位OV

如果算术运算、浮点数比较指令执行时出现错误(例如溢出、非法操作和不规范的格式),溢出位被置1。如果后面的同类指令执行结果正常,该为被清0。

本例程序中,用"OV"位来判断整数运算的运算结果是否溢出。结合"SAVE"指令,在BR中保存正确的逻辑。

2、SAVE指令

SAVE指令用于将RLO存入BR中。

3、JNB指令

当逻辑运算结果为0时,JNB就中断线性程序扫描,并跳转到指定的位置继续执行。同时将RLO位的内容复制到BR位中。

对于该跳转程序,当"#temp13"为0时,RLO=0,JNB指令生效,将程序跳转到"M002"的位置,继续执行。同时,将RLO的内容复制到BR位中。从"M002"开始的指令,将BR的值读出来,与后续逻辑进行"与"运算。

当"#temp13"为1时,JNB指令不满足跳转条件,程序从"L #IN3"处继续执行,执行整数的加法运算,即:

83eb07b9d66cbe5a022facd30cad3c22.png

"#temp23"的值与"#IN2"做比较,也可作为"#OUT7"状态的逻辑依据。

由于"@maintenance乔"同学只给了一段程序,没有上下文做参考,因此,本段程序暂时不能完全解读。但大概的逻辑是:

"#IN3"是某工艺参数的实际值,"#IN2"端是给定了其上限值,"#OUT7"用于控制某设备的启停,当实际值小于上限值时,"#OUT7"才为1,相应的设备方能启动。


四、写在最后

由于程序不完整,最终也没解读出个所以然来。但驼子想通过本例表达的是:

遇到一段复杂的程序,要懂得合理的拆分它们,先从主体框架上弄懂程序想“干什么”,然后,再逐步分解每一个逻辑。精力允许的话,可以借助仿真手段,测试程序,验证自己的猜想。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值