使用数组或字节在结构化文本中设置多个输出

时间:2016-12-16 15:12:50

标签: automation plc st twincat

我在TwinCAT3中傻瓜尝试并熟悉ST。我现在有一个简单的问题。

说我有8个LED。每个分配给输出1-8。现在我希望能够发送一个如下所示的字节:10101010。让我们调用该变量来保存该字节setOUTPUTS。 我是否会按照以下方式将setOUTPUTS初始化为

bsetOUTPUTS := BYTE;  

在初始化该变量后,我如何循环将每个LED设置为相应的位?

例如:setOUTPUTS = 10001000,我将如何循环通过setOUTPUTS变量将LED 8和LED 4设置为ON,而将其他LED设置为OFF。

如果这不可能,使用数组的替代方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以将setOutputs变量的每个位与通过setOutputs长度移位的位进行比较:

FOR i := 0 TO 7 DO
  out[i] := setOutputs AND SHL(1, i);
END_FOR;

答案 1 :(得分:0)

要初始化一个字节

setOUTPUTS : BYTE:=86; (* equiavlent to 01010101  *)

您可以根据位设置输出,如下所示

out1 := setOUTPUTS.0;  (* bit 0 of byte *)
out2:=setOUTPUTS.1;  (* bit 1 of byte *)

你可能认为你可以做一些事情,比如遍历字节中的位

FOR i:=0 TO 8 BY 1 DO
(* out is an array of outputs *)
out[i] := setOUTPUTS.i;
END_FOR

但遗憾的是你无法做到这一点。据我所知,单独设置它们是实现这一目标的唯一方法。

答案 2 :(得分:0)

我只是将“bsetOUTPUTS”的位映射到IO。

enter image description here

偏移0表示位0,偏移1表示位1,等等

所以我将我的通道1(LED 1)链接到bsetOUTPUTS偏移0,通道2连接到bsetOUTPUTS偏移1等。

enter image description here