变量声明在VAR和END_VAR之间,举例如下
VAR nVar1 : INT;END_VAR
该类变量可以从对象外部进行读操作,但无法进行写操作。尽管如此,也不建议进行读操作,比如一个FB有多个实例,在不同的实例后,局部变量的值有可能是不一样的。
2. 输入变量
变量声明在VAR_INPUT和END_VAR之间,从外部可以通过 <function block instance name>.<variable name>访问,举例如下
VAR_INPUT nIn1 : INT; //1st input variableEND_VAR
3. 输出变量
变量声明在VAR_OUTPUT和END_VAR之间,从外部可以通过 <function block instance name>.<variable name>访问,举例如下
VAR_OUTPUT nOut1 : INT; //1st output variableEND_VAR
4. 输入输出变量
变量声明在VAR_IN_OUT和END_VAR之间。
该类型变量可以读和写
FB的VAR_IN_OUT变量在调用FB时必须赋值
从外部不能通过 <function block instance name>.<variable name>访问
如果字符串类型作为参数时,那么实参和形参的长度必须一致,否则有可能造成数据不一致。
bit类型的变量无法用于VAR_IN_OUT
无法传递属性
其语法如下:
<keyword><POUname>VAR_IN_OUT<variablename> : <datatype> ( := <initializationvalue> )? ;END_VAR<keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG
举例如下
FUNCTION_BLOCKFB_SampleVAR_IN_OUTbInOut : BOOL;END_VAR
如果需要接受常量,那么可以用VAR_IN_OUT CONSTANT,该类型变量只能读不能写
其语法如下
<keyword><POUname>VAR_IN_OUT CONSTANT<variablename> : <datatype>; // formal parameterEND_VAR<keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG
如果变量类型为STRING/WSTRING,那么接受字符串常量时,字符串常量的长度可以与变量的长度不一致。
示例代码如下:
//Function//变量声明FUNCTION F_Manipulate : BOOLVAR_IN_OUT sReadWrite : STRING(16); (* Can be read or written here in POU *) nReadWrite : DWORD; (* Can be read or written here in POU *)END_VARVAR_IN_OUT CONSTANT cReadOnly : STRING(16); (* Constant string variable can only be read here in POU *)END_VAR
//代码sReadWrite := 'String_from_POU';nReadWrite := STRING_TO_DWORD(cReadOnly);//主程序//变量声明PROGRAM MAINVAR sVar10 : STRING(10) := '1234567890'; sVar16 : STRING(16) := '1234567890123456'; sVar20 : STRING(20) := '12345678901234567890'; nVar : DWORD;END_VAR
//代码// The following line of code causes the compiler error:// VAR_IN_OUT parameter 'sReadWrite' of 'F_Manipulate' needs variable with write access as input.F_Manipulate(sReadWrite := '1234567890123456', cReadOnly := '1234567890123456', nReadWrite := nVar);// The following line of code causes the compiler error:// String variable 'sVar10' too short for VAR_IN_OUT parameter 'sReadWrite' of 'F_Manipulate' F_Manipulate(sReadWrite := sVar10, cReadOnly := sVar10, nReadWrite := nVar);// Correct codeF_Manipulate(sReadWrite := sVar16, cReadOnly := '1234567890', nReadWrite := nVar);F_Manipulate(sReadWrite := sVar16, cReadOnly := '1234567890123456', nReadWrite := nVar);F_Manipulate(sReadWrite := sVar16, cReadOnly := '12345678901234567890', nReadWrite := nVar);F_Manipulate(sReadWrite := sVar16, cReadOnly := sVar10, nReadWrite := nVar);F_Manipulate(sReadWrite := sVar16, cReadOnly := sVar16, nReadWrite := nVar);F_Manipulate(sReadWrite := sVar20, cReadOnly := sVar20, nReadWrite := nVar);
5. 全局变量
变量声明在VAR和END_VAR之间,举例如下
VAR_GLOBALnVarGlob1 : INT; END_VAR
6. 临时变量
变量声明在VAR_TEMP和END_VAR之间,只能在program和FB中定义,举例如下
VAR_TEMP nVarTmp1 : INT; //1st temporary variableEND_VAR
7. 静态变量
变量声明在VAR_STAT和END_VAR之间,举例如下
VAR_STATnVarStat1 : INT;END_VAR
8. 实例变量
变量声明在VAR_INST和END_VAR之间,该类型变量只能在FB的方法中定义,并且只能在该方法中访问,举例如下
METHODMethLast : INTVAR_INPUTnVar : INT;END_VARVAR_INSTnLast : INT := 0;END_VAR
MethLast := nLast;nLast := nVar; |