第3章 PLC的编程语言
3.1 S7-200 PLC的编程基础知识
3.1.1 数据的存储类型
(1)数据的长度和类型 S7-200将信息存于不同的存储器单元,每个单元都有唯一的地址。可以明确指出要存取的存储器地址,这就允许用户程序直接存取这个信息。表3-1列出了不同长度的数据所能表示的数值范围。
表3-1 不同长度的数据表示的十进制和十六进制数范围
(2)常数 在S7-200的许多指令中都用到常数,常数有多种表示方法,如二进制、十进制和十六进制等。在表述二进制和十六进制时,要在数据前分别加“2#”或“16#”,格式如下:
二进制常数:2#1100,十六进制常数:16#234B1。其他的数据表述方法举例如下:
ASCII码:“HELLOW”,实数:-3.1415926,十进制数:234。
几个错误表示方法:八进制的“33”表示成“8#33”,十进制的“33”表示成“10#33”,“2”用二进制表示成“2#2”,这些错误读者要避免。
若要存取存储区的某一位,则必须指定地址,包括存储器标识符、字节地址和位号。图3-1是一个位寻址的例子。其中,存储器区、字节地址(I代表输入,2代表字节2)和位地址之间用点号(.)隔开。
图3-1 位寻址的例子
【例3-1】如图3-2所示,如果MD0=1FH,那么,MB0、MB1、MB2和MB3的数值是多少?
图3-2 字节、字和双字的起始地址
解:根据图3-2可知,MB0=0,MB1=0,MB2=0,MB3=1FH。这点不同于三菱PLC,注意区分。
3.1.2 元件的功能与地址分配
(1)输入过程映像寄存器I 输入继电器与输入端相连,它是专门用来接收PLC外部开关信号的元件。在每次扫描周期的开始,CPU对物理输入点进行采样,并将采样值写入输入过程映像寄存器中,可以按位、字节、字或双字来存储输入过程映像寄存器中的数据,输入寄存器等效电路如图3-3所示。
图3-3 输入寄存器I0.0的等效电路
位格式:I[字节地址].[位地址],如I0.0。
字节、字或双字格式:I[长度][起始字节地址],如IB0、IW0、ID0。
(2)输出过程映像寄存器Q 输出继电器用来将PLC内部信号输出传送给外部负载(用户输出设备)。输出继电器线圈由PLC内部程序的指令驱动,其线圈状态传送给输出单元,再由输出单元对应的硬触点来驱动外部负载,输出寄存器等效电路如图3-4所示,在每次扫描周期的结尾,CPU将输出过程映像寄存器中的数值复制到物理输出点上。要以按位、字节、字或双字来存取输出过程映像寄存器。
图3-4 输出寄存器Q0.0的等效电路
位格式:Q[字节地址].[位地址],如Q1.1。
字节、字或双字格式:Q[长度][起始字节地址],如QB5、QW5、QD5。
(3)变量存储器V 可以用V存储器存储程序执行过程中控制逻辑操作的中间结果,也可以用它来保存与工序或任务相关的其他数据,变量存储器不能直接驱动外部负载。它可以按位、字节、字或双字来存取V存储区中的数据。
位格式:V[字节地址].[位地址],如V10.2。
字节、字或双字格式:V[长度] [起始字节地址],如VB100、VW100、VD100。
(4)位存储器M 位存储器是PLC中数据最多的一种继电器,一般的辅助继电器与继电器控制系统中的中间继电器相似。位存储器不能直接驱动外部负载,负载只能由输出继电器的外部触点驱动。位存储器的常开与常闭触点在PLC内部编程时可以无限次使用。可以用位存储区作为控制继电器来存储中间操作状态和控制信息,并且可以按位、字节、字或双字来存取位存储区。
位格式:M[字节地址].[位地址],如M2.7。
字节、字或双字格式:M[长度][起始字节地址],如MB10、MW10、MD10。
提示:有的用户习惯使用M区作为中间地址,但S7-200 CPU中M区地址空间很小,只有32个字节,往往不够用。而S7-200 CPU中提供了大量的V区存储空间,即用户数据空间。V存储区相对很大,其用法与M区相似,可以按位、字节、字或双字来存取V区数据,例如VI0.1、VB20、VW100、VD200等。
【例3-2】图3-5所示的梯形图中,Q0.0控制一盏灯,请分析当系统上电后接通I0.0和系统断电后又上电时灯的明暗情况。
图3-5 梯形图
解:当系统上电后接通I0.0,Q0.0线圈带电,并自锁,灯亮;系统断电后又上电,Q0.0线圈处于断电状态,灯不亮。
(5)特殊存储器SM SM位为CPU与用户程序之间传递信息提供了一种手段。可以用这些位选择和控制S7-200 CPU的一些特殊功能。例如,首次扫描标志位(SM0.1)、按照固定频率开关的标志位或者显示数学运算或操作指令状态的标志位,并且可以按位、字节、字或双字来存取SM位。
位格式:SM[字节地址].[位地址],如SM0.1。
字节、字或双字格式:SM[长度][起始字节地址],如SMB86、SMW22、SMD42。
特殊寄存器的范围为SM0~SM549,全部掌握是比较困难的,全部特殊寄存器请参考有关手册,常用的特殊寄存器见表3-2。SM0.0、SM0.1、SM0.5的波形图如图3-6所示。
表3-2 特殊存储器字节SM0(SM0.0~SM0.7)
图3-6 SM0.0、SM0.1、SM0.5的波形图
【例3-3】图3-7所示的梯形图中,Q0.0控制一盏灯,请分析当系统上电后灯的明暗情况。
解:因为SM0.5是周期为1s的脉冲信号,所以灯亮0.5s,然后暗0.5s,以1s为周期闪烁。
图3-7 例3-3的梯形图
(6)局部存储器L S7-200有64B的局部存储器,其中60B可以用做临时存储器或者给子程序传递参数。如果用梯形图或功能块图编程,STEP 7-Micro/WIN保留这些局部存储器的最后4B。局部存储器和变量存储器V很相似,但只有一个区别:变量存储器是全局有效的,而局部存储器只在局部有效。全局是指同一个存储器可以被任何程序存取(包括主程序、子程序和中断服务程序),局部是指存储器区和特定的程序相关联。S7-200给主程序分配64B的局部存储器,给每一级子程序嵌套分配64B的局部存储器,同样给中断服务程序分配64B的局部存储器。
子程序不能访问分配给主程序、中断服务程序或者其他子程序的局部存储器。同样,中断服务程序也不能访问分配给主程序或子程序的局部存储器。S7-200 PLC根据需要分配局部存储器,也就是说,当主程序执行时,分配给子程序或中断服务程序的局部存储器是不存在的。当发生中断或者调用一个子程序时,需要分配局部存储器。新的局部存储器地址可能会覆盖另一个子程序或中断服务程序的局部存储器地址。
局部存储器在分配时PLC不进行初始化,初值可能是任意的,当在子程序调用中传递参数时,在被调用子程序的局部存储器中,由CPU替换其被传递的参数的值,局部存储器在参数传递过程中不传递值,在分配时不被初始化,可能包含任意数值。L可以作为地址指针。
位格式:L[字节地址].[位地址],如L0.0。
字节、字或双字格式:L[长度][起始字节地址],如LB33。下面的程序中,LD10作为地址指针。
LD SM0.0 MOVD &VB0,LD10 //将V区的起始地址装载到指针中
(7)模拟量输入映像寄存器AI S7-200将模拟量值(如温度或电压)转换成1个字长(16位)的数字量。可以用区域标识符(AI)、数据长度(W)及字节的起始地址来存取这些值。因为模拟输入量为1个字长,并且从偶数位字节(如0、2、4)开始,所以必须用偶数字节地址(如AIW0、AIW2、AIW4)来存取这些值,如AIW1是错误的数据。模拟量输入值为只读数据。
格式:AIW[起始字节地址],如AIW0。以下为通道0模拟量输入的程序。
LD SM0.0 MOVW AIW0,CW10 //将通道0模拟量输入量转换为数字量后存入MW10中
(8)模拟量输出映像寄存器AQ S7-200把1字长的数字值按比例转换为电流或电压。可以用区域标识符(AQ)、数据长度(W)及字节的起始地址来改变这些值。因为模拟量为一个字长,且从偶数字节(如0,2,4)开始,所以必须用偶数字节地址(如AQW0、AQW2、AQW4)来改变这些值。模拟量输出值时只写数据。
格式:AQW[起始字节地址],如AQW0。以下为通道0模拟量输入的程序。
LD SM0.0 MOVW 1234,AQW0 //将通道1234转换成模拟量(如电压)从通道0中输出
(9)定时器T 在S7-200 CPU中,定时器可用于时间累计,其分辨率(时基增量)分为1ms、10ms和100ms三种。定时器有以下两个变量。
①当前值:16位有符号整数,存储定时器所累计的时间。
②定时器位:按照当前值和预置值的比较结果置位或复位(预置值是定时器指令的一部分)。
可以用定时器地址来存取这两种形式的定时器数据。究竟使用哪种形式取决于所使用的指令:如果使用位操作指令,则是存取定时器位;如果使用字操作指令,则是存取定时器当前值。存取格式为:T[定时器号],如T37。
S7-200系列中定时器可分为接通延时定时器、有记忆的接通延时定时器和断开延时定时器三种。它们是通过对一定周期的时钟脉冲进行累计而实现定时的,时钟脉冲的周期(分辨率)有1ms、10ms、100ms三种,当计数达到设定值时触点动作。
(10)计数器存储区C 在S7-200 CPU中,计数器可以用于累计其输入端脉冲电平由低到高的次数。CPU提供了三种类型的计数器,一种只能增加计数;一种只能减少计数;另外一种既可以增加计数,又可以减少计数。计数器有以下两种形式。
①当前值:16位有符号整数,存储累计值。
②计数器位:按照当前值和预置值的比较结果置位或者复位(预置值是计数器指令的一部分)。
可以用计数器地址来存取这两种形式的计数器数据。究竟使用哪种形式取决于所使用的指令:如果使用位操作指令,则是存取计数器位;如果使用字操作指令,则是存取计数器当前值。存取格式为:C[计数器号],如C24。
(11)高速计数器HC 高速计数器用于对高速事件计数,它独立于CPU的扫描周期。高速计数器有一个32位的有符号整数计数值(或当前值)。若要存取高速计数器中的值,则应给出高速计数器的地址,即存储器类型(HC)加上计数器号(如HC0)。高速计数器的当前值是只读数据,仅可以作为双字(32位)来寻址。
格式:HC[高速计数器号],如HC1。
(12)累加器AC 累加器是可以像存储器一样使用的读写设备。例如,可以用它来向子程序传递参数,也可以从子程序返回参数,以及用来存储计算的中间结果。S7-200提供4个32位累加器(AC0、AC1、AC2和AC3),并且可以按字节、字或双字的形式来存取累加器中的数值。
被访问的数据长度取决于存取累加器时所使用的指令。如图3-7所示,当以字节或者字的形式存取累加器时,使用的是数值的低8位或低16位。当以双字的形式存取累加器时,使用全部32位。
格式:AC[累加器号],如AC0。以下为将常数18移入AC0中的程序。
LD SM0.0 MOVB 18,AC0 //将常数18移入AC0
(13)顺控继电器存储S 顺控继电器位(S)用于组织机器操作或者进入等效程序段的步骤。SCR提供控制程序的逻辑分段。可以按位、字节、字或双字来存取S位。
位:S[字节地址].[位地址],S3.1。
字节、字或双字:S[长度][起始字节地址]。
3.1.3 STEP 7中的编程语言
STEP 7有梯形图、语句表和功能块图3种基本编程语言,可以相互转换。通过安装软件包,还有其他的编程语言,以下简要介绍。
(1)顺序功能图(SFC) STEP 7中为S7-Graph,不是STEP 7的标准配置,需要安装软件包,是针对顺序控制系统进行编程的图形编程语言,特别适合顺序控制程序编写。
(2)梯形图(LAD) 直观易懂,适合于数字量逻辑控制。“能流”(Power flow)与程序执行的方向。梯形图适合于熟悉继电器电路的人员使用。设计复杂的触点电路时最好用梯形图。其应用最为广泛。
(3)语句表(STL) 功能比梯形图或功能块图强。语句表可供喜欢用汇编语言编程的用户使用。语句表的输入快,可以在每条语句后面加上注释。设计高级应用程序时建议使用语句表。S7-200不支持此功能。
(4)功能块图(FBD) “LOGO!”系列微型PLC使用功能块图编程。功能块图适合于熟悉数字电路的人使用。
(5)结构文本(ST) STEP 7的S7-SCL(结构化控制语言)符合EN61131-3标准。SCL适合于复杂的公式计算、复杂的计算任务和最优化算法,或管理大量的数据等。S7-SCL编程语言适合于熟悉高级编程语言(例如PASCAL或C语言)的人使用。S7-200不支持此功能。
(6)S7-HiGraph编程语言 图形编程语言S7-HiGraph属于可选软件包,它用状态图(state graphs)来描述异步,非顺序过程的编程语言。S7-HiGraph适合于异步非顺序过程的编程。S7-200不支持此功能。
(7)S7 CFC编程语言 可选软件包CFC(Continuous Function Chart,连续功能图)用图形方式连接程序库中以块的形式提供的各种功能。CFC适合于连续过程控制的编程。它不是STEP 7的标准配置,需要安装软件包。S7-200不支持此功能。
在STEP 7编程软件中,如果程序块没有错误,并且被正确地划分为网络,在梯形图、功能块图和语句表之间可能转换。如果部分网络不能转换,则用语句表表示。