Example: Broken Input Detection#
With a 0-10 V input, a reading of 0 V is indistinguishable from an open circuit; both read zero. A 4-20 mA current-loop input distinguishes the two: a healthy loop never reads below 4 mA, so anything under that indicates a wire break.
This example modifies the Analog Threshold Control program to read a 4-20 mA transmitter and detect loop faults.
Hardware#
Slot |
Module |
|---|---|
1 |
SLM-AI-8-mA (8-channel 0-20 mA analog input, used here with a 4-20 mA transmitter) |
2 |
SLM-DCO-15P (15-channel sourcing DC output) |
Wire channel 1 of the analog module to a 4-20 mA transmitter. Wire indicator lamps to output channels 1 through 4.
Backplane configuration#
Add both modules in order. Leave the analog module’s Reading Format on Raw counts and Counts Scaling on Module resolution, the defaults. The SLM-AI-8-mA has a 13-bit converter, so the input arrives as a UINT from 0 to 8191 across its 0-20 mA range.
The generated addresses:
Slot |
Channel |
Address |
Alias |
|---|---|---|---|
1 |
AI1 |
|
|
2 |
DO1 |
|
|
2 |
DO2 |
|
|
2 |
DO3 |
|
|
2 |
DO4 |
|
|
The program#
Variables#
Name |
Class |
Type |
Location |
Initial Value |
Documentation |
|---|---|---|---|---|---|
|
Local |
|
|
0-20 mA as 0-8191 counts |
|
|
Local |
|
|
First lamp |
|
|
Local |
|
|
Second lamp |
|
|
Local |
|
|
Third lamp |
|
|
Local |
|
|
Fourth lamp |
|
|
Local |
|
Scaled reading, in milliamps |
||
|
Local |
|
How many lamps should be lit |
||
|
Local |
|
Set when the loop reads below live zero |
VAR
level_raw : UINT AT Level_Raw; (* 0-20 mA as 0-8191 counts *)
bar_1 : BOOL AT Bar_1; (* First lamp *)
bar_2 : BOOL AT Bar_2; (* Second lamp *)
bar_3 : BOOL AT Bar_3; (* Third lamp *)
bar_4 : BOOL AT Bar_4; (* Fourth lamp *)
level_ma : REAL; (* Scaled reading, in milliamps *)
segments : INT; (* How many lamps should be lit *)
loop_fault : BOOL; (* Set when the loop reads below live zero *)
END_VAR
Code body#
level_ma := UINT_TO_REAL(level_raw) / 8191.0 * 20.0;
loop_fault := level_ma < 3.5;
IF loop_fault THEN
bar_1 := FALSE;
bar_2 := FALSE;
bar_3 := FALSE;
bar_4 := FALSE;
ELSE
(* Map 4-20 mA onto 0-4 lit segments *)
IF level_ma >= 18.0 THEN segments := 4;
ELSIF level_ma >= 14.0 THEN segments := 3;
ELSIF level_ma >= 10.0 THEN segments := 2;
ELSIF level_ma >= 6.0 THEN segments := 1;
ELSE segments := 0;
END_IF;
bar_1 := segments >= 1;
bar_2 := segments >= 2;
bar_3 := segments >= 3;
bar_4 := segments >= 4;
END_IF;
A reading below 3.5 mA is treated as a broken loop. All lamps are driven off until the loop recovers.