首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CodeSys按名称获取常量值

CodeSys按名称获取常量值
EN

Stack Overflow用户
提问于 2020-06-23 16:43:19
回答 2查看 173关注 0票数 0

有没有可能在CodeSys中以二次函数的方式得到常量的值?

例如:

代码语言:javascript
复制
VAR CONSTANT
    MYCONST_1 : INT := 1;
    MYCONST_2 : INT := 2;
    MYCONST_3 : INT := 3;
    MYCONST_4 : INT := 4;
END_VAR

toCheck := 3; // INT
result := 0; // INT

FOR i := 1 TO 4 DO
    IF toCheck = i THEN
        result := GET_CONSTANT_VALUE_BYNAME(CONCAT('MYCONST_', INT_TO_STR(i)))
    END_IF
END_FOR
EN

回答 2

Stack Overflow用户

发布于 2020-06-23 19:15:02

这段代码的目标是什么?在循环结束时,如果toCheck等于3,则结果变量始终为4。

那么为什么不直接写4呢?

代码语言:javascript
复制
IF toCheck = 3 THEN
    result := MYCONST_4; 
END_IF

如果您想要一个依赖于循环索引值的常量值,为什么不使用常量整数数组呢?

代码语言:javascript
复制
VAR CONSTANT
    iConstValues : ARRAY[1..4] OF INT := [20,21,22,23];
END_VAR

FOR i := 1 to (eMAX_AXES_NUM-1) DO

    //Let's check an array of references to axes
    if NOT aAxes[i].isOperational()
    THEN
        //If one axis in the group is not operational return a result value
        result := iConstValues[i] ;
        RETURN
    END_IF
    
END_FOR

通常情况下,你会得到这样的结果:

代码语言:javascript
复制
TYPE E_Actuator :
(
    eNO_ACTUATOR := 0,
    eAXIS, //has value 1
    eVALVE //has value 2
);
END_TYPE

TYPE E_Status :
(
    eNO_RESULT := 0,
    eOPERATIONAL,
    eERROR
);
END_TYPE

TYPE E_AxisType :
(
    eX_AXIS := 1,
    eY_AXIS,
    eZ_AXIS,
    eA_AXIS,
    eB_AXIS,
    eMAX_AXES_NUM
);
END_TYPE

FUNCTION_BLOCK CheckActuators 
VAR_INPUT
    eActuator : E_Actuator;
END_VAR
VAR_OUTPUT
    eStatus : E_Status;
    eFaultyAxis : E_AxisType;
END_VAR

CASE eActuator OF

    //Check for type Axis
    eAXIS:
        //Check status here and return a value
        (*
        FOR i := 1 to (eMAX_AXES_NUM - 1) DO
            //CheckActuators has an array with references to all axes in the project for example..
            if NOT aAxes[i].isOperational()
            THEN
                //If one axis in the group is not operational return error status
                eStatus := eERROR;
                eFaultyAxis := i;

                RETURN
            END_IF
        END_FOR
        *)
        
    //Check for type Valve
    eVALVE:
            
END_CASE
票数 2
EN

Stack Overflow用户

发布于 2020-06-24 13:20:28

首先,你的例子很奇怪。Confition IF将在每个周期中工作,目前尚不清楚条件如何依赖于周期。我想你的意思是。

代码语言:javascript
复制
IF toCheck = i THEN

无论如何,在codesys中,你不能像在PHP变量变量中那样做

代码语言:javascript
复制
$a = "hello";
$$a = "world";
echo $helo // output world

或者像这样

代码语言:javascript
复制
$b = 2;
$a1 = 1;
$a2 = 2;
echo ${"a" . $b}; // Output 2

这些都不会在ST工作。你已经使用了不同的方法。如果你要在你的问题中说出你想要解决的最终任务,我会给你最好的建议,但现在我只给你一个大概的概念。CODESYS2.3的所有示例。在3.5中,语法略有不同。

  1. Arrays

代码语言:javascript
复制
VAR 
    aSteps: ARRAY[1..4] OF INT := 1, 2, 3, 4;
END_VAR

toCheck := 3; // INT
result := 0; // INT

FOR i := 1 TO 4 DO
    IF toCheck = i THEN
        result := aSteps[i];
    END_IF
END_FOR

但更简单的是,因为您已经了解toCheck的索引,并且不需要将其转换为变量名,所以您可以简单地。

代码语言:javascript
复制
VAR 
    aSteps: ARRAY[1..4] OF INT := 1, 2, 3, 4;
END_VAR

toCheck := 3; // INT
result := aSteps[toCheck];

  1. Enumerations

首先,您定义一个类型。

代码语言:javascript
复制
TYPE enSteps : (
    stepIdle, stepStart, stepEnd := 5
);
END_TYPE

现在是stepIdle := 0stepStart := 1stepEnd := 5

代码语言:javascript
复制
VAR
    result: enSteps;
END_VAR

toCheck := 1;
result := toCheck;

IF result = stepStart THEN
   // DO something
END_IF

或者,您可以使用CASE

代码语言:javascript
复制
CASE result OF
stepIdle: // do something
stepStart: // do something
stepEnd:
    result := stepIdle;
END_CASE

备注

如果你能描述一下你正在努力实现的目标,我会给你一个更好的建议。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62530740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档