【发布时间】:2022-09-27 11:59:08
【问题描述】:
我对结构化文本很陌生,所以请原谅我的简单问题。
我正在使用 OpenPLC 创建这个简单的程序。我一直在按照下面链接中的示例创建带有结构化文本的流光简单程序。在这段视频中,他们使用了 5 个 LED 并通过案例语句对其进行控制。 但是,我的问题是,如果我的程序需要打开100盏灯,我应该如何更改代码? 我应该使用 for 循环吗?如何?
标签: plc structured-text
我对结构化文本很陌生,所以请原谅我的简单问题。
我正在使用 OpenPLC 创建这个简单的程序。我一直在按照下面链接中的示例创建带有结构化文本的流光简单程序。在这段视频中,他们使用了 5 个 LED 并通过案例语句对其进行控制。 但是,我的问题是,如果我的程序需要打开100盏灯,我应该如何更改代码? 我应该使用 for 循环吗?如何?
标签: plc structured-text
是的,您可以使用for loops 等使程序更加“动态”。
不幸的是,大多数 PLC 不能让您动态访问它们的数字输出。这意味着最后您必须编写代码,将数组中的值(您将循环通过)转换为数字输出。
【讨论】:
有几种方法可以做到这一点。首先让我展示如何创建最多 16 个的追光灯。
PROGRAM PLC_PRG
VAR
iNumOfLights : INT := 6;
fbCounter : CTU := ;
fbTicker : BLINK := (ENABLE := TRUE, TIMELOW := T#100MS, TIMEHIGH := T#1S);
wOut: WORD;
END_VAR
fbTicker();
fbCounter(CU := fbTicker.OUT, RESET := fbCounter.Q, PV := iNumOfLights);
wOut := SHL(2#0000_0000_0000_0001, fbCounter.CV);
A := wOut.0;
B := wOut.1;
C := wOut.2;
D := wOut.3;
E := wOut.4;
F := wOut.5;
G := wOut.6;
END_PROGRAM
或者,如果您知道输出地址,您可以直接对输出进行操作。
PROGRAM PLC_PRG
VAR
iNumOfLights : INT := 6;
fbCounter : CTU := ;
fbTicker : BLINK := (ENABLE := TRUE, TIMELOW := T#100MS, TIMEHIGH := T#1S);
wOut AT %QB0.1: WORD;
END_VAR
fbTicker();
fbCounter(CU := fbTicker.OUT, RESET := fbCounter.Q, PV := iNumOfLights);
wOut := SHL(2#0000_0000_0000_0001, fbCounter.CV);
END_PROGRAM
您还可以通过类似的方式更改追光灯的类型。
IF fbCounter.CV = 0 THEN
wOut := 0;
END_IF;
wOut := wOut OR SHL(2#0000_0000_0000_0001, fbCounter.CV);
现在这背后是什么。 SHl 操作员将1 移动到集合编号的左侧。例如SHL(2#0000_0000_0000_0001, 3) 将导致2#0000_0000_0000_1000。所以我们将它分配给wOut,然后通过wOut.[n] 访问各个位。
【讨论】: