io-commissioning-kit
I/O-list-driven commissioning toolkit for a simulated instrumentation rack of a laser amplifier test bench. By Pavan Yadava Annappa.
Everything on this page is simulated. The rack, the field devices, the wiring faults and the OPC UA server are a local Python simulation. No real hardware, PLC or plant data is involved. The interlock logic is a test harness, not a safety function.
Documentation chain: I/O list (YAML) → lint → cable schedule, interface description, loop-check procedure → loop check over OPC UA → commissioning record → issue log.
I/O list (38 points, revision C)
| Tag | Description | Signal | Range / normal | Channel | Cable | JB | Cabinet |
|---|---|---|---|---|---|---|---|
| FT-101 | Coolant flow, amplifier head circuit | AI_4_20mA | 0 .. 20 L/min | A1-AI1.1 | W-FT-101 | JB-1 | A1-X2:1 A1-X2:2 |
| FT-102 | Coolant flow, diode pump modules | AI_4_20mA | 0 .. 40 L/min | A1-AI1.2 | W-FT-102 | JB-1 | A1-X2:3 A1-X2:4 |
| PT-101 | Coolant supply pressure | AI_4_20mA | 0 .. 10 bar | A1-AI1.3 | W-PT-101 | JB-1 | A1-X2:5 A1-X2:6 |
| LT-101 | Coolant tank level | AI_4_20mA | 0 .. 100 % | A1-AI1.4 | W-LT-101 | JB-1 | A1-X2:7 A1-X2:8 |
| TT-101 | Coolant supply temperature | AI_RTD | 0 .. 50 degC | A1-RT1.1 | W-TT-101 | JB-1 | A1-X2:9 A1-X2:10 A1-X2:11 |
| TT-102 | Coolant return temperature | AI_RTD | 0 .. 50 degC | A1-RT1.2 | W-TT-102 | JB-1 | A1-X2:12 A1-X2:13 A1-X2:14 |
| TT-103 | Amplifier head body temperature | AI_RTD | 0 .. 100 degC | A1-RT1.3 | W-TT-103 | JB-1 | A1-X2:15 A1-X2:16 A1-X2:17 |
| CH-101-RUN | Chiller running | DI | normal TRUE | A1-DI1.1 | W-CH-101-RUN | JB-1 | A1-X2:18 A1-X2:19 |
| CH-101-FLT | Chiller healthy (opens on fault) | DI | normal TRUE | A1-DI1.2 | W-CH-101-FLT | JB-1 | A1-X2:20 A1-X2:21 |
| CH-101-EN | Chiller remote start | DO | normal FALSE | A1-DO1.1 | W-CH-101-EN | JB-1 | A1-X2:22 A1-X2:23 |
| PT-201 | Vacuum, spatial filter tube | AI_0_10V | 1e-08 .. 100 mbar | A1-AV1.1 | W-PT-201 | JB-2 | A1-X2:24 A1-X2:25 A1-X2:26 |
| PT-202 | Vacuum, forevacuum line | AI_0_10V | 0.001 .. 1000 mbar | A1-AV1.2 | W-PT-202 | JB-2 | A1-X2:27 A1-X2:28 A1-X2:29 |
| VP-201-RUN | Roughing pump running | DI | normal TRUE | A1-DI1.3 | W-VP-201-RUN | JB-2 | A1-X2:30 A1-X2:31 |
| VV-201-CMD | Gate valve open command | DO | normal FALSE | A1-DO1.2 | W-VV-201-CMD | JB-2 | A1-X2:32 A1-X2:33 |
| VV-201-ZSO | Gate valve open limit | DI | normal TRUE | A1-DI1.4 | W-VV-201-ZSO | JB-2 | A1-X2:34 A1-X2:35 |
| VV-201-ZSC | Gate valve closed limit | DI | normal FALSE | A1-DI1.5 | W-VV-201-ZSC | JB-2 | A1-X2:36 A1-X2:37 |
| PT-301 | N2 purge supply pressure | AI_4_20mA | 0 .. 6 bar | A1-AI2.1 | W-PT-301 | JB-3 | A1-X2:38 A1-X2:39 |
| FT-301 | N2 purge flow | AI_4_20mA | 0 .. 50 L/min | A1-AI2.2 | W-FT-301 | JB-3 | A1-X2:40 A1-X2:41 |
| PT-302 | Instrument air pressure | AI_4_20mA | 0 .. 10 bar | A1-AI2.3 | W-PT-302 | JB-3 | A1-X2:42 A1-X2:43 |
| XV-301-CMD | N2 purge valve open command | DO | normal FALSE | A1-DO1.3 | W-XV-301-CMD | JB-3 | A1-X2:44 A1-X2:45 |
| XV-301-ZSO | N2 purge valve open feedback | DI | normal FALSE | A1-DI1.6 | W-XV-301-ZSO | JB-3 | A1-X2:46 A1-X2:47 |
| MT-401 | Lab room humidity | AI_4_20mA | 0 .. 100 %rH | A1-AI2.4 | W-MT-401 | JB-3 | A1-X2:48 A1-X2:49 |
| TT-401 | Lab room temperature | AI_RTD | 0 .. 50 degC | A1-RT1.4 | W-TT-401 | JB-3 | A1-X2:50 A1-X2:51 A1-X2:52 |
| AT-402 | Lab oxygen concentration | AI_0_10V | 0 .. 25 %vol | A1-AV1.3 | W-AT-402 | JB-3 | A1-X2:53 A1-X2:54 A1-X2:55 |
| PD-501-EN | Diode pump driver enable | DO | normal FALSE | A1-DO1.4 | W-PD-501-EN | JB-4 | A1-X2:56 A1-X2:57 |
| PD-501-FLT | Diode pump driver healthy (opens on fault) | DI | normal TRUE | A1-DI1.7 | W-PD-501-FLT | JB-4 | A1-X2:58 A1-X2:59 |
| PD-501-RDY | Diode pump driver ready | DI | normal TRUE | A1-DI1.8 | W-PD-501-RDY | JB-4 | A1-X2:60 A1-X2:61 |
| JT-501 | Diode pump current monitor | AI_0_10V | 0 .. 500 A | A1-AV1.4 | W-JT-501 | JB-4 | A1-X2:62 A1-X2:63 A1-X2:64 |
| TT-501 | Diode heat sink temperature | AI_RTD | 0 .. 100 degC | A1-RT2.1 | W-TT-501 | JB-4 | A1-X2:65 A1-X2:66 A1-X2:67 |
| SH-501-CMD | Beam shutter open command | DO | normal FALSE | A1-DO1.5 | W-SH-501-CMD | JB-4 | A1-X2:68 A1-X2:69 |
| SH-501-ZSO | Beam shutter open limit | DI | normal FALSE | A1-DI2.1 | W-SH-501-ZSO | JB-4 | A1-X2:70 A1-X2:71 |
| SH-501-ZSC | Beam shutter closed limit | DI | normal TRUE | A1-DI2.2 | W-SH-501-ZSC | JB-4 | A1-X2:72 A1-X2:73 |
| XL-501 | Laser-on warning lamp | DO | normal FALSE | A1-DO1.6 | W-XL-501 | JB-4 | A1-X2:74 A1-X2:75 |
| ZS-601A | Enclosure door closed, channel A | DI | normal TRUE | A1-DI2.3 | W-ZS-601A | JB-4 | A1-X2:76 A1-X2:77 |
| ZS-601B | Enclosure door closed, channel B | DI | normal TRUE | A1-DI3.1 | W-ZS-601B | JB-4 | A1-X2:78 A1-X2:79 |
| HS-602A | E-stop chain healthy, channel A | DI | normal TRUE | A1-DI2.4 | W-HS-602A | JB-4 | A1-X2:80 A1-X2:81 |
| HS-602B | E-stop chain healthy, channel B | DI | normal TRUE | A1-DI3.2 | W-HS-602B | JB-4 | A1-X2:82 A1-X2:83 |
| HS-604 | Interlock reset pushbutton | DI | normal FALSE | A1-DI2.5 | W-HS-604 | JB-4 | A1-X2:84 A1-X2:85 |
Sample commissioning record
Run with 8 planted wiring faults
(config/demo_faults.yaml), tolerance +/- 0.5 % of span,
tester "simulated run". Result: 28/38 passed,
10 failed. Sign-off fields are left blank on purpose.
| Tag | Channel | Signal | As found | Result | Suspected cause |
|---|---|---|---|---|---|
| FT-101 | A1-AI1.1 | AI_4_20mA | 0%: 0.003949 / 25%: 4.993 / 50%: 9.997 / 75%: 15.01 / 100%: 20 | PASS | - |
| FT-102 | A1-AI1.2 | AI_4_20mA | 0%: -9.983 / 25%: 5.023 / 50%: 20.01 / 75%: 34.98 / 100%: 49.99 | FAIL | scaling mismatch between field device and controller channel |
| PT-101 | A1-AI1.3 | AI_4_20mA | 0%: 0.0005416 / 25%: 2.5 / 50%: 4.999 / 75%: 7.499 / 100%: 10.01 | PASS | - |
| LT-101 | A1-AI1.4 | AI_4_20mA | 0%: 70 / 25%: 70 / 50%: 70 / 75%: 70 / 100%: 70 | FAIL | stuck / frozen value |
| TT-101 | A1-RT1.1 | AI_RTD | 0%: -0.02328 / 25%: 12.49 / 50%: 24.97 / 75%: 37.5 / 100%: 50.01 | PASS | - |
| TT-102 | A1-RT1.2 | AI_RTD | 0%: 2.571e+04 / 25%: 2.571e+04 / 50%: 2.571e+04 / 75%: 2.571e+04 / 100%: 2.571e+04 | FAIL | open circuit |
| TT-103 | A1-RT1.3 | AI_RTD | 0%: -0.01903 / 25%: 25 / 50%: 50.01 / 75%: 75.02 / 100%: 100 | PASS | - |
| CH-101-RUN | A1-DI1.1 | DI | close contact: T / open contact: F | PASS | - |
| CH-101-FLT | A1-DI1.2 | DI | close contact: T / open contact: F | PASS | - |
| CH-101-EN | A1-DO1.1 | DO | command FALSE: F / command TRUE: T / command FALSE: F | PASS | - |
| PT-201 | A1-AV1.1 | AI_0_10V | 0%: 9.993e-09 / 25%: 3.168e-06 / 50%: 0.0009951 / 75%: 0.319 / 100%: 98.89 | PASS | - |
| PT-202 | A1-AV1.2 | AI_0_10V | 0%: 0.001 / 25%: 0.03162 / 50%: 1.002 / 75%: 31.61 / 100%: 996.5 | PASS | - |
| VP-201-RUN | A1-DI1.3 | DI | close contact: T / open contact: F | PASS | - |
| VV-201-CMD | A1-DO1.2 | DO | command FALSE: F / command TRUE: T / command FALSE: F | PASS | - |
| VV-201-ZSO | A1-DI1.4 | DI | close contact: T / open contact: F | PASS | - |
| VV-201-ZSC | A1-DI1.5 | DI | close contact: T / open contact: F | PASS | - |
| PT-301 | A1-AI2.1 | AI_4_20mA | 0%: 3.899 / 25%: 3.9 / 50%: 3.901 / 75%: 3.902 / 100%: 3.898 | FAIL | swapped with A1-AI2.3 (PT-302) |
| FT-301 | A1-AI2.2 | AI_4_20mA | 0%: 0.003372 / 25%: 12.49 / 50%: 25.01 / 75%: 37.51 / 100%: 50.01 | PASS | - |
| PT-302 | A1-AI2.3 | AI_4_20mA | 0%: 4.995 / 25%: 5.002 / 50%: 4.995 / 75%: 5 / 100%: 4.998 | FAIL | swapped with A1-AI2.1 (PT-301) |
| XV-301-CMD | A1-DO1.3 | DO | command FALSE: F / command TRUE: T / command FALSE: F | PASS | - |
| XV-301-ZSO | A1-DI1.6 | DI | close contact: T / open contact: F | PASS | - |
| MT-401 | A1-AI2.4 | AI_4_20mA | 0%: -0.1633 / 25%: 25.25 / 50%: 49.23 / 75%: 74.9 / 100%: 99.4 | FAIL | noisy signal (unstable reading) |
| TT-401 | A1-RT1.4 | AI_RTD | 0%: -0.01396 / 25%: 12.49 / 50%: 25 / 75%: 37.5 / 100%: 49.99 | PASS | - |
| AT-402 | A1-AV1.3 | AI_0_10V | 0%: -0.002713 / 25%: 6.242 / 50%: 12.5 / 75%: 18.76 / 100%: 25 | PASS | - |
| PD-501-EN | A1-DO1.4 | DO | command FALSE: F / command TRUE: T / command FALSE: F | PASS | - |
| PD-501-FLT | A1-DI1.7 | DI | close contact: T / open contact: F | PASS | - |
| PD-501-RDY | A1-DI1.8 | DI | close contact: T / open contact: F | PASS | - |
| JT-501 | A1-AV1.4 | AI_0_10V | 0%: 0.05945 / 25%: 125.2 / 50%: 249.8 / 75%: 374.8 / 100%: 500 | PASS | - |
| TT-501 | A1-RT2.1 | AI_RTD | 0%: 0.04905 / 25%: 25 / 50%: 49.99 / 75%: 75.02 / 100%: 100 | PASS | - |
| SH-501-CMD | A1-DO1.5 | DO | command FALSE: F / command TRUE: T / command FALSE: F | PASS | - |
| SH-501-ZSO | A1-DI2.1 | DI | close contact: T / open contact: T | FAIL | swapped with A1-DI2.2 (SH-501-ZSC) |
| SH-501-ZSC | A1-DI2.2 | DI | close contact: F / open contact: F | FAIL | swapped with A1-DI2.1 (SH-501-ZSO) |
| XL-501 | A1-DO1.6 | DO | command FALSE: T / command TRUE: F / command FALSE: T | FAIL | output polarity reversed |
| ZS-601A | A1-DI2.3 | DI | close contact: T / open contact: F | PASS | - |
| ZS-601B | A1-DI3.1 | DI | close contact: F / open contact: T | FAIL | inverted contact (NO wired as NC or vice versa) |
| HS-602A | A1-DI2.4 | DI | close contact: T / open contact: F | PASS | - |
| HS-602B | A1-DI3.2 | DI | close contact: T / open contact: F | PASS | - |
| HS-604 | A1-DI2.5 | DI | close contact: T / open contact: F | PASS | - |
Injected faults (simulation only, hidden from the checker): swap PT-301<->PT-302; swap SH-501-ZSO<->SH-501-ZSC; open TT-102; scaling FT-102; inverted ZS-601B; stuck LT-101; polarity XL-501; noise MT-401
Issue log (10 open)
ISSUE-001: FT-102 (A1-AI1.2) - scaling mismatch between field device and controller channel
- Labels: commissioning, configuration, cooling
- Evidence: raw signal correct at every step, but 0 % reads -9.983 and 100 % reads 49.99 L/min (I/O list: 0 .. 40)
- Location: cable W-FT-102 via JB-1 X1:3 X1:4, trunk W-JB-1-A1 cores 3/4, cabinet A1-X2:3 A1-X2:4
- Suggested action: Compare transmitter range / sensor type with the controller channel configuration and correct one of them (update the I/O list if the device changed).
- Status: open
ISSUE-002: LT-101 (A1-AI1.4) - stuck / frozen value
- Labels: commissioning, wiring, cooling
- Evidence: raw frozen at 15.2 mA for all steps
- Location: cable W-LT-101 via JB-1 X1:7 X1:8, trunk W-JB-1-A1 cores 7/8, cabinet A1-X2:7 A1-X2:8
- Suggested action: Check whether the channel or device is frozen (forced value, failed card, shorted contact).
- Status: open
ISSUE-003: TT-102 (A1-RT1.2) - open circuit
- Labels: commissioning, wiring, cooling
- Evidence: raw 1e+04 ohm, status OVERRANGE at every step
- Location: cable W-TT-102 via JB-1 X1:12 X1:13 X1:14, trunk W-JB-1-A1 cores 12/13/14, cabinet A1-X2:12 A1-X2:13 A1-X2:14
- Suggested action: Check continuity of field cable and trunk cores, terminal screws and fuses.
- Status: open
ISSUE-004: PT-301 (A1-AI2.1) - swapped with A1-AI2.3 (PT-302)
- Labels: commissioning, wiring, gas
- Evidence: injection at PT-301 field terminals moved channel A1-AI2.3 (PT-302); A1-AI2.1 stayed near 14.4 mA
- Location: cable W-PT-301 via JB-3 X1:1 X1:2, trunk W-JB-3-A1 cores 1/2, cabinet A1-X2:38 A1-X2:39
- Suggested action: Check core termination at the junction box and cabinet terminals for both loops; correct the crossed cores, then repeat the loop check for both points.
- Status: open
ISSUE-005: PT-302 (A1-AI2.3) - swapped with A1-AI2.1 (PT-301)
- Labels: commissioning, wiring, gas
- Evidence: injection at PT-302 field terminals moved channel A1-AI2.1 (PT-301); A1-AI2.3 stayed near 11.99 mA
- Location: cable W-PT-302 via JB-3 X1:5 X1:6, trunk W-JB-3-A1 cores 5/6, cabinet A1-X2:42 A1-X2:43
- Suggested action: Check core termination at the junction box and cabinet terminals for both loops; correct the crossed cores, then repeat the loop check for both points.
- Status: open
ISSUE-006: MT-401 (A1-AI2.4) - noisy signal (unstable reading)
- Labels: commissioning, wiring, environment
- Evidence: reading spread up to 3.53 % of span within one step
- Location: cable W-MT-401 via JB-3 X1:11 X1:12, trunk W-JB-3-A1 cores 11/12, cabinet A1-X2:48 A1-X2:49
- Suggested action: Check shield termination (one end), cable routing near power cables and grounding.
- Status: open
ISSUE-007: SH-501-ZSO (A1-DI2.1) - swapped with A1-DI2.2 (SH-501-ZSC)
- Labels: commissioning, wiring, laser
- Evidence: toggling SH-501-ZSO switched SH-501-ZSC (A1-DI2.2) instead
- Location: cable W-SH-501-ZSO via JB-4 X1:15 X1:16, trunk W-JB-4-A1 cores 15/16, cabinet A1-X2:70 A1-X2:71
- Suggested action: Check core termination at the junction box and cabinet terminals for both loops; correct the crossed cores, then repeat the loop check for both points.
- Status: open
ISSUE-008: SH-501-ZSC (A1-DI2.2) - swapped with A1-DI2.1 (SH-501-ZSO)
- Labels: commissioning, wiring, laser
- Evidence: toggling SH-501-ZSC switched SH-501-ZSO (A1-DI2.1) instead
- Location: cable W-SH-501-ZSC via JB-4 X1:17 X1:18, trunk W-JB-4-A1 cores 17/18, cabinet A1-X2:72 A1-X2:73
- Suggested action: Check core termination at the junction box and cabinet terminals for both loops; correct the crossed cores, then repeat the loop check for both points.
- Status: open
ISSUE-009: XL-501 (A1-DO1.6) - output polarity reversed
- Labels: commissioning, wiring, laser
- Evidence: state follows the stimulus inverted
- Location: cable W-XL-501 via JB-4 X1:19 X1:20, trunk W-JB-4-A1 cores 19/20, cabinet A1-X2:74 A1-X2:75
- Suggested action: Check output wiring and the configured output logic (normally energised vs normally de-energised).
- Status: open
ISSUE-010: ZS-601B (A1-DI3.1) - inverted contact (NO wired as NC or vice versa)
- Labels: commissioning, wiring, safety
- Evidence: state follows the stimulus inverted
- Location: cable W-ZS-601B via JB-4 X1:23 X1:24, trunk W-JB-4-A1 cores 23/24, cabinet A1-X2:78 A1-X2:79
- Suggested action: Check whether the device contact is NO or NC against the I/O list and rewire or change the configured logic.
- Status: open
Fault-injection campaign
200 seeded scenarios with 0-3 random wiring faults each (288 faults). Kit = 5-step loop check with cross-talk check; naive = one mid-scale reading or one digital state per point. False alarms on healthy points: kit 0/7277, naive 0/7277. Wall time per scenario over local OPC UA: kit 0.74 s, naive 0.09 s.
| Fault class | Faults | Kit detected | Kit classified | Naive detected |
|---|---|---|---|---|
| Inverted DI contact (NO/NC) | 48 | 100.0 % | 100.0 % | 100.0 % |
| Noise | 37 | 100.0 % | 100.0 % | 62.2 % |
| Open circuit | 33 | 100.0 % | 100.0 % | 100.0 % |
| DO polarity reversal | 39 | 100.0 % | 100.0 % | 100.0 % |
| Scaling mismatch | 53 | 100.0 % | 100.0 % | 62.3 % |
| Stuck / frozen value | 43 | 100.0 % | 100.0 % | 55.8 % |
| Swapped channels (crossed cores) | 35 | 100.0 % | 100.0 % | 77.1 % |
| Scaling: wrong RTD curve (alpha 0.003926) | 18 | 100.0 % | 100.0 % | 100.0 % |
| Scaling: span 25 % too large | 15 | 100.0 % | 100.0 % | 100.0 % |
| Scaling: range widened both ends (mid-scale unchanged) | 20 | 100.0 % | 100.0 % | 0.0 % |
| All faults | 288 | 100.0 % | 100.0 % | 78.8 % |
Cause-and-effect test: 15 causes x 6 effects (90 matrix cells), 327 checks, 327 passed, 0 failed.
Page generated by scripts/build_site.py from the JSON outputs of the
runs. Numbers are not edited by hand.