STL状态字地使用.docx
《STL状态字地使用.docx》由会员分享,可在线阅读,更多相关《STL状态字地使用.docx(14页珍藏版)》请在冰豆网上搜索。
STL状态字地使用
STL状态字问题
悬赏分:
5
-解决时间:
2009-2-9 11:
47
最近在学习STL语言,每个指令都有个状态字,
BR,CC1,CC0,OV,OS,OR,STA,RLO,/FC,这些状态位都代表什么含意?
怎么个用法呢?
希望各位老师指点一下,越详细越好!
问题ID:
31231
提问者:
工控123-毕业实践员 第4级
最佳答案
●首次检查位:
状态字的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(条件代码)位给出有关下列结果的相关信息:
• 算术指令结果
• 比较指令结果
• 字逻辑指令
• 在移位功能中,移出位相关信息。
可以用以下指令来检查条件代码CC1和CC0。
CC1 CC0 检查完成后,如果:
0 0 A == 0 结果 =0
1 0 A > 0 结果 > 0
0 1 A < 0 结果 < 0
● 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位未使用。
回答者:
yhk-初级工程师 第9级 2009-2-5 11:
45
提问者对于答案的评价:
很详细,非常感谢!
30天内的投票结果:
好50%(0) 不好50%(0)
其他回答
楼上的 已经详细的解释了 状态字的意义
他说的很对
我想说的是 你对状态字的认识有一定的误区
不是“每个指令都有状态字”
状态字 和地址寄存器等一样,是CPU 里面的一个区域 大小是16位 就是一个字 ;我们给这个区域取名位状态字 ,各个位的意思如楼上所说;
而 指令的执行结果 受到状态字的影响,
并且指令也会影响到状态字,即修改状态字;
回答者:
sqzth-中级技术员 第6级 2009-2-5 12:
02
好多指令执行完后的状态字,你可以不用理会的,要的时候才去捡回来
回答者:
Youder-毕业实践员 第4级 2009-2-5 12:
09
要想得到非手册解释,就到300论坛里搜索,300论坛里有更好的解释,讨论的次数更多。
回答者:
LaoHuai-高级工程师 第11级 2009-2-5 13:
09
看起来是很简单!
但应用起来就麻烦了!
回答者:
轻轻飞-顶级工程师 第12级 2009-2-5 13:
25
状态字的编程较复杂,感觉常用的是RLO与BR位的操作
回答者:
实在-高级技术员 第7级 2009-2-5 13:
57
学习了。
回答者:
yanjiuximenzi-初级技术员 第5级 2009-2-5 21:
11
Step 7里就有帮助,非常清楚
SIEMENS STEP7 编程状态字的作用定义
状态字用于表示CPU执行指令时所具有的状态。
一些指令是否执行或以何方式执行可能取决于状态字中的某些位;执行指令时也可能改变状态字中的某些位,也能在位逻辑指令或字逻辑指令中访问并检测他们。
状态字的结构如下:
Bit:
31… 8 7 6 5 4 3 2 1 0
BR
CC1
CC0
OV
OS
OR
STA
RLO
/FC
(1) 首位检测位(/FC)
状态字的位0称为首位检测位。
若位的状态为0,则表明一个梯形逻辑网络的开始,或指令为逻辑串的第一条指令。
CPU对逻辑串第一条指令的检测(称为首位检测)产生的结果直接保存在状态字的RLO位中,经过首次检测存放在RLO中的0或1被称为首位检测结果。
位在逻辑串的开始时总是0,在逻辑串指令执行过程中位为1,输出指令或与逻辑运算有关的转移指令(表示一个逻辑串结束的指令)将清0。
(2) 逻辑操作结果(RLO)
状态字的位1称为逻辑操作结果RLO(ResultofLogicOperation)。
该位存储逻辑指令或算术比较指令的结果。
在逻辑串中,RLO位的状态能够表示有关信号流的信息。
RLO的状态为1,表示有信号流(通);为0,表示无信号流(断)。
可用RLO触发跳转指令。
(3) 状态位(STA)
状态字的位2称为状态位。
状态位不能用指令检测,它只是在程序测试中被CPU解释并使用。
如果一条指令是对存储区操作的位逻辑指令,则无论是对该位的读或写操作,STA总是与该位的值取得一致;对不访问存储区的位逻辑指令来说,STA位没有意义,此时它总被置为1。
初始条件:
M1.1=0M1.2=1M1.3=0
程序
状态字
解释
AM1.1
0_0000_0001
BIT0=1表示指令开始执行,初始/FC为0,当程序执行时为1;BIT1=0,由于AM1.1=0,AM1.1必然运行结果为0,即RLO为0,故BIT1=0;BIT2=0表示存储的位M1.1为0。
AM1.2
0_0000_0101
BIT0=1表示指令正在执行;BIT1=0,由于AM1.1=0,AM1.2=1,运行结果为1,即RLO为0;BIT2=1表示存储的位M1.2为0。
ANM1.3
0_0000_0001
BIT0=1表示指令正在执行;BIT1=0,由于AM1.1=0,AM1.2=1,AM1.3=0,运行结果为0,即RLO为0;BIT2=1表示存储的位M1.2为0。
=M1.4
0_0000_0000
BIT0=0表示指令执行结束;BIT1=0,由于AM1.1=0,AM1.2=1,AM1.3=0,=M1.4,运行结果为0,即RLO为0;BIT2=1表示存储的位M1.4为0。
初始条件:
M1.1=1M1.2=1M1.3=0
程序
状态字
解释
AM1.1
0_0000_0111
BIT0=1表示指令开始执行,初始/FC为0,当程序执行时为1;BIT1=1,由于AM1.1=1,AM1.1必然运行结果为1,即RLO为1,故BIT1=1;BIT2=1表示存储的位M1.1为1。
AM1.2
0_0000_0111
BIT0=1表示指令正在执行;BIT1=1,由于AM1.1=1,AM1.2=1,运行结果为1,即RLO为1;BIT2=1表示存储的位M1.2为0。
ANM1.3
0_0000_0011
BIT0=1表示指令正在执行;BIT1=0,由于AM1.1=1,AM1.2=1,AM1.3=0,运行结果为1,即RLO为1;BIT2=1表示存储的位M1.2为0。
=M1.4
0_0000_0110
BIT0=0表示指令执行结束;BIT1=0,由于AM1.1=1,AM1.2=1,AM1.3=0,=M1.4,运行结果为1,即RLO为1;BIT2=1表示存储的位M1.4为1。
(4) 或位(OR)
状态字的位3称为或位(OR)。
在先逻辑“与”后逻辑“或”的逻辑串中,OR位暂存逻辑“与”的操作结果,以便进行后面的逻辑“或”运算。
其它指令将OR位清0。
初始条件:
M1.1=1M1.2=1M1.3=0
程序
状态字
解释
AM1.1
0_0000_0111
BIT0=1表示指令开始执行,初始/FC为0,当程序执行时为1;BIT1=1,由于AM1.1=1,AM1.1必然运行结果为1,即RLO为1,故BIT1=1;BIT2=1表示存储的位M1.1为1。
AM1.2
0_0000_0111
BIT0=1表示指令正在执行;BIT1=1,由于AM1.1=1,AM1.2=1,运行结果为1,即RLO为1;BIT2=1表示存储的位M1.2为0。
O
0_0000_1111
如果O指令前M1.1,M1.2“与”结果1,则OR位1
ANM1.3
0_0000_1011
BIT0=1表示指令正在执行;BIT1=0,由于AM1.1=1,AM1.2=1,AM1.3=0,运行结果为1,即RLO为1;BIT2=1表示存储的位M1.2为0;BIT3=0,O的结果。
=M1.4
0_0000_0110
BIT0=0表示指令执行结束;BIT1=0,由于AM1.1=1,AM1.2=1,AM1.3=0,=M1.4,运行结果为1,即RLO为1;BIT2=1表示存储的位M1.4为1;BIT3=1,O结束。
(5) 溢出状态保持位(OS)
状态字的位4称为溢出状态保持位(或称为存储溢出位)。
如果浮点或算术运算出现问题,触发OV位并置位OS位,故障消除,OS位保持,即OV被置1时OS也被置1,OV被清0时OS仍保持。
所以它保存了OV位。
可用于指明在先前的一些指令执行中是否产生过错误。
只有下面的指令才能复位OS位:
JOS(OS=1时跳转)、块调用指令、块结束指令自动复位OS位。
(6) 溢出位(OV)
状态字的位5称为溢出位。
溢出位被置1,表明一个算术运算或浮点数比较指令执行时出现错误(错误:
溢出、非法操作、不规范格式)。
后面的算术运算或浮点数比较指令执行故障消除结果正常的话OV位就被清0。
(7) 条件码1(CC1)和条件码0(CC0)
状态字的位7和位6称为条件码1和条件码0。
这两位结合起来用于表示在累加器1中产生的算术运算或逻辑运算结果与0的大小关系;比较指令的执行结果或移位指令的移出位状态。
详见下表。
算术运算后的CC1和CC0
CCl
CCO
算术运算
无溢出
整数算术运算
有溢出
浮点数算术运算
有溢出
0
0
结果=0
整数加时产生负范围溢出
平缓下溢
0
1
结果<0
乘时负范围溢出;加、减、取负时正溢出
负范围溢出
1
0
结果>0
乘、除时正溢出;加、减时负溢出
正范围溢出
1
1
-
在除时除数为0
非法操作
比较、移位和循环移位、字逻辑指令后的CC1和CC0
CCl
CCO
比较指令
移位和循环指令
字逻辑指令
0
0
累加器2=累加器1
移位=0
结果=0
0
1
累加器2<累加器1
-
-
1
0
累加器2>累加器1
-
结果≠0
1
1
不规范
(只用于浮点数比较)
移出位=1
-
(8) 二进制结果位(BR)
状态字的位8称为二进制结果位。
它将字处理程序与位处理联系起来,在一段既有位操作又有字操作的程序中,用于表示字操作结果是否正确(异常)。
将BR位加入程序后,无论字操作结果如何,都不会造成二进制逻辑链中断。
在LAD的方块指令中,BR位与ENO有对应关系,用于表明方块指令是否被正确执行:
如果执行出现了错误,BR位为0,ENO也为0;如果功能被正确执行,BR位为1,ENO也为1。
在用户编写的FB和FC程序中,必须对BR位进行管理,当功能块正确运行后使BR位为1,否则使其为0。
使用STL指令SAVE或LAD指令——(SAVE),可将RLO存入BR中,从而达到管理BR位的目的。
当FB或FC执行无错误时,使RLO为1并存入BR,否则,在BR中存入0。
BR 位(二进制结果位)时状态字的第8位,用于将前一功能的结果传递给接下来执行的功能。
下表解释了BR 位的含义并指出了其用法。
序号
BR 位的含义及用法
1
在 FBD/LAD编辑环境中,BR位的值被传递到功能块的输出ENO(FBs/FCs 和SFBs/SFCs)。
如果 BR=1,紧接下来的EN=1(=BR)的功能或功能块被执行或被单独调用。
如果BR=0,紧接下来的EN=0(=BR)的功能或功能块既不被执行或也不被单独调用。
2
如果在 FBD/LAD编辑环境中使用字操作(如ADD_...)或其他非二进制操作,操作执行成功则BR=1,而发生处理错误(如:
溢出)则BR=0。
在这种情况下,后续的功能或功能块的调用由BR位控制。
3
如果使用STL创建一个功能或功能块并在FBD/LAD编辑环境中调用,则必须在退出功能或功能块前将逻辑操作结果(RLO)保存到BR位中。
使用指令"SAVE","JCB"和"SPBNB"来使能ENO(参见下文)。
4
如果调用SFB或SFC,BR位的状态指示CPU执行SFB或SFC是否正确。
如果执行过程中出错,则BR位值为0。
如果执行过程中未出错,则BR位值为1。
5
SAVE
"SAVE"指令将RLO存入BR位。
首次检查位"/FC"未复位。
鉴于这个原因,如果接下来的网络中是AND操作,BR位的状态被包含在逻辑操作中。
不推荐在同一个块或更低层的块中使用"SAVE"指令后查询BR位,因为如果中间操作太多会导致BR位的值变化。
最好是在退出块之前使用"SAVE"指令,因为这样的话ENO输出(=BR位)的值即为RLO位的值,可以在这之后立即加上错误处理。
"JCB"指令
"jumplabel"即为跳转目的地的符号名称。
如果 RLO=1,"JCB"指令中断线性程序的执行并跳转到跳转目的地。
线性程序的执行在跳转目的地继续执行。
跳转目的地由跳转符号来标明。
如果 RLO=0,则不跳转。
RLO被置1。
程序继续执行下面的指令。
7
"JNB"指令
跳转目的地由跳转符号来标明。
如果 RLO=0,"JNB"指令中断线性程序的执行并跳转到跳转目的地。
线性程序的执行在跳转目的地继续执行。
如果 RLO=1,则不跳转。
RLO被置1。
程序继续执行下面的指令。
状态字的位信号,可以在程序中使用指令进行操作,如调用SET、CLR指令直接对RLO位进行操作。
在调试阶段,可以根据状态位的状态调试程序,如使用STA、RLO位的信号可以判断操作地址的状态和指令处理结果,状态字是调试STL程序不可缺少的工具。
浅谈CPU状态字寄存器
雷浩(无锡市北辰自动化技术有限公司)
1.引言
CPU寄存器状态字的各位给出了有关指令状态或结果的信息以及所出现的错误,我们可以将二进制逻辑操作状态位信号状态直接集成到程序中,以控制程序执行的流程。
2.状态字寄存器
先简单介绍一下CPU中状态字。
●首次检查位:
状态字的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(条件代码)位给出有关下列结果的相关信息:
•算术指令结果
•比较指令结果
•字逻辑指令
•在移位功能中,移出位相关信息。
可以用以下指令来检查条件代码CC1和CC0。
CC1CC0检查完成后,如果:
00A==0结果=0
10A>0 结果>0
01A<0 结果<0
●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位未使用。
3.具体使用
下面我们结合STEP7中的指针编程来具体介绍条件码CC0/CC0的用法。
不同的指令在CPU中执行时间是不同的。
浮点数比定点数执行时间要长;字逻辑指令比位逻辑指令执行时间要长;在某些程序中适当使用状态字来进行编程可以减少CPU程序的执行时间。
例1:
比如说要比较一个DB中块的DBB0-DBB99这100个字节是正数是负数还是0,正数用1来表示;负数用-1来表示;0用0来表示。
并且将对应结果存入MB200开始的100个字节中。
我们通常的做法可能为:
如果利用条件码来进行编程,既可以减少程序的大小还会减少一定的指令执行时间,我们只需要将中间的比较程序加以优化,即可以达到目的。
例2:
根据状态位C0和CC1的状态而跳转的跳转功能指令JZ不改变任何状态位的状态,而且逻辑操作结果RLO值也会“随着”该跳转功能带到跳转程序段中,供用户程序其它逻辑操作之用(不改变/FC状态)。
示例两个整数相减并需进行连续判断:
LMW2
LMW8
-I
JZZERO//如果结果等于“0”,则跳转至标号ZERO处
//结果不等于“0”时所执行的指令
ZERO:
//结果等于“0”时,所要执行的指令
如果用户不熟悉JZ指令和状态位C0和CC1的具体含义,编程时就需要通过比较指令将比较结果存入一个二进制位中,再根据这个二进制位通过JC/JCN指令来控制程序的执行了。
例3:
我们实际应用中可能要利用某些协议转换网关(比如说Hilscher公司的NTTAP系列网关)来和某些串口协议的仪表进行通信时,会遇到CRC校验的问题,关于CRC校验时需要判断溢出位是否为1的问题来进行程序的进一步计算。
我们以EURO2408的MODBUS通信时需要的CRC校验为例说明CRC校验的步骤:
1、装载16#FFFF到一个16位CRC寄存器;
2、将CRC寄存器的高8位字节与信息中的第一个8位字节相异或,结果返回到CRC寄存器中;
3、将CRC寄存器数据向右移动一位;
4、如果溢出的位等于1,则将CRC寄存器与16#A001相异或,结果返回到CRC寄存器中;
4、如果溢出的位等于0,则重复第3步;
5、重复第3、4步骤,直到已经移位了8次;
6、将CRC寄存器的高8位字节与信息中的下一个8位字节相异或,结果返回到CRC寄存器中;
7、重复第3步到第6步,直到信息中所有字节都与CRC寄存器相异或,并都移位了8次;
8、最后的CRC寄存器中的结果即为CRC校验码,最后被添加到信息(数据)的末尾(交换!
低8位
在前,高8位在后;)
在第4步中需要判断溢出的位是否为1,如何判断对于整个程序有着重要的影响。
我们可以用A>0指令来判断这个条件,具体代码的编写,有兴趣时大家可以根据上面的步骤编写一个自己的CRC程序。
4.结束语
在一般情况下,我们不必考虑这些状态位,但在某些情况下,利用这些状态位并结合一定的指令,可以给我们的编程带来更大的灵活性,同时对于进一步提高自己的编程水平也有一定的作用。