Live streams
Collector: Rockwell Logix
Read ControlLogix, CompactLogix and Micro800 PLCs directly over EtherNet/IP, with no OPC server.
Rockwell Logix (EtherNet/IP)
The logix source reads Rockwell Automation ControlLogix, CompactLogix and Micro800 controllers directly over EtherNet/IP (CIP), the way Studio 5000 and HMIs do. Use it where a customer runs on Allen-Bradley PLCs and nobody bought the controller's OPC UA server or a gateway. It is read only: the collector never writes to the PLC. Tags are read by name, in groups per poll interval, with several tags per request.
Configuration
sources:
- name: Line 3 PLC
type: logix
host: 10.20.0.30
slot: 0 # processor slot in the chassis (CompactLogix: 0)
poll_ms: 500
tags: logix-tags.csv
- name: Packaging Micro820
type: logix
host: 10.20.0.31
micro800: true
tags: micro.csv
- name: Everything numeric
type: logix
host: 10.20.0.32
discover: true # collect every numeric tag the controller lists| Name | Type | Description |
|---|---|---|
hostrequired | string | Address of the controller (or of its Ethernet module). |
port | numberDefault: 44818 | EtherNet/IP TCP port. |
slot | numberDefault: 0 | Processor slot in the chassis. CompactLogix and Micro800 are slot 0; a ControlLogix reached through an Ethernet module needs the slot of its CPU. |
micro800 | true | falseDefault: false | Set for Micro800 controllers (Micro820/830/850/870). They do not support grouped reads, so each tag is a request. |
tags | path | The tag list CSV, relative to collector.yaml. Required unless discover is true. |
discover | true | falseDefault: false | Collect every numeric tag the controller lists instead of a tag list. |
poll_ms | numberDefault: 1000 | Default poll interval; a row can set its own. |
timeout_s | numberDefault: 5.0 | Socket timeout. A call that takes three times this is abandoned and the connection is rebuilt. |
max_tags_per_read | numberDefault: 100 | Tags asked for in one call. The driver already splits them to fit the connection size; lower this on a slow link. |
The tag list
name,plc_tag,unit,scale,offset,poll_ms,description
Line speed,Line_Speed,m/min,,,100,
Tank temp,Program:Main.TankTemp,degC,0.1,,,Raw is tenths
Pump 1 speed,Pump1.Speed,rpm,,,,UDT member
Pump 1 running,Pump1.Running,,,,,BOOL
Alarm bit 5,AlarmWord.5,,,,,Bit of a DINT
Zone temps,Zones[0..7],degC,,,1000,Eight elements: Zone temps[0] .. Zone temps[7]| Name | Type | Description |
|---|---|---|
name | string | The channel name in Kymoscope. Defaults to plc_tag. Unique within the source. |
plc_tagrequired | string | The symbol exactly as in the controller: Tag, Program:Main.Tag, Tag[3], Udt.Member, Word.5 (bit of an integer). Case is ignored by the PLC. |
unit, description | string | Shown on the channel. |
scale, offset | numberDefault: 1, 0 | value = raw x scale + offset (not applied to BOOL). |
poll_ms | number | This tag’s interval; tags with the same interval are read together. |
An array range such as Zones[0..7] expands to one channel per element, named after the name plus the index. Supported types: BOOL, SINT, INT, DINT, LINT, REAL, LREAL and the unsigned variants. Strings and whole structures are not collected: name the numeric members instead (Pump1.Speed, not Pump1).
discover
kymoscope-collector discover --source "Line 3 PLC" lists the controller and program tags that are numeric (including arrays up to 256 elements, one channel per element) and skips strings, structures and system tags. Members of structures are not listed: add them to the tag list by hand. With discover: true the source collects that list directly. Listing a large controller can take a few seconds and is done once at start.
Gaps and health
- Every sample is stamped with the time the response arrived; the PLC does not timestamp tags.
- A tag the controller refuses (does not exist, no access, wrong name) is stored as a gap and the first failure is written to the log, once. The other tags in the request are not affected.
- If the connection is lost the tags of that poll are stored as gaps and the collector reconnects on its own with a delay that grows to one minute. A controller that stops answering mid-call is abandoned after three times
timeout_swithout blocking the other sources.
connected, reconnects, threads_abandoned, polls, poll_errors, overruns, last_poll_s, values_per_sTroubleshooting
| Symptom | Likely cause |
|---|---|
connected stays 0 | Wrong host, port 44818 blocked by a firewall, or the controller has no free connections (other HMIs and tools use them). Check the slot. |
| A tag is always a gap, log says "Path destination unknown" | The name does not exist in that scope. Program tags need the full Program:Name.Tag; check spelling. |
| Log says "strings and structures are not collected" | The tag is a STRING or a UDT. Point plc_tag at a numeric member. |
| Micro800 reads are slow | Each tag is its own request on Micro800; raise poll_ms or read fewer tags. |
Permissions to ask the site for
- TCP port 44818 from the collector host to the controller. Reads use one CIP connection per source.
- An engineer to confirm the slot and the tag names, and that one more connection is acceptable on the controller. No change to the PLC program is needed and nothing is written.
- EtherNet/IP has no encryption on most installed controllers. Keep the collector in the control network DMZ; the data leaves your site encrypted. Install with
pip install "kymoscope-collector[logix]".