首页 理论教育 PAC编程基础教程:Logix控制器内存结构

PAC编程基础教程:Logix控制器内存结构

时间:2023-10-26 理论教育 版权反馈
【摘要】:Logix控制器的程序文件和数据文件有独到之处,不能沿用早期传统产品的经验,在学习编程之前,必须对控制器的内存结构了解清楚,因为每一个执行动作都会关联到程序文件和数据文件。Logix控制器内存的程序文件是三层树形结构,分为任务、程序和例程。程序是一个完整的结构,就像传统产品的一个处理器,如果将一个PLC5的项目文件转换为Logix控制器的项目文件,将对应着一个连续任务下的一个程序。

PAC编程基础教程:Logix控制器内存结构

所有的基于计算机平台的工控自动化产品都具有内存结构,通常意义来说,内存用来存放程序文件和数据文件。程序文件包含了动作执行代码的组合形式以及执行代码组合的执行顺序和执行模式,甚至包含了与程序处理关联的I/O数据访问模式;数据文件是用来存放程序处理之前的数据和程序处理之后的数据,数据的存放方式和数据的表达形式都是程序执行代码访问必须关注的,也即编程指令中的访问地址的书写规则。Logix控制器的程序文件和数据文件有独到之处,不能沿用早期传统产品的经验,在学习编程之前,必须对控制器的内存结构了解清楚,因为每一个执行动作都会关联到程序文件和数据文件。

Logix控制器内存的程序文件是三层树形结构,分为任务(Task)、程序(Program)和例程(Routine)。每个层面都具有特定的作用和意义,了解程序文件的结构,以便更好地规划执行代码,获得合理的运行结构和执行进程。

任务是最上层的结构,定义了执行方式并安排了执行顺序,奠定了控制器控制过程的基础。任务有如下三种类型:

●连续型任务 指的是周而复始地连续执行任务,一个项目只允许定义1个,亦可以不定义。连续任务是优先权级别最低的,可以被任何周期型任务和事件触发型任务中断。控制器项目创建时自动产生,可以更改为其他类型的任务。连续型任务在所有的时间都运行,跟系统高层管理的时间片段紧密相关。

●周期型任务 指的是定时中断执行的任务,周期性的执行任务,须定义周期时间,任务组态要设定优先级别。在规划周期型任务时,其调用的周期时间要小于任务的执行时间,在多个周期型任务执行时要兼顾彼此的时间安排,否则将发生任务调用的交迭。周期型任务的运用常用于需要精确地控制执行时间的场合,或用于长时间才调用一次的执行动作,以节约控制器CPU资源。

●事件触发型任务 指的是事件触发引起的任务调用,事件触发可以是外部输入点变化引起,也可以由Consumed标签引起,或事件指令调用引起,还可以由运动控制状态引起,任务组态要设定优先权级别。多个事件触发型任务要兼顾不能发生任务调用的交迭。事件触发型任务的运用可以改善性能和减低消耗,减少控制器CPU的资源占用,加快信息的吞吐和系统反映能力,有时也用来捕获正常RPI刷新可能丢失的短脉冲信号

任务的执行顺序是由任务的类型所决定的,连续任务是接连不断首尾相接地执行,只有周期型任务和事件触发型任务才会中断执行,中断执行遵循高优先权任务中断低优先权任务的原则,一旦中断任务执行完毕,将回到原来的中断点继续执行。在一个控制器项目中定义了多个任务执行,一定要安排规划好它们的执行,确保没有任务执行的交迭情况。

每个任务执行完毕,会将执行的控制结果进行输出处理。自动输出处理在任务属性组态中选定,连续任务和周期任务的默认组态不取消,事件触发任务的默认组态取消。输出数据处理将本次任务执行的控制结果送出,然后通过输出模块的数据交换,送至被控制的输出设备。

任务的执行要留有足够的时间来响应控制器外部非预定性数据访问,因为外部非预定性数据访问是任务执行的余留时间来进行的,否则将引起非预定性数据访问的堵塞和滞留。

程序是任务下层的一个完整的组织结构,具有相对的独立性,能够启动执行代码的扫描和调动例程执行,它包含了:

●每个程序由一个数据库和多个例程组成。

●每个程序都拥有一个独立的数据库,在这个数据库建立的数据标签只能被本程序内的例程引用,且都是内部数据。

●每个程序中必须指定一个例程为主控例程,作为本程序运行的启动例程。

●每个程序中还可以指定一个故障处理例程,以解决本程序内任何例程运行时引起的故障。

●其余的例程均由主控例程中编写的调子例程指令JSR来调用。

