static void Main(string[] args) { IDNP3Manager mgr = DNP3ManagerFactory.CreateManager(); mgr.AddLogHandler(PrintingLogAdapter.Instance); //this is optional var channel = mgr.AddTCPServer("server", LogLevel.INFO, 5000, "127.0.0.1", 20000); //optionally, add a listener for the channel state channel.AddStateListener(state => Console.WriteLine("Server state: " + state)); var config = new SlaveStackConfig(); var outstation = channel.AddOutstation("outstation", LogLevel.INFO, RejectingCommandHandler.Instance, config); //optionally, add a listener for the stack state outstation.AddStateListener(state => Console.WriteLine("Outstation state: " + state)); Console.WriteLine("Press <Enter> to randomly change a value"); var publisher = outstation.GetDataObserver(); Random r = new Random(); while (true) { Console.ReadLine(); int value = r.Next(UInt16.MaxValue); System.Console.WriteLine("Change Analog 0 to: " + value); publisher.Start(); publisher.Update(new Analog(value, 1, DateTime.Now), 0); publisher.End(); } }
static void Main(string[] args) { IDNP3Manager mgr = DNP3ManagerFactory.CreateManager(); mgr.AddLogHandler(PrintingLogAdapter.Instance); //this is optional var channel = mgr.AddTCPClient("client", LogLevel.INFO, 5000, "127.0.0.1", 20000); //optionally, add a listener for the channel state channel.AddStateListener(state => Console.WriteLine("Client state: " + state)); var config = new MasterStackConfig(); config.link.useConfirms = true; //setup your stack configuration here. var master = channel.AddMaster("master", LogLevel.INFO, PrintingDataObserver.Instance, config); //optionally, add a listener for the stack state master.AddStateListener(state => Console.WriteLine("Master state: " + state)); Console.WriteLine("Enter an index to send a command"); while (true) { System.UInt32 index = System.UInt32.Parse(Console.ReadLine()); var future = master.GetCommandProcessor().SelectAndOperate(new ControlRelayOutputBlock(ControlCode.CC_PULSE, 1, 100, 100), index); CommandStatus result = future.Await(); Console.WriteLine("Result: " + result); } }
static void Main(string[] args) { IDNP3Manager mgr = DNP3ManagerFactory.CreateManager(); mgr.AddLogHandler(PrintingLogAdapter.Instance); //this is optional var channel = mgr.AddTCPServer("server", LogLevels.NORMAL, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5), "0.0.0.0", 20000); // Optional: add a listener for the channel state channel.AddStateListener(state => Console.WriteLine("channel state: " + state)); var config = new OutstationStackConfig(); // configure the various measurements in our database config.databaseTemplate = new DatabaseTemplate(4, 1, 1, 1, 1, 1, 1, 0); config.databaseTemplate.binaries[0].clazz = PointClass.Class2; // .... config.outstation.config.allowUnsolicited = true; // Optional: setup your stack configuration here config.link.localAddr = 10; config.link.remoteAddr = 1; var outstation = channel.AddOutstation("outstation", RejectingCommandHandler.Instance, DefaultOutstationApplication.Instance, config); outstation.Enable(); // enable communications Console.WriteLine("Press <Enter> to change a value"); bool binaryValue = false; double analogValue = 0; while (true) { Console.ReadLine(); binaryValue = !binaryValue; ++analogValue; System.Console.WriteLine("Change Binary 0 to: " + binaryValue); System.Console.WriteLine("Change Analog 9 to: " + analogValue); // create a changeset and load it var changeset = new ChangeSet(); changeset.Update(new Binary(binaryValue, 1, DateTime.Now), 0); changeset.Update(new Analog(analogValue, 1, DateTime.Now), 0); outstation.Load(changeset); } }
static void Main(string[] args) { IDNP3Manager mgr = DNP3ManagerFactory.CreateManager(); mgr.AddLogHandler(PrintingLogAdapter.Instance); //this is optional var channel = mgr.AddTCPServer("server", LogLevels.NORMAL, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5), "0.0.0.0", 20000); // Optional: add a listener for the channel state channel.AddStateListener(state => Console.WriteLine("channel state: " + state)); var config = new OutstationStackConfig(); // configure the various measurements in our database config.databaseTemplate = new DatabaseTemplate(4, 1, 1, 1, 1, 1, 1); config.databaseTemplate.binaries[0].pointClass = PointClass.Class2; // .... // Optional: overide the default reporting variations config.outstation.eventConfig.binary = EventBinaryResponse.Group2Var2; config.outstation.staticConfig.analog = StaticAnalogResponse.Group30Var5; // Optional: setup your stack configuration here config.link.localAddr = 10; config.link.remoteAddr = 1; var outstation = channel.AddOutstation("outstation", RejectingCommandHandler.Instance, DefaultOutstationApplication.Instance, config); outstation.Enable(); // enable communications Console.WriteLine("Press <Enter> to randomly change a value"); var database = outstation.GetDatabase(); bool value = false; while (true) { Console.ReadLine(); value = !value; System.Console.WriteLine("Change Binary 1 to: " + value); database.Start(); database.Update(new Binary(value, 1, DateTime.Now), 0); database.End(); } }
// Static Constructor static DNP3InputAdapter() { s_adapters = new List <DNP3InputAdapter>(); s_manager = DNP3ManagerFactory.CreateManager(Environment.ProcessorCount); s_manager.AddLogHandler(new IaonProxyLogHandler()); }
static int Main(string[] args) { IDNP3Manager mgr = DNP3ManagerFactory.CreateManager(1); mgr.AddLogHandler(PrintingLogAdapter.Instance); //this is optional var channel = mgr.AddTCPClient("client", LogLevels.ALL, ChannelRetry.Default, "127.0.0.1", 20000); //optionally, add a listener for the channel state channel.AddStateListener(state => Console.WriteLine("channel state: " + state)); var config = new MasterStackConfig(); //setup your stack configuration here. config.link.localAddr = 1; config.link.remoteAddr = 10; var key = new byte[16]; for (int i = 0; i < key.Length; ++i) { key[i] = 0xFF; } var master = channel.AddMaster("master", PrintingSOEHandler.Instance, DefaultMasterApplication.Instance, config); // you a can optionally add various kinds of polls var integrityPoll = master.AddClassScan(ClassField.AllClasses, TimeSpan.FromMinutes(1), TaskConfig.Default); var rangePoll = master.AddRangeScan(30, 2, 5, 7, TimeSpan.FromSeconds(20), TaskConfig.Default); var classPoll = master.AddClassScan(ClassField.AllEventClasses, TimeSpan.FromSeconds(5), TaskConfig.Default); /* you can also do very custom scans * var headers = new Header[] { Header.Range8(1, 2, 7, 8), Header.Count8(2, 3, 7) }; * var weirdPoll = master.AddScan(headers, TimeSpan.FromSeconds(20)); */ master.Enable(); // enable communications Console.WriteLine("Enter a command"); while (true) { switch (Console.ReadLine()) { case "a": // perform an ad-hoc scan of all analogs master.ScanAllObjects(30, 0, TaskConfig.Default); break; case "c": var task = master.SelectAndOperate(GetCommandHeaders(), TaskConfig.Default); task.ContinueWith((result) => Console.WriteLine("Result: " + result.Result)); break; case "o": var crob = new ControlRelayOutputBlock(ControlCode.PULSE_ON, 1, 100, 100); var single = master.SelectAndOperate(crob, 1, TaskConfig.Default); single.ContinueWith((result) => Console.WriteLine("Result: " + result.Result)); break; case "l": // add interpretation to the current logging level var filters = channel.GetLogFilters(); channel.SetLogFilters(filters.Add(LogFilters.TRANSPORT_TX | LogFilters.TRANSPORT_RX)); break; case "i": integrityPoll.Demand(); break; case "r": rangePoll.Demand(); break; case "e": classPoll.Demand(); break; case "x": return(0); default: break; } } }
static int Main(string[] args) { IDNP3Manager mgr = DNP3ManagerFactory.CreateManager(); mgr.AddLogHandler(PrintingLogAdapter.Instance); //this is optional var channel = mgr.AddTCPClient("client", LogLevels.NORMAL, TimeSpan.FromSeconds(5), TimeSpan.FromMinutes(2), "127.0.0.1", 20000); //optionally, add a listener for the channel state channel.AddStateListener(state => Console.WriteLine("channel state: " + state)); var config = new MasterStackConfig(); //setup your stack configuration here. config.link.localAddr = 1; config.link.remoteAddr = 10; var master = channel.AddMaster("master", PrintingSOEHandler.Instance, DefaultMasterApplication.Instance, config); // you a can optionally add various kinds of polls var integrityPoll = master.AddClassScan(ClassField.AllClasses, TimeSpan.FromMinutes(1)); var rangePoll = master.AddRangeScan(30, 2, 5, 7, TimeSpan.FromSeconds(20)); var classPoll = master.AddClassScan(ClassField.AllEventClasses, TimeSpan.FromSeconds(5)); // you a can optionally add state callbacks for monitoring these polls integrityPoll.AddScanCallback((PollState state) => Console.WriteLine("integrity poll state change: " + state)); classPoll.AddScanCallback((PollState state) => Console.WriteLine("class poll state change: " + state)); rangePoll.AddScanCallback((PollState state) => Console.WriteLine("range poll state change: " + state)); master.Enable(); // enable communications Console.WriteLine("Enter an index to send a command"); while (true) { switch (Console.ReadLine()) { case "c": var crob = new ControlRelayOutputBlock(ControlCode.PULSE, 1, 100, 100); var future = master.GetCommandProcessor().SelectAndOperate(crob, 0); future.Listen((result) => Console.WriteLine("Result: " + result)); break; case "l": // add interpretation to the current logging level var filters = channel.GetLogFilters(); channel.SetLogFilters(filters.Add(LogFilters.TRANSPORT_TX | LogFilters.TRANSPORT_RX)); break; case "i": integrityPoll.Demand(); break; case "r": rangePoll.Demand(); break; case "e": classPoll.Demand(); break; case "x": return(0); default: break; } } }