PLC编程实用指南(第2版)
上QQ阅读APP看书,第一时间看更新

1.3 PLC程序数据

关键词:地址、位、数位、字节、字、通道、双字、入出软器件、内部软器件、变量、局部

变量、全局变量、数据类型、自定义数据类型、数组、结构、指针、常量数据是PLC处理信息的载体,是PLC POU即程序组织单元(Program Organization Unit)的重要组

成部分。可以这么说,没有数据也就没有PLC的程序。PLC程序数据有地址、变量、常量及其他。

1.3.1 地址

这里讲的地址是指PLC软器件。是PLC操作系统划分与管理的内存区。用于存储PLC程序数据。并使用与电器相关的含义命名,如某某继电器、某某定时器、某某计数器、某某数据存储器等。其实,这些都只是内存区中的一个位、字节或字。这些位、字节、字的值,即代表着这些器件的状态。也正是在物理上,这些器件只是内存区的位、字节、字或位,所以,才称之为软器件。

PLC软器件分为I/O软器件与内部软器件。

PLC I/O软器件也可称映射器件,是内存区中与输入、输出等种种模块相映射的区域。与输入点对应的称输入继电器,或称输入映射区。与输出点对应的称输出继电器,或称输出映射区。如用有模拟量模块或其他智能模块,则还包括与其有关的数据映射区。如PLC联网,则还含有与联网模块有关的数据缓冲区。

内部软器件用于存储运行程序的中间结果。一般讲,内部器件与硬件没有映射关系。但是,如果PLC用到特殊功能的单元时,有可能要分配一些内部器件作为与CPU交换数据的缓冲区及工作状态的记录。内部器件有内部辅助继电器、特殊继电器、计数器、计时器、数据存储器、暂存器等。当然,不同的PLC,这些类型、名称也不可能完全相同。

软器件的类型及数量,反映了PLC的控制能力,是PLC性能的重要方面。越是性能好的PLC,越是新型的PLC,其类型也越多,数量也越大。不过,由于新型PLC已与计算机一样,也可在内存区中自定义程序变量。因而,这里讲的软器件的类型及数量多少已无关紧要。只要这个可定义变量的内存区足够大,可定义的变量类型足够多,其控制能力自然也就强了。

PLC技术的发展,其软器件的类型及数量,特别是内部器件现已大为增加。所以,不少PLC多已不用继电器(RELAY)称谓它了。而改称它为区(AREA)。突出了PLC信息处理的功能。

要指出的是,这些软器件在内存中确都有其实际地址。但对多数PLC可不必去具体了解。只是个别PLC,如西门子S7200型PLC,对软器件进行间接地访问时,则先要知道它在内存中的实际地址,然后才可进行访问。对此,还将在随后介绍间接地址时有所说明。

1.I/O软器件

(1)开关量用的输入、输出继电器。开关量用的输入、输出继电器是指,可与实际开关量输入、输出模块上的点相对应的那部分内存区。它决定了PLC可能配置的最多I/O(开关量)点数。西门子PLC称之为过程映射寄存器(process-image register),指的也是与输入、输出点有对应关系的内存区。

输入继电器与输入点对应。一般讲当PLC输入刷新时,输入暂存器的状态即映像到输入继电器中。输入继电器为只读存储器,不能用程序改变它的内容,而只能被输入点的状态所映像。所以无输入点与其对应的,如其地址是固定编排时,一般不能作为他用。

输出继电器与输出点对应。一般讲当PLC输出刷新时,输出继电器的状态被映像到输出内部电路的锁存器。锁存器保持状态,直到下一个刷新的到来。锁存器再经输出电路传递,即成为输出点上的输出。输出继电器是可写的,以便产生所要求的输出;也还是可读的,以用于反馈控制。对用户程序,它是可读可写的存储单元。所以,若无输出点与其对应的也可另作他用。

这里的点是指二进制数的一个位,仅1、0两个取值。用它代表开关触点,或继电器的触点及线圈。1代表有关开关触点通(ON)或有关继电器线圈得电(工作、ON)。0代表这个触点断,或这继电器线圈失电(不工作、OFF)。

继电器的触点有常开的,它的线圈不工作(或说失电)时,它断、OFF;它的线圈工作(或说得电)时,它通、ON。还有常闭的,它的线圈ON,它OFF;它的线圈OFF,它ON。只是这里继电器既无实际的线圈,又无实际的触点。这里讲的线圈、触点,都只是内存单元的一个位。但在性能上可认为:线圈得电,为用1写了这个单元;线圈失电,为用0写了这个单元。用其常开触点,指直接用它的值;用其常闭触点,指用它取反后的值。这样的继电器也称软继电器。显然,其触点的使用次数是不受限制的,其线圈被改写的次数也是不受限制的。这也是它比实际继电器好用的重要之点。

要使用这些“点”,必须弄清它是怎么编址的?这个编址,各PLC厂商多不尽相同。这也是PLC使用的一个难点。

欧姆龙PLC编址是按字、位计算,先指定字(有时也称通道,channel,但施耐德PLC则把这里的位称通道)地址,再指定在字中的位地址,如图1-15a所示。

如地址为0001.03,则表示为0001通道(字)的03位,如图1-15所示。

西门子PLC编址是按字节、位计算,先指定字节地址,再指定在字节中的位地址,如图1-16所示。

978-7-111-39745-8-Chapter02-31.jpg

图1-15 欧姆龙PLC地址含义

1—字或通道地址 2—位地址(00到15) 3—通道地址 4—位地址0001.03

如图所示,这里地址是I3.4,其含义是输入点(I为输入点编址的前缀),3为字节地址,4为字节3中的第4位。如果为输出点,则所加的前缀为“Q”。