●未预定程序(Unscheduled Programs)中存放备用或暂不运行的程序,这些程序会下载到控制器中,但不会执行。

●同一个任务下的多个程序,将按任务下排列的顺序执行,这个顺序可以通过任务的组态页面重新调整。

程序是一个完整的结构,就像传统产品的一个处理器,如果将一个PLC5的项目文件转换为Logix控制器的项目文件,将对应着一个连续任务下的一个程序。这正是一个新项目创建时的默认情形。

程序只是任务中的一部分,一个程序全部扫描完毕是不会进行输出处理的,将执行代码划分为不同的程序完全出于非结构的需求。程序划分的主要作用有时用以区分执行不同的控制区域和不同的控制对象;由于不同的程序可以拥有独立的数据库,有时程序起到了隔离数据的作用;在多人合作的大项目中,程序甚至用来区分不同的编程者。

多个程序共同引用的公共数据,应该存放在控制器区域的数据库中。

在任务下,并列着等同于程序的是Phase Manager,一个完整的设备工作进程管理程序,特定状态模块规定了执行的进程,是面对设备控制过程而设计的。适用于批处理设备阶段性的管理,也是标准编程的一种模式。

位于程序文件结构最底层的是例程,例程是编程体,所有的控制的执行代码都被编写在例程中,有4种编程代码形式:

梯形图(LD)最常采用的编程模式,是由梯级组成的程序结构,完成时序逻辑控制的执行代码编辑。通常完成现场复杂的逻辑关系,解决现场机器的连锁关系,明确运动控制指令的执行顺序。指令系统的丰富和强大,还能完成对外通信的信息处理工作,以及维护人员的检查工作。

●顺序功能流程图(SFC)多操作的高水平管理,需要将工作进程细化到步,以便于严格控制执行步骤,用SFC来编辑步的执行顺序和结构。每个步都是执行代码的组成,激活步的反复操作和非激活步的静止,节约了大量的无效扫描时间。运动控制顺序的准确安排和递进步骤也是人们选择SFC的原因之一,通常会结合语句编程运用。

●语句编程(ST)采取ASCII代码编写程序,通常用于SFC的转换条件判断或赋值。可以完成复杂或特殊要求的运算,也可以完成其他编程方式没法处理的数组和表格的数据处理。在语句编程中,同样可实现梯形图指令或功能块的互换执行代码,甚至完成等同的通信操作。

●功能块(FBD)组态过程控制,是引入的DCS系统的仪表控制组态方式,由功能块之间的连接建立程序结构,参数连接和设定是功能块组态的主要内容。易于完成闭环控制流量计算等专用功能。在驱动控制中的专用功能块满足各种驱动组态需求,方便而直观。

例程才是控制器程序文件最基本的结构元素,所有的执行代码都是通过例程的不同编程方式编辑而成。例程才是程序文件真正的执行体,只有通过例程的调用和执行代码的扫描,控制过程才得以实现。

根据不同的需求和编程原则,选择不同的例程编程代码形式,并没有严明的界限,也没有严格的规定,甚至没有特别的优劣之分。PAC的适应性表现在给人们更多的选择和决定权,其中也包括了编程的语言和模式。

Logix控制器的数据文件是特别不同于传统的PLC处理器数据地址的,这直接影响了人们的编程习惯。首先,控制器所使用的数据不再是源自硬件的寄存器地址或字符式的寄存器地址,而是标准的计算机数据标签,这种被称为描述型的标签,由字母、数字和下划线组成,常常具有文字所能表达的含义。这使得I/O地址可以映像为设备名称,直接与现场设备挂钩,而无须特别的文档说明,将人们从强记外部设备地址的困境中解放出来。

最初接触标签地址的人们当然还是会有抱怨,因为他们在编程时不能像传统产品那样随心所欲地使用已存在的地址,而需要将一个一个标签在数据库中创建之后才能使用,这似乎耽误了一些时间和感到繁琐,直到他们晚些时候了解可以免去I/O文字说明的工作和无须在别处重复建立数据地址,才恍然大悟一次性创建原来是件一劳永逸的事情,从此欣然接受。

Logix控制器的数据文件并非集中于一处,而是分布在不同的区域,分为全局数据区域和程序数据区域。这两个数据区域的数据引用范围是不一样的,由于区域的划分,可以使得按生产过程和程序功能分类的数据在查询和引用上更为清楚和方便。

数据区域划分原则:

●全局数据区域 又称控制器数据区域,它含有全部的对外数据和公用的内部数据,其数据可被控制器内所有的例程引用。所有的I/O数据和外部设备访问数据都只能或被要求建立在控制器数据区域;规划时要注意只有公用的内部数据才放在控制器数据区域,不要滥用宝贵的全局数据资源。

