GE SRTP Driver
Overview
GE SRTP (Service Request Transport Protocol) — the Ethernet communication protocol for GE Fanuc Series 90 / RX3i / RX7i / VersaMax PLCs. PlantPulse Edge implements it with the NativeProcessDriver pattern: an external native client (GEClient) is spawned as a child process, and its standard output lines are parsed to accumulate values.
| Item | Value |
|---|---|
opc_type | GE |
| Implementation class | plantpulse.driver.protocol.ge.GEDriver |
| Communication library | External native binary (./GEClient, based on uGESRTP) |
| Inheritance | NativeProcessDriver |
| read | ✅ (cache polling) |
| write | ❌ |
| Security | None |
| Default port | 18245 (SRTP TCP) — specified via opc_agent_port |
Class Structure / Behavior
GEDriver
└── ProcessTask (Thread) — ProcessBuilder 로 ./GEClient ip port addresses timecycle
└── Binder (Thread) — 자식의 stdout 한 라인씩 파싱
↳ "VAL:<dev>:<idx>:<type>:<format>:<value>" → current_value_map
↳ "START:" / "READ_FAIL:" / "ERROR:" / "LOG:" → 로그
connect()— ICMP ping toNetUtils.isReachable(ip)→ terminates immediately on failure. If theuse-multi=trueoption is set andchannel-threadis greater than 1, the address list is partitioned and multiple child processes are started concurrently.- Child working directory:
/opt/kopens/plantpulse-edge/plc/ge. Executable:./GEClient. read()— returns the last value fromcurrent_value_map.get(addr + ":" + format)(the child updates it every timecycle).close()—process.destroyForcibly()of all ProcessTasks.
OPC Registration Options
| Field | Meaning | Default |
|---|---|---|
opc_agent_ip / opc_agent_port | PLC IP / SRTP port (normally 18245) | — |
timecycle | Polling period (ms) — passed to the child process as an argument | — |
options.use-multi | Multi-process mode | true |
options.channel-thread | Number of partitions (1 = single process) | 1 |
Internal constant: GE_DEFAULT_CONNECTION_DELAY_MS = 1500 — wait after the first connect. If no tag is read for 10 seconds, START-ADDRESS-SCAN-SLOW logs a warning.
Tag plc_address Format
Format passed to the child process (commaIOAddress): <dev>:<idx>:<data_type>:<format> joined by commas.
| Notation | Meaning (GE Fanuc standard) |
|---|---|
R00001 | Register %R 1 (16-bit signed) |
R00500 | Register %R 500 |
I00001 | Input bit %I 1 |
Q00001 | Output bit %Q 1 |
T00001 | Temporary memory %T |
M00001 | Internal coil %M |
AI00001 | Analog input |
AQ00001 | Analog output |
format mapping (afterFormat):
format | Behavior |
|---|---|
BIN[N] | Read the word, then extract bit N (N = 0..F, hex allowed) |
STR | Word → 16-bit binary → ASCII text conversion |
| (otherwise) | The string sent by the child, as-is |
Unsupported Areas
- Write —
write()is always false. Requires SRTP write to be exposed by the native client. - Pure Java SRTP implementation — currently depends on an external binary. Moving in-process with the uGESRTP / iot-communication libraries is a follow-up task in the same direction as the LS driver (legacy .NET → Java).
- Symbolic Tag — only coordinates (area + index) are supported; named tags are not.
- Programming/Service Request mode — simple read queries only.
Test Coverage
test/java/plantpulse/driver/protocol/ge/GEDriverTest — address conversion (commaIOAddress) and verification of the BIN/STR branches in afterFormat. The wire level is delegated to the external binary, so unit tests with a mock child process are handled separately.
References
- GE Fanuc SRTP — public reverse engineering: uGESRTP, Wireshark dissector.
- Code:
plantpulse-edge-driver/src/plantpulse/driver/protocol/ge/GEDriver.java. - Operations: if the child binary is missing, the connect stage logs a
PROCESS-SLOWwarning plus aERROR:log — first check whether/opt/kopens/plantpulse-edge/plc/ge/GEClientis executable (+x).