首页 理论教育 创建和引用Add-On指令:PAC编程基本教程

创建和引用Add-On指令:PAC编程基本教程

时间:2023-10-26 理论教育 版权反馈
【摘要】:下面我们通过一个实例来看Add-On指令是如何创建和组态的,并且通过梯形图梯级的指令引用来观察它的运行情况。图15-1 选择创建新的Add-On指令点击“New Add-On Instruction”项,进入创建页面,如图15-2所示。为该Add-On指令命名STACK,点击后完成创建,在编程软件的树形结构中出现了新的Add_On指令,如图15-3所示。Add-On指令的结构数据由下面要讲到的参数和本地标签构成。图15-7 Add-On指令的逻辑例程图1

创建和引用Add-On指令:PAC编程基本教程

下面我们通过一个实例来看Add-On指令是如何创建和组态的,并且通过梯形图梯级的指令引用来观察它的运行情况。

这里,我们采用一个熟悉的例子。前面曾经编写过的保持最新数据的堆栈数组处理的梯级逻辑,现在我们把这一段程序处理装到Add-On指令中来运用。先分析一下案例。

Add-On指令将对外交换的数据有:

●数据装入源地址:提供堆栈数组的数据来源,DINT数据类型标签;

●数据卸载目标地址:提供堆栈数组的数据目标,DINT数据类型标签;

●数据采集周期时间:提供堆栈数组的数据采集周期,DINT数据类型标签;

●堆栈数组指针清零:提供对堆栈数组的位置管理,BOOL数据类型标签;

●堆栈数组:传递堆栈数组的数据,20个DINT数据类型的数组。指令执行要求:

●将源地址的数据装入堆栈数组;

●堆栈数组的最前面的数据卸载到目标地址;

●在Add-On指令参数中输入数据采集的时间和堆栈数组。

在RSLogix5000编程软件的树形结构中,选中“Add-On Instructions”项,右击出现如图15-1所示的画面。

978-7-111-36030-8-Chapter15-1.jpg

图15-1 选择创建新的Add-On指令

点击“New Add-On Instruction”项,进入创建页面,如图15-2所示。

创建一个Add-On指令,本页包含的信息说明:

●Name:为Add—On指令命名,此名称不但是指令的名称,指令所属的自定义结构数据,也沿用相同名称。

●Description:对指令加以说明,作为注释信息,可使用汉字。

●Type:执行代码的例程类型,可以是梯形图、功能块或语句结构编程。

●Revision:指令版本,可设定主要版本、次要版本和延伸文字。

●Vendor:指令卖主名称。为该Add-On指令命名STACK,点击978-7-111-36030-8-Chapter15-2.jpg后完成创建,在编程软件的树形结构中出现了新的Add_On指令,如图15-3所示。创建时选择了梯形图,所以Logic编程将采用梯形图。

双击“STACK”,打开指令定义页面,如图15-4所示。

978-7-111-36030-8-Chapter15-3.jpg

图15-2 Add-On指令创建页面

General页面跟创建时的画面差不多,点击左下角的978-7-111-36030-8-Chapter15-4.jpg,即可进入编程,此例是梯形图编程。左下角还显示了本指令结构数据所耗用的字节,也是每次引用指令指定数据标签所占用的字节数。Add-On指令的结构数据由下面要讲到的参数和本地标签构成。

978-7-111-36030-8-Chapter15-5.jpg

图15-3 产生新的Add-On指令

点击Parmeters页面,进入参数组态,创建指令所需要的参数,如图15-5所示。

参数说明:

●Name:为Add—On指令中的参数命名。

●Usage:参数的交换方式选择,有三种用法:

-Input(输入参数):将参数数据带入指令后台,只能是基本数据,即操作数

-Output(输出参数):从指令后台带出参数数据,只能是基本数据,即操作数。

-InOut(输入/输出参数):指令后台与外部的批量数据交换,可以是基本数据,也可以是结构数据和数组。这部分不占用指令结构数据的耗用字节,编辑指令引用时键入的数据结构必须跟这里定义的数据结构是一样的。

●Data Type:参数的数据类型,和一般定义标签相同。

●Default:参数的默认值,指令编程引用时,在创建指令结构数据标签时给出的初始值。

978-7-111-36030-8-Chapter15-6.jpg

图15-4 Add-On指令定义页面

978-7-111-36030-8-Chapter15-7.jpg

图15-5 Add-On指令参数组态页面

●Style:参数数据的表达形式,和一般定义标签相同。

●Req:此项勾选,该参数不但出现在指令中,并实施指令的后台数据对外部数据进行COP式的交换。

●Vis:此项勾选,参数将出现在指令中,如果单独勾选此项而没有选择Req,则在指令上表现为只读数据。

总而言之,Add_On指令参数是指令对外数据交换的接口,通过输入参数将数据传递进去,交给指令后台运行,然后输出参数将运行结果传递出来。根据本例的要求,一共建立了5个对外数据交换的参数,并按照用途,选定了数据类型。参数表格中已一一列举说明。

