S7-200 CPU提供两种指令集用于完成各种自动化任务:IEC指令集和SIMATIC指令集。IEC指令集是符合PLC编程的IEC1131-3标准,而SIMATIC指令集是专门为S7-200 CPU设计的。可以通过STEP 7-Micro/WIN编程软件的菜单“工具”→“选项”命令,在两种指令集之间切换,如图1-11所示。SIMATIC指令集比IEC指令集执行速度快,指令种类更丰富,完成的功能更多。在为S7-200 CPU编程时,一般采用SIMATIC指令集,下面将主要介绍SIMATIC指令集。
图1-11 S7-200编程模式选择
位逻辑指令是针对触点和线圈进行运算操作的,触点和线圈指令是PLC中应用最多的指令。触点是对二进制位的状态测试,测试结果用于进行逻辑运算;线圈用来改变二进制位的状态,其状态根据它前面的逻辑运算结果而定。
1.触点指令
触点指令包括常开触点、常闭触点、常开立即触点、常闭立即触点、取反触点、正转换触点和负转换触点,它们在梯形图中的表示如表1-13所示。
表1-13 触点指令
常开触点和常闭触点称为标准触点,其操作数为I、Q、V、M、SM、S、T、C、L等。当位等于1时,常开触点接通,常闭触点断开;当位等于0时,常开触点断开,常闭触点接通。
常开立即触点和常闭立即触点称为立即触点,其操作数只能为I。立即触点不依靠S7200 CPU扫描周期进行更新,它会立即更新。当物理输入点为1时,常开立即触点接通,常闭立即触点断开;当物理输入点为0时,常开立即触点断开,常闭立即触点接通。
取反触点将它左边电路的逻辑运算结果取反,逻辑运算结果若为1,则变为0;逻辑运算结果若为0,则变为1。该指令没有操作数。
正转换触点指令(上升沿检测指令)检测到每一次正转换(由0到1),让功率流接通一个扫描周期。负转换触点指令(下降沿检测指令)检测到每一次负转换(由1到0),让功率流接通一个扫描周期。这两个指令没有操作数。
2.线圈指令
线圈指令用来表达一段程序的执行结果,包括输出指令、置位指令、复位指令、立即输出指令、立即置位指令和立即复位指令。它们在梯形图中的表示如表1-13所示。
表1-14 线圈指令
续表
输出指令又称为普通线圈指令,当线圈前的逻辑运算结果为1时,输出指令将相应的位地址置为1;当线圈前的逻辑运算结果为0时,输出指令将相应的位地址清为0。
置位指令在线圈前的逻辑运算结果为1时,从指定的位地址开始,置位指定个数的位地址,个数的范围是1~255;当逻辑运算结果为0时,这些仍保持为1。复位需要用到复位指令。复位指令在线圈前的逻辑运算结果为1时,从指定的位地址开始,复位指定个数的位地址,个数的范围是1~255。
如果复位指令指定的是一个定时器位(T)或计数器位(C),指令不但复位定时器或计数器位,而且清除定时器或计数器的当前值。
立即输出指令、立即置位指令和立即复位指令执行时,将新数值同时写入物理输出和相应的过程映像寄存器位置。这一点不同于非立即指令,只把新值写入输出过程映像寄存器中。
输出指令、置位指令和复位指令的操作数可以是I、Q、V、M、SM、S、T、C、L。立即输出指令、立即置位指令和立即复位指令的操作数只能是Q。指令中个数的操作数可以是IB、QB、VB、MB、SMB、SB、LB、AC、*VD、*LD、*AC和常数。
图1-12~图1-14是触点指令和线圈指令编程示例。
图1-12 常开触点、常闭触点及线圈指令编程示例
图1-13 置位指令和复位指令编程示例
图1-14 取反指令、正转换指令和负转换指令编程示例
S7-200有3种类型的定时器:接通延时定时器(TON)、有记忆接通延时定时器(TONR)和断开延时定时器(TOF)。共计256个定时器,其编号为T0~T255。其中,有记忆接通延时定时器为64个,其余192个均可定义为接通延时定时器或断开延时定时器。
定时器对时间间隔计数,时间间隔称为分辨率,又称为时基。S7-200定时器有3种分辨率:1ms、10ms和100ms,如表1-15所示。
表1-15 定时器类型
从表1-15中可以看出,接通延时定时器(TON)和断开延时定时器(TOF)使用相同的定时器号,但在同一个PLC程序中,一个定时器只能使用一次,不能既有接通延时定时器(TON)T33,又有断开延时定时器(TOF)T33。
定时器的定时时间等于分辨率乘以预设值,例如,T37为100ms定时器,如果预设值为10,则实际定时时间为100ms×10,为1s。定时器在梯形图中的格式如图1-15所示,定时器的有效操作数如表1-16所示。
图1-15 定时器指令格式
表1-16 定时器的有效操作数
S7-200 CPU定时器中,不同分辨率的定时器,由于其刷新方式不同,因而在使用定时器时有一些注意事项。对于1ms分辨率的定时器来说,定时器位和当前值的更新不与扫描周期同步。对于大于1ms的程序扫描周期,定时器位和当前值在一次扫描内刷新多次。对于10ms分辨率的定时器来说,定时器位和当前值在每个程序扫描周期的开始刷新。定时器位和当前值在整个扫描周期过程中为常数。在每个扫描周期的开始会将前一个扫描累计的时间间隔加到定时器当前值上。对于分辨率为100ms的定时器,在执行指令时对定时器位和当前值进行更新。因此,如果100ms定时器指令不是每个周期都执行,定时器就不能及时刷新,可能会导致出错。
1.接通延时定时器(TON)
接通延时定时器(TON)用于计时单个时间间隔。当输入端接通时,定时器开始计时;当定时器的当前值大于或等于预设值时,定时器变为ON。定时器继续计时,一直计时到最大值。当输入端断开,或用复位指令复位定时器时,定时器当前值被清零,定时器变为OFF。接通延时定时器(TON)程序示例如图1-16所示。
图1-16 接通延时定时器(TON)程序示例
2.有记忆接通延时定时器(TONR)
有记忆接通延时定时器(TONR)用于累计多个间隔。当输入端接通时,定时器开始计时;当定时器的当前值大于或等于预设值时,定时器变为ON。定时器继续计时,一直计时到最大值。当输入端断开时,定时器保留当前值并停止计时,当输入端再次接通时,定时器从保留的值开始计时。有记忆接通延时定时器(TONR)只能用复位指令R对其复位,复位后,定时器变为OFF,当前值清零。有记忆接通延时定时器(TONR)程序示例如图1-17所示。
图1-17 有记忆接通延时定时器(TONR)程序示例
3.断开延时定时器(TOF)
断开延时定时器(TOF)用来在输入断开后延时一段时间断开输出。当输入端接通时,定时器变为ON,当前值被设为0。当输入端断开时,定时器开始计时。当定时器的当前值等于预设值时,定时器变为OFF,并停止计时。如果在定时到达预设值之前,输入端重新接通,则定时器位保持为ON。断开延时定时器(TOF)程序示例如图1-18所示。
图1-18 断开延时定时器(TOF)程序示例
计数器用来累计输入脉冲的数量。S7-200有3种计数器:增计数器(CTU)、减计数器(CTD)和增/减计数器(CTUD)。共计256个计数器,其编号为C0~C255。由于每一个计数器只有一个当前值,所以不要多次定义同一个计数器(具有相同标号的增计数器、增/减计数器、减计数器访问相同的当前值)。当使用复位指令复位计数器时,计数器位复位并且计数器当前值被清零。计数器在梯形图中的格式如图1-19所示,计数器的有效操作数如表1-17所示。
图1-19 计数器指令格式
表1-17 计数器的有效操作数
1.增计数器(CTU)
增计数指令(CTU)从当前计数值开始,在每次输入状态(CU)从OFF到ON变化时,递增计数。当Cxx的当前值大于或等于预设值PV时,计数器位Cxx置位。当它达到最大值(32 767)后,计数器停止计数。当复位端(R)接通或者执行复位指令后,计数器被复位。增计数器(CTU)程序示例如图1-20所示。
图1-20 增计数器(CTU)程序示例
2.减计数器(CTD)
减计数指令(CTD)从当前计数值开始,在每次输入状态(CD)从OFF到ON变化时,递减计数。当Cxx的当前值等于0时,计数器位Cxx置位,并停止计数。当装载输入端(LD)接通时,计数器位被复位,并将计数器的当前值设为预设值PV。减计数器(CTD)程序示例如图1-21所示。
图1-21 减计数器(CTD)程序示例
3.增/减计数器(CTUD)
增/减计数指令(CTUD)在每次增计数输入状态(CU)从OFF到ON变化时,递增计数;在每次减计数输入状态(CD)从OFF到ON变化时,递减计数。在每一次计数器执行时,预设值PV与当前值进行比较,当Cxx的当前值大于或等于预设值PV时,计数器位Cxx置位。当计数器当前值达到最大值(32 767)时,在增计数输入状态(CU)的下一个上升沿将当前计数值变为最小值(−32 768);当计数器当前值达到最小值(−32 768)时,在减计数输入状态(CD)的下一个上升沿将当前计数值变为最大值(32 767)。当复位端(R)接通或者执行复位指令后,计数器位被复位,当前值被清零。增/减计数指令(CTUD)程序示例如图1-22所示。
图1-22 增/减计数指令(CTUD)程序示例
S7-200 PLC的比较指令可以对字节、整数、双整数、实数和字符串类型的数据进行比较。其中字节比较是无符号的,整数、双整数和实数的比较是有符号的。执行比较指令时,PLC对两个源数据进行比较,如果条件满足,则触点接通;如果条件不满足,则触点断开。比较指令(以等于为例)在梯形图中的表示如表1-18所示,程序示例如图1-23所示。
表1-18 比较指令
图1-23 比较指令程序示例
数字运算指令使得PLC不再局限于位操作,而是具有越来越强的运算能力,扩大了PLC的应用范围,使得PLC具有了更强的竞争力。它包括四则运算指令(加、减、乘、除)、增减指令和数学函数指令。
1.四则运算指令
四则运算指令分为加法、减法、乘法和除法指令,这四种指令的有效操作数如表1-19所示。
表1-19 四则运算指令有效操作数
加法指令是对两个有符号数进行相加,其梯形图的指令格式如表1-20所示。
表1-20 加法指令格式
减法指令是对两个有符号数进行相减操作,其梯形图的指令格式如表1-21所示。
表1-21 减法指令格式
乘法指令是对两个有符号数进行相乘运算,其梯形图的指令格式如表1-22所示。
表1-22 乘法指令格式
续表
除法指令是对两个有符号数进行相除运算,其梯形图的指令格式如表1-23所示。
表1-23 除法指令格式
2.增减指令
增减指令又称为自动加1或自动减1指令,数据长度可以是字节、字和双字。其中字节增指令和字节减指令的操作是无符号的,字、双字增指令和字、双字减指令的操作是有符号的。增减指令的有效操作数如表1-24所示,其梯形图的指令格式如表1-25所示。
表1-24 增减指令有效操作数
表1-25 增减指令格式
3.数学函数指令
数学函数指令包括正弦(SIN)函数、余弦(COS)函数、正切(TAN)函数、自然对数、自然指数和平方根函数指令。数学函数指令是双字长的实数运算,其有效操作数如表1-26所示,梯形图的指令格式如表1-27所示。
表1-26 数学函数指令有效操作数
表1-27 数学函数指令格式
续表
传送指令在不改变原存储单元值的情况下,将IN(输入端存储单元)的值复制到OUT(输出端存储单元)中。传送指令包括普通传送指令、字节立即传送指令和块传送指令。
1.普通传送指令
普通传送指令可按字节、字、双字及实数进行数据传送。其有效操作数如表1-28所示,梯形图的指令格式如表1-29所示。
表1-28 普通传送指令有效操作数
表1-29 普通传送指令格式
续表
2.字节立即传送指令
字节立即传送指令允许在物理I/O和存储器之间立即传送一个字节数据,包括字节立即读指令和字节立即写指令。字节立即读指令读取物理输入,并将结果存入内存地址,但输入映像寄存器并不刷新。字节立即写指令从内存地址中读取数据,写入物理输出,同时刷新相应的输出映像寄存器。字节立即传送指令的有效操作数如表1-30和表1-31所示,其梯形图的指令格式如表1-32所示。
表1-30 字节立即读指令有效操作数
表1-31 字节立即写指令有效操作数
表1-32 字节立即传送指令格式
3.块传送指令
块传送指令用来一次传送多个数据,最多可传送255个数据组成的数据块。数据块的类型可以是字节块、字块和双字块,其有效操作数如表1-33所示,梯形图的指令格式如表1-34所示。
表1-33 块传送指令有效操作数
续表
表1-34 块传送指令格式
在进行数据处理时,不同性质的操作指令需要不同数据类型的操作数。转换指令用于对操作数的类型进行转换,并输出到指定的目标地址中。转换指令包括标准转换指令、ASCII码转换指令和字符串转换指令,字符串转换指令和ASCII码转换指令类似,这里不作介绍。
1.标准转换指令
标准转换指令包括整数至字节转换、字节至整数转换、整数至双整数转换、双整数至整数转换、整数至BCD码转换、BCD码至整数转换、双整数至实数转换、四舍五入指令和取整指令。这些指令将输入值转换为指定的格式并存储到输出值存储区中。标准转换指令的有效操作数如表1-35所示,梯形图的指令格式如表1-36所示。
表1-35 标准转换指令有效操作数
续表
表1-36 标准转换指令格式
2.ASCII码转换指令
ASCII码转换指令包括整数至ASCII码转换、双整数至ASCII码转换、实数至ASCII码转换、十六进制数至ASCII码转换和ASCII码至十六进制数转换。有效的ASCII码字符为十六进制的16#30~16#39和16#41~16#46,也就是数字字符0~9和大写字母A~F。ASCII码转换指令的有效操作数如表1-37所示,梯形图的指令格式如表1-38所示。
表1-37 ASCII码转换指令有效操作数
表1-38 ASCII码转换指令格式
整数至ASCII码转换指令输入端FMT的含义如图1-24所示。
图1-24 整数至ASCII码转换指令的FMT操作数
整数至ASCII码转换指令输出缓冲区的大小始终是8字节。nnn表示输出缓冲区中小数点右侧的数字位数。nnn域的有效范围是0~5。nnn=000~101,分别对应0~5。对于nnn大于5的情况,输出缓冲区会被空格键的ASCII码填充。c指定用逗号(c=1)或者点号(c=0)作为整数和小数的分隔符。高4位必须为0。图1-25给出了一个数值的例子,其格式为使用点号(c=0),小数点右侧有三位小数(nnn=011)。
图1-25 整数至ASCII码转换示例
双整数至ASCII码转换指令输入端FMT的含义如图1-26所示。
图1-26 双整数至ASCII码转换指令的FMT操作数
双整数至ASCII码转换指令输出缓冲区的大小始终是12字节,nnn表示输出缓冲区中小数点右侧的数字位数。nnn域的有效范围是0~5。对于nnn大于5的情况,输出缓冲区会被空格键的ASCII码填充。c指定用逗号(c=1)或者点号(c=0)作为整数和小数的分隔符。高4位必须为0。图1-27给出了一个数值的例子,其格式为使用点号(c=0),小数点右侧有四位小数(nnn=100)。
图1-27 双整数至ASCII码转换示例
实数至ASCII码转换指令输入端FMT的含义如图1-28所示。
实数至ASCII码转换指令的输出缓冲区的大小由ssss域决定,范围为3~15字节。S7-200的实数格式支持最多7位小数,试图显示7位以上的小数会产生一个四舍五入的错误。ssss表示输出缓冲区的大小,0、1或者2字节的大小是无效的。nnn表示输出缓冲区中小数点右侧的数字位数。nnn域的有效范围是0~5。对于nnn大于5或者指定的输出缓冲区太小以致于无法存储转换值的情况,输出缓冲区会被空格键的ASCII码填充。c指定用逗号(c=1)或者点号(c=0)作为整数和小数的分隔符。图1-29给出了一个数值的例子,其格式为使用点号(c=0),小数点右侧有一位小数(nnn=001)和6字节的缓冲区大小(ssss=0110)。
图1-28 实数至ASCII码转换指令的FMT操作数
图1-29 实数至ASCII码转换示例
移位指令在PLC控制中是比较常用的,移位指令分为左、右移位指令和左、右循环移位指令及移位寄存器指令三大类。左、右移位指令和左、右循环移位指令根据移位数据的长度分为字节型、字型和双字型,最大移位位数为字节型数据。移位指令的梯形图指令格式如表1-39所示。
表1-39 移位指令格式
续表
左、右移位指令将输入值IN左移或右移N位,并将结果装载到输出OUT中。移位指令对移出的位自动补零。如果位数N大于或等于最大允许值(对于字节操作为8,对于字操作为16,对于双字操作为32),则移位操作的次数为最大允许值。如果移位次数大于0,溢出标志位(SM1.1)上就是最近移出的位值。如果移位操作的结果为0,零存储器位(SM1.0)置位。字节操作是无符号的。对于字和双字操作,当使用有符号数据类型时,符号位也被移动。
循环左、右移位指令将输入值IN循环左移或者循环右移N位,并将输出结果装载到OUT中。循环移位是圆形的。如果位数N大于或者等于最大允许值(对于字节操作为8,对于字操作为16,对于双字操作为32),S7-200在执行循环移位之前,会执行取模操作,得到一个有效的移位次数。移位位数的取模操作结果,对于字节操作是0~7,对于字操作是0~15,而对于双字操作是0~31。如果移位次数为0,循环移位指令不执行,零标志位(SM1.0)被置位。如果循环移位指令执行,最后一个移位的值会复制到溢出标志位(SM1.1)。如果移位次数不是8(对于字节操作)、16(对于字操作)和32(对于双字操作)的整数倍,最后被移出的位会被复制到溢出标志位(SM1.1)。字节操作是无符号的。对于字和双字操作,当使用有符号数据类型时,符号位也被移位。
移位寄存器指令将一个数值移入到移位寄存器中。移位寄存器指令提供了一种排列和控制产品流或数据流的简单方法。使用该指令,在每个扫描周期,整个移位寄存器移动一位。移位寄存器指令把输入的DATA数值移入移位寄存器。其中,S_BIT指定移位寄存器的最低位,N指定移位寄存器的长度和移位方向(正向移位=N,反向移位=-N)。移位寄存器指令移出的每一位都被放入溢出标志位(SM1.1)。移位寄存器指令的有效操作数如表1-40所示。
表1-40 移位指令有效操作数
移位寄存器的最高位(MSB.b)可通过下列公式计算求得:
MSB.b = [(S_BIT的字节号)+([N]-1+(S_BIT的位号))除以8].[除以8的余数]
例如:如果S_BIT是V33.4、N是14,下列计算显示MSB.b是V35.1。
当反向移动时,N为负值,输入数据从最高位移入,最低位(S_BIT)移出。移出的数据放在溢出标志位(SM1.1)中。当正向移动时,N为正值,输入数据从最低位(S_BIT)移入,最高位移出。移出的数据放在溢出标志位(SM1.1)中。移位寄存器的最大长度为64位。图1-30中给出了N为正和负两种情况下的移位过程。
图1-30 移位寄存器的正向移位和反向移位
逻辑运算指令是对逻辑数(无符号数)进行处理,包括逻辑取反、逻辑与、逻辑或和逻辑异或操作,数据长度可以是字节、字和双字。逻辑运算指令的有效操作数如表1-41所示,梯形图的指令格式如表1-42所示。
表1-41 逻辑运算指令有效操作数
表1-42 逻辑运算指令格式
续表
逻辑运算指令的程序示例如图1-31所示,此例的功能是当常开触点I0.0接通后,分别执行字取反指令、字AND(与)指令、字OR(或)指令和字XOR(异或)指令,运算结果如图1-32所示。
图1-31 逻辑运算指令程序示例
图1-32 逻辑运算结果
程序控制指令包括条件结束指令、停止指令、监视程序(看门狗)复位指令、FORNEXT循环指令、跳转指令和标号指令,其梯形图的指令格式如表1-43所示。
表1-43 程序控制指令格式
条件结束指令(END)根据前面的逻辑关系终止当前扫描周期。可以在主程序中使用条件结束指令,但不能在子程序或中断程序中使用该指令。
停止指令(STOP)将S7-200 CPU从运行模式切换至停止模式,从而立即终止程序的执行。如果停止指令在中断程序中执行,则该中断立即终止,并且忽略所有挂起的中断,继续扫描程序的剩余部分。完成当前周期的剩余动作,包括主用户程序的执行,并在当前扫描周期的最后,完成从运行模式到停止模式的转变。
监视程序复位指令(WDR)允许S7-200 CPU的系统看门狗定时器被重新触发,这样可以在不引起看门狗错误的情况下,增加扫描所允许的时间。使用监视程序复位指令要小心,因为如果用指令去阻止扫描完成或过度地延迟扫描完成的时间,则在终止本次扫描前,下列操作将被禁止:通信(自由端口方式除外)、I/O更新(立即I/O指令除外)、强制更新、SM位更新、运行时间诊断、在中断程序中的STOP指令等。当扫描时间超过25s,10ms和100ms定时器将不会正确累计时间。
FOR-NEXT循环指令可以描述需重复进行一定次数的循环体。每条FOR指令必须对应一条NEXT指令,NEXT指令标志着FOR循环的结束。FOR-NEXT循环嵌套(一个FORNEXT循环在另一个FOR-NEXT循环之内)深度可达8层。FOR-NEXT指令执行FOR指令和NEXT指令之间的指令。
跳转指令(JMP)执行程序内标号N指定的程序分支。标号指令标识跳转目的地的位置N。可以在主程序、子程序或者中断程序中使用跳转指令。跳转和与之相应的标号指令必须位于同一段程序代码中(无论是主程序、子程序还是中断程序)。不能从主程序跳到子程序或中断程序,同样不能从子程序或中断程序跳出。