From 5ef1da7ac22725bf94a6ad2b7e109da85ef8da9d Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 20 Jul 2015 17:09:05 +0200 Subject: [PATCH 1/6] - added function ControlObjectClient_useConstantT to enable constant T parameter value during a control sequence --- config/stack_config.h | 4 +- dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs | 2 + .../IEC61850forCSharp/ReportControlBlock.cs | 10 +- dotnet/IEC61850forCSharp/Reporting.cs | 2 +- dotnet/reporting/ReportingExample.cs | 66 +++++---- dotnet/reporting/reporting.csproj | 138 ++++++++++++------ src/iec61850/client/client_control.c | 32 +++- src/iec61850/client/client_report.c | 12 +- src/iec61850/client/ied_connection.c | 4 +- src/iec61850/inc/iec61850_client.h | 11 ++ .../inc_private/ied_connection_private.h | 1 + src/iec61850/server/mms_mapping/mms_mapping.c | 2 + src/mms/iso_client/iso_client_connection.c | 28 +++- src/vs/libiec61850-wo-goose.def | 1 + src/vs/libiec61850.def | 1 + tools/model_generator/genconfig.jar | Bin 75191 -> 75283 bytes tools/model_generator/genmodel.jar | Bin 75190 -> 75282 bytes .../com/libiec61850/scl/model/LogControl.java | 7 +- .../scl/model/ReportControlBlock.java | 5 +- .../libiec61850/scl/model/TriggerOptions.java | 7 +- 20 files changed, 245 insertions(+), 88 deletions(-) diff --git a/config/stack_config.h b/config/stack_config.h index 49fb2e5..91322e9 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -18,8 +18,8 @@ #define DEBUG_ISO_SERVER 0 #define DEBUG_ISO_CLIENT 0 #define DEBUG_IED_SERVER 0 -#define DEBUG_IED_CLIENT 0 -#define DEBUG_MMS_CLIENT 0 +#define DEBUG_IED_CLIENT 1 +#define DEBUG_MMS_CLIENT 1 #define DEBUG_MMS_SERVER 0 #define DEBUG_GOOSE_SUBSCRIBER 0 #define DEBUG_GOOSE_PUBLISHER 0 diff --git a/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs index 9691d4b..73df640 100644 --- a/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs +++ b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs @@ -261,8 +261,10 @@ namespace IEC61850 ~IedConnection () { + Console.WriteLine ("IedConnection destructor invoked"); if (connection != IntPtr.Zero) IedConnection_destroy(connection); + Console.WriteLine ("IedConnection destructor finished"); } public IsoConnectionParameters GetConnectionParameters () diff --git a/dotnet/IEC61850forCSharp/ReportControlBlock.cs b/dotnet/IEC61850forCSharp/ReportControlBlock.cs index 55fae3c..57df501 100644 --- a/dotnet/IEC61850forCSharp/ReportControlBlock.cs +++ b/dotnet/IEC61850forCSharp/ReportControlBlock.cs @@ -159,6 +159,7 @@ namespace IEC61850 private IntPtr self; private IntPtr connection; + private IedConnection iedConnection = null; private string objectReference; private bool flagRptId = false; private bool flagRptEna = false; @@ -202,6 +203,7 @@ namespace IEC61850 private void internalReportHandler (IntPtr parameter, IntPtr report) { + Console.WriteLine ("called internalReportHandler"); try { if (this.report == null) @@ -217,16 +219,20 @@ namespace IEC61850 } } - internal ReportControlBlock (string objectReference, IntPtr connection) + internal ReportControlBlock (string objectReference, IedConnection iedConnection, IntPtr connection) { self = ClientReportControlBlock_create (objectReference); + this.iedConnection = iedConnection; this.connection = connection; this.objectReference = objectReference; } ~ReportControlBlock() { - IedConnection_uninstallReportHandler(connection, objectReference); + Console.WriteLine ("Destructor invoked"); + //IedConnection_uninstallReportHandler(connection, objectReference); + //this.iedConnection = null; + Console.WriteLine ("Destructor finished"); } public string GetObjectReference () diff --git a/dotnet/IEC61850forCSharp/Reporting.cs b/dotnet/IEC61850forCSharp/Reporting.cs index 256880f..f61906a 100644 --- a/dotnet/IEC61850forCSharp/Reporting.cs +++ b/dotnet/IEC61850forCSharp/Reporting.cs @@ -33,7 +33,7 @@ namespace IEC61850 { public ReportControlBlock GetReportControlBlock (string rcbObjectReference) { - return new ReportControlBlock (rcbObjectReference, connection); + return new ReportControlBlock (rcbObjectReference, this, connection); } } diff --git a/dotnet/reporting/ReportingExample.cs b/dotnet/reporting/ReportingExample.cs index 4a319cc..506f283 100644 --- a/dotnet/reporting/ReportingExample.cs +++ b/dotnet/reporting/ReportingExample.cs @@ -75,36 +75,36 @@ namespace reporting ReportControlBlock rcb1 = con.GetReportControlBlock(rcbReference1); ReportControlBlock rcb2 = con.GetReportControlBlock(rcbReference2); - ReportControlBlock rcb3 = con.GetReportControlBlock(rcbReference3); - - rcb1.GetRCBValues(); - - // note: the second parameter is not required! - 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 (rcb2.IsBuffered()) - Console.WriteLine ("RCB: " + rcbReference2 + " is buffered"); - - rcb2.InstallReportHandler(reportHandler, rcb2); + ReportControlBlock rcb3 = con.GetReportControlBlock(rcbReference3); + + rcb1.GetRCBValues(); + + // note: the second parameter is not required! + 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 (rcb2.IsBuffered()) + Console.WriteLine("RCB: " + rcbReference2 + " is buffered"); + + rcb2.InstallReportHandler(reportHandler, rcb2); rcb2.SetOptFlds(ReportOptions.REASON_FOR_INCLUSION | ReportOptions.SEQ_NUM | ReportOptions.TIME_STAMP | - ReportOptions.CONF_REV | ReportOptions.ENTRY_ID | ReportOptions.DATA_REFERENCE | ReportOptions.DATA_SET); - rcb2.SetTrgOps(TriggerOptions.DATA_CHANGED | TriggerOptions.INTEGRITY); - rcb2.SetIntgPd(2000); - rcb2.SetRptEna(true); - - rcb2.SetRCBValues(); + ReportOptions.CONF_REV | ReportOptions.ENTRY_ID | ReportOptions.DATA_REFERENCE | ReportOptions.DATA_SET); + rcb2.SetTrgOps(TriggerOptions.DATA_CHANGED | TriggerOptions.INTEGRITY); + rcb2.SetIntgPd(2000); + rcb2.SetRptEna(true); + + rcb2.SetRCBValues(); rcb3.GetRCBValues(); @@ -128,14 +128,20 @@ namespace reporting ReportingExample.running = false; }; + /* stop main loop when connection is lost */ + con.InstallConnectionClosedHandler(delegate(IedConnection connection) { + Console.WriteLine("Connection closed"); + ReportingExample.running = false; + }); + while (running) { Thread.Sleep(10); } con.Abort (); } catch (IedConnectionException e) { - Console.WriteLine (e.Message); - } + Console.WriteLine ("Error: " + e.Message); + } } } diff --git a/dotnet/reporting/reporting.csproj b/dotnet/reporting/reporting.csproj index 7d7cef5..319ba36 100644 --- a/dotnet/reporting/reporting.csproj +++ b/dotnet/reporting/reporting.csproj @@ -1,45 +1,95 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {9E29B4CE-EE5F-4CA6-85F6-5D1FF8B27BF8} - Exe - reporting - reporting - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - true - - - none - true - bin\Release - prompt - 4 - true - - - - - - - - - - - - {C35D624E-5506-4560-8074-1728F1FA1A4D} - IEC61850forCSharp - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {9E29B4CE-EE5F-4CA6-85F6-5D1FF8B27BF8} + Exe + reporting + reporting + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + true + full + false + bin\Debug + DEBUG; + prompt + 4 + true + true + + + none + true + bin\Release + prompt + 4 + true + + + + + + + + True + True + Settings.settings + + + + + + + + {C35D624E-5506-4560-8074-1728F1FA1A4D} + IEC61850forCSharp + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + False + Microsoft .NET Framework 4 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 4.5 + true + + \ No newline at end of file diff --git a/src/iec61850/client/client_control.c b/src/iec61850/client/client_control.c index 3aa4cca..57f6de3 100644 --- a/src/iec61850/client/client_control.c +++ b/src/iec61850/client/client_control.c @@ -46,8 +46,12 @@ struct sControlObjectClient bool interlockCheck; bool synchroCheck; bool hasTimeActivatedMode; + int edition; /* 1 = Ed. 1 - 2 = Ed. 2 */ + bool useConstantT; /* some servers require a constant T parameter for select and operate */ + uint64_t constantT; /* timestamp of select/operate to be used when constant T option is selected */ + LastApplError lastApplError; CommandTerminationHandler commandTerminationHandler; @@ -380,7 +384,16 @@ ControlObjectClient_operate(ControlObjectClient self, MmsValue* ctlVal, uint64_t MmsValue* ctlNum = MmsValue_newUnsignedFromUint32(self->ctlNum); MmsValue_setElement(operParameters, index++, ctlNum); - uint64_t timestamp = Hal_getTimeInMs(); + uint64_t timestamp; + + if ((self->ctlModel == CONTROL_MODEL_SBO_ENHANCED) && (self->useConstantT)) + timestamp = self->constantT; + else + timestamp = Hal_getTimeInMs(); + + if (self->useConstantT) + self->constantT = timestamp; + MmsValue* ctlTime; if (self->edition == 2) @@ -485,6 +498,9 @@ ControlObjectClient_selectWithValue(ControlObjectClient self, MmsValue* ctlVal) uint64_t timestamp = Hal_getTimeInMs(); MmsValue* ctlTime; + if (self->useConstantT) + self->constantT = timestamp; + if (self->edition == 2) ctlTime = MmsValue_newUtcTimeByMsTime(timestamp); else { @@ -609,7 +625,13 @@ ControlObjectClient_cancel(ControlObjectClient self) MmsValue* ctlNum = MmsValue_newUnsignedFromUint32(self->ctlNum); MmsValue_setElement(cancelParameters, index++, ctlNum); - uint64_t timestamp = Hal_getTimeInMs(); + uint64_t timestamp; + + if (self->useConstantT) + timestamp = self->constantT; + else + timestamp = Hal_getTimeInMs(); + MmsValue* ctlTime; if (self->edition == 2) @@ -652,6 +674,12 @@ ControlObjectClient_cancel(ControlObjectClient self) return true; } +void +ControlObjectClient_useConstantT(ControlObjectClient self, bool useConstantT) +{ + self->useConstantT = useConstantT; +} + void ControlObjectClient_enableInterlockCheck(ControlObjectClient self) { diff --git a/src/iec61850/client/client_report.c b/src/iec61850/client/client_report.c index 4381544..55f04c5 100644 --- a/src/iec61850/client/client_report.c +++ b/src/iec61850/client/client_report.c @@ -267,7 +267,9 @@ IedConnection_installReportHandler(IedConnection self, const char* rcbReference, else report->rptId = NULL; + Semaphore_wait(self->reportHandlerMutex); LinkedList_add(self->enabledReports, report); + Semaphore_post(self->reportHandlerMutex); if (DEBUG_IED_CLIENT) printf("DEBUG_IED_CLIENT: Installed new report callback handler for %s\n", rcbReference); @@ -276,12 +278,16 @@ IedConnection_installReportHandler(IedConnection self, const char* rcbReference, void IedConnection_uninstallReportHandler(IedConnection self, const char* rcbReference) { + Semaphore_wait(self->reportHandlerMutex); + ClientReport report = lookupReportHandler(self, rcbReference); if (report != NULL) { LinkedList_remove(self->enabledReports, report); ClientReport_destroy(report); } + + Semaphore_post(self->reportHandlerMutex); } void @@ -544,9 +550,13 @@ private_IedConnection_handleReport(IedConnection self, MmsValue* value) } } + printf("U0 sem wait\n"); + Semaphore_wait(self->reportHandlerMutex); + printf("U1 call user\n"); if (matchingReport->callback != NULL) matchingReport->callback(matchingReport->callbackParameter, matchingReport); - + Semaphore_post(self->reportHandlerMutex); + printf("U2\n"); exit_function: return; } diff --git a/src/iec61850/client/ied_connection.c b/src/iec61850/client/ied_connection.c index f71a445..c0749e4 100644 --- a/src/iec61850/client/ied_connection.c +++ b/src/iec61850/client/ied_connection.c @@ -485,6 +485,7 @@ IedConnection_create() self->state = IED_STATE_IDLE; self->stateMutex = Semaphore_create(1); + self->reportHandlerMutex = Semaphore_create(1); self->connectionTimeout = DEFAULT_CONNECTION_TIMEOUT; @@ -617,10 +618,12 @@ IedConnection_destroy(IedConnection self) LinkedList_destroyStatic(self->clientControls); Semaphore_destroy(self->stateMutex); + Semaphore_destroy(self->reportHandlerMutex); GLOBAL_FREEMEM(self); } + MmsVariableSpecification* IedConnection_getVariableSpecification(IedConnection self, IedClientError* error, const char* objectReference, FunctionalConstraint fc) @@ -1129,7 +1132,6 @@ mmsFileReadHandler(void* parameter, int32_t frsmId, uint8_t* buffer, uint32_t by { struct sClientProvidedFileReadHandler* handler = (struct sClientProvidedFileReadHandler*) parameter; - handler->retVal = handler->handler(handler->handlerParameter, buffer, bytesReceived); handler->byteReceived += bytesReceived; diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index ad96ab1..b5305d2 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -1335,6 +1335,17 @@ ControlObjectClient_setTestMode(ControlObjectClient self); void ControlObjectClient_setOrigin(ControlObjectClient self, const char* orIdent, int orCat); +/** + * \brief Use a constant T parameter for all command (select, operate, cancel) of a single control sequence + * + * NOTE: Some non-standard compliant servers may require this to accept oper/cancel requests + * + * \param self the ControlObjectClient instance + * \param useContantT enable this behaviour with true, disable with false + */ +void +ControlObjectClient_useConstantT(ControlObjectClient self, bool useConstantT); + void ControlObjectClient_enableInterlockCheck(ControlObjectClient self); diff --git a/src/iec61850/inc_private/ied_connection_private.h b/src/iec61850/inc_private/ied_connection_private.h index 61b1a13..1334ed1 100644 --- a/src/iec61850/inc_private/ied_connection_private.h +++ b/src/iec61850/inc_private/ied_connection_private.h @@ -40,6 +40,7 @@ struct sIedConnection LastApplError lastApplError; Semaphore stateMutex; + Semaphore reportHandlerMutex; IedConnectionClosedHandler connectionCloseHandler; void* connectionClosedParameter; diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index c3fcc93..c82eed0 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -1413,6 +1413,8 @@ writeAccessGooseControlBlock(MmsMapping* self, MmsDomain* domain, char* variable #if (CONFIG_GOOSE_DATSET_WRITABLE == 1) if (strcmp(varName, "DatSet") == 0) { + // allow to set non-existing data set? + MmsValue_update(MmsValue_getElement(MmsGooseControlBlock_getMmsValues(mmsGCB), 2), value); allowAccess = true; } diff --git a/src/mms/iso_client/iso_client_connection.c b/src/mms/iso_client/iso_client_connection.c index 573bcd1..7ff796f 100644 --- a/src/mms/iso_client/iso_client_connection.c +++ b/src/mms/iso_client/iso_client_connection.c @@ -106,6 +106,8 @@ connectionHandlingThread(IsoClientConnection self) TpktState packetState; + printf("P1\n"); + while ((packetState = CotpConnection_readToTpktBuffer(self->cotpConnection)) == TPKT_WAITING) { Thread_sleep(1); @@ -116,6 +118,9 @@ connectionHandlingThread(IsoClientConnection self) } } + printf("P2\n"); + + if (packetState == TPKT_ERROR) break; @@ -146,27 +151,44 @@ connectionHandlingThread(IsoClientConnection self) break; } + printf("P3\n"); + + self->callback(ISO_IND_DATA, self->callbackParameter, &(self->presentation->nextPayload)); + printf("P4\n"); + + /* wait for user to release the buffer */ Semaphore_wait(self->receiveBufferMutex); + + printf("P5\n"); + CotpConnection_resetPayload(self->cotpConnection); } + printf("I1\n"); + self->callback(ISO_IND_CLOSED, self->callbackParameter, NULL); + printf("I2\n"); + self->state = STATE_IDLE; Socket_destroy(self->socket); + printf("I3\n"); + if (DEBUG_ISO_CLIENT) printf("ISO_CLIENT_CONNECTION: exit connection %p\n", self); - /* release buffer to enable resuse of client connection */ + /* release buffer to enable reuse of client connection */ Semaphore_post(self->receiveBufferMutex); + printf("I4\n"); + self->handlingThreadRunning = false; } @@ -427,12 +449,16 @@ IsoClientConnection_close(IsoClientConnection self) if (DEBUG_ISO_CLIENT) printf("ISO_CLIENT: IsoClientConnection_close\n"); + printf("B1\n"); + if (self->handlingThreadRunning) { self->stopHandlingThread = true; while (self->handlingThreadRunning) Thread_sleep(1); } + printf("B2\n"); + self->state = STATE_IDLE; } diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 8f30508..1affa1e 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -490,3 +490,4 @@ EXPORTS ClientReport_getBufOvfl MmsValue_getUtcTimeInMsWithUs IedModel_setIedNameForDynamicModel + ControlObjectClient_useConstantT diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index fa29b64..8a12da8 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -514,3 +514,4 @@ EXPORTS ClientReport_getBufOvfl MmsValue_getUtcTimeInMsWithUs IedModel_setIedNameForDynamicModel + ControlObjectClient_useConstantT diff --git a/tools/model_generator/genconfig.jar b/tools/model_generator/genconfig.jar index 1c00bf010e1a00dddd8de1820578456497f71d48..75df96c9dc5006ff93ff2f1eee970ee42ea1523f 100644 GIT binary patch delta 7998 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 OT1nB+R!G5k(f$V$EW#Q9 diff --git a/tools/model_generator/genmodel.jar b/tools/model_generator/genmodel.jar index 2f84d3f0cf473a060599bd9963ff978e1d3a0646..84d30c6540439bbc37788a158486320ebaca7d17 100644 GIT binary patch delta 8005 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 Date: Wed, 22 Jul 2015 09:11:59 +0200 Subject: [PATCH 2/6] - extended/fixed ws .def files --- src/vs/libiec61850-wo-goose.def | 2 ++ src/vs/libiec61850.def | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 1affa1e..09c2cda 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -491,3 +491,5 @@ EXPORTS MmsValue_getUtcTimeInMsWithUs IedModel_setIedNameForDynamicModel ControlObjectClient_useConstantT + ControlObjectClient_setOrigin + diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index 8a12da8..9682dda 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -91,7 +91,7 @@ EXPORTS ControlObjectClient_getObjectReference @218 ControlObjectClient_operate @219 ControlObjectClient_select @220 - ControlObjectClient_selectWithValue @221MmsConnection_setConnectTimeout + ControlObjectClient_selectWithValue @221 ControlObjectClient_setLastApplError @222 ControlObjectClient_setCommandTerminationHandler DataAttribute_create @273 @@ -515,3 +515,4 @@ EXPORTS MmsValue_getUtcTimeInMsWithUs IedModel_setIedNameForDynamicModel ControlObjectClient_useConstantT + ControlObjectClient_setOrigin From eb31da81a8c7e3be3244aebda1466d77bab74075 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 25 Sep 2015 07:53:34 -0300 Subject: [PATCH 3/6] - added ControlObjectClient_setOrigin to VS def files --- src/vs/libiec61850-wo-goose.def | 1 + src/vs/libiec61850.def | 1 + 2 files changed, 2 insertions(+) diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 8f30508..52b7ad6 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -490,3 +490,4 @@ EXPORTS ClientReport_getBufOvfl MmsValue_getUtcTimeInMsWithUs IedModel_setIedNameForDynamicModel + ControlObjectClient_setOrigin diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index fa29b64..d0189d8 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -514,3 +514,4 @@ EXPORTS ClientReport_getBufOvfl MmsValue_getUtcTimeInMsWithUs IedModel_setIedNameForDynamicModel + ControlObjectClient_setOrigin From 6e260b88a4994cf8abcee8571a522ee9a9900043 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 29 Sep 2015 10:39:12 +0200 Subject: [PATCH 4/6] - fixed bug in .net implementation. Garbage collected command termination handler. --- dotnet/IEC61850forCSharp/Control.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dotnet/IEC61850forCSharp/Control.cs b/dotnet/IEC61850forCSharp/Control.cs index d8bcc86..cd425d8 100644 --- a/dotnet/IEC61850forCSharp/Control.cs +++ b/dotnet/IEC61850forCSharp/Control.cs @@ -164,6 +164,7 @@ namespace IEC61850 commandTerminationHandler(commandTerminationHandlerParameter, this); } + private InternalCommandTerminationHandler intCommandTerminationHandler; internal ControlObject (string objectReference, IntPtr connection, IedConnection iedConnection) { @@ -174,7 +175,7 @@ namespace IEC61850 if (this.controlObject == System.IntPtr.Zero) throw new IedConnectionException("Control object not found", 0); - InternalCommandTerminationHandler intCommandTerminationHandler = new InternalCommandTerminationHandler (MyCommandTerminationHandler); + intCommandTerminationHandler = new InternalCommandTerminationHandler (MyCommandTerminationHandler); ControlObjectClient_setCommandTerminationHandler(controlObject, intCommandTerminationHandler, controlObject); } From 0bc0fd94ed3a29df648fff6d87de9341bbd9b892 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 9 Oct 2015 15:22:47 +0200 Subject: [PATCH 5/6] - fixed bug in get name list service when client sends wrong domain name --- src/mms/iso_mms/server/mms_get_namelist_service.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/mms/iso_mms/server/mms_get_namelist_service.c b/src/mms/iso_mms/server/mms_get_namelist_service.c index fcd3b66..0bb0af1 100644 --- a/src/mms/iso_mms/server/mms_get_namelist_service.c +++ b/src/mms/iso_mms/server/mms_get_namelist_service.c @@ -436,9 +436,12 @@ mmsServer_handleGetNameListRequest( else if (objectClass == OBJECT_CLASS_NAMED_VARIABLE_LIST) { LinkedList nameList = getNamedVariableListsDomainSpecific(connection, domainSpecificName); - createNameListResponse(connection, invokeId, nameList, response, continueAfter); - - LinkedList_destroy(nameList); + if (nameList == NULL) + mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + else { + createNameListResponse(connection, invokeId, nameList, response, continueAfter); + LinkedList_destroy(nameList); + } } #endif /* (MMS_DATA_SET_SERVICE == 1) */ @@ -447,7 +450,6 @@ mmsServer_handleGetNameListRequest( mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); } - } else if (objectScope == OBJECT_SCOPE_VMD) { /* vmd-specific */ From 120a36c9e3c73107b844a76a8fc182df7b7f11d9 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 12 Oct 2015 12:29:57 +0200 Subject: [PATCH 6/6] - added missing functions to .def files --- src/vs/libiec61850-wo-goose.def | 3 ++- src/vs/libiec61850.def | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 09c2cda..54cabde 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -492,4 +492,5 @@ EXPORTS IedModel_setIedNameForDynamicModel ControlObjectClient_useConstantT ControlObjectClient_setOrigin - + LogicalDevice_getChildByMmsVariableName + LogicalNode_getDataset diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index 9682dda..73d532e 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -516,3 +516,5 @@ EXPORTS IedModel_setIedNameForDynamicModel ControlObjectClient_useConstantT ControlObjectClient_setOrigin + LogicalDevice_getChildByMmsVariableName + LogicalNode_getDataset