很多初学者在初学阶段,可能都有下面的疑问:
1)状态字中的首次检测位“/FC”、逻辑运算的结果位“RLO”和状态位“STA”到底有什么作用?它与编程有关吗?
2)程序段的第一条逻辑运算指令实际上作了什么操作?
S7-300的状态字由16位组成,其中9…15位没有意义,其中0…8分别为:
/FC——首次检查位(状态字,位0)
RLO——逻辑运算的结果(状态字,位1)
STA——状态位(状态字,位2)
OR——(状态字,位3)
OS——存储溢出(状态字,位4)
OV——溢出(状态字,位5)
CC 1、CC 0——条件代码(状态字,位6和位7)
BR——二进制结果位(状态字,位8)
下面我说说最为常用,也最让初学者搞不懂的/FC、RLO和STA。
/FC 首次检查位(状态字,位0)
/FC位信号状态控制一个逻辑运算串。
/FC位是状态字位0。
每一逻辑运算都会查询/FC位的信号状态和寻址的触点。
如果/FC位信号状态等于"1",指令会将其寻址触点上信号状态检查的结果与首次检查生成的RLO逻辑组合在一起,并将结果存储在RLO位中。
如果/FC位信号状态等于"0",逻辑串将开始首次检查。
分配一个值(S,R,=)或执行依据RLO状态的跳转指令后,逻辑串结束且/FC位被设置为"0"。
RLO 逻辑运算的结果(状态字,位1)
RLO位存储逻辑运算串或比较指令的结果。
RLO位是状态字位1。
程序段中的第一条指令检查触点信号状态。如果已执行检查,RLO被设置为"1"。第二条指令也检查触点信号状态。此检查结果被按照布尔代数规则与RLO位中存储的值组合在一起,并存储在RLO位中。在分配或进行条件跳转之后,此逻辑串结束。根据RLO位的值执行分配或条件跳转。
STA 状态位(状态字,位2)
STA位存储被寻址位的值。
STA位是状态字的位2。
对存储器执行读访问的位逻辑指令(A、AN、O、ON、X或XN)的状态始终与被寻址位的值相同。可对存储器执行写访问的逻辑指令(R、S或=)的状态与写入位的值或被寻址位的值(如果未执行写操作)相同。对于不访问存储器的位指令,状态位无意义。这些指令将STA设置为1。状态位并不由指令读取,而是在您查看程序变量的在线状态时被解释。
1)状态字中的首次检测位/FC、逻辑运算的结果位RLO和状态位STA到底有什么作用?它与编程有关吗?
上面对/FC、RLO、STA的解释是说明书上写的,看完后你也许仍是一头雾水,下面我通过例子给你讲讲/FC、RLO、STA到底有什么用:
① /FC
请看下面的程序段,它将两个触点I0.0和I0.1串联后,控制Q0.0的线圈,逻辑表达式为I0.0*I0.1=Q0.0。执行第一条指令“A I0.0”时首次检测位为0,表示程序段开始。执行“=”指令之后,首次检测位被清零。
A I 0.0
A I 0.1
= Q 0.0
查阅手册,对A指令的描述如下:“检查寻址位的状态是否为1,并将测试结果与RLO进行“与”运算。”
② RLO
继续看上面程序段,执行第一条指令“A I0.0”时,若I0.0=0,则“RLO”=0,若I0.0=1,则“RLO”=1;执行第二条指令“A I0.1”时,若I0.0=0、I0.1=0,则“RLO”=0,若I0.0=1、I0.1=1,则“RLO”=1,若I0.0=0、I0.1=0或1,则“RLO”=0;执行“=”指令之后,“RLO”=执行第二条指令“A I0.1”后的“RLO”。
③ STA
继续看上面的程序段,执行第一条指令“A I0.0”时,若I0.0=0,则“STA”=0;若I0.0=1,则“STA”=1;执行第二条指令“A I0.1”时,“STA”也和执行第一条指令“A I0.0”时的“STA”类似。
2)程序段的第一条逻辑运算指令实际上作了什么操作?
我还是利用上面的程序段给你说明,上面程序段中,执行第一条“A I0.0”指令时,它到底做了什么操作?
①显然它不会将I0.0的状态值与前一个程序段执行完后的“RLO”进行“与”运算,本程序段与前一程序段之间“井水不犯河水”。
② “与”运算需要两个变量参与,第一条A指令执行完后只有一个位变量I0.4的值,不可能作“与”运算,就像只有一个人不能结婚一样。
将上面程序段的第一条“A I0.0”指令改为“O I0.0”或“X I0.0”指令(“或”运算或“异或”运算指令),本段程序段指令的“与”运算执行的结果相同。这说明本程序段实际执行的是什么逻辑运算取决于第二条指令,而与第一条指令(A、O或X)无关。
实际上,程序段的第一条指令或逻辑串的第一条指令并不执行什么逻辑运算,第一条A、O、X指令只是将指令中的位变量的值传送到“RLO”,第一条AN、ON、XN指令将指令中的位变量的值作“非”运算后传送到“RLO”。
操作系统在执行程序的时候,判断首次检测位的值,其值为0时,就知道该指令是程序段的第一条指令或逻辑串的第一条指令,然后完成上述的操作。首次检测位与用户程序没有直接的关系。
别的PLC(包括S7-200)几乎都用LD或LDN指令来表示一个程序段或逻辑串的开始。S7-300/400因为没有类似的指令,所以用首次检测位来检测一个程序段或逻辑串的开始。
这些均是个人学习心得,供各位初学者参考。若有不对之处请指正!