源字Source_Stack采用Input数据类型,该数据类型只允许基本数据类型,即操作数,这里选用的是一个双整字。目标字Dest_Stack采用Output数据类型,该数据类型只允许基本数据类型,即操作数,这里选用的是一个双整字。

周期时间Cycle_Stack选用Input数据类型,这里选用的是一个双整字。有一点要提请注意的是周期时间的单位,这显然跟Logic中要编写的梯级逻辑的处理有关,我们将使用计时器来完成周期性动作,计时器的时间基值是1ms,作为计时器预置值的时间提供,这里也应该为毫秒的时间单位。当默认值为3000时,意味着默认的数据采集时间是每3秒一次。清除堆栈指针操作位ClrPosition_Stack选用的Input数据类型作为梯级条件的操作数,这里选用的是布尔量。

堆栈数组Array_Stack采用的是InOut数据类型,该数据类型允许结构数据或数组进行交换。这里指定的堆栈数组是20个双整字的数组,也即实际交换的堆栈数组长度,而并非堆栈指令操作的数组长度。正如我们在第10章的讨论,先入先出堆栈指令FFL和FFU操作的数组要比实际数组多出一个数据单元,我们把这个问题交给Add—On指令内部来处理,在外部保持跟使用的长度一致。

点击Local Tags页面,进入本地标签组态,如图15-6所示。

978-7-111-36030-8-Chapter15-8.jpg

图15-6 Add-On指令本地标签组态页面

本地标签是完全运行在Add-On指令后台的数据,也是Add-On指令后台运行的中间结果,这种隐藏,既保护了这些参数不被修改,也给封装后的Add-On指令提供了数据保护。

用于堆栈指令操作的堆栈数组Array_Stack_Buffer,设定的数组长度为21,比外部交换的堆栈数组多一个数组元素,它的前20个数据将复制给指令参数的堆栈数组。

控制结构标签Control_Stack是堆栈指令操作所使用的控制结构数据标签,其指针将在合适的时候被复位为0。

窄脉冲存储位ONS_Stack为确保指针复位操作只执行一次的ONS指令而设。

计时器Timer_Stack用于设定采样周期时间,其定时工作的完成位DN为堆栈指令提供了执行条件。(www.xing528.com)

978-7-111-36030-8-Chapter15-9.jpg

图15-7 Add-On指令的逻辑例程

978-7-111-36030-8-Chapter15-10.jpg

图15-8 堆栈处理的梯级逻辑

现在,我们为自定义指令的执行,编写梯级逻辑,如图15-7所示,梯形图Logic就是存放Add-On指令执行逻辑的地方,我们所说的自定义指令后台运行就是在执行Add-On指令里面的逻辑。

点击978-7-111-36030-8-Chapter15-11.jpg进入梯形图编写梯级逻辑,如图15-8所示。

传送指令MOV将外部设定的周期采样时间传送到计时器预置值,计时器完成位在这个设定的时间到达时置位,产生一个触发脉冲,堆栈装载指令FFL执行,将堆栈源地址Source_Stack的数据装入堆栈缓存数组Array_Stack_Buffer,直到堆栈满,即Control_Stackz.DN位置位,堆栈卸载指令FFU执行,将堆栈缓存数组最前面的数据卸出到堆栈目标地址Dest_Stack,腾出最后一个数据单元,堆栈装载指令FFL再装入新的数据。

最后一个梯级将堆栈缓存数组Array_Stack_Buffer的前20个数据复制给堆栈数组Ar-ray_Stack,并通过指令交换到外部。这样,使用STACK指令丝毫不用考虑堆栈数组的长度问题,需要多长的数组,直接使用多长的数组便可。

前次程序的运行,堆栈数组Add-On指令的堆栈指针也许不在零的位置,这种残留的状态很有可能影响到当前的执行,Add-On指令应该提供一个可以清除堆栈指针的位指令操作。显然,这种操作只能在必要时进行一次性操作,为了外部清除条件更为宽松,操作不受限制,我们可以把限制一次性操作的ONS指令编写在Add-On指令的后台逻辑操作。

至此,一个Add-On指令就基本建成了,此时在指令集的Add-On分类项中出现了新的指令STACK,如图15-9所示。这个指令不但能在梯形图中引用,功能块和语句结构编程照样也可以引用。

978-7-111-36030-8-Chapter15-12.jpg

图15-9 新的指令STACK

同时在系统结构数据中,也出现了与STACK指令同名的STACK预定义结构数据,如图15-10所示。就像系统的标准指令一样,这是每当STACK指令被引用时,分配给指令的结构数据标签所必用的结构数据类型。

现在,我们在一个普通的梯形图例程中编写引用这条指令的梯级逻辑,如图15-11所示。

978-7-111-36030-8-Chapter15-13.jpg

图15-10 STACK预定义 结构数据

这里,我们将模拟量通道0的数据当作源堆栈参数。一般来说,外部模拟量的输入也可以直接引用在指令的Source_Stackde参数项中,但我们定义的Source_Stackd是双整字。在此例中,模拟量模块的输入是整型数数据类型INT,不能被Source_Stackd参数项直接接受,所以通过MOV指令转换一下,MOV指令允许目标参数项和源参数项使用不同的数据类型。当然,采用定标指令代替MOV指令也未尝不可,下面我们就要谈到定标指令。

