葛东霞
(济南工程职业技术学院,山东济南250014)
西门子博图的PLC编程软件中,带有背景数据块的基本指令主要是定时器和计数器指令。这两个指令在编程时使用率是极高的,这两个指令的背景数据块在主程序OB、功能块FC和FB块中有单个实例、多重实例、参数实例三种不同的应用形式[1]。本文将详细介绍这两个指令三种背景数据块形式的区别和应用。
西门子博图的PLC编程软件中,有些指令是不带背景数据块的,比如位逻辑运算指令、比较指令、数学运算指令、移位循环指令等。即使个别指令需要数据存储通常也是1个存储位就可以解决,不再单独设立背景数据块,比如边沿指令会把上一个扫描周期的数据存储在中间寄存器区M的1个位中以便进行比较,这个位在添加指令时直接设置即可。
基本指令中的定时器、计数器指令除了有输入、输出信号,还有其他的设置信号和过程数据,比如定时器指令会设置定时时间、复位信号等,过程数据会有当前时间;计数器会设置计数个数、复位信号或加载信号,过程数据会有当前个数等。为了提升指令使用的便利性,博图专门为这样的指令设计了对应的数据块用于存储数据。在添加指令时,博图会自动加载对应的数据块支持指令的运行,这个数据块称作指令带有的背景数据块。当然,工艺指令比如PID指令、运动控制等指令也是带有背景数据块的,但是这些指令不属于本文提到的基本指令类型,其应用也是不同的,请读者注意区分。
基本指令背景数据块单个实例、多重实例、参数实例这三种应用形式主要是根据指令的背景数据块的来源及使用特点进行区分的。下面介绍三种应用形式在主程序OB块和功能块FC、FB块中的特点和应用。
以定时器为例,在主程序OB块中添加定时器指令时,博图弹出的调用选项对话框中只有单个实例的背景数据块可以选择。指令添加后,该数据块可以在“项目树”中通过“程序块—系统块—程序资源”路径进行查看,并且数据块会显示在指令上方。而且,每使用一个定时器就会在程序资源处生成一个对应的背景数据块,当使用较多的定时器或者计数器指令时会占用较多的数据块资源,同时也不方便管理。这里需要注意的是,在使用定时器时,不同的定时器严禁共用背景数据块,否则会导致定时错误。
功能块FC块是没有专用存储区的函数块[2-3],在FC块中使用定时器、计数器指令时,它们的背景数据块如何存储就成为一个问题。以定时器为例,在功能块FC块中添加定时器指令时,博图弹出的调用选项对话框中有单个实例和参数实例两种背景数据块形式可以选择,下面分别进行介绍。
FC块中添加定时器使用单个实例的背景数据块与在OB块中的单个实例形式是相同的,数据块仍是在程序资源中可以查看,同样存在占用数据块资源、不方便管理的问题。
FC块中添加定时器使用参数实例是指函数块将指令的背景数据块保存在指定块参数的实例中,这里提到的指定块是指用户为存储数据单独设置的数据块,具体操作如下:
在程序块中添加一个名为“数据块_1”的全局类型的数据块,在“数据块_1”中添加名为“定时器”、数据类型为“IEC_TIMER”的数据,这就为FC块中的定时器准备好了数据存储空间,如图1所示。
图1 添加指定数据块
在FC功能块中添加定时器指令,选择参数实例,此时指令的背景数据块将作为输入/输出(InOut)类型参数[1],出现在功能块接口参数的输入/输出类型参数中,如图2所示。
图2 接口参数中的参数实例
由于是输入/输出类型参数,当在OB1中调用FC块时需要对其赋值,这时则需要将提前建好的指定数据块“数据块_1”中的“定时器”数据赋值给定时器的背景数据块。此时,定时器的具体定时时间仍是未知的,可以在程序中使用MOVE指令将具体定时时间传送到“数据块_1”.定时器.PT中,这样在FC功能块中为添加的定时器选择参数实例背景数据块的操作步骤就结束了。
建立专有数据块使用参数实例,将指令的背景数据块整合在指定数据块中,可以解决占用很多数据块资源和背景数据块不方便管理的问题。在建立数据块时,如果同种类型的背景数据块较多,可以通过在指定数据块中设置该类型的数组来实现并提高效率。另外,建立用户数据类型(UDT)也是提高工作效率的好方法,本文最后会进行介绍。
FB块是带有自身存储区的函数块[2-3]。主程序OB每一次调用FB块,博图软件都会自动给FB块分配对应的背景数据块用于存储数据。函数块的所有数据都可以永久存储在自身的背景数据块中,块执行结束后这些数据也不会丢失,这样对于需要存储数据的指令来说就会方便许多。
仍然以定时器为例,在功能块FB块中添加定时器指令时,博图软件弹出的调用选项对话框中有单个实例、多重实例和参数实例三种背景数据块形式可以选择,下面分别进行介绍。
FB块中添加定时器使用单个实例的背景数据块与在OB块、FC块中的单个实例形式相同。
FB块中添加定时器使用多重实例的背景数据块是指将指令本身的数据保存在调用函数块的背景数据块中。因为只有FB功能块在调用时博图会分配背景数据块,所以多重实例形式只有FB块可以使用,FC块由于没有存储区是不能使用的。在FB功能块中添加定时器指令,选择多重实例,指令的背景数据块作为静态(Static)类型参数,将出现在功能块接口参数的静态类型参数中,如图3所示。当在主程序OB块中调用FB块时,可以在博图分配的函数块背景数据块中看到定时器的数据块,如图4所示。由于静态类型参数不同于输入/输出类型参数,在功能块调用时是不产生赋值端口的,定时器的具体定时时间仍然可以在程序中使用MOVE指令赋值到FB块背景数据块对应的定时器中(本例位置“块_2_DB”.IEC_Timer_0_Instance.PT),如图5所示,注意这里赋值的目的地与FC块参数实例的赋值到指定数据块不同。
图3 接口参数中的多重实例图
图4 函数块背景数据块
图5 使用函数块背景数据块为定时器赋值
多重实例实现了数据的集中,又不像FC块那样需要单独建立数据块,是很多编程人员的首选。
FB块中添加定时器使用参数实例的背景数据块与在FC功能块中的参数实例形式相同,指令的背景数据块出现在功能块接口参数的输入/输出(InOut)类型参数中。用户需要建立指定数据块以支持指令数据的存储,此时在FB块本身的背景数据块中出现的指令数据块是不可用的。
对于一组多类型变量需要多次重复设置并使用时,为提高工作效率,会使用到用户数据类型。由于本文讨论的是带有背景数据块的基本指令,所以假设用户数据类型仅为使用定时器而设立。在“项目树”PLC数据类型中添加名为“定时器组”的新数据类型,并在该类型中建立多个定时器需要的“IEC_TIMER”类型的数据,如图6所示。在功能块FC、FB中可以选择“定时器组”数据类型快速完成参数的建立。
图6 在UDT中建立“定时器组”
如果在添加定时器指令时选用多重实例形式,则需要将“定时器组”用户数据类型添加在功能块接口参数的静态(Static)类型参数中。其他操作与前面讲到的多重实例应用相同,与此对应,所有指令数据将归到FB块的背景数据块中,如图7所示。当然,此种用途只有FB功能块可以支持。
如果在添加定时器指令时选用参数实例形式,则需要将“定时器组”用户数据类型添加在功能块接口参数的输入/输出(InOut)类型参数中。其他操作与前面讲到的参数实例应用相同,与此对应,用户需要建立指定数据块以支持指令数据存储,如图7所示。功能块FC、FB块均可以使用。
图7 多重实例形式和参数实例形式
带有背景数据块的基本指令的单个实例、多重实例、参数实例三种背景数据块应用形式中,单个实例有占用数据块资源、不方便管理的特点。多重实例可以将指令本身的数据保存在调用函数块的背景数据块中,只有FB块可以使用。参数实例将指令本身的数据保存在用户建立的指定块参数的实例中,FC块、FB块都可以使用。