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

collector.yaml
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
NameTypeDescription
hostrequiredstringAddress of the controller (or of its Ethernet module).
portnumber
Default: 44818
EtherNet/IP TCP port.
slotnumber
Default: 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.
micro800true | false
Default: false
Set for Micro800 controllers (Micro820/830/850/870). They do not support grouped reads, so each tag is a request.
tagspathThe tag list CSV, relative to collector.yaml. Required unless discover is true.
discovertrue | false
Default: false
Collect every numeric tag the controller lists instead of a tag list.
poll_msnumber
Default: 1000
Default poll interval; a row can set its own.
timeout_snumber
Default: 5.0
Socket timeout. A call that takes three times this is abandoned and the connection is rebuilt.
max_tags_per_readnumber
Default: 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

logix-tags.csv
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]
NameTypeDescription
namestringThe channel name in Kymoscope. Defaults to plc_tag. Unique within the source.
plc_tagrequiredstringThe 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, descriptionstringShown on the channel.
scale, offsetnumber
Default: 1, 0
value = raw x scale + offset (not applied to BOOL).
poll_msnumberThis 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_s without blocking the other sources.
Health stream channels for a Logix source
connected, reconnects, threads_abandoned, polls, poll_errors, overruns, last_poll_s, values_per_s

Troubleshooting

SymptomLikely cause
connected stays 0Wrong 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 slowEach 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]".