●程序数据区域 全部为内部数据,其数据只能被本程序内的例程引用。各程序之间的数据区域是隔离的,以防止标签命名的冲突。程序中的例程所使用的数据,应该集中地放在程序数据库中。特别是指令中使用的结构数据标签,不要随意地创建在控制器区域,占用了公共资源

在一个控制器项目中,全局数据区域的数据库只有一个,程序数据区域的数据库却有多个,每个程序都会分配一个数据库,因此有多少个程序就有多少个程序区域的数据库,每当在指令参数中分派数据标签时,总会出现一个全局区域的数据库和一个程序区域的数据库提供挑选。(www.xing528.com)

无论是在全局区域的数据标签还是在程序区域的数据标签,在创建的时候,都要选择数据类型。Logix控制器的数据的类型细分可以说太多,但粗分只有两大类型,基本数据类型和结构数据类型。

基本数据类型具有如下几种:

●BOOL布尔数 占用一位 数据范围:0或1

●SINT短整数 占用一个字节,数据范围:-128~+127

●INT整数 占用两个字节,数据范围:-32768~+32767

●DINT双整数 占用4个字节,数据范围:-2147483648~+2147483647

●REAL实数 占用4个字节 数据范围:3.4×10-38~1.17×10+38(负数)1.17×10-38~3.4×10+38(正数)

基本数据也称为操作数,是具体的操作对象,除了布尔量,其余都是数据量,只是使用字节不同,具有数据范围的差异。数据范围小,耗用字节少的不一定节省内存。Logix控制器的CPU芯片是32位的,这意味着32位是CPU处理的基本数据单元

每个基本数据类型的标签都要占用一个数据单元,哪怕是布尔量,其内存耗用如图2-2所示,灰色部分为内存耗用,空白部分为闲置。当数据类型为BOOL、SINT和INT被分配给一个标签时,控制器也要花费一个完整的数据基本单元,剩余部分则被闲置,可以看出布尔量是浪费得最厉害的,双整数和实数是最节省的。

978-7-111-36030-8-Chapter02-2.jpg

图2-2 内存耗用

只有使用基本数据单元处理数据和通信才是最节约内存和操作时间的。以后编程使用的指令参数,但凡遇到字的处理,要尽可能地使用双整数和实数,这也是优化的原则之一。

结构数据则比较复杂,分为系统预定义的结构数据和用户自定义的结构数据,系统预定义结构数据是固定不变的,用户自定义结构则千变万化,不同的用途不同的对象将建立不同的结构数据。

系统预定义的结构数据是系统固有的结构数据,往往产生于系统设计之初,为了不同的应用目的,通过开发、演变或移植而形成的。

系统预定义结构数据可分为如下几种:

●I/O模块组态时产生的I/O数据 每个与控制器交换数据的I/O模块,都有固定的内容,诸如组态、状态输入、输出的双向数据传送,不同的模块含有不同的内容,这在模块开发之际便被设计。当在I/O组态的树形结构下创建一个模块时,控制器数据区域便会产生一个相应的I/O结构数据,该数据结构与模块交换的内容相符。

●出自于PLC5/SLC500的多字元素文件 多字元素其实就是结构数据的初期形式,为了把指令操作相关的数据内容集合在一起,使用了多个字组合。例如被称为三字元素的计时器和计数器文件,在Logix控制器中被称为计时器结构数据和计数器结构数据。至于较大的数据块,如PD和MG的多达十几个字或几十个字的多字元素,也转为结构复杂数据繁多的PID结构数据和MESSAGE结构数据。

●运动控制的数据结构 正是结构数据的出现,才使得运动控制得以用指令的形式进行操作,因为一个运动控制的动作,需要相当多的数据来对应,能把这些数据集合在一起的,非结构数据莫属了。复杂的运动控制,其结构数据中甚至可以内嵌上一个数组,用以模拟一条凸轮曲线。

●过程控制功能块的数据结构 来自功能块的结构数据,可以说是由来已久,DCS系统历来就是结构数据,被称为一个Point的数据,其实就是一个货真价实的结构数据,功能块操作被轻而易举地引入PAC就不足为怪了,因为Logix控制器的结构数据完全满足了功能块数据形式的需求,并且有更为清晰的表达形式。

●系统组态信息和状态信息Logix控制器没有系统给出状态数据文件,因为系统中不仅仅是控制器,所有的与控制器通信的模块都含有大量的组态信息或状态信息,用户可访问的不仅仅是控制器内部的信息,而是系统的各个模块或设备的信息。不同的系统有不同的组成结构,含有不同的模块或设备,用户可以各取所需地访问信息,Logix控制器特定的SSV/GSV指令就是用于这个目的。面对系统要设置的数据或要获取的数据,都是通过结构数据来存放的,这需要建立相应的结构数据标签。