三菱PLC的输入(前缀加X)、输出点(前缀加Y)是以位编址,如图1-17所示。都是从0到可能的最大地址。并按八(对小型机)或十六(对中、大型机)进制进位。但没有字或字节地址。当多位使用时,则应在其前,加上使用多少位的指定。如K1X0,指的是X0~X4,4个位。再如K2X0,指的是X0~X7,8个位。其余类推。这样,如按字节、字使用时,虽较麻烦,但也有其灵活性。可使这些点的使用,不受字节、字的局限。

978-7-111-39745-8-Chapter02-32.jpg

图1-16 西门子PLC地址含义

978-7-111-39745-8-Chapter02-33.jpg

图1-17 三菱PLC位元件多位使用时的指定

西门子PLC用字节、位编址,要用字节,则前缀加QB,要用字,则前缀加QW。要用双字,则前缀加QD。但编号仍按字节计。如用QW0,则含有QB0、QB1;用QW2则含QB2、QB3;如用双字时QD0,则含有QB0、QB1、QB2、QB3。可知,如用了QW0,不能再用QW1,否则,QB1地址将重复使用。

和利时PLC开关量I/O软器件地址格式为:先是百分号(%,施耐德等PLC也如此),接着加地址类型标识(输入为I、输出为Q、中间存储区为M),最后为地址编号。地址编号先是位(通道)、字节、字、双字标志,然后加数码号。这里位标志为X,字节标志为B,字标志为W;双字标志为D。当使用“位”地址时,则首先要指定其所在的字节地址,然后再指出其在字节中的位地址。具体方法是用小数表示,整数部分标出是哪个字节,小数部分标出是哪个“位”。如图1-18所示。

978-7-111-39745-8-Chapter02-34.jpg

图1-18 和利时PLC地址编号

如图所示,%IX3.4指的是输入第3字节的第4位。

使用PLC,一定要了解输入、输出继电器的情况。要清楚,它有多少输入输出继电器,怎么编号,与输入、输出点的物理位置怎么对应的(在模块上有相应标号)等,否则无法编程,也无法接线。

输入、输出点的地址编号,有三种办法:

一是点地址固定。这用于箱体式PLC。其主箱体、扩展箱体连接好后,其各点的地址也就默认地确定了。

二是模块地址固定。模块安装好后,其地址依其所在机架及其上的位置,也默认地确定了。点在模块上的地址一般也是固定的。

三是模块地址自行设定。模块地址可用软件或硬件设定,这已是发展趋势。

再就是,AB新机型PLC的I/O编址更详细些。要指明I/O模块所在的网络、机架槽号以及使用的数据类型和具体I/O点号。如Local:1:I.Data.0,是指I/O模块所在网络站点为当地(Local),所在机架槽位为1,类型为输入(I)数据(Data),使用的位是它的0位。再如kk:6:O.Data.3,是指I/O模块所在网络站点为远程站点(命名为kk),所在机架的槽位为6,类型为输出(O)数据(Data),使用的是它的3位。由于AB新型PLC的I/O模块为智能型的,除了有普通的输入(I)、输出(O)、数据(Data)类型,还有C类型的、滤波(Filter Off On)及数据(Data)类型的故障(Fault)等。这些地址多用于对模块的工作设定或监视。只是必要时才用。具体类型与使用的模块有关。而且,这些地址在模块配置时(定义成该模块类型数据)可自动生成。

应该强调的是,不同PLC的I/O编址多不完全一样。为了准确使用这些地址,最好要仔细阅读有关说明书。

(2)模拟量I/O地址。除了开关量I/O模块,还有模拟量I/O模块。对欧姆龙公司的模块式PLC,它的编号由其上的机号设定开关设定,与模块安装位置无关。要注意的是,所设的机号不能重复。机号设定后,将指定相应的通道及数据存储器(DM,内部软器件的一种,见后叙述)归其使用。至于这些通道与数据存储器的含义及使用,可参考有关说明书。而欧姆龙公司小型机的模拟量单元,是与开关量单元一样,按安装位置,统一编址,不作机号的设定。

三菱PLC模拟量输入、输出模块也是独立编址。用常数K指定模块号及在模块中的通道号。这里的通道是指哪一路的模拟量。

西门子公司S7-300 PLC模拟量模块与开关量模块都称为信号模块,无单元号。这两种模块都依其所在机架及槽位统一编址。只是模拟量加的前缀为IW(模入)或QW(模出),每一路要占一个字、两个字节。

表1-5为西门子S7-300系列PLC,如配置四个机架时的编址情况。从表知,它是定机架、定槽位编址的。如有一个8路的模入模块安装在机架1、槽位6,其各路地址分别为IW416、IW418……直到IW430。如这个槽位安装的是4路模出模块,则其各路地址分别为QW416、QW418、QW420及QW422。如这个槽位安装的是16点开关量输入模块,则其地址为IB40、IB41两个字节。

和利时PLC模拟量I/O地址与开关量统一编址,与西门子类似。只是在I或Q之前也要加%符号。

AB新机型PLC的模拟量I/O编址也更详细些。也要指明模块所在的网络、机架槽号以及使用的数据类型和具体通道(Ch)点号。如Local:3:I.Ch0Data,是指模块所在网络为当地(Local),所在机架槽位为3,类型为输入(I)数据(Data),使用的通道是它的0通道。再如Local:4:O.Ch0Data,是指I/O模块所在网络为当地(Local),所在机架的槽位为4,类型为输出(O)数据(Data),使用的通道(Ch)也是它的0通道。由于AB新型PLC的模拟量I/O模块也是智能型的,除了有普通的输入(I)、输出(O)、数据(Data)类型,还有其他类型,即使数据(Data)类型,之下还有分支。这些地址多用于对模块的工作设定或监视。只是必要时才用。具体类型与使用的模块有关。而且,这些地址在模块配置后也会自动生成。

表1-5 S7-300机地址分配

978-7-111-39745-8-Chapter02-35.jpg

应该强调的是,不同PLC的模拟量I/O编址多不完全一样。为了准确使用这些地址,应仔细阅读有关说明书。

