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

Automation 使用数组或字节在结构化文本中设置多个输出,automation,plc,st,twincat,Automation,Plc,St,Twincat,我在TwinCAT3中鬼混,试图熟悉ST。现在我有一个简单的问题 假设我有8个LED。每个分配给输出1-8。现在我希望能够发送一个字节,看起来像这样:10101010。让我们调用该变量来保存该字节集输出我是否可以按如下方式初始化setOUTPUTS以保持该状态? bsetOUTPUTS := BYTE; 初始化该变量后,如何循环该变量以将每个LED设置为相应的位? 例如:setOUTPUTS=10001000,我如何循环通过setOUTPUTS变量将LED 8和LED 4设置为打开,同时关

我在TwinCAT3中鬼混,试图熟悉ST。现在我有一个简单的问题

假设我有8个LED。每个分配给输出1-8。现在我希望能够发送一个字节,看起来像这样:10101010。让我们调用该变量来保存该字节集输出我是否可以按如下方式初始化setOUTPUTS以保持该状态?

bsetOUTPUTS := BYTE;  
初始化该变量后,如何循环该变量以将每个LED设置为相应的位?

例如:setOUTPUTS=10001000,我如何循环通过setOUTPUTS变量将LED 8和LED 4设置为打开,同时关闭其他LED

如果不可能,那么使用阵列的替代方法是什么


谢谢

要初始化一个字节,您需要

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

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

您可以将setOutputs变量的每一位与在setOutputs长度上移位的位进行比较:

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

我只需将“BSetOutput”的位映射到IO

偏移量0表示位0,偏移量1表示位1,以此类推

因此,我将通道1(LED 1)链接到bsetOUTPUTS偏移量0,通道2链接到bsetOUTPUTS偏移量1,等等


您是否在Codesys中编程?在TwinCAT环境中没有很好的答案。我没有想到这一点+1为您。out[i]是否为8个LED的阵列/枚举?SHL是指左移1吗?谢谢out[i]是一个可以映射到8个单独LED的阵列。SHL(n,i)将数字n,‘i’次向左移动。