有没有可能在CodeSys中以二次函数的方式得到常量的值?
例如:
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发布于 2020-06-23 19:15:02
这段代码的目标是什么?在循环结束时,如果toCheck等于3,则结果变量始终为4。
那么为什么不直接写4呢?
IF toCheck = 3 THEN
result := MYCONST_4;
END_IF如果您想要一个依赖于循环索引值的常量值,为什么不使用常量整数数组呢?
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通常情况下,你会得到这样的结果:
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发布于 2020-06-24 13:20:28
首先,你的例子很奇怪。Confition IF将在每个周期中工作,目前尚不清楚条件如何依赖于周期。我想你的意思是。
IF toCheck = i THEN无论如何,在codesys中,你不能像在PHP变量变量中那样做
$a = "hello";
$$a = "world";
echo $helo // output world或者像这样
$b = 2;
$a1 = 1;
$a2 = 2;
echo ${"a" . $b}; // Output 2这些都不会在ST工作。你已经使用了不同的方法。如果你要在你的问题中说出你想要解决的最终任务,我会给你最好的建议,但现在我只给你一个大概的概念。CODESYS2.3的所有示例。在3.5中,语法略有不同。
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的索引,并且不需要将其转换为变量名,所以您可以简单地。
VAR
aSteps: ARRAY[1..4] OF INT := 1, 2, 3, 4;
END_VAR
toCheck := 3; // INT
result := aSteps[toCheck];首先,您定义一个类型。
TYPE enSteps : (
stepIdle, stepStart, stepEnd := 5
);
END_TYPE现在是stepIdle := 0、stepStart := 1和stepEnd := 5
VAR
result: enSteps;
END_VAR
toCheck := 1;
result := toCheck;
IF result = stepStart THEN
// DO something
END_IF或者,您可以使用CASE
CASE result OF
stepIdle: // do something
stepStart: // do something
stepEnd:
result := stepIdle;
END_CASE备注
如果你能描述一下你正在努力实现的目标,我会给你一个更好的建议。
https://stackoverflow.com/questions/62530740
复制相似问题