IEC 61131-3定义的程序组织单元(POU)是函数、功能块、类和程序。功能块和类可包含方法。作为面向对象的编程语言,一个POU包含用于模块化目的和结构化的明确定义的程序部分。
POU和方法可由用户编程实现,也可由PLC实施者实现。POU和方法是否允许递归,即一个POU和方法的调用是否影响另一个POU和方法的调用,是由实施者规定的。POU、方法和给定资源的实例允许的最大个数也由实施者规定。
1.赋值
一个文字(直接量)、常量表达式、变量或一个表达式(见下述)的值被写入另一个变量,称为赋值。另一个变量可以是任何类型的变量,例如,函数、方法、功能块等的一个输入或一个输出变量。
赋值过程遵循下列规则:
1)类型为STRING或WSTRING的变量和常数可对应地赋值给类型为STRING或WSTRING的另一个变量。如果源字符串比目标字符串长,则结果由实施者规定。
2)子范围数据类型的变量能用于它基本类型的变量可以使用的任何地方。例如,子范围数据类型是INT,则该子范围数据类型的变量在INT数据类型可使用的任何地方都可使用。
3)派生数据类型的变量可用于它基本类型的变量可以使用的任何地方。
4)数组数据类型的变量,其附加规则由实施者规定。
5)文本表示的赋值符号如下:
①“:=”符号:它表示操作符右侧表达式的值被写到操作符左侧的变量,例如,A:=B。
②“=>”符号:它表示操作符左侧的值被写到操作符右侧的变量。“=>”操作符只能用在函数、方法、功能块等的调用的参数列表中,只能通过VAR_OUTPUT变量来返回给调用者,例如,C10(CU:=%IX10,Q=>OUT)。
6)图形表示时,它是图形符号的源连接到它的宿的连线,例如,从一个功能块的输出端到另一个功能块的输入端,从一个函数的返回值到变量的图形符号等。图形表示的赋值可采用MOVE赋值函数实现。
7)赋值时,赋值符号两侧的数据类型必须相同。当两者不一致时,必须使用数据类型转换函数。
8)数据类型的转换有隐式和显式两种。
【例1-20】赋值。
2.表达式
表达式是一个语言结构,它由一个已经定义的操作数(如文本、变量、函数调用)和操作符(如+、-、*、/)组合而成。表达式可产生一个值,该值称为表达式的值,它可被多次给出(读取)。
隐式和显式数据类型转换可被用于一个表达式操作的数据类型。
表达式可以用文本格式或图形格式描述。文本格式根据编程语言规定的程序按规定的顺序执行,例如,先乘除后加减;先执行圆括号内的运算,再执行外部的运算;从左向右执行运算等。图形格式是用图形元素(连接线、函数和功能块等)表示的网络,其表达式的运算是网络求值的过程。
(1)常量表达式
常量表达式是一种语言结构,它由已定义的操作数组合而成,例如,文字、常量变量、枚举变量和操作符(如+、-、*),用于产生一个称为表达式的值的数值,该值可被多次给出(读取)。常量表达式的值不会发生改变。
【例1-21】常量和常量表达式。
(2)对ANY_BIT变量的局部寻址
具有一般数据类型ANY_BIT属性的变量,可对该变量的一个位、字节、字和双字局部寻址。表1-23是ANY_BIT数据类型变量的局部寻址的示例。
表1-23 对ANY_BIT变量的局部寻址
注:1.根据表1-20,位存取的前缀%X可以省略,例如,By1.%X7等效于By1.7。
2.局部寻址不能用于直接表示变量,例如,%IB10。
【例1-22】ANY_BIT数据类型的变量局部寻址。
(3)调用表达式
调用是语言结构,用于函数、功能块实例或功能块或类的方法的执行。调用可用文本描述或图形描述。
调用的规律如下:
1)当标准函数输入变量没有给出其名称时,默认的名称是从上到下依次为IN1,IN2,…。如果标准函数只有一个没有名称的输入变量,则该变量名称用IN。例如,ADD函数中,输入变量的名称用IN1,IN2,…。而SQRT函数的输入变量的名称用IN。
2)VAR_IN_OUT变量应正确映射到其输入和输出。采用文本调用时,如果VAR_IN_OUT变量是正确映射,则在POU包含的VAR_IN_OUT、VAR、VAR_TEMP、VAR_OUTPUT或VAR_EXTERNAL变量声明段用“:=”赋值到被声明的变量,或者其他包含的调用中正确映射的VAR_IN_OUT变量。一个正确映射的VAR_IN_OUT变量的调用可用“:=”赋值符赋值给包含POU的VAR、VAR_OUTPUT或VAR_EXTERNAL变量声明段的变量。
3)图形描述时,正确映射的VAR_IN_OUT变量应被连接到有关图形符号的左面,同时,应被连接到该图形符号中VAR_IN_OUT变量的右面。
4)当这样的连接导致该被连接变量的值模糊不定时,则出错。
IEC61131-3第三版指出,当功能块实例名在VAR_INPUT变量声明段声明,或作为VAR_IN_OUT变量时,它可作为输入。当功能块实例名作为VAR_INPUT变量时,功能块的变量具有只读属性。当功能块实例名作为VAR_IN_OUT变量,且功能块被调用时,功能块的变量具有读和写属性。
(4)文本类编程语言中表达式(函数)的调用
文本类编程语言中表达式的调用由被调用实体名和后续的参数列表组成。例如,A:=ADD(B,C,D);表示一个加函数的调用,其中,B、C、D是三个输入参数。它们是参数列表,参数之间用逗号分隔,用圆括号将列表的参数包括在内。调用时,参数列表应提供实际的数值。
1)形参调用。参数列表将实际值赋值给形参名(形式参数列表),即:
输入和输入-输出变量的值用“:=”操作符赋值
输出变量的值用“=>”操作符赋值
形式参数列表可以是完整的或不完整的,任何在列表中没有被赋值的变量有初始值,可以是在调用实体的声明中被用户定义并赋值,或采用该变量相应数据类型的系统默认初始值。
由于列表中参数与实际值有一一对应的赋值关系,因此,参数列表的顺序可任意排列。在列表中可使用执行控制参数EN和ENO。
【例1-23】表达式的形参调用。
A:=LIMIT(EN:=COND,IN:=B,MN:=0,MX:=5,ENO=>TEMPL); //完整参数列表
A:=LIMIT(IN:=B,MX:=5); //不完整参数列表
2)非形参调用。除了执行控制参数EN和ENO外,非格式调用时的参数列表应包含在函数定义中给出的完全相同的参数个数,相同的参数顺序和相同的数据类型。
【例1-24】表达式的非形参调用。
A:=LIMIT(B,0,5); //必须与该函数的参数排列顺序、数据类型和参数个数保持一致
(5)图形类编程语言中表达式的调用
图形类编程语言中,表达式的调用可根据下列规则:
1)被调用的表达式用矩形块表示,矩形块的大小和性能与被调用表达式的输入参数个数和其他信息有关。被调用实体的名称或符号应位于矩形块内的上侧,输入-输出变量的名称应分别列写在矩形块内的左侧和右侧,如果有附加的执行控制参数EN和ENO,则应列写在矩形块内部最上部位置的左侧和右侧。
2)参数的连接用信号流线表示。布尔信号取反的图形符号是一个与块相切的小空心圆,它与矩形块及输入或输出线连接。空心圆也可用大写字母O表示。取反操作在POU外执行。矩形表示的函数的所有输入和输出(包括函数的返回值)用单线表示在矩形块相应侧的外面。
3)输出(包括函数的返回值)可连接到变量,用于作为其他调用的输入。输出也可不连接。如果有附加的执行控制参数ENO,则函数的返回值位于ENO的下面位置。
4)输入可连接到其他调用的输出或有关变量。
表1-24是文本类和图形类编程语言中调用形式参数和非形式参数的示例。
表1-24 文本类和图形类编程语言中调用形式参数和非形式参数的示例
注:本表示例说明图形和等效的文本的用法,包括标准ADD函数没有定义的形式参数名、标准SHL函数有定义的形式参数名、SHL函数有附加的EN输入和ENO输出取反及有用户定义的形式参数名的用户定义的函数(INC)。
3.执行控制EN和ENO
POU的EN和ENO是该POU的使能输入和使能输出变量。在POU中,既可只用EN,也可只用ENO,或两者都使用或都不使用。
(1)EN的赋值
EN输入可在POU内部或外部赋值。其赋值准则如下:
1)EN输入在POU内部赋值时,如果EN是FALSE,则ENO被置为FALSE,POU立刻返回或执行一个取决于该状态的一个子集,所有给定的输入和输入-输出参数被赋值,并被设置在POU的实例(函数除外),并检查输入-输出参数的有效性。
2)EN输入在POU外部赋值时,如果EN是FALSE,则仅有ENO被置为FALSE,而POU不被调用,输入和输入-输出参数不被赋值,POU实例不被设置,也不检查输入-输出参数的有效性。从一个外部调用分开的POU输入的EN不被设置。
3)附加的EN和ENO用于控制执行过程的进行与否。
使能输入EN和使能输出ENO的应用原则如下:
1)当该POU被调用时,如果EN的值是0(FALSE),则该POU实体定义的操作不被执行,同时,ENO的值也被复位到0(FALSE)。
2)否则,当该POU被调用时,如果EN的值是1(TRUE),则该POU实体定义的操作被执行,同时,ENO的值也被置位到1(TRUE)。
3)如果POU执行过程中出错,例如,类型转换出错、数值结果超出该数据类型的范围、除以零等,则ENO的值被自动复位到0(FALSE)或实施者规定的该出错的其他处置。(www.xing528.com)
4)如果ENO输出的求值结果为FALSE,则所有该POU的输出(VAR_OUTPUT、VAR_IN_OUT和函数返回)值应根据实施者的规定。
5)输入EN只能被设置为实际值,作为一个POU调用的一部分。
6)输出ENO只能连接一个变量,作为一个POU调用的一部分。输出ENO只能在它POU的内部进行设置。
7)用引用操作REF()中的参数EN/ENO,来获得EN/ENO参数的引用是错误的。
(2)执行控制参数的执行
EN和ENO可以内部执行,也可以外部执行。
【例1-25】EN和ENO执行示例。
myInst(EN:=cond,A:=V1,C:=V3,B=>V2,ENO=>X);
表1-25显示EN和ENO的内部执行和外部执行。
表1-25 内部执行和外部执行
(3)执行控制参数的示例
表1-26是EN和ENO执行控制的示例。给出的性能演示所选用的语言仅作为示例。
表1-26 EN和ENO执行控制的示例
4.数据类型转换
当不同数据类型的变量进行操作时,需要将不同的数据类型转换成为相同的数据类型。因此,当使用表达式、设置和参数赋值时,数据类型转换用于适配数据类型。例如,整数数据类型的变量A不能与实数数据类型的变量B相加,可以将A的数据类型转换为实数数据类型再加,也可将B数据类型转换为整数数据类型再加。
(1)需要数据类型转换的场合
下列情况下需要对变量的数据类型进行转换:
1)赋值语句中,一个变量的数据值赋值到另一个不同数据类型的另一个变量时,可采用赋值操作符“:=”和“=>”和函数、功能块、方法和程序中被声明为输入、输出变量等参数的赋值实现。例如,输入变量A被声明是整数,而变量B被声明为实数,则用A:=B语句可将实数B的值转换为整数,并赋值给A。
2)表达式由操作符和操作数组成,操作数分为直接数据值和数据类型相同或不同的变量。
例如,表达式SQRT(A+B*1.5),可采用不同数据类型的变量A和B转换为实数实现。这里,函数SQRT适用于实数数据类型,因此,其内部的各变量都需转换到实数数据类型。
(2)数据转换类型的分类
数据转换分为显式和隐式两种。显式数据类型转换通过数据类型转换函数实现。隐式数据类型转换遵循下列规则:
1)应保持数据类型的值和精度。
2)可用于类型化函数。
3)可用于将表达式的值赋值给变量。
4)可用于一个输入参数的赋值。
5)可用于一个输出参数的赋值。
6)可用于一个输入-输出参数的赋值。
7)可用于使操作数和操作结果或过载函数结果获得相同的数据类型。
8)对非类型化的文本,由实施者规定其转换规则。为避免出现模棱两可现象,建议用户采用类型化文本。
表1-27是两种可交替使用的“隐式”和“显式”的源数据类型到目标数据类型的转换。
需注意,一些数据类型的转换是没有“隐式”和“显式”的。例如,实数数据类型转换为时间数据类型,这时,必须用对应的数据类型转换函数REAL_TO_TIME。
表1-27 两种可交替使用的“隐式”和“显式”的源数据类型到目标数据类型的转换
(续)
注:1.表中的空格为没有必要进行数据类型转换(因数据类型相同)。
2.本标准没有显式和隐式的数据类型转换的定义。
3.表中的i表示隐式数据类型转换,但也允许显式类型转换。
4.表中的e表示用户使用的显式数据类型转换(标准的转换函数),会有可接受的精度损失,范围的失配或可能影响实施者的相关行为。
①为避免使用的字符串发生冲突,STRING到WSTRING的转换和CHAR到WCHAR的转换是显式的。
(3)数据转换的示例
【例1-26】显式和隐式数据类型转换。
变量声明如下:
表1-28是不同编程语言中显式和隐式数据类型转换的用法。
表1-28 显式和隐式数据类型转换的用法
(4)支持的隐式数据类型转换
图1-12显示标准支持的隐式数据类型转换。箭头表示可能的转换路径,例如,BOOL能够转换为BYTE,BYTE能够转换为WORD等,即从存储空间大的数据类型中可隐式转换为存储空间小的数据类型。
图1-12 支持的隐式数据类型转换
5.过载
如果在一般数据类型中的各种类型输入语言元素都可被操作,则称该语言元素是过载的,也称为超载或多载,例如ANY_NUM、ANY_INT等输入数据元素。过载表示对一种操作或功能,能用一个或多个不同的数据类型的操作数或参数进行工作的能力。
(1)具有过载性能的标准语言元素
下列标准语言元素具有一般过载性能作为其特定的性能:
1)标准函数:有过载的标准函数(例如ADD、MUL)和过载的标准转换函数(例如TO_REAL、TO_INT)。
2)标准方法:IEC 61131没有在标准类或功能块类型中定义标准方法,但可由实施者提供。
3)标准功能块:除了一些简单功能块,像计数器外,IEC 61131没有定义标准功能块。但它们可以在IEC 61131的其他部分定义,并由实施者提供。
4)标准类:IEC 61131没有定义标准类,但它们可在IEC 61131的其他部分定义,并由实施者提供。
5)操作符:ST编程语言的“+”和“*”和指令表(IL)编程语言的ADD和MUL等操作符具有过载性能。
(2)具有过载语言元素的变量进行数据类型的转换
根据图1-12,一般数据类型ANY_NUM的基本数据类型包括ANY_REAL和ANY_INT。但不同实施者可规定其一般数据类型所包含的基本数据类型。例如,可规定ANY_BIT只表示基本数据类型的BYTE和WORD。
一个过载语言元素可根据下列规则用被定义的基本数据类型操作:
1)输入和输出/返回值的数据类型应是相同的数据类型。
2)如果同类型输入和输出的数据类型有不同的类型,则语言元素的转换由实施者规定。
3)一个表达式和一个赋值的隐式数据类型转换遵循表达式求值的顺序。
【例1-27】一个表达式和一个赋值的隐式数据类型转换。
4)存储过载函数返回值的变量的数据类型不影响函数或操作的返回值数据类型。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。