1

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

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

bsetOUTPUTS := BYTE;  

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

例如:setOUTPUTS = 10001000,我将如何循环通过 setOUTPUTS 变量将 LED 8 和 LED 4 设置为 ON,同时让其他 LED 处于 OFF 状态。

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

谢谢!!

4

3 回答 3

1

要初始化一个字节,你会

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

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

于 2016-12-16T16:46:32.327 回答
1

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

FOR i := 0 TO 7 DO
  out[i] := setOutputs AND SHL(1, i);
END_FOR;
于 2016-12-19T07:32:59.850 回答
0

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

在此处输入图像描述

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

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

在此处输入图像描述

于 2018-03-21T15:51:12.690 回答