(3)其他地址。除了上述地址,还有用于通信等智能模块的数据缓存区。这些多与网络等模块有关。OMRON用链接继电器(LR)或可任意指定的一些数据存储器(DM)。三菱称用指定的内部继电器(M)、数据存储器(D)、链接继电器(B)及链接寄存器(W)。西门子用可按有关模块的说明书使用。这些多与所用的模块与网络有关。

总之,I/O软器件总是与PLC使用的各种模块或插件相关,它的CPU就是通过这些软器件读写模块,与这些模块通信。

2.内部软器件

(1)内部辅助继电器。与继电器电路中的中间继电器一样,运用得合理,可帮助实现输入与输出间复杂的变换,从而可使PLC更好地进行各种控制。

内部辅助继电器的数量一般要比输入、输出继电器多得多。除了用作中间继电器,还用于数据处理。

欧姆龙PLC内部辅助继电器也分配有通道号。每个通道也是16个继电器。可以通道(字)为单位使用,也可以继电器(位)为单位使用。

西门子公司、三菱公司PLC的内部继电器,就加有前缀“M”。前者是以字节、位编号,多位使用方法同输入、输出继电器。后者与它的输入、输出点类似,也是按位编号,但按十进制进位。多位使用,也与其输入、输出继电器相同。

和利时PLC内部辅助继电器,前缀为“%M”。也可按位、字节、字、双字使用。

AB新型机就只有内存区,没有这里这样意义的内部器件。

使用PLC时,对选用的PLC的内部辅助继电器的情况也要弄清楚,否则也无法设计程序。它的数量非常多,为编程提供了很大的方便。

内部辅助继电器有的可设定为掉电保持的,即PLC失电后,其内容保持不变。只是欧姆龙专有此类内部辅助继电器,并特称之为保持继电器,并加前缀HR。

(2)定时器。它类似于继电电路用的时间继电器,用于延(定)时控制。它有线圈,有触点(标志位),还有寄存器(存放定时器现值、设定值)。定时的设定值可为常数,也可为某个(字)地址,再用这个地址的内容作为设定值。

对欧姆龙PLC,当定时器的线圈OFF时,没有输出,其常开触点为OFF,常闭触点为ON,其寄存器的当前值为设定值。当定时器的线圈ON时,它的寄存器的当前值从设定值开始,每经历一个单位设定时间减1。当减到零时,即产生输出,其常开触点从OFF转为ON,常闭触点从ON转为OFF。任何时候,一旦其线圈OFF,其输出立即停止,其常开触点从ON转为OFF,常闭触点从OFF转为ON,寄存器的当前值又变为设定值。

而对三菱、西门子PLC,情况有点不同。当定时器的线圈OFF时,也没有输出,其常开触点为OFF,常闭触点为ON,但其寄存器的当前值为0。当定时器的线圈ON时,它的寄存器的当前值从0开始,每经历一个单位设定时间加1。当加到设定值时,即产生输出,其常开触点从OFF转为ON,常闭触点从ON转为OFF。任何时候,一旦这线圈OFF,输出立即停止,其常开触点从ON转为OFF,常闭触点从OFF转为ON,寄存器的当前值又变为0。

欧姆龙PLC的设定值用BCD码设定。设定范围为0000~9999。新型机也可用十六进制码,设定范围为0~65535。三菱、西门子均用十六进制码。

普通定时器单位设定时间值为0.1s,故其最大延时可达999.9s,或6553.5s。如高速定时,其单位设定值可能为0.01s、0.001s,故其最大的定时值为99.99s、9.999s,或655.35s、或65.535s。如处理成低速定时,其单位设定值可能为1s、min,故其最大的定时值为9999s、9999min,或65535s、65535min。

这个单位设定时间的不同处理,不同厂商有不同的办法。

欧姆龙是用不同的定时指令处理。用TIM指令时,为100ms,而用TIMH指令时,为10ms,用TIMHH指令时,为1ms。

西门子则用不同的编号处理,有的编号的定时器单位设定时间小,而有的大。如S7-200型PLC,其单位时间设定值与定时器编号为

1ms T32,T96

10ms T33~T36,T97~T100

100ms T37~T63,T101~T255

三菱PLC也类似。如FX2N型PLC,其单位时间设定值与定时器编号为

1ms T246~T249

10ms T200~T245

100ms T0~T199

以上介绍的定时器是ON延时的。西门子PLC还可用不同指令,处理成其他工作方式,如ON即时,而OFF延时等。而如用欧姆龙、三菱PLC要作这样处理,则只好通过程序,用辅助继电器帮助解决。

应该指出,PLC的定时器的定时控制都是通过程序实现的。由于输入响应延时及扫描工作方式的影响,定时控制不是很准确的,可能与设定值差一个扫描周期。扫描时间若大过单位设定值,只有若干个定时器(可中断工作的)才能准确工作。

PLC的定时器多为掉电不保持的,掉电后停止计时,其已计入的值不保留,复电时,再从头计时。但有的也可掉电保持,即可累计计时。视不同的PLC、不同编号及不同的设定而定。

提示:定时器怎么用,与相应的定时指令的使用有关,这在介绍定时指令时,还要作进一步说明。有的PLC不用定时器指令,而使用定时功能块,则没有或不用这个定时器。

(3)计数器。它类似于继电电路用的计数器,用于记录脉冲输入信号的数量,即信号从OFF到ON的次数。它有线圈,有触点(标志位),还有寄存器(存放计数器现值)。有两种计数,一为单向计数,另一为可逆(双向)计数。

单向计数:有增计数与减计数。欧姆龙PLC单向计数都是减计数。当输入脉冲输入信号从OFF到ON变化一次,计一次数。计数器的寄存器减1。而开始时,计数器的寄存器为设定值,当其值减到零时,则产生输出。其常开触点ON,常闭触点OFF。

