首页 > 解决方案 > 连接变量

问题描述

我需要将一个字符串、一个整数和一个字符串连接成一个变量——在这种情况下是一个输入。

输入命名如下:

DI_Section1_Valve AT %I*: BOOL;
DI_Section2_Valve AT %I*: BOOL;
DI_Section3_Valve AT %I*: BOOL;

现在,我想遍历这些(这只是一个简短的示例):

For i:= 1 TO 3 DO
    Var[i] := NOT CONCAT(CONCAT('DI_Section', INT_TO_STRING(i)), '_Valve')
END_FOR

但是通过连接字符串,我会得到一个字符串,例如。'DI_Section1_Valve',而不是布尔变量,例如。DI_Section1_Valve。

我如何以变量而不是字符串结束?任何帮助表示赞赏,在此先感谢。/Thoft99

标签: twincatcodesysstructured-text

解决方案


该技术称为可变变量。不幸的是,这在 ST 中不可用。解决它的方法很少。据我了解,Twincat 3 基于 Codesys 3.5。这意味着 UNION 可用。还有一个技巧是引用BOOL不能按预期工作,一个引用占用一个字节。所以你不能把它们按顺序排列,所以你需要知道BYTE输入模块的地址。

TYPE DI_Bits : STRUCT
        DI_Section1_Valve  : BIT; (* Bit 1 *)
        DI_Section2_Valve  : BIT; (* Bit 2 *)
        DI_Section3_Valve  : BIT; (* Bit 3 *)
        DI_Section4_Valve  : BIT; (* Bit 4 *)
        DI_Section5_Valve  : BIT; (* Bit 5 *)
        DI_Section6_Valve  : BIT; (* Bit 6 *)
        DI_Section7_Valve  : BIT; (* Bit 7 *)
        DI_Section8_Valve  : BIT; (* Bit 8 *)
    END_STRUCT
END_TYPE

TYPE DI_Sections : UNION
        ByName : DI_Bits; 
        ByID : ARRAY[1..8] OF BOOL; (* Comment *)
        ByMask: BYTE;
    END_UNION
END_TYPE

PROGRAM PLC_PRG
    VAR
        DIS AT %IB0.0: DI_Sections; (* Our union *)
        xOut : BOOL;
    END_VAR


    xOut := DIS.ByID[1];
    xOut := DIS.ByName.DI_Section1_Valve;
    
    DIS.ByID[5] := TRUE; 
    // Now DIS.ByName.DI_Section5_Valve also EQ TRUE

END_PROGRAM

推荐阅读