From 90c9484e8db3ade2d6b8664ce08ec4378bf6f4f1 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 16 Mar 2015 15:44:17 +0100 Subject: [PATCH] - changed reporting example to use two different RCBs - .net API: remove native callback in ReportControlBlock destructor --- .../IEC61850forCSharp/ReportControlBlock.cs | 13 ++++++ dotnet/reporting/ReportingExample.cs | 42 ++++++++++++------- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/dotnet/IEC61850forCSharp/ReportControlBlock.cs b/dotnet/IEC61850forCSharp/ReportControlBlock.cs index e23e56c4..55fae3cd 100644 --- a/dotnet/IEC61850forCSharp/ReportControlBlock.cs +++ b/dotnet/IEC61850forCSharp/ReportControlBlock.cs @@ -150,6 +150,9 @@ namespace IEC61850 [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] static extern void IedConnection_installReportHandler (IntPtr connection, string rcbReference, string rptId, InternalReportHandler handler, IntPtr handlerParameter); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedConnection_uninstallReportHandler(IntPtr connection, string rcbReference); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void InternalReportHandler (IntPtr parameter, IntPtr report); @@ -220,6 +223,16 @@ namespace IEC61850 this.connection = connection; this.objectReference = objectReference; } + + ~ReportControlBlock() + { + IedConnection_uninstallReportHandler(connection, objectReference); + } + + public string GetObjectReference () + { + return this.objectReference; + } /// /// Installs the report handler. diff --git a/dotnet/reporting/ReportingExample.cs b/dotnet/reporting/ReportingExample.cs index 8f0c2000..0dde51db 100644 --- a/dotnet/reporting/ReportingExample.cs +++ b/dotnet/reporting/ReportingExample.cs @@ -14,6 +14,8 @@ namespace reporting { Console.WriteLine ("Received report:\n----------------"); + Console.WriteLine (" for RCB: " + report.GetRcbReference()); + if (report.HasTimestamp ()) Console.WriteLine (" timestamp: " + MmsValue.MsTimeToDateTimeOffset (report.GetTimestamp ()).ToString ()); @@ -29,7 +31,7 @@ namespace reporting ReportControlBlock rcb = (ReportControlBlock) parameter; - Console.WriteLine("Buffered: " + rcb.IsBuffered()); + Console.WriteLine(" For RCB: " + rcb.GetObjectReference() + " Buffered: " + rcb.IsBuffered()); } @@ -45,33 +47,45 @@ namespace reporting if (args.Length > 0) hostname = args [0]; else - //hostname = "localhost"; - hostname = "172.23.44.10"; + hostname = "localhost"; + + hostname = "10.0.2.2"; Console.WriteLine ("Connect to " + hostname); try { con.Connect (hostname, 102); - string rcbReference = "simpleIOGenericIO/LLN0.RP.EventsRCB01"; + string rcbReference1 = "simpleIOGenericIO/LLN0.RP.EventsRCB01"; + string rcbReference2 = "simpleIOGenericIO/LLN0.RP.EventsIndexed01"; - ReportControlBlock rcb = con.GetReportControlBlock(rcbReference); + ReportControlBlock rcb1 = con.GetReportControlBlock(rcbReference1); + ReportControlBlock rcb2 = con.GetReportControlBlock(rcbReference2); - rcb.GetRCBValues(); + rcb1.GetRCBValues(); // note: the second parameter is not required! - rcb.InstallReportHandler(reportHandler, rcb); + rcb1.InstallReportHandler(reportHandler, rcb1); + + if (rcb1.IsBuffered()) + Console.WriteLine ("RCB: " + rcbReference1 + " is buffered"); + + rcb1.SetTrgOps(TriggerOptions.DATA_CHANGED | TriggerOptions.INTEGRITY); + rcb1.SetIntgPd(5000); + rcb1.SetRptEna(true); + + rcb1.SetRCBValues(); + + rcb2.GetRCBValues(); - if (rcb.IsBuffered()) - Console.WriteLine ("RCB: " + rcbReference + " is buffered"); + rcb2.InstallReportHandler(reportHandler, rcb2); - Console.WriteLine(rcb.GetDataSetReference()); + rcb2.SetTrgOps(TriggerOptions.DATA_CHANGED | TriggerOptions.INTEGRITY); + rcb2.SetIntgPd(2000); + rcb2.SetRptEna(true); - rcb.SetTrgOps(TriggerOptions.DATA_CHANGED | TriggerOptions.INTEGRITY); - rcb.SetIntgPd(5000); - rcb.SetRptEna(true); + rcb2.SetRCBValues(); - rcb.SetRCBValues(); /* run until Ctrl-C is pressed */ Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs e) {