西门子PLC单向计数器有增的,也有减的。当输入脉冲输入信号从OFF到ON变化一次,计一次数,计数器的寄存器增1,或减1。对于增计数,其开始时,计数器的寄存器的值为0,当增大到等于或大于设定值时,则产生输出(计数仍可进行,直到最大值,65535)。其常开触点ON,常闭触点OFF。对于减计数,开始时计数器的寄存器为设定值,当其值减到0时,则产生输出。其常开触点ON,常闭触点OFF。

三菱PLC单向计数则是增计数。当输入脉冲输入信号从OFF到ON变化一次,计一次数。计数器的寄存器增1。而开始时,计数器的寄存器为0,当其值增到设定值时,产生输出。其常开触点ON,常闭触点OFF。并不再计数。

计数器一般都是掉电保持的。即使掉电,计数值不变。但在任何时候,送入复位信号(ON),计数器的寄存器都恢复成原始状态,并停止计数,不再输出。

除了单向计数器,还有双向,即可逆计数器。欧姆龙、西门子用相应指令实现单向或双向计数功能。而三菱PLC则用编号指定。有的编号只能单向计数,而有的编号可双向计数,并用特殊继电器(见后说明)指定计数方向。同时双向计数总是双字长的(8位十六进制数)。

再就是,欧姆龙PLC的设定值、计数值用BCD码设定。范围为0000~9999。但它的新型机也可用十六进制码,设定为0~65535。三菱、西门子PLC均用十六进制码。

提示:计数器怎么用,与相应的计数指令的使用有关,这在介绍计数指令时,还要作进一步说明。有的PLC不用计数指令,而使用计数功能块,则没有或不用这个计数器。

(4)数据存储(寄存)器。PLC进行控制以及计数,总要作一些数据处理,用一些特殊单元时,如模拟量入、模拟量出单元,还要作一些数据计算。所以,各种PLC也都备有存储大量数据的专门存储单元。欧姆龙用的标号为DM。三菱用的标号为D、西门子的S7-200标号为V。

欧姆龙、三菱PLC的存储器一般按字计(编号)。随着技术的发展,现在PLC的这个存储器容量不断增大。可达几K、几十K,以至于要用兆计。

数据存储器中的位(bit)、数位(digit)、字节(Byte)、字(word)及双字(D)间的关系处理,各PLC厂商是不大一样的。

图1-19a所示为欧姆龙及三菱PLC的位、数位、字节、字和双字之间的关系。它的地址以字计。并多以字作为处理单位。没有特定双字概念,两个相邻的字可处理成双字,这时,高位存于高地址,低位存于低地址,并以低位字的地址代表这双字地址。

西门子PLC数据存储器是按字节计(编号)。它讲的数据存储器多少K,都是以字节计。它可以字节为单位使用,如VB0、VB1。也还有字、双字为单位使用,但编号仍以字节计。如用VW0,则含VB0及VB1;用VW2则含VB2及VB3等。如按双字使用,则用VD0(含VW0、VW2)、VD4(含VW4及VW6)等。显然,如用了VW0,再用VW1,则其中的VB1将重复。如不是特殊需要,应避免出现此情况。

西门子的字、双字的高地址、存低位,低地址、存高位。如VB100=11,VB101=22,VB102=33,V103=44,则VW100为1122,VW102为3344,而VD100为11223344。具体如图1-19b所示。

978-7-111-39745-8-Chapter02-36.jpg

图1-19 字与双字组成

西门子这种按字节编号,高、低位数据存储与日本、美国的PLC不同,有其麻烦之处。但它可灵活进行种种转换处理,也有其好处。

提示:数据存储器多用数据处理,故多不能对其中的位进行逻辑操作。过去,只有西门子PLC可以这么做。如今,欧姆龙、三菱的新型机也可用相应指令进行操作了。

(5)特殊继电器、特殊数据存储器。它也是一种内部辅助继电器,只是各有其特殊用途。而且,各厂商PLC或同一厂商PLC不同机型,都不尽相同。大体上这些用途有PLC状态辅助继电器、时钟用辅助继电器、标志用辅助继电器等。很显然,只有对其有相应了解,才能编写好相应程序。表1-6列举了部分PLC的部分特殊继电器的编号及其功能。

表1-6 部分PLC的部分特殊继电器的编号及功能

978-7-111-39745-8-Chapter02-37.jpg

应该讲,这样的特殊继电器现在已越来越多了。以欧姆龙的小型机为例,其特殊继电器就有12.5通道(字),200个继电器。其编号从244开始,直到255的前半个通道。而CJ1机则多得多。故干脆不称其为特殊继电器,而称用标志(Condition Flag,CF)及辅助区(AR)。

西门子的S7-200机也有相应的特殊继电器。它的前缀为“SM”,称为特殊存储器位。三菱PLC的特殊继电器也不少,如FX机从M8000~M8255都是特殊辅助继电器。这些内容实在太多,详细情况请参看有关说明。

除了特殊继电器,还有特殊数据存储器,多用其作系统的种种设定。如欧姆龙小型机的DM6600~6614:用作起始处理设定;可把PLC设成起始为编程、运行或监控模式及内部继电器上电时是清零。欧姆龙辅助继电器(AR)大多数也与这个存储器作用相同。

西门子PLC也有很多类似的特殊功能数据存储器,用以实现各种特殊功能。如S7-200机,它的SM区有近200个字节,除了特殊继电器,还有更多的是用作特殊数据存储器。用于通信、高速计数、定时中断等设定。

三菱的FX机从D8000~D8225的数据寄存器,就是这类特殊的数据存储器。

和利时PLC也有特殊地址,即%MB0~%MB99间的100个字节。被系统占用,主要用来反映CPU模块及扩展模块的一些状态信息。其中%MB0~%MB9为CPU模块的专用寄存器,%MB10~%MB19保留,从%MB20开始为模块的诊断区。

对这些特殊继电器及存储器,最好备有相应手册,以便使用时查找。好在所有编程软件都有这方面的帮助,编程时可随时查用。所以,这里就不再详细介绍了。

(6)标识(P、I、N)。也称指针,用以标识在程序所标示的指令的地址。这是三菱PLC用的内部器件。在使用跳转指令、调子程序(用P)或使用程序中断(用I)时,要用到它。使用时,把它放在梯形图左母线的外(左)边。

西门子PLC的标识用指令(LBL)指明相应序号实现。仅用于程序跳转。它的子程序调用子程序号。

欧姆龙PLC无这样的内部器件,也没有标示一说。它的跳转及子程序调用均使用指令。

此外,三菱还有N,用以指定主控指令(见后)的编号。

(7)其他。以上介绍的内部器件,当然不是PLC内部器件的全部。而且,各厂商、各型号PLC的内部器件也不完全相同,有的还有别的什么名称。如三菱PLC FX2系列还有状态继电器,编号为S000~S999共1000点,用于作步进控制。西门子PLC也有状态继电器S,专用于作步进指令的标号。当然,不被步进指令使用时,也可用作内部继电器。

欧姆龙的CV机可用流程图语言编程,所以,还有转移区(Transition Area),TN0000~TN1023共1024个字,用做流程图编程时转移标志;步进区(Step Area),ST0000~ST1024,也是1024个字,用做流程图编程的“步”标志等。

三菱PLC Q系列等中、大型机还有其他一些内部器件。如锁存继电器(L)、报警器(F)、边沿继电器(V)、特殊链接继电器(SB)、链接继电器(B)、链接寄存器(W)及链接特殊寄存器(SW)等。

再就是西门子PLC中、大型机以及新型的S7-1200小型机没有上述意义上的数据存储器(DM、D或V)。只有数据块(DB)。数据块功能很强,用起来也很方便。但必须先定义,然后才能使用。这样处理方法与将要介绍的PLC变量本质上是完全相同的。

了解了PLC的软器件,即PLC的数据存储区,也就了解了PLC指令的操作数。至于这些操作数怎么被指令操作,将在介绍PLC的指令时,作具体介绍。

提示:由于篇幅限制,以上只是简要地介绍本书涉及的PLC的一些软器件。而全面、系统地弄清所使用的PLC的软器件,对正确使用该PLC,编写好高质量的PLC程序,是至关重要的。因此,在PLC实际编程过程中,建议要多查阅有关PLC的编程手册,切实把有关软器件弄懂、弄清。

3.间接地址

这与计算机C语言的指针类似,用软器件做指针,其内容作为地址。即实际使用的数是用这个“指针”指向地址的内容,而不是这个“指针”本身的值。具体使用有3个办法:

(1)用数据存储器作指针。欧姆龙PLC是用DM。在调用它的DM之前加“∗”或“@”号,即说明为间接地址。前者地址以BCD码计,后者以十六进制计。如“∗DM100”,而DM100的值为十进制数100,则实际地址是DM0100,DM0100的值才是真正的操作数。再如“@DM100”,而DM100的值为十六进制数100,则实际地址是DM0256,DM0256的值才是真正的操作数。

(2)用变址器(或索引寄存器)作指针。它也是软器件,但专用作指针,以对PLC软器件作间接访问。如欧姆龙CJ1机共有16个索引寄存器,地址从IR00~IR15。所加的前缀为“IR”。

提示:索引寄存器为双字长,存储的地址为绝对地址(absolute memory addresses in I/Omemory)。可存字(word)地址,也可存储位(bit)地址。存位地址时,高7个数位(digit)存字(通道)地址,低数位存储位地址。对其赋值,不能简单地用MOV之类指令,要用相应的地址赋值指令,即MOVB(560)指令。

在过去的欧姆龙PLC中、只有DM区可间接访问,但有了这个索引寄存器后,这样的间接访问,就可扩大到整个I/O内存区。

欧姆龙CJ1机还有16个数据寄存器,地址从DR00~DR15。所加的前缀为“DR”。它常与索引寄存器配合使用。

三菱称之为变址寄存器V及Z,各为16位。可单独使用(只使用V),也可合起来使用(V上位数,Z下位数,并以Z的地址代表其地址)。用双字时,可访问的数据区几乎不受限制。

(3)用双字做指针。西门子PLC就是这样,用双字先赋值软器件的实际内存地址(被赋值的地址前加“&”)。然后用这个双字作地址指针,作间接地址。只是在指针前加“∗”。其办法与C语言用的办法相同。只是它只能以字节为单位访问。

4.符号地址(Symbol)

上述软器件或间接地址的名称主要是前缀字母与数字,看不出它的意义。用它作操作数编写的程序,可读性较差,不易理解。虽然可对其加注,但采用了有一定含义的符号与实际地址(软器件)关联,并在程序中用这个符号地址代表实际地址,则更方便些。

同时,使用符号地址还便于程序更改,如地址变动,可以不改程序,只需重新编辑符号与地址的关联就可以了。此外,使用符号地址还便于程序移植与重用,为用户建立功能库、功能块库或程序库提供了可能。所以,目前PLC编程很少不用符号地址。

使用符号地址的另外还有如下重要好处:

(1)可分别定义符号的作用范围,便于程序数据管理。

(2)设定数据类型,作高级设定时,还可设定数组,便于程序数据的正确使用。

符号地址是用编程软件中符号编辑器编辑。不同厂商软件有不同的编辑器。但都是用它添加符号名称,确定数据类型,进行地址关联以及必要的加注。这里强调数据类型很重要,因为有了它便于发现地址关联的错误。

欧姆龙编程软件还可自动分配符号地址所使用(相关联)的实际地址。办法是在“工程”窗口的PLC项处,点击鼠标右键。再在之后弹出的菜单上,点击“内存分配”项下的“自动分配”项。这时,将弹出“PLC自动内存自动分配”窗口。在其上选择“允许此PLC的自动分配”,并指定相应可用于自动分配的内存区。这样,编辑符号地址时,系统将自动分配所使用的实际地址。

有的PLC还可用微软的电子表格等工具软件编辑,其所编辑数据可用导入、导出或复制、粘贴的方法与符号编辑器共享。