用户自定义结构数据是由编程者根据各种需求建立的数据类型,一旦定义完成便被嵌入系统,在数据库中创建标签时,在数据类型选项中便可以选择新定义的结构数据类型。

用户自定义结构数据的创建常常出于如下的考虑:

●针对控制对象而创建 将某个控制对象相关的参数集合在一起,即使是不同的数据类型。作为子元素的各个参数可以是基本数据,也可以是结构数据,还可以是已经定义的用户自定义结构数据。这是一种最常见的用户自定义结构数据,由于其集中和综合性,编程或监视的检索极为方便。

●针对通信对象而创建 控制器的对外通信,是以标签名作为连接建立通信的,一个标签,即使含有大量的参数数据,对通信而言,也只是占用一个连接,当外部设备跟控制器建立起连接,便可一次交换更多的数据,对比单个操作数的轮询访问,大大地节约了通信资源和节省了网络的带宽,是目前大力推荐的先进的通信模式。

●针对人机界面访问而创建 人机界面访问的数据,在控制器中被抽取并集中在动态缓存区,以便快捷地访问,如果将同时访问的操作数集中在一个或几个标签中,人机界面只需使用少量的几个通信连接,便优化地获取了它所需要的通信数据,动态缓存区的更换也将更为便利和快速,人机界面访问的优化数据包,简单地用结构数据就实现了组合处理。

●针对冗余数据交叉装载而创建 在冗余系统中,主控制器需要传送冗余数据到辅控制器,每当主控制器运行的数据被刷新,即使没有变化,也要传送一次,挑选变化频度相同的数据组合成一个结构数据,将多次传送变为一次传送,可大量减少交叉装载的时间,从而优化冗余系统性能。

●针对专门用途而创建 某些专用的通信模块,特别是第三方通信的模块,曾经是多种数据的交换,比如说组态数据、状态数据、输入数据、输出数据等,都可以将它们集合在一个结构数据中,并加以详细说明,过去需要一本厚厚的说明书对照操作来编写程序,现在由厂家提供一个或多个特定的结构数据就解决问题了。

●由Add_On指令创建而生成 用户自定义指令Add_On在创建时,根据需求要建立各种类型的指令参数,这些指令参数将自动生成一个与Add_On指令同名的用户自定义结构数据。用于Add_On指令的自定义结构数据,跟标准指令的系统预定义结构数据在运用上几乎没有区别。

由于用户自定义结构数据是出于不同的目的建立的,很有可能同一操作数会出现在不同的结构数据标签中,比如有一个开关量操作数存在于作为控制对象而建立的结构数据标签中,同时这个开关量状态要被人机界面访问,为了组合优化通信,有可能这个开关量操作数被装入一个用于通信的结构数据标签中。如果你在一个控制器项目中,看到诸如名为HMI的例程,你完全有理由相信,例程中执行的操作都是将人机界面访问对象装入通信结构数据标签。

用户自定义结构必须是32位的基本数据单元的整倍数,每当创建一个子元素,系统都会进行比较,前面基本数据单元剩余的空间是否够用,如果不够,将开辟一个新的基本数据单元,即使是不同的数据类型集合在一起,系统还是会按字节紧凑地使用每一个空间。当然,子元素的开出先后顺序直接地影响了空间的紧凑与否,在必要的时候需对顺序进行调整。

定义数据的结构类型时,一定要紧凑地安排空间,如果留有多余的未使用空间,一旦这个数据类型被选用于标签,便会成倍地耗用内存空间。

总之,用户自定义数据类型的运用是灵活多变的,与编程处理的关系非常密切,不同的编程处理目的,创建的结构数据标签也不一样,在今后的编程训练中,我们会不断地接触到各种用法,届时再细细体会。

还有一种数据形式是数组。数组是同一数据类型连续分布的集合,既可以是基本数据类型组成,也可以是结构数据类型组成。数组也就是传统产品PLC5所说的文件,所以原PLC5指令系统的文件操作指令在Logix控制器的指令系统中统称为数组操作指令。

不同于文件的是数组可定义为1维、2维和3维的数组,其中1维数组相当于原来的文件。各维数组中的元素个数基本不受限制,可以定义到任意大,直到内存不够使用为止。多维数组的数据存放形式,给可能存在的人机界面或二级计算机提供了模样完整的原始数据,为各种管理型数据库的数据处理奠定了良好的基础,尤其是集成架构系列的产品,更显出其优势和发展空间。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