[西门子] TwinCAT 3 PLC - 变量类型

[复制链接]
查看67593 | 回复0 | 2024-1-27 08:42:10 | 显示全部楼层 |阅读模式

    局部变量 VAR


变量声明在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;
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则