STL的状态字及LAD转换STL的细节
状态字Status Word:
- 如表:
BR | CC1 | CC0 | OV | OS | OR | STA | RLO | /FC | |
---|---|---|---|---|---|---|---|---|---|
写: |
通常在官方手册上:
-
表示不进行读写,
x
表示对应位可以写入0/1
2个状态
1/0
表示对应位的确定状态
*
表示读取
-
官方对于各个位的解释:
- 首次检查位:状态字的0位称作首次检查位,如果/FC 位的信号状态为“0”,则表示伴随着下一条逻辑指令,程序中将开始一个新的逻辑串。FC前面的斜杠表示对FC取反。
- 逻辑运算结果:状态字的第1位为RLO 位(RLO= “逻辑运算结果”),在二进制逻辑运算中用作暂时存储位。比如,一串逻辑指令中的某个指令检查触点的信号状态,并根据布尔逻辑运算规则将检查的结果(状态位)与RLO位进行逻辑门运算,然后逻辑运算结果又存在RLO位中。
- 状态位:状态位(第2位)用以保存被寻址位的值。状态位总是向扫描指令(A,AN,O,…)或写指令(=,S,R,)显示寻址位的状态(对于写指令,保存的寻址位状态是本条写指令执行后的该寻址位的状态)。
- OR位:在用指令OR执行或逻辑操作之前,执行与逻辑操作的时候,就需要用到OR这一状态位。OR位表示先前执行的与逻辑操作产生的值为“1”,于是,逻辑操作或的执行结果就已被确定为“1”。
- OV位:溢出表示算术或比较指令执行时出现了错误。根据所执行的算术或逻辑指令结果对该位进行设置。
- OS位:溢出存储位是与OV位一起被置位的,而且在更新算术指令之后,它能够保持这种状态,也就是说,它的状态不会由于下一个算术指令的结果而改变。 这样,即使是在程序的后面部分,也还有机会判断数字区域是否溢出或者指令是否含有无效实数。OS位只有通过如下这些命令进行复位:JOS(若OS = 1,则跳转)命令,块调用和块结束命令。
- CC1及CC0位:CC1和CC0(条件代码)位给出有关下列结果的相关信息:算术指令结果/比较指令结果/字逻辑指令/在移位功能中,移出位相关信息。
- BR位:状态字的第8位称为二进制结果位。它将字处理程序与位处理联系起来,在一段既有位操作又有字操作的程序中,用于表示字逻辑是否正确。将BR位加入程序后,无论字操作结果如何,都不会造成二进制逻辑链中断。在梯形图的方块指令中,BR位与ENO位有对应关系,用于表明方块指令是否被正确执行:如果执行出现了错误,BR位为0,ENO位也为0;如果功能被正确执行,BR位为1, ENO位也为1。在用户编写的FB/FC程序中,应该对BR位进行管理,功能块正确执行后,使BR位为1,否则使其为0。使用SAVE指令将RLO存入BR中,从而达到管理BR位目的。
- 状态字的9-15位未使用。
Status Word位解析
- 1. /FC:通俗来讲,这个位表示的是当前语句是不是一个新的程序段。
/
表示取反,即=0
表示一个程序段的结束,=1
则表示还在一个程序段的执行过程中。- 如图,从STL语句和梯形图的对比从来看差异:
- 如图,从STL语句和梯形图的对比从来看差异:
触点的与运算
A
或者与非运算AN
,所反映出来的/FC位一定是1。这也符合"STEP7_Statement_List_for_S7-300_and_S7-400_k"这本手册对A/AN状态字的定义;
同样的,置位S
复位R
甚至线圈=
,这一类指令反映出来的/FC一定是0,这类指令代表了一段完整的(从输入到输出,从触点到线圈)程序段。
- 2. RLO:表示二进制(0/1)逻辑运算的结果暂存位,它一定是当前位的状态位
STA
和前一组运算后的RLO
进行与运算的结果。- 通俗解释:因为有了RLO的存在,程序员可以构建一系列逻辑判断,而每个判断的执行都依赖于前一个操作的结果,例如,在一个自动化控制逻辑中,你可能需要依次检查多个传感器的状态,并基于这些状态决定是否启动机器。RLO使得每个检查的结果可以依次传递和评估,直到达到最终决策。此处的截图可以看得出来,当把M100.0置位的时候,当前的RLO变成了1,此时M100.1的STA虽然是0,但是
1 & 0
的结果是1,所以M100.1处的RLO依旧为1。
以下是关于SET/CLR/SAVE
:
- 通俗解释:因为有了RLO的存在,程序员可以构建一系列逻辑判断,而每个判断的执行都依赖于前一个操作的结果,例如,在一个自动化控制逻辑中,你可能需要依次检查多个传感器的状态,并基于这些状态决定是否启动机器。RLO使得每个检查的结果可以依次传递和评估,直到达到最终决策。此处的截图可以看得出来,当把M100.0置位的时候,当前的RLO变成了1,此时M100.1的STA虽然是0,但是
如上,在STL语句表中,可以用:
SET
直接把状态字中RLO=1
CLR
直接把状态字中RLO=0,但它并不会清除BR的状态
SAVE
把当前状态字中RLO的值保存到BR寄存器
SET/CLR/SAVE
后面跟的= AlwaysTrue
其实是新的一条语句(因为他们的/FC=0),作用是把RLO的状态给到AlwaysTrue,所以其实SET/CLR/SAVE
后面什么都不跟程序也不会报错。
- 3. STA:用以保存被寻址位(扫描位:A、AN、O、ON…写指令:=、S、R…)的值
- 通俗解释:当前变量的值就等于当前的状态位
- 通俗解释:当前变量的值就等于当前的状态位
值得注意的是,
O(先与运算后或运算)
和A()
以及AN()
这一类带分支的指令,他们的STA是1,但他们的RLO
一定是-
,表示这条指令不会引起RLO
的变化。
(题外话:有些时候将LAD转成STL时候程序会多出像NOP 0
一样的指令,其实它通常出现在一些调用块后面,在LAD中,调用块之后跟了一条没用的线,这时候就是NOP 0)
- 4. OR:
- OR位表示先前执行的与逻辑操作产生的值为“1”,于是,逻辑操作或的执行结果就已被确定为“1”
- OR位表示先前执行的与逻辑操作产生的值为“1”,于是,逻辑操作或的执行结果就已被确定为“1”
当置位M110.0后,它于M110.1于运算的结果是1 .所以
O
的OR
位就变成了1。
-
5. OS:
-
6. OV:
-
7. CC0/CC1:
-
8. BR:
- 当您在STL中编写要从LAD/FBD调用的功能块或功能时,必须在离开该块之前将逻辑运算(RLO)的结果立即存储在BR位中,
这样才能为LAD/FBD框提供使能输出(ENO)
。使用SAVE、JCB、JNB指令执行此操作。
- 当您在STL中编写要从LAD/FBD调用的功能块或功能时,必须在离开该块之前将逻辑运算(RLO)的结果立即存储在BR位中,
状态字查看小技巧:
- 右键状态监控表,不仅可以看状态字,还可以看AR1/AR2/ACCU2等其他寄存器
LAD转STL
在Step7中是可以把LAD直接转换为STL显示的,但是有些时候转为出来又会多一些看起来不太好理解的语句,所以这里以实际的LAD转STL为例,逐语句解释。
- LAD转STL
- 转换前的LAD
- 转换后的STL
L 20.0
是一个在LAD中并没有直接体现出来的临时变量(Temp区,用关键字L
表示),属于系统转换时自动定义,从20.0开始是因为之前的地址已经被当前的OB或者FC的临时数据使用了,如下图(Date_And_Time占8个字节)。另外L W#16#FFFF(装载指令)
和此处的L含义不同。
A L 20.0
在STL中出现了4次,作为“AlwaysTrue”
的中间变量,对应了梯形图从上到下的4个分支,如下图。
JNB
表示不满足则跳转。跳转标签所在语句会先被执行,跳转从标签语句之后开始执行。换句话说就是:比如_001 NOP 0
这句话,实际上正常扫描的时候会把NOP 0
执行后,才判断跳转。NOP 0
在STL中出现了4次,表示存在4个空的线
(梯形图后面只有线,没有其他东西),如图:
- 使用
JNB
体现了LAD中从左往右,从上往下
的程序扫描思路。对于每一个分支都逐一判断:首先有“Tmp_SwitchTime_UP”时,执行后面的语句;当不满足“Tmp_SwitchTime_UP”,跳转至下一条语句(从上往下的顺序)。体现了PLC程序里面,触点的接通与否以及后续的逻辑,是程序扫描到该语句时做出的判断。另外,STL程序里去判断A L 20.0
是否接通也是逻辑的自洽,类比在梯形图中,MOVE块前面没有判断逻辑,如图: