在文章《S7-300/400进阶笔记5.1:300系列PLC的装载存储器的类别及方法》一文后,有小伙伴在评论区提了个问题,驼子决定有必要写一篇文章,和大家一起讨论一下。也希望小伙伴们能向"@maintenance乔"学习,有问题及时提出来,大家一起讨论、一起进步。
![b56865332e073dc54e559a284879ecf2.png](https://img-blog.csdnimg.cn/img_convert/b56865332e073dc54e559a284879ecf2.png)
程序如下:
![f1cba8610a385a3ed0fbb353f11e6875.png](https://img-blog.csdnimg.cn/img_convert/f1cba8610a385a3ed0fbb353f11e6875.png)
注意:原问题的红框部分是:置位指令"S #OUT7"。由于只给了我部分程序,没有复位"#OUT7"的指令,信号无法翻转,因此为了方便仿真测试和理解,这里将程序略作改动。
一、相关参数说明
程序编写在一个FC中,接口定义如下:
![b0e1386c469ac0238ec1b6b7e5a1a0b2.png](https://img-blog.csdnimg.cn/img_convert/b0e1386c469ac0238ec1b6b7e5a1a0b2.png)
二、捋一捋主逻辑
![36090cf54c87ebc16b6835f1e44c8798.png](https://img-blog.csdnimg.cn/img_convert/36090cf54c87ebc16b6835f1e44c8798.png)
其实,本程序的难点如图中的"红框"所示。如果将其"注释"掉(即在指令前面打"//",使该指令不执行),则程序就编程简单的逻辑控制指令了,如下图所示。
![8809ac85d25c34a19cba8e9be4e8d475.png](https://img-blog.csdnimg.cn/img_convert/8809ac85d25c34a19cba8e9be4e8d475.png)
逻辑比较简单,不需要赘述了。重点分析一下注释掉的判断与跳转指令。
三、判断与跳转指令
在解读程序之前,先解释几个STL语句。
- 状态字寄存器
![5a9b770b71d8b8348fc1403a4a21300b.png](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/83eb07b9d66cbe5a022facd30cad3c22.png)
"#temp23"的值与"#IN2"做比较,也可作为"#OUT7"状态的逻辑依据。
由于"@maintenance乔"同学只给了一段程序,没有上下文做参考,因此,本段程序暂时不能完全解读。但大概的逻辑是:
"#IN3"是某工艺参数的实际值,"#IN2"端是给定了其上限值,"#OUT7"用于控制某设备的启停,当实际值小于上限值时,"#OUT7"才为1,相应的设备方能启动。
四、写在最后
由于程序不完整,最终也没解读出个所以然来。但驼子想通过本例表达的是:
遇到一段复杂的程序,要懂得合理的拆分它们,先从主体框架上弄懂程序想“干什么”,然后,再逐步分解每一个逻辑。精力允许的话,可以借助仿真手段,测试程序,验证自己的猜想。