978-7-111-36030-8-Chapter15-14.jpg

图15-11 在例程中引用STACK指令的梯级逻辑

堆栈数组Array_Stack项键入的地址必须跟指令定义设定的InOut参数结构完全一致,这里我们设定的是20个长度的双整字数组。当在线查看数据时,我们可以看到如图15-12所示的数据显示。

刚才,我们编写了堆栈指针从外部复位的做法,当外部操作复位时,内部有响应,这为用户根据运用情况进行复位提供了机会,如果我们规定STACK指令在梯级条件不成立的时候一定要复位堆栈指针,不妨利用扫描模式的介入来实现梯级条件不成立时自动复位堆栈指针。

扫描模式是Logic执行之外的某些处理,用于执行的特殊介入,进入Scan Modes页面,如图15-13所示的画面,这是定义预扫描、后扫描以及梯级条件为假时所进行的相关处理,按照事先编辑的梯级逻辑执行。

点击“EnableInFalse routine”的978-7-111-36030-8-Chapter15-15.jpg,进入如图15-14所示的画面,这里将编写梯级条件不成立时执行的代码,同样的,可以是梯形图、功能块和语句结构编程来完成执行代码。

978-7-111-36030-8-Chapter15-16.jpg

图15-12 STACK指令的堆栈数据显示

点击“OK”,完成了梯级条件未使能的处理逻辑例程的创建,如图15-15所示。

978-7-111-36030-8-Chapter15-17.jpg

图15-13 扫描模式页面

978-7-111-36030-8-Chapter15-18.jpg

图15-14 创造Add-On指令不使能执行的例程

由此,一个梯级条件未使能的逻辑例程产生,如图15-16所示,用于编写梯级条件不成立时的逻辑处理,大多数情况下会编写Add-On指令初始化处理的执行代码。

点击978-7-111-36030-8-Chapter15-19.jpg,或点击978-7-111-36030-8-Chapter15-20.jpg,进入EnableInFalse的例程,可在该例程中编写清除堆栈指针的梯级逻辑,如图15-17所示。

这样,堆栈指针在STACK指令梯级条件给定的调用和停止调用中,不知不觉就被清除了。要知道堆栈数组的处理,指针可是一个关键,严谨的指针处理可以避免操作上的混乱。当然关于STACK指令的使用指南就得说明,每当指令梯级条件使能,堆栈数组将从0元素开始装载,直到堆栈数组装满才开始推陈出新。

如果创建预扫描例程并在其中编写同样的逻辑,例程运行之初,同样可以获得这样的清理,这可以避免当例程首次扫描,本条指令的梯级条件正处在ON状态而引起的问题。

978-7-111-36030-8-Chapter15-21.jpg

图15-15 扫描模式页面

978-7-111-36030-8-Chapter15-22.jpg

图15-16 一个梯级条件未使能的逻辑例程出现

978-7-111-36030-8-Chapter15-23.jpg

图15-17 清除堆栈指针的梯级逻辑

当我们修改了Add_On指令的逻辑执行动作时,之前所有已编写并使用的指令、逻辑关系均随之发生了变化,例如堆栈指针在梯级条件不成立时堆栈指针复位的有关处理。

要想修改参数设定的默认值,情况却不是那么简单,比如我们修改了采样周期的默认时间,从3000改为2000,然后我们又编制了新的STACK指令运用,你会惊奇的发现,在修改之前编写的STACK指令并不遵从修改后的默认值,依旧使用原来的3000的默认值,只有修改后编写的STACK指令才会使用新的默认值2000。这是一个值得注意的问题,因为编写STACK指令时创建相应的Add_On指令的结构数据标签按照当时的默认值已经设定,修改Add_On指令参数时,无法同时改变已经创建的Add_On指令结构数据标签中的默认值,如果你希望所有的指令都使用新的默认值,可以到已经创建的Add_On指令结构数据标签中逐个地进行修改。

当然,每个默认值在指令运行时会自动给出,大多数情形下默认值为0,因而不被人们所关注。尽管每个参数一旦运行之后给出的默认值是可以更改的,但是重新运行又会给出默认值。本例中周期时间的默认值是3000,运行后可以从默认值更改为任何数据,但是重新运行又会给出默认值3000。

还有3个页面需要简单介绍。

如图15-18所示的签名页面是Safety Add_On指令专用的,签名是安全产品特定的做法,我们在这里不作讨论。

978-7-111-36030-8-Chapter15-24.jpg

图15-18 安全签名页面

点击“Change History”,进入如图15-19所示画面。这个页面用来记录指令创建和历次修改的情况,如果需要,也可以予以清除。

点击“Help”,进入帮助画面,如图15-20所示,这里将出现帮助文件,这些文字说明也是Add_On指令的组成部分,为了让使用者更好更正确地使用指令,在此提供更为详尽的信息。

978-7-111-36030-8-Chapter15-25.jpg

图15-19 记录指令的创建和修改的页面

978-7-111-36030-8-Chapter15-26.jpg

图15-20 帮助页面

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

我要反馈