IEC 60870-5-101 Master (cs101_master.c), supporting both :balanced and :unbalanced link layer modes.
Features:
- Multi-slave polling and addressing in
:unbalancedmode (add_slave/2,use_slave_address/2,poll_single_slave/2,request_class_1_data/2,request_class_2_data/2) - Automatic Class 1 polling when
ACD(Access Demand) bit is set by a slave - Full-duplex peer-to-peer transmission in
:balancedmode (DIR = trueby default) - Convenience command functions (
send_interrogation_command/4,send_clock_sync_command/3,send_process_command/4,send_asdu/2, etc.)
Summary
Functions
Returns a specification to start this module under a supervisor.
Sets the DIR bit in balanced link layer mode.
Sets idle timeout in milliseconds.
Sets own link layer address in balanced mode.
Starts a CS101.Master GenServer.
Types
Functions
@spec add_slave(GenServer.server(), non_neg_integer()) :: :ok
Returns a specification to start this module under a supervisor.
See Supervisor.
@spec get_app_layer_parameters(GenServer.server()) :: IEC60870.AppLayerParameters.t()
@spec get_link_layer_parameters(GenServer.server()) :: IEC60870.LinkLayerParameters.t()
@spec is_channel_ready?(GenServer.server(), non_neg_integer()) :: boolean()
@spec poll_single_slave(GenServer.server(), non_neg_integer()) :: :ok
@spec request_class_1_data(GenServer.server(), non_neg_integer()) :: :ok
@spec request_class_2_data(GenServer.server(), non_neg_integer()) :: :ok
@spec send_asdu(GenServer.server(), IEC60870.ASDU.t(), non_neg_integer() | nil) :: :ok | {:error, term()}
@spec send_link_layer_test_function(GenServer.server()) :: :ok
@spec set_dir(GenServer.server(), boolean()) :: :ok
Sets the DIR bit in balanced link layer mode.
@spec set_idle_timeout(GenServer.server(), pos_integer()) :: :ok
Sets idle timeout in milliseconds.
@spec set_own_address(GenServer.server(), non_neg_integer()) :: :ok
Sets own link layer address in balanced mode.
@spec start(GenServer.server()) :: :ok
Starts a CS101.Master GenServer.
Options:
:transport(required) -{transport_mod, handle}(e.g.VirtualBus.attach(bus)):mode-:unbalancedor:balanced(default:unbalanced):ll_params-%IEC60870.LinkLayerParameters{}:al_params-%IEC60870.AppLayerParameters{}:own_address- own link layer address for balanced mode (default0):slave_address- default target slave link address (default1):slaves- list of slave link addresses to register initially in unbalanced mode:dir-DIRbit in balanced mode (defaulttrue):queue_size- max ASDU queue size in balanced mode (default100):owner- PID to receive{:iec60870_cs101_master, master_pid, event}messages:asdu_handler-fn master_pid, slave_addr, asdu -> any() end:link_state_handler-fn master_pid, slave_addr, new_state -> any() end:raw_message_handler-fn master_pid, bytes, sent? -> any() end
@spec stop(GenServer.server()) :: :ok
@spec use_slave_address(GenServer.server(), non_neg_integer()) :: :ok