![](/img/trans.png)
[英]Split IEC 61131-3 DINT into two INT variables (PLC structured text)
[英]Is it possible to indirectly index an array in structured text (IEC 61131-3 standard)
我有一个结构数组: myStructure[0..100]
我想按名称索引该结构。
它的工作原理是为每个索引指定一个名称:
P101_AI := 9
P102_AI := 10
P103_AI := 11
P104_AI := 12
所以索引结构中的一个成员: myStructure[P103_AI].value
(即索引myStructure[11].value)
但是,是否可以间接索引它?
即如果声明TempString : STRING[30];
在运行时更改 TempString 以索引数组。
这是一些伪代码来描述我想做的事情:
FOR i:=101 TO 104 DO
TempString := CONCAT('P',i);
TempString := CONCAT(TempString,'_AI');
MyStructure[ indirect(TempString)].value := 'some value';
END_FOR;
创建一个枚举怎么样?
{attribute 'qualified_only'}
TYPE E_AnalogInput :
(
P101_AI := 9,
P102_AI,
P103_AI,
P104_AI
);
END_TYPE
然后你可以声明:
analogInputs : ARRAY[E_AnalogInput.P101_AI..E_AnalogInput.P104_AI] OF INT;
运行 for 循环:
FOR inputCount:=E_AnalogInput.P101_AI TO E_AnalogInput.P104_AI BY 1 DO
//Do something
END_FOR
希望这可以帮助
我会使用指针和映射。 首先,将您的结构更改为指针。
TYPE MyType: STRUCT
input: POINTER TO INT;
value: INT;
// other properties
END_STRUCT
END_TYPE
然后,创建一个全局数组。
VAR_GLOBAL
MyStructure: ARRAY[1..100] OR MyType;
END_VAR
现在在一个程序中创建一次运行代码。
PROGRAM PLC_PRG:
VAR
xInit:= FALSE;
END_VAR
IF NOT xInit THEN
xInit := TRUE;
mMap();
END_IF
END_PROGRAM
现在在方法或动作mMap
为每个数组元素执行此操作。
MyStructure[1].input:= ADR(AI_Name);
MyStructure[2].input:= ADR(P102_AI);
MyStructure[3].input:= ADR(%ID0.1);
我使用了 3 种不同的方式来绑定指针。 我认为顺序并不重要。 然后在一个程序中,你可以做到这一点。
FOR i := 1 TO 100 DO
MyStructure[i].value := 'MyStructure[i].input^;
END_FOR;
这就是我解决它的方法。
TYPE infoType: STRUCT
name: STRING[20];
END_STRUCT
END_TYPE
TYPE sensorType: STRUCT
value: INT;
info: infoType;
END_STRUCT
END_TYPE
TYPE IO_Type: STRUCT
AI: ARRAY[1..100] OF sensorType;
END_STRUCT
END_TYPE
TYPE E_AnalogInput :
(
P101_AI := 9,
P102_AI,
P103_AI,
P104_AI
);
END_TYPE
PROGRAM PLC_PRG:
VAR
IOs: IO_Type;
END_VAR
IOs.AI[P101_AI].info.name := 'P101_AI';
FOR i:=101 TO 104 DO
TempString := CONCAT('P',i);
TempString := CONCAT(TempString,'_AI');
FOR i:=0 TO SIZE_OF(ADR(IOs.AI)) / SIZE_OF(ADR(IOs.AI[0])) DO
IF TempString = IOs.AI[i].info.name THEN
IOs.AI[i].value := 123; // Some value
EXIT;
END_IF;
END_FOR;
END_FOR;
END_PROGRAM
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.