A transfer set is the engine of an ICCP link. Data values are what you exchange; data sets group them; but the transfer set decides everything about the actual flow — when reports are sent, what they contain, how bursts are handled, and whether the client must acknowledge. Once transfer sets are enabled, the link runs itself: the server monitors conditions and pushes reports without a single poll.
All of it is configured in one shot. The Start Transfer operation is a single write carrying the complete parameter block, which means one packet in a capture — or one screen in a vendor tool — defines the entire reporting behavior of a feed. This article explains every parameter in that block, how they interact, and which combinations production links actually use. Verified against IEC 60870-6-503.
Table of Contents
The lifecycle: pool, allocate, enable, disable
Transfer sets live in a pool on the server, and understanding the allocation rules prevents a class of subtle bugs.
The client obtains a transfer set with the Get Next DSTransfer Set Value operation, which returns the name of the next available Data Set Transfer Set from the server’s pool and allocates it to that client. The allocation holds until one of three things happens: the client disables the set with Stop Transfer, the association ends (conclude or abort), or a Start Transfer on it fails.
The client then issues Start Transfer, assigning values to every component of the transfer set in one operation: which data set to report, and the full transmission parameter block described below. Status goes to ENABLED and the server’s condition monitoring begins — at the Start Time if one is set in the future, immediately otherwise.
Stop Transfer sets the status to DISABLED. Two consequences follow that engineers regularly forget. The transfer set’s name goes back into the server’s pool, and all data identified by that name becomes invalid. And for a dynamically allocated set, the standard is explicit: the client shall not issue a Start Transfer after issuing a Stop Transfer on it. Stop is final for that allocation — to resume reporting, go back to Get Next DSTransfer Set Value and start fresh. Client implementations that cache transfer set names across a stop/start cycle are fighting the standard.
One more rule, easy to miss and important: retrieving initial values is the client’s responsibility. Enabling an exception-based transfer set gets you changes from that moment on, nothing before. A correct client startup reads the data set once (or configures an integrity cycle and waits for it) before trusting its database.
The parameter block: DSTransmissionPars
Ten parameters define the transmission behavior. Grouped by what they control:
Timing
Start Time — when condition monitoring begins. Zero means “now.” A future value delays the start; a past value starts monitoring immediately.
Interval — the reporting period, counted from Start Time. Its meaning shifts with RBE: with RBE false, every interval expiry reports the current state of the entire data set; with RBE true, it reports only the objects that changed during the interval.
Integrity Check — the period for full-refresh reports when the IntegrityTimeOut condition is enabled. This is the safety net under exception reporting: however quiet the points are, the client gets the whole data set on this cycle and any accumulated drift is corrected.
Buffer Time — the burst absorber. The timer starts at the first ObjectChange and, when it expires, one report carries what happened during the window. Zero means a report per change — fine for a handful of slow points, punishing for a large set during a system event. A substation trip that flips forty statuses in half a second becomes one report instead of forty.
TLE (Time Limit for Execution) — the freshness guarantee, and the parameter most often misunderstood. It bounds the server: if the server anticipates it cannot deliver a report within TLE, it shall not generate the report and shall discard the data. Old data is treated as worse than no data. Set TLE tight on a congested link and you’ll see reports silently vanish — which is the feature working exactly as specified. (The standard notes that clients may separately track how long a transfer set is considered valid — sometimes called TAL, Time Allowed to Live — but defines no requirements for it; it’s purely an implementation choice.)
Behavior flags
RBE (Report By Exception) — true means only changed objects are reported. On the wire this normally arrives as a list of just the changed values, but the standard defines a fallback: if that list would exceed the negotiated maximum MMS PDU size, the server may transfer the entire set as a named variable list instead. So an “exception” report can legitimately arrive as a full-set report during a large disturbance — clients must handle both encodings, and analysts shouldn’t read a full report as a bug.
All Changes Reported — an optional flag refining RBE with a non-zero buffer time. False (the classic behavior): if a point changes three times inside the buffer window, only the final value is reported. True: all three values arrive in the report. False suits state-oriented SCADA displays; true matters when the receiving side sequences events.
Critical — true means the client must confirm receipt of each transfer report back to the server. Reserve it for the data that justifies the extra round-trip; a link where everything is critical has doubled its message count for nothing.
Block Data — true selects the compact octet-string report encoding of conformance block 3 instead of fully typed MMS data. Bandwidth saved, wire-level typing lost — and as covered in the conformance blocks article, block 3 support can’t be discovered from Supported_Features, so never enable this without written confirmation from both vendors.
One structural sizing rule
At Start Transfer time, when RBE is false, the server checks whether the entire data set fits within the maximum MMS PDU size negotiated for the association. If it doesn’t fit, the Start fails with an error and the transfer set name returns to the pool. This is why “the transfer set won’t start” on a large periodic feed is usually a sizing problem: either trim the data set, split it across transfer sets, or switch the design to RBE where the fallback mechanism handles size.
The five conditions: DSConditions Requested
The conditions are flags telling the server what to watch for. Any enabled condition occurring triggers a Transfer Report.
IntervalTimeOut — report when the Interval expires. The backbone of periodic reporting.
IntegrityTimeOut — report the entire data set when the Integrity Check period expires. The standard scopes it precisely: it applies only when RBE is true. With RBE false, periodic full reports are already what IntervalTimeOut produces, so integrity would be redundant.
ObjectChange — report when any object in the data set changes. The definition is broader than most people assume: a change of value, status, or quality flag counts. A point whose value never moves but whose quality toggles between valid and held will generate reports — correct behavior, and a common source of “why is this quiet point so chatty” questions.
OperatorRequest — report when an operator at the server center requests it. The mechanism that lets the data owner push a refresh to the remote end on demand.
OtherExternalEvent — report when an agreed external event occurs, identified by the Event Code Requested attribute. The escape hatch for bilateral agreements with triggering needs the standard didn’t foresee.
Four configurations that cover real links
The parameters combine into a small number of patterns that account for nearly every production transfer set.
The clock feed. RBE false, IntervalTimeOut only, Interval at the agreed period, Buffer Time and Integrity Check unused. Full data set on every cycle. Predictable bandwidth, dead simple, and subject to the PDU-size check at start. The classic tie-line feed at 4 or 10 seconds.
The exception feed. RBE true, ObjectChange + IntegrityTimeOut, Buffer Time a second or two, Integrity Check in the minutes range. Changes flow as they happen, bursts coalesce, the integrity cycle heals any drift. The workhorse configuration for large point counts — this is conformance block 2 earning its place.
The hybrid. RBE true with IntervalTimeOut and ObjectChange: changed values also swept up on a fixed cadence. Useful when the client application ingests on a cycle but you still want burst responsiveness between cycles.
The critical channel. A small data set of high-consequence points on its own transfer set with Critical true — often alongside an exception feed carrying the bulk. The acknowledgment overhead stays proportional to what actually needs guaranteed delivery, and per the QOS model in the protocol stack article, this set can ride a higher-priority association.
Reports that describe themselves
A transfer report is an MMS InformationReport carrying data set values — but which transfer set sent it, and why? The standard’s answer is the special transfer objects: Transfer Set Name, Transfer Set Time Stamp, DSConditions, Event Code, and Next Transfer Set. They’re placeholder objects you include inside the data set itself, and the server fills them in each report.
Include the first three in every data set you build. Each report then carries its own provenance — the triggering transfer set, the server-side timestamp, and the condition that fired (interval, object change, integrity, operator request). Multi-transfer-set clients need this to route reports at all, and anyone reading a Wireshark capture will thank the engineer who configured it.
Mistakes that keep recurring
Empty database after startup. The client enabled an RBE transfer set and waited. Nothing was wrong — nothing had changed yet, and initial values are the client’s job to fetch.
Stop, then Start, then confusion. A stopped dynamically-allocated transfer set is gone; its name may already belong to another allocation. Re-allocate with Get Next DSTransfer Set Value.
Reports “lost” on a slow WAN. TLE doing its job: the server discarded reports it couldn’t deliver in time. Widen TLE or fix the path — the protocol chose freshness over completeness because you told it to.
A quiet point that reports constantly. ObjectChange includes quality changes. Look at the quality flags, not the value.
Full-size reports on an RBE feed during disturbances. The PDU-size fallback, not a misconfiguration.
Block Data enabled unilaterally. The Start succeeds or fails depending on undiscoverable peer support. Confirm in writing first.
FAQ
How many transfer sets does a typical link use?
Commonly a handful per direction: one exception feed for the bulk of points, sometimes a short periodic set for critical analogs, occasionally a dedicated critical-flagged set. The protocol supports many concurrent enabled transfer sets per association; the practical limit is server capacity and agreement terms.
What’s the difference between Interval and Integrity Check?
Interval drives the routine reporting cycle and its content depends on RBE. Integrity Check exists only for RBE feeds: a slower cycle on which the entire data set is reported regardless of changes, so the client’s picture can’t drift.
Who decides the transfer set parameters?
Formally, the bilateral agreement — rates and conditions are part of what the two centers sign, and the server validates requested parameters against the agreed limits in the bilateral table. Practically, the client sends the parameters in Start Transfer and the server accepts or rejects.
Can the server change parameters on a running transfer set?
No. Parameters are set by the client at Start Transfer. Changing behavior means stopping (and thus releasing) the set and starting a new allocation with new parameters.
Is a transfer report guaranteed to arrive?
Only if Critical is true, which obliges the client to confirm receipt — giving the server grounds to detect loss. Ordinary reports are unconfirmed InformationReports; the integrity cycle is what bounds the damage of a lost one.
Do transfer sets survive an association drop?
No. Allocation is tied to the association — an abort or conclude releases the client’s transfer sets. Reconnection means re-allocating, re-starting, and re-reading initial values. Client implementations should treat this whole sequence as one atomic “restore the link” routine.