1.3.2 变量

变量(Variables),有的也称标签(Tags)是用户自行定义的PLC的内存区。传统PLC只有地址,没有这个变量一说。新型和高档PLC才有此程序数据。如和利时LEC G3机的内存数据区中,有容量很大的全局区(G区)及掉电保持区(R区),只能通过定义变量使用它。再如西门子的S7-300/400系列PLC及新型的S7-1200小型机的数据块所用的区域,也是通过定义使用。还有AB新型PLC就没有所谓的内部软器件,只有用户定义的变量。如果所定义的变量要与I/O实际地址(I/O软器件)关联可使用别名(Alias),即用变量当做硬件地址的别名。其他高档PLC也多是此情况。而且,越是高档或新型PLC,其内部器件越少,但可定义的变量则非常之多。

变量与传统PLC的符号地址不同是,它与实际地址(软器件)可以关联,也可不关联。而符号地址则必须与I/O或内部器件关联。

再就是,地址可以定义为变量名(与变量关联),也可不定义为变量名(不与变量关联)。后者也可在程序中直接使用。

使用变量取代内部器件地址的好处是比较灵活,可定义的数据类型多,而且PLC的资源还可得到充分利用。这也是当今PLC技术发展一大趋势。只是使用它编程,计算机技术的“味道”浓些,可能对习惯于电气技术的PLC编程人员,初用时可能不大习惯。

1.变量类型

变量可定义的类型很多,而且随着PLC功能的增强,其类型也越来越多。具体可根据不同特点分类。

(1)根据数据所占内存大小划分有:

1)位数据(bit)。仅占一个位的内存区。

2)数位数据(digit)。占4个位的内存区。

3)字节数据(Byte,B)。占8个位的内存区。

4)字数据(word,W)。占16个位的内存区。

5)双字数据(Double word,DW)。占32个位的内存区。

6)多字数据。占更多字的内存区。

(2)根据数据类型划分有:

1)布尔型。标识符为BOOL,在0(或FALSE)、1(或TRUE)之间选一。

2)整数型。有多种类型。它的类型名称、类型标识符、上下限及存储空间见表1-7。

整数型常数可使用十进制数,也可用二或十六进制数。用前者,直接写数就可以了,如65535。用后者时,在数值前要加“2#”或“16#”,如16#ABCD。所使用的数也不能超过表1-7的数据上、下限。

3)实数型。也称浮点型。用于表示有理数。其标识符为REAL,占32位。实数型数据可正、可负,最小数可以是·1.175495E-38,最大数可以是·3.402823E+38。

表1-7 PLC整数类型标识符、上下限及存储空间

978-7-111-39745-8-Chapter02-38.jpg

4)字符串型。字符型数据(STRING),即字符串。其常量在两个单引号间给出。如978-7-111-39745-8-Chapter02-39.jpgabcd978-7-111-39745-8-Chapter02-40.jpg,这里的abcd就是字符串常量。字符串还可含转义(特殊)字符。只是在之前应加“$”符号。具体见表1-8。

表1-8 转义字符

978-7-111-39745-8-Chapter02-41.jpg

5)时钟型(TIME)、日期型(DAY)、时间型(T IME_OF_DAY,TOD)、日期时间型(DATE and DATE_AND_TIME,DT)等。可用于存储时钟、日期、时间、日期时间值等数值。不同PLC此类型数据的表达可能不完全一样。

6)其他型。如各种功能块型的变量,可用做功能块例程的命名。有的还可由用户自行定义类型等。

(3)根据数据的作用范围划分有:

1)局部变量。其作用范围仅限于所在程序。超出程序无效。

2)全局变量。其定作用范围为PLC的所有程序。但是,如与所在程序局部变量重名,则所在程序的局部变量有效,而它无效。

3)网络变量。如AB等PLC,有此变量。其作用范围可覆盖PLC网络。可以用以PLC间数据链接、实现通信。

4)共享变量。如西门子博途软件建立的过程有此变量。其作用范围可覆盖整个工程。可在工程的其他部件,如人机界面、计算机监控系统等,实现数据共享。

(4)根据PLC停机后数据是否保持划分有:

1)保持变量。PLC掉电后,其值保持。

2)非保持变量。PLC掉电后,其值不保持。

(5)根据变量的结构划分有:

1)简单变量。所定义的变量只有一个,而且只有一个类型。常见的多是此类变量。

2)复合变量。所定义的变量有多个,而且可能有多个类型。如计算机常用数组、结构等就是此类变量。

(6)根据变量的使用划分有:

1)直接变量。直接使用它作变量。也是最常用的变量。

2)指针变量。也是间接变量,使用它的值作为地址,用此地址指向的变量作变量。

(7)根据变量的在POU中的使用划分有:

1)输入变量。用于程序数据输入。

2)输出变量。用于程序数据输出。

3)输入输出变量。也即变量,既可输入程序数据,又可输出程序数据。多数变量为此变量。

2.变量定义

变量在使用前要先定义。要用标识符命名。根据编程标准,标识符只能由字母、数字和下画线字符组成的一个串,并且它应以字母或下画线字符开头。不能使用中文。用具体命名规则取决于具体的PLC。

变量定义时除了命名,还要指明它的类型。要上述分类指明它的归属。如果必要也可与I/O地址关联。变量名称一般要有意义,以便识别与使用。必要时还可加注解。

变量定义要使用编程软件。一般软件都有它的编辑器。有的还可用微软公司的Excel编辑,然后导入。变量可以预先集中编辑,也可随时使用随时编辑。以和利时PLC的变量定义为例,其声明格式为

<变量名>{AT<关联地址>}:<变量类型>{:=<初始值>};

其中{}部分是可选的。可知,定义变量可以与实际地址无关。当然,这不是变量不用地址,而是由系统去分配地址。它用的地址是它的PLC的G区及R区。后者数据保留(掉电后恢复,原数据保留);前者不保留(掉电后恢复,原数据丢失)。

