S7-300/400的状态指令
一、CPU寄存器 CPU的寄存器用于寻址或处理数据。在相关命令(L, T,...)的配合下,可以在CPU存储器区和寄存器之间进行数据交换。 1)累加器: S7-300CPU有2个累加器,S7-400CPU有4个累加器,用于算术、比较指令或者用于其他字节、字及双字指令。 2)地址寄存器:要S7-300/400有2个地址寄存器作为指针用于寄存器间接寻址。 3)数据块寄存器:有2个,数据块寄存器里包含打开的(活动的)数据块的号码。因此可能有2个DB同时打开,其中一个DB使用DB 寄存器,另一个作为背景DB 使用DI寄存器。打开DB时,其长度自动装载到相应的DB长度寄存器中。 4)状态字:状态字包含各个不同的状态位,这些状态位反应程序执行过程中各个指令的执行结果或状态。 二、存储器区域 S7-300/400CPU 存储器可以分为4个区域: 1)装载存储器用于存储用户程序,不包括符号地址赋值或注释。装载存储器可以是RAM或者是FLASH EPROM存储器。 2)工作存储器用于存储与执行程序相关的那部分S7程序。程序只能在工作存储区内执行。 3)I/O存储区允许对所连接信号模块的输入和输出进行直接存取。 4)系统存储区(RAM)包括过程映像输入和输出表、位存储器、定时器和计数器等区域,此外还包括局部数据堆栈、块堆栈和中断堆栈。 三、状态字 状态字各位给出了有关指令状态或结果的信息以及所出现的错误。可以用二进制逻辑操作将状态位信号状态直接集成到程序中,以控制程序执行的流程。 1)首次检查位:状态字的0位称作首次检查位,如果/FC 位的信号状态为“0”,则表示伴随着下一条逻辑指令,程序中将开始一个新的逻辑串。FC前面的斜杠表示对FC取反。 2)逻辑运算结果:状态字的第1位为RLO 位(RLO= “逻辑运算结果”),在二进制逻辑运算中用作暂时存储位。比如,一串逻辑指令中的某个指令检查触点的信号状态,并根据布尔逻辑运算规则将检查的结果(状态位)与RLO位进行逻辑门运算,然后逻辑运算结果又存在RLO位中。 3)状态位:状态位(第2位)用以保存被寻址位的值。状态位总是向扫描指令(A,AN,O,…)或写指令(=,S,R,)显示寻址位的状态(对于写指令,保存的寻址位状态是本条写指令执行后的该寻址位的状态)。 4)OR位:在用指令OR执行或逻辑操作之前,执行与逻辑操作的时候,就需要用到OR这一状态位。OR位表示先前执行的与逻辑操作产生的值为“1”,于是, 逻辑操作或的执行结果就已被确定为“1”。 5)OV位:溢出表示算术或比较指令执行时出现了错误。根据所执行的算术或逻辑指令结果对该位进行设置。 6)OS位:溢出存储位是与OV位一起被置位的,而且在更新算术指令之后,它能够保持这种状态,也就是说,它的状态不会由于下一个算术指令的结果而改变。这样,即使是在程序的后面部分,也还有机会判断数字区域是否溢出或者指令是否含有无效实数。OS位只有通过如下这些命令进行复位:JOS(若OS = 1,则跳转)命令,块调用和块结束命令。 7)CC1及CC0位:CC1和CC0(条件代码)位给出有关下列结果的相关信息: • 算术指令结果 • 或者,比较指令结果 • 字逻辑指令,或 • 在移位功能中,移出位相关信息。 可以用以下指令来检查条件代码CC1和CC0。
CC1 CC0 检查完成后,如果: 0 0 A == 0 结果 = 0 (ACCU2 = ACCU1) 1 0 A > 0 结果 > 0 (ACCU2 > ACCU1) 0 1 A monitor功能激活的时候,BR位的值也会影响LAD/STL/FBD 编辑器中处理的块的显示。 BR位设置为“1”的调用块,表明了状态完成,否则即表明状态未完成。 四、状态指令 1)跳转功能 使用跳转功能,可以中断程序线性处理过程而转向块的另一个位置接着执行。程序分支的执行可能无关任何条件,或者仅当满足特定条件后才执行。 2)无条件跳转 JU 跳转功能总是执行的,也就是说,它的执行不依赖于任何条件。JU跳转功能可以中断程序的线性处理过程而转向跳转标号处执行程序。JU 跳转功能不论是在跳转处,还是在目的标号处都不影响状态位。 3)带有RLO和BR 依据RLO位和BR位的状态,程序可实现分支执行。而且,能够在RLO位检查的跳转功能,同时将其保存到BR位中去。 根据RLO位状态而跳转的功能(JC, JCN)指令,无论条件满足与否,都将状态位STA和RLO设置为“1”,将OR和/FC位设置为“0”。 具有RLO位状态保存能力的跳转功能指令(JCB, JNB)将RLO位的状态保存到BR位中。其余的状态位:STA、RLO、R和/FC位的处理方式与那些不保存RLO状态的跳转功能相同。 取决于BR位状态的跳转功能指令(JBI, JNBI),不论条件满足与否,都将把状态位STA设置为“1”,将OR位和/FC位设置为“0”。而RLO位和BR位的状态则保持不变。 4)取决于OV和OS位, 如果有溢出发生,则执行跳转指令JO和JOS。在需要执行多个连续指令的串运算的跳转功能 中,每次算术计算功能执行完毕后,就必须要对OV 的状态进行评估。如果算术指令执行后,其结果在所允许的数值范围之内,而且之前产生的是一个溢出,则将OV 位复位。为了在串计算结束后检测可能出现的数值范围溢出,就必须要检查OS位的状态。OS位只能由块调用和块结束指令或者跳转指令JOS进行复位。 跳转功能指令JO和JOS不会改变状态字其余各位的状态值。 5)根据CC0和CC1位: 根据状态位CC0和CC1的状态,可以执行某一程序功能。据此,您可以检查计算状态而跳转的功能 ,结果是正值、零、或者负值?
根据状态位C0和CC1的状态而跳转的跳转功能指令不改变任何状态位的状态,而且逻辑操作结果RLO值也会“随着”该跳转功能带到跳转程序段中,供用户程序其它逻辑操作之用(不改变/FC状态)。
示例 两个整数相减并需进行连续判断: L MW2 L MW8 -I JZ ZERO // 如果结果等于“0”,则跳转至标号ZERO处 // 结果不等于“0”时所执行的指令 ZERO: . // 结果等于“0”时,所要执行的指令
6)跳转分配器 JL指令的跳转分配器允许根据跳转分支号,使程序跳转到块内跳转目标程序段。JL指令是与JU跳转功能表一起配合工作的。 该JU功能列表紧接在JL指令之后,它可以含有最大256个跳转入口。JL指令所带的标号指向JU功能列表的末端,也即,指向列表后面的第一条指令。 在JL 和 :之间,只能是跳转指令JU。如果“0”位于寄存器ACCU1-L-L中,那么就执行第一个跳转指令,如果“1”位于寄存器ACCU1-L-L,那么就执行第二个跳转指令,等等,依此类推。如果其中的数字大于列表长度,则JC分支跳转到列表末端。 JL指令的执行不依赖于任何条件,而且不会改变状态位值。 7)Loop 指令 循环指令LOOP简化了循环程序的编程。 要编写一个循环指令程序,需将期望执行的循环扫描数装入寄存器ACCU1-L中。 LOOP 指令就会把累加器ACCU1右边的字看成是一个16位无符号数,范围是0-65535。 LOOP 指令每执行一次,ACCU1-L中的值就减1,接着将该值与0进行比较。如果比较结果不等于0,程序就会跳转到LOOP指令中所指定的标号处;如果比较结果等于0,程序不发生跳转,而是执行紧接下来的一条指令。 8)BE BE指令用来结束当前程序块中的程序执行,BE始终是块中的最后一条指令。 当保存块时,该指令由PG自动产生,因而不必单独输入,此BE指令是不可见的。 操作系统将程序返回到主调块,并从程序调用操作后面的第一条指令开始接着执行程序。当前保存的局部数据区重新激活。 9)BEU BEU 指令象BE指令一样,用来结束当前程序块中的程序执行。与BE指令不同的是,可在块内重复编程BEU。紧接着BEU指令后面的程序段,只有在使用跳转功能指向它的时候才得以执行。 10)BEC BEC指令根据RLO位的值来结束块。如果RLO = 1,则结束当前块的程序执行,并且从程序调用语句后面的第一条指令开始接着执行程序。如果RLO=0,则不执行BEC指令。这时,CPU将RLO位设置为“1”,执行BEC后面的指令。
|