微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

连接变量

如何解决连接变量

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

输入的名称如下:

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

解决方法

该技术称为变量变量。不幸的是,这在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
,

您不能使用字符串访问变量。您可以做的是手动创建一个指向要索引的值的指针的数组,例如:

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

    DI_Section_Valves: ARRAY [1..3] OF POINTER TO BOOL
        := [ADR(DI_Section1_Valve),ADR(DI_Section2_Valve),ADR(DI_Section3_Valve)];
    FOR i:= 1 TO 3 DO
        out[i] := DI_Section_Valves[i]^;
    END_FOR

编辑:或者,您可以创建一个执行此操作的函数:

METHOD Get_DI_Selection_Valve : BOOL
VAR_INPUT
    i: INT;
END_VAR

    CASE i OF
    1: Get_DI_Selection_Valve := DI_Section1_Valve;
    2: Get_DI_Selection_Valve := DI_Section2_Valve;
    3: Get_DI_Selection_Valve := DI_Section3_Valve;
    END_CASE
FOR i:= 1 TO 3 DO
    out[i] := Get_DI_Selection_Valve(i);
END_FOR

想法还是一样的

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。