在编程时,如使用未声明的变量,系统将出现图1-20所示的变量声明窗口。

从图1-20可知,可对变量类别(有VAR局部变量、VAR_GLOBAL全局变量等)、变量类型(有布尔型、整型等)、是否与实际地址关联、注释及初始值等做出选择。如果做了该图所示的选定,再单击“确认”,即完成了该变量的声明。这时,在该程序的局部变量声明中将加上此变量。即

978-7-111-39745-8-Chapter02-42.jpg

图1-20 变量声明窗口

978-7-111-39745-8-Chapter02-43.jpg

在图1-20窗口中,“常量”选项的含义是,选定它,程序不能改变它。“保留”选项的含义是,选定它,此变量就可掉电保持。

变量与实际地址关联,和利时称之为变量AT声明。但不是所有的变量都允许做这样的声明。声明为BYTE、WORD、DWORD变量,既可按BYTE、WORD、DWORD使用,也可按位使用。这时,可在变量之后加小数点,然后再加位号。如AA为WORD类型变量,AA指的是字,而AA.14指的是AA字的14位。

以下为它定义的几个变量:

978-7-111-39745-8-Chapter02-44.jpg

978-7-111-39745-8-Chapter02-45.jpg

这里,VAR到END_VAR、VAR_INPUT到END_INPUT以及VAR_OUTPUT到END_OUTPUT之间就是POU所定义的变量、输入变量及输出变量。

3.指针变量

指针是指向变量地址的变量。指针声明的格式为

<指针名>:POINTER TO<数据类型或功能块>;

指针所指向变量的数据类型,可以是系统定义的类型,也可是用户自定义类型,还可以是功能块。

要读取变量的地址,有读取变量地址指令,如和利时PLC用ADR指令,它用于把变量或者功能块的地址赋给指针,例如:

978-7-111-39745-8-Chapter02-46.jpg

指针是计算机C语言常用的工具。使用得好,可提高程序效率。指针还可用于对将要介绍的数组各成员的访问。这时,要先把数组下标下限成员的地址赋值给数组处理指针。然后相应改变这个指针值,即可访问数组的不同成员。

和利时LEC G3机内存地址以字节来计算。如果指针指向字节,指针加、减1,即可访问不同的字节。如果指针指向字,则加、减2,才可访问不同的字。如果指针指向双字,则加、减4,才可访问不同的双字。其余类推。

4.复合变量

除了简单变量,有的PLC还可数组、结构、枚举等类似计算机C语言那样的复合变量。

(1)数组。数组是相同类型数据的集合。有一维、二维和三维数组(不同PLC规则不完全相同)。如和利时PLC其声明格式为

<数组名>:ARRAY[<ll1>..<ul1>,<ll2>..<ul2>]OF<变量类型>.

Ll1、ll2、ll3标识字段范围的最小值;ul1、ul2和ul3标识最大值。范围必须是整型的。

如声明以下数组:

978-7-111-39745-8-Chapter02-47.jpg

则它的名为“Card_game”,是二维数组,下限都是1,上限分别是13、4。数组中的元素(成员)可用数组名加下标访问。如用矩阵与数组对应,那么一维数组,就相当于一维矩阵;二维数组,就相当于二维矩阵;三维数组,就相当于三维矩阵。

如上述数组Card_game,为二维数组。用如下的矩阵A对应:

978-7-111-39745-8-Chapter02-48.jpg

即A的每个元素都有两个下标。如A13,第1个下标为1,代表处于第1行;第2个下标为3,代表处于第3列。有了这个对应,就很好理解Card_game[2,4]的含义。它就是指其中下标1为2、下标2为6的元素。

在声明数组的同时,可进行初始化。如下示的就是已初始化的数组:

arr1:ARRAY[1..5]OF INT:=1,2,3,4,5;

说明:初始化后的arr1[1]=1、arr1[2]=2、arr1[3]=3、arr1[4]=4、arr1[5]=5。

arr2:ARRAY[1..2,3..4]OF INT:=1,3(7);(∗1,7,7,7的简写∗)

说明:两维数组初始化赋值的顺序总是,第1下标先取下限,第2个从下限依次加1,直到上限。这时,第1下标加1,第2下标又从下限开始,依次加1,其余类推,直到都到两个下标的上限。所以,按上述约定,arr2数组初始化后的各元素的值为arr2[1,3]=1、arr2[1,4]=7、arr2[3]=7、arr2[2,4]=7。

arr3:ARRAY[1..2,2..3,3..4]OF INT:=2(0),4(4),2,3;

(∗0,0,4,4,4,4,2,3的简写∗)

说明:三维数组初始化赋值的顺序总是,第1下标先取下限,第2下标也先取下限,第3个从下限依次加1,直到上限。这时,第2下标加1,第3下标又从下限开始,依次加1,其余类推,直到2、3两个下标都到下标的上限。这时,第1下标加1,第2、3下标又重复上述过程,直到都达到三个下标的上限。所以,按上述约定,初始化后的arr3[1,2,3]=0、arr3[1,2,4]=0、arr3[1,3,3]=4、arr3[1,3,4]=4、arr3[2,2,3]=4、arr3[2,2,4]=4、arr3[2,3,3]=2、arr3[2,2,4]=3。

数组也可部分初始化,如

arr1:ARRAY[1..10]OF INT:=1,2;

没有初始化的数组元素的值,为数组元素类型的默认值。在上面例子中,arr1[1]为1、arr1[2]为2,其他数组元素初始值为0。

数组的下标也可以是变量。这样,改变变量的值,就可访问数组不同的成员。但数组不能动态声明。即定义它的上、下标只能是数字。

数组可与实际地址关联,如

mmW AT%MW100:ARRAY[100..4145]OF WORD;

还可声明如下数组:

mmB AT%MW100:ARRAY[100..4145]OF BYTE;

这里,同一地址与不同的数组关联是允许的。

提示:数组的单元总数是有限制的。如LM3109机为4046。再多编译通不过。

