AssociationConfig
The AssociationConfig
struct provides the configuration information you need to communicate with a particular outstation on the communication channel, including:
- Timeout for responses on this association
- Startup handshaking
- If and how to perform time synchronization
- Per-association task queue size
Note that the outstation address is provided as a separate argument when adding an association to a channel.
- Rust
- C
- C++
- Java
- C#
fn get_association_config() -> AssociationConfig {
let mut config = AssociationConfig::new(
// disable unsolicited first (Class 1/2/3)
EventClasses::all(),
// after the integrity poll, enable unsolicited (Class 1/2/3)
EventClasses::all(),
// perform startup integrity poll with Class 1/2/3/0
Classes::all(),
// don't automatically scan Class 1/2/3 when the corresponding IIN bit is asserted
EventClasses::none(),
);
config.auto_time_sync = Some(TimeSyncProcedure::Lan);
config.keep_alive_timeout = Some(Duration::from_secs(60));
config
}
dnp3_association_config_t get_association_config()
{
dnp3_association_config_t config = dnp3_association_config_init(
// disable unsolicited first (Class 1/2/3)
dnp3_event_classes_all(),
// after the integrity poll, enable unsolicited (Class 1/2/3)
dnp3_event_classes_all(),
// perform startup integrity poll with Class 1/2/3/0
dnp3_classes_all(),
// don't automatically scan Class 1/2/3 when the corresponding IIN bit is asserted
dnp3_event_classes_none());
config.auto_time_sync = DNP3_AUTO_TIME_SYNC_LAN;
config.keep_alive_timeout = 60;
return config;
}
dnp3::AssociationConfig config(
dnp3::EventClasses::all(),
dnp3::EventClasses::all(),
dnp3::Classes::all(),
dnp3::EventClasses::none()
);
private static AssociationConfig getAssociationConfig() {
return new AssociationConfig(
// disable unsolicited first (Class 1/2/3)
EventClasses.all(),
// after the integrity poll, enable unsolicited (Class 1/2/3)
EventClasses.all(),
// perform startup integrity poll with Class 1/2/3/0
Classes.all(),
// don't automatically scan Class 1/2/3 when the corresponding IIN bit is asserted
EventClasses.none())
.withAutoTimeSync(AutoTimeSync.LAN)
.withKeepAliveTimeout(Duration.ofSeconds(60));
}
private static AssociationConfig GetAssociationConfig()
{
return new AssociationConfig(
// disable unsolicited first (Class 1/2/3)
EventClasses.All(),
// after the integrity poll, enable unsolicited (Class 1/2/3)
EventClasses.All(),
// perform startup integrity poll with Class 1/2/3/0
Classes.All(),
// don't automatically scan Class 1/2/3 when the corresponding IIN bit is asserted
EventClasses.None()
)
.WithAutoTimeSync(AutoTimeSync.Lan)
.WithKeepAliveTimeout(TimeSpan.FromSeconds(60));
}
Initialization
The DNP3 standard requires that the master perform these actions during initialization before normal polling can occur:
If your outstation doesn't support unsolicited reporting, you can turn the DISABLE/ENABLE unsolicited requests off by setting
AssociationConfig.DisableUnsolClasses
and AssociationConfig.EnableUnsolClasses
to EventClasses.None()
. The master will then skip unsolicited configuration during initialization, only performing the integrity poll.
Scheduling
The following algorithm is used to schedule requests within an association:
- User requests such as control operations get top priority.
- The association then considers automatic and initialization tasks in this order:
- Clear the RESTART IIN bit if previously observed in a response.
- Disable unsolicited reporting if configured to do so during initialization.
- Perform an integrity scan if configured to do so during initialization.
- Perform automatic time synchronization if enabled, and the master observes the 'NEED_TIME IIN' bit in a response.
- Enable unsolicited reporting if configured to do so during initialization.
- Finally, the system will then execute periodic polls.
The standard does not specify how requests should be scheduled for multiple associations on a channel. Our implementation uses a per-association task queue. The channel scheduler round-robins through the associations to ensure fair access.
The RESTART
IIN bit is automatically cleared by the master whenever the outstation reports it.