From 37a857e1282964fc54c8ca9810a7e1727c027318 Mon Sep 17 00:00:00 2001 From: Maxson Ramon dos Anjos Medeiros Date: Mon, 21 Jul 2025 10:09:12 +0200 Subject: [PATCH] C -> LIB61850_API SVControlBlock_getName added .NET -> Wrapper for SVControl ge_name added, called inside of SMVHandler --- .../IEC61850Model/SVControlBlock.cs | 11 ++++++ .../server_example_access_control/Program.cs | 16 ++------- .../server_example_access_control/model.cfg | 35 ++++++++++--------- src/iec61850/inc/iec61850_dynamic_model.h | 3 ++ src/iec61850/server/model/dynamic_model.c | 7 ++++ 5 files changed, 42 insertions(+), 30 deletions(-) diff --git a/dotnet/IEC61850forCSharp/IEC61850Model/SVControlBlock.cs b/dotnet/IEC61850forCSharp/IEC61850Model/SVControlBlock.cs index d9dc7105..e9c1300f 100644 --- a/dotnet/IEC61850forCSharp/IEC61850Model/SVControlBlock.cs +++ b/dotnet/IEC61850forCSharp/IEC61850Model/SVControlBlock.cs @@ -26,6 +26,9 @@ namespace IEC61850 static extern IntPtr SVControlBlock_create(string name, IntPtr parent, string svID,string dataSet, UInt32 confRev, uint smpMod, UInt16 smpRate, uint optFlds, bool isUnicast); + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern IntPtr SVControlBlock_getName(IntPtr self); + /// /// create a new Multicast/Unicast Sampled Value (SV) control block (SvCB) /// Create a new Sampled Value control block(SvCB) and add it to the given logical node(LN) @@ -56,6 +59,14 @@ namespace IEC61850 this.self = self; } + public string Name + { + get + { + return Marshal.PtrToStringAnsi(SVControlBlock_getName(self)); + } + } + } } diff --git a/dotnet/server_example_access_control/Program.cs b/dotnet/server_example_access_control/Program.cs index 18f54645..2e6784e1 100644 --- a/dotnet/server_example_access_control/Program.cs +++ b/dotnet/server_example_access_control/Program.cs @@ -142,7 +142,7 @@ namespace server_access_control /* Install handler to control access to control blocks (RCBs, LCBs, GoCBs, SVCBs, SGCBs)*/ bool ControlBlockAccessCallBack(object parameter, ClientConnection connection, ACSIClass acsiClass, LogicalDevice ld, LogicalNode ln, string objectName, string subObjectName, ControlBlockAccessType accessType) { - Console.WriteLine(acsiClass.ToString() + " "+ accessType.ToString() + " access " + ld.GetName() + ln.GetName() +"/"+ objectName + "." + subObjectName); + Console.WriteLine(acsiClass.ToString() + " "+ accessType.ToString() + " access " + ld.GetName() + ln.GetName() +"/"+ objectName + "." + subObjectName + "\n"); return true; } @@ -221,18 +221,6 @@ namespace server_access_control iedServer.SetDirectoryAccessHandler(directoryAccessHandler, null); - /* Handler for Sampled values control block - */ - - void SVCBEventHandler(SVControlBlock svcb, SMVEvent smvEvent, object parameter) - { - Console.WriteLine("SVControlBlock event " + smvEvent.ToString()); - } - - //LogicalNode logicalNode = (LogicalNode)iedModel.GetModelNodeByShortObjectReference("GenericIO/GGIO1"); - //SVControlBlock sampledValuesControlBlock = iedModel.GetSVControlBlock(logicalNode, "MSVCB01"); - //iedServer.SetSVCBHandler(SVCBEventHandler, sampledValuesControlBlock, null); - /*SettingGroups*/ LogicalDevice logicalDevice = (LogicalDevice)iedModel.GetModelNodeByShortObjectReference("GenericIO"); ; @@ -338,7 +326,7 @@ namespace server_access_control void sVCBEventHandler(SVControlBlock sampledValuesControlBlock, SMVEvent sMVEvent, object parameter) { - Console.WriteLine("control called"); + Console.WriteLine("control called " + sampledValuesControlBlock.Name + " Event: " + sMVEvent.ToString() + "\n"); } iedServer.SetSVCBHandler(sVCBEventHandler, sampledValuesControlBlock_1, null); diff --git a/dotnet/server_example_access_control/model.cfg b/dotnet/server_example_access_control/model.cfg index ad0b6472..d01cb427 100644 --- a/dotnet/server_example_access_control/model.cfg +++ b/dotnet/server_example_access_control/model.cfg @@ -1,20 +1,5 @@ MODEL(simpleIO){ LD(GenericIO){ -LN(LPHD1){ -DO(PhyNam 0){ -DA(vendor 0 20 5 16 0); -} -DO(PhyHealth 0){ -DA(stVal 0 12 0 17 0)=1; -DA(q 0 23 0 18 0); -DA(t 0 22 0 16 0); -} -DO(Proxy 0){ -DA(stVal 0 0 0 17 0); -DA(q 0 23 0 18 0); -DA(t 0 22 0 16 0); -} -} LN(GGIO1){ DO(Mod 0){ DA(stVal 0 12 0 17 0)=1; @@ -159,6 +144,21 @@ DA(q 0 23 0 18 0); DA(t 0 22 0 16 0); } } +LN(LPHD1){ +DO(PhyNam 0){ +DA(vendor 0 20 5 16 0); +} +DO(PhyHealth 0){ +DA(stVal 0 12 0 17 0)=1; +DA(q 0 23 0 18 0); +DA(t 0 22 0 16 0); +} +DO(Proxy 0){ +DA(stVal 0 0 0 17 0); +DA(q 0 23 0 18 0); +DA(t 0 22 0 16 0); +} +} LN(LLN0){ SG(1 5) DO(Mod 0){ @@ -234,7 +234,10 @@ LOG(EventLog); GC(gcbEvents events Events 3 0 1000 3000){ PA(4 1 1000 010CCD010001); } -SMVC(MSVCB01 xxxxMUnn01 Events 0 0 0 1 0 ){ +SMVC(SMV1 xxxxMUnn01 Events 0 0 0 1 0 ){ +PA(4 123 4000 010CCD040001); +} +SMVC(SMV2 null Measurements 0 0 0 0 0 ){ PA(4 123 4000 010CCD040001); } } diff --git a/src/iec61850/inc/iec61850_dynamic_model.h b/src/iec61850/inc/iec61850_dynamic_model.h index ed6a31c4..a3b5aeff 100644 --- a/src/iec61850/inc/iec61850_dynamic_model.h +++ b/src/iec61850/inc/iec61850_dynamic_model.h @@ -468,6 +468,9 @@ LIB61850_API SVControlBlock* SVControlBlock_create(const char* name, LogicalNode* parent, const char* svID, const char* dataSet, uint32_t confRev, uint8_t smpMod, uint16_t smpRate, uint8_t optFlds, bool isUnicast); +LIB61850_API const char* +SVControlBlock_getName(SVControlBlock* self); + LIB61850_API void SVControlBlock_addPhyComAddress(SVControlBlock* self, PhyComAddress* phyComAddress); diff --git a/src/iec61850/server/model/dynamic_model.c b/src/iec61850/server/model/dynamic_model.c index 2290918e..f3c7f3d7 100644 --- a/src/iec61850/server/model/dynamic_model.c +++ b/src/iec61850/server/model/dynamic_model.c @@ -587,6 +587,13 @@ SVControlBlock_create(const char* name, LogicalNode* parent, const char* svID, c return self; } + +const char* +SVControlBlock_getName(SVControlBlock* self) +{ + return self->name; +} + void SVControlBlock_addPhyComAddress(SVControlBlock* self, PhyComAddress* phyComAddress) {