提示:不同品牌PLC数组定义的格式也不完全一样。具体可在编程参阅有关软件帮助。

提示:有的PLC访问数组成员时,其下标只能是常量,有的可以是变量。

(2)结构(Structure)。结构是用户自定义数据类型。以和利时PLC为例,其定义格式为

978-7-111-39745-8-Chapter02-49.jpg

图1-21所示为和利时PLC编程软件PowerPro对象管理器的“数据类型”窗口。点击鼠标右键,将弹出菜单。再在“弹出菜单上”,点击“添加”,将出现如图1-21所示的“New data type”窗口。在“新建数据类型名”空白处右方,填入结构名(该图填的为“struct2”)。再点击“确认”,即可弹出结构名为struct2编辑窗口。在其上即可进行结构编辑。

978-7-111-39745-8-Chapter02-50.jpg

图1-21 数据类型定义窗口

如图所示,该结构名为struct2。内含有起点、点1到4及终点6个数组。注意,这里定义的结构,还不是用户可使用的变量。只是创建一个struct2结构的数据类型。但有了它才可进行struct2这个结构类型的变量声明。如

978-7-111-39745-8-Chapter02-51.jpg

这里,声明了2个struct2结构类型的变量。变量名为Sss1与Sss2。其中变量Sss1已初始化。而Sss2未初始化,其成员按默认值赋值,均为0。对它的成员访问的格式是

978-7-111-39745-8-Chapter02-52.jpg

如上述例子,Sss1.Start、Sss2.Start.分别是Sss1结构类型变量的Start成员及Sss2结构类型变量的Start成员。

(3)枚举(Enumeration)。枚举也是用户自定义数据类型,由许多字符常量组成,并把这些常量称作枚举值。枚举以关键字TYPE开始END_TYPE结束。其定义格式为

978-7-111-39745-8-Chapter02-53.jpg

这里,枚举类型名与变量命名规则相同。<Enum_0>、<Enum_1>、…<Enum_n>等为待枚举字符常量。

枚举类型变量的值是数字,称枚举值。如同INT类型一样使用。如不作初始化,枚举值0,指向第1项,即这里的<Enum_0>。枚举值1,指向第1项。即这里的<Enum_1>。其余类推。

枚举类型定义方法与结构定义的方法相同。如和利时PLC也是在PowerPro对象管理器的“数据类型”窗口上,点击鼠标右键,弹出菜单。再在“弹出菜单”上,点击“添加”,出现如图1-21所示的“New data type”窗口。在“新建数据类型名”右方,填入枚举类型名。再点击“确认”,即可弹出与填入枚举类型名编辑窗口。在其上即可进行枚举类型编辑。

如做如下“TRAFFIC_SIGNAL”(交通信号)的枚举定义:

978-7-111-39745-8-Chapter02-54.jpg

只是这里定义的枚举,还不是用户可使用的变量。只是创建一个TRAFFIC_SIGNAL枚举的数据类型。但有了它才可进行TRAFFIC_SIGNAL这个枚举类型的变量声明。如

TRAFFIC_SIGNAL1:TRAFFIC_SIGNAL;

这里的TRAFFIC_SIGNAL1为TRAFFIC_SIGNAL类型变量。如TRAFFIC_SIGNAL1值为0,因为“Red”没有初始化,又是第一项,则指的是“Red”。如值为1,则指的是第二项,“Yellow”。因为“Green”在定义时初始化为10,如果值为10,则指的是“Green”。如“Green”后还有项目,将从11起增加。

枚举不能多次使用相同的枚举项。如

978-7-111-39745-8-Chapter02-55.jpg

这两个枚举都有“Red”,是不允许的。

1.3.3 常量

也称常数、即时数或立即数。就是实际输入到程序指令中的具体数值。而且这些数值在程序执行中一直保持不变。是PLC指令常见的操作数之一。如TRUE、FALSE就是一个布尔常量。常量与数据类型有关。类型不同,常量的值也不同。具体应在它的该类型数据上限与下限(含上下限)之间选定。

PLC常要使用常数。常数有:16位、32位。输入常数输入时一般要加上相应的前缀。

对欧姆龙:加“#”表示BCD码或十六进制数,如加“&”表示十进制数。

对三菱加“H”表示BCD码或十六进制数,加“K”表示十进制数,加“E”表示实数。

对西门子加“16#”表示十六进制数,不加表示十进制数,数字中带有小数点表示实数。

此外,有的PLC还可输入与处理字符或字符串,如‘a’、‘abc’。也可在字符前加$,则输入的为转义字符,如‘$$50’,实际的值为‘$50’,这里第1个$为转义符号。

提示:不同的PLC可使用的常数及常数表示的格式也不完全相同。如欧姆龙十进制数不能输入,前缀“#”号就是十六进制数。所以,使用时要注意之间的区别。

为了程序便于修改与重用,应尽量少用常量。办法是在程序先使用变量,但在程序初始化时设法把常量赋值给这些常量。这样,程序修改,只需修改初始化部分,而主体可以不动。有的PLC还可用加载数据块的方法实现初始化,那样,则只要修改数据块,即可更改常量,更加方便。

1.3.4 其他操作数

PLC程序的其他操作数还有标号、功能块名及函数名。

标号

标号是跳转指令的操作数。指出下一个要执行的指令(或梯形图的节)标号。标号与变量命名一样,也是要用一些英文字母、数字或其他合法字符的组合。但不是所有的指令(或梯形图的节)都要有标号,只是有跳转关系时,需要此标号。

函数名

在ST语言中,调用函数的也可直接作为操作数使用。如

Result:=Fct(7)+3;

这里,Fct是函数名,却作为赋值语句的操作数。

要指出的是,以上介绍的变量定义、指针变量、复合变量、常量及其他操作数都是以和利时PLC为例。至于其他PLC对这些问题的处理只是大体与这里介绍的相同。更详细的可参阅有关编程软件的帮助或相应的PLC使用说明书。