- .NET API: Added support for SelectStateChangedHandler

- .NET API: Added ModelNode.GetObjectReference
pull/291/head
Michael Zillgith 5 years ago
parent 0879ad0d46
commit ae4f940753

@ -749,6 +749,9 @@ namespace IEC61850
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern int ModelNode_getType(IntPtr self); static extern int ModelNode_getType(IntPtr self);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr ModelNode_getObjectReference(IntPtr self, IntPtr objectReference);
public IntPtr self; public IntPtr self;
internal ModelNode() internal ModelNode()
@ -787,9 +790,24 @@ namespace IEC61850
} }
} }
}
public string GetObjectReference()
{
IntPtr objRefPtr = ModelNode_getObjectReference(self, IntPtr.Zero);
if (objRefPtr != IntPtr.Zero) {
string objRef = Marshal.PtrToStringAnsi(objRefPtr);
Marshal.FreeHGlobal(objRefPtr);
return objRef;
}
else {
return null;
}
}
}
public class DataSet public class DataSet
{ {
@ -1021,6 +1039,42 @@ namespace IEC61850
public delegate MmsDataAccessError WriteAccessHandler (DataAttribute dataAttr, MmsValue value, public delegate MmsDataAccessError WriteAccessHandler (DataAttribute dataAttr, MmsValue value,
ClientConnection connection, object parameter); ClientConnection connection, object parameter);
/// <summary>
/// Reason for the select state change
/// </summary>
public enum SelectStateChangedReason
{
/// <summary>
/// Control has been selected
/// </summary>
SELECT_STATE_REASON_SELECTED = 0,
/// <summary>
/// Cancel received for the control
/// </summary>
SELECT_STATE_REASON_CANCELED = 1,
/// <summary>
/// Unselected due to timeout (sboTimeout)
/// </summary>
SELECT_STATE_REASON_TIMEOUT = 2,
/// <summary>
/// Unselected due to successful operate
/// </summary>
SELECT_STATE_REASON_OPERATED = 3,
/// <summary>
/// Unselected due to failed operate
/// </summary>
SELECT_STATE_REASON_OPERATE_FAILED = 4,
/// <summary>
/// Unselected due to disconnection of selecting client
/// </summary>
SELECT_STATE_REASON_DISCONNECTED = 5
}
public delegate void ControlSelectStateChangedHandler(ControlAction action, object parameter, bool isSelected, SelectStateChangedReason reason);
/// <summary>
/// Return type of ControlHandler and ControlWaitForExecutionHandler
/// </summary>
public enum ControlHandlerResult { public enum ControlHandlerResult {
/// <summary> /// <summary>
/// check or operation failed /// check or operation failed
@ -1141,6 +1195,9 @@ namespace IEC61850
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int InternalControlHandler (IntPtr action, IntPtr parameter, IntPtr ctlVal, [MarshalAs(UnmanagedType.I1)] bool test); private delegate int InternalControlHandler (IntPtr action, IntPtr parameter, IntPtr ctlVal, [MarshalAs(UnmanagedType.I1)] bool test);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void InternalSelectStateChangedHandler(IntPtr action, IntPtr parameter, [MarshalAs(UnmanagedType.I1)] bool isSelected, int reason);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_setWaitForExecutionHandler(IntPtr self, IntPtr node, InternalControlWaitForExecutionHandler handler, IntPtr parameter); static extern void IedServer_setWaitForExecutionHandler(IntPtr self, IntPtr node, InternalControlWaitForExecutionHandler handler, IntPtr parameter);
@ -1150,6 +1207,9 @@ namespace IEC61850
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_setControlHandler (IntPtr self, IntPtr node, InternalControlHandler handler, IntPtr parameter); static extern void IedServer_setControlHandler (IntPtr self, IntPtr node, InternalControlHandler handler, IntPtr parameter);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_setSelectStateChangedHandler(IntPtr self, IntPtr node, InternalSelectStateChangedHandler handler, IntPtr parameter);
[DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)]
static extern void IedServer_setWriteAccessPolicy(IntPtr self, FunctionalConstraint fc, AccessPolicy policy); static extern void IedServer_setWriteAccessPolicy(IntPtr self, FunctionalConstraint fc, AccessPolicy policy);
@ -1182,6 +1242,7 @@ namespace IEC61850
private InternalControlHandler internalControlHandlerRef = null; private InternalControlHandler internalControlHandlerRef = null;
private InternalControlPerformCheckHandler internalControlPerformCheckHandlerRef = null; private InternalControlPerformCheckHandler internalControlPerformCheckHandlerRef = null;
private InternalControlWaitForExecutionHandler internalControlWaitForExecutionHandlerRef = null; private InternalControlWaitForExecutionHandler internalControlWaitForExecutionHandlerRef = null;
private InternalSelectStateChangedHandler internalSelectedStateChangedHandlerRef = null;
internal class ControlHandlerInfo { internal class ControlHandlerInfo {
public DataObject controlObject = null; public DataObject controlObject = null;
@ -1196,15 +1257,19 @@ namespace IEC61850
public ControlWaitForExecutionHandler waitForExecHandler = null; public ControlWaitForExecutionHandler waitForExecHandler = null;
public object waitForExecHandlerParameter = null; public object waitForExecHandlerParameter = null;
public ControlSelectStateChangedHandler selectStateChangedHandler = null;
public object selectStateChangedHandlerParameter = null;
public ControlHandlerInfo(DataObject controlObject) public ControlHandlerInfo(DataObject controlObject)
{ {
this.controlObject = controlObject; this.controlObject = controlObject;
this.handle = GCHandle.Alloc(this); this.handle = GCHandle.Alloc(this);
} }
~ControlHandlerInfo() {
~ControlHandlerInfo()
{
this.handle.Free(); this.handle.Free();
} }
} }
private Dictionary<DataObject, ControlHandlerInfo> controlHandlers = new Dictionary<DataObject, ControlHandlerInfo> (); private Dictionary<DataObject, ControlHandlerInfo> controlHandlers = new Dictionary<DataObject, ControlHandlerInfo> ();
@ -1217,7 +1282,7 @@ namespace IEC61850
ControlAction controlAction = new ControlAction (action, info, this); ControlAction controlAction = new ControlAction (action, info, this);
if (info != null & info.controlHandler != null) if (info != null && info.controlHandler != null)
return (int)info.controlHandler (controlAction, info.controlHandlerParameter, new MmsValue (ctlVal), test); return (int)info.controlHandler (controlAction, info.controlHandlerParameter, new MmsValue (ctlVal), test);
else else
return (int)ControlHandlerResult.FAILED; return (int)ControlHandlerResult.FAILED;
@ -1229,8 +1294,8 @@ namespace IEC61850
ControlHandlerInfo info = (ControlHandlerInfo)handle.Target; ControlHandlerInfo info = (ControlHandlerInfo)handle.Target;
if (info != null & info.checkHandler != null) { if (info != null && info.checkHandler != null)
{
ControlAction controlAction = new ControlAction (action, info, this); ControlAction controlAction = new ControlAction (action, info, this);
return (int)info.checkHandler (controlAction, info.checkHandlerParameter, new MmsValue (ctlVal), test, interlockCheck); return (int)info.checkHandler (controlAction, info.checkHandlerParameter, new MmsValue (ctlVal), test, interlockCheck);
@ -1244,8 +1309,8 @@ namespace IEC61850
ControlHandlerInfo info = (ControlHandlerInfo)handle.Target; ControlHandlerInfo info = (ControlHandlerInfo)handle.Target;
if (info != null & info.waitForExecHandler != null) { if (info != null && info.waitForExecHandler != null)
{
ControlAction controlAction = new ControlAction (action, info, this); ControlAction controlAction = new ControlAction (action, info, this);
return (int)info.waitForExecHandler (controlAction, info.waitForExecHandlerParameter, new MmsValue (ctlVal), test, synchoCheck); return (int)info.waitForExecHandler (controlAction, info.waitForExecHandlerParameter, new MmsValue (ctlVal), test, synchoCheck);
@ -1254,6 +1319,20 @@ namespace IEC61850
return (int)ControlHandlerResult.FAILED; return (int)ControlHandlerResult.FAILED;
} }
void InternalSelectStateChangedHandlerImpl(IntPtr action, IntPtr parameter, bool isSelected, int reason)
{
GCHandle handle = GCHandle.FromIntPtr(parameter);
ControlHandlerInfo info = (ControlHandlerInfo)handle.Target;
if (info != null && info.selectStateChangedHandler != null)
{
ControlAction controlAction = new ControlAction(action, info, this);
info.selectStateChangedHandler(controlAction, info.selectStateChangedHandlerParameter, isSelected, (SelectStateChangedReason)reason);
}
}
private struct WriteAccessHandlerInfo { private struct WriteAccessHandlerInfo {
public WriteAccessHandler handler; public WriteAccessHandler handler;
public object parameter; public object parameter;
@ -1269,7 +1348,6 @@ namespace IEC61850
int WriteAccessHandlerImpl (IntPtr dataAttribute, IntPtr value, IntPtr connection, IntPtr parameter) int WriteAccessHandlerImpl (IntPtr dataAttribute, IntPtr value, IntPtr connection, IntPtr parameter)
{ {
//object info = writeAccessHandlers.Item [dataAttribute];
WriteAccessHandlerInfo info; WriteAccessHandlerInfo info;
writeAccessHandlers.TryGetValue (dataAttribute, out info); writeAccessHandlers.TryGetValue (dataAttribute, out info);
@ -1333,15 +1411,6 @@ namespace IEC61850
self = IedServer_createWithConfig (iedModel.self, nativeTLSConfig, nativeConfig); self = IedServer_createWithConfig (iedModel.self, nativeTLSConfig, nativeConfig);
} }
// causes undefined behavior
//~IedServer()
//{
// if (self != IntPtr.Zero)
// {
// IedServer_destroy(self);
// }
//}
private InternalConnectionHandler internalConnectionHandler = null; private InternalConnectionHandler internalConnectionHandler = null;
/// <summary> /// <summary>
@ -1484,11 +1553,29 @@ namespace IEC61850
IedServer_setWaitForExecutionHandler(self, controlObject.self, internalControlWaitForExecutionHandlerRef, GCHandle.ToIntPtr(info.handle)); IedServer_setWaitForExecutionHandler(self, controlObject.self, internalControlWaitForExecutionHandlerRef, GCHandle.ToIntPtr(info.handle));
} }
/// <summary>
/// Set a callback handler for a controllable data object to track select state changes
/// </summary>
/// <param name="controlObject">Control object.</param>
/// <param name="handler">Handler.</param>
/// <param name="parameter">A user provided parameter that is passed to the callback handler.</param>
public void SetSelectStateChangedHandler(DataObject controlObject, ControlSelectStateChangedHandler handler, object parameter)
{
ControlHandlerInfo info = GetControlHandlerInfo(controlObject);
info.selectStateChangedHandler = handler;
info.selectStateChangedHandlerParameter = parameter;
if (internalSelectedStateChangedHandlerRef == null)
internalSelectedStateChangedHandlerRef = new InternalSelectStateChangedHandler(InternalSelectStateChangedHandlerImpl);
IedServer_setSelectStateChangedHandler(self, controlObject.self, internalSelectedStateChangedHandlerRef, GCHandle.ToIntPtr(info.handle));
}
public void HandleWriteAccess (DataAttribute dataAttr, WriteAccessHandler handler, object parameter) public void HandleWriteAccess (DataAttribute dataAttr, WriteAccessHandler handler, object parameter)
{ {
writeAccessHandlers.Add (dataAttr.self, new WriteAccessHandlerInfo(handler, parameter, dataAttr)); writeAccessHandlers.Add (dataAttr.self, new WriteAccessHandlerInfo(handler, parameter, dataAttr));
//writeAccessHandlers.Item [dataAttr.self] = handler;
IedServer_handleWriteAccess (self, dataAttr.self, WriteAccessHandlerImpl, IntPtr.Zero); IedServer_handleWriteAccess (self, dataAttr.self, WriteAccessHandlerImpl, IntPtr.Zero);
} }

@ -51,27 +51,45 @@ namespace server1
return ControlHandlerResult.OK; return ControlHandlerResult.OK;
}, null); }, null);
DataObject spcso2 = (DataObject)iedModel.GetModelNodeByShortObjectReference("GenericIO/GGIO1.SPCSO2");
iedServer.SetSelectStateChangedHandler (spcso2, delegate (ControlAction action, object parameter, bool isSelected, SelectStateChangedReason reason) {
DataObject cObj = action.GetControlObject();
Console.WriteLine("Control object " + cObj.GetObjectReference() + (isSelected ? " selected" : " unselected") + " reason: " + reason.ToString());
}, null);
iedServer.Start (102); iedServer.Start (102);
Console.WriteLine ("Server started");
GC.Collect (); if (iedServer.IsRunning())
{
Console.WriteLine("Server started");
DataObject ggio1AnIn1 = (DataObject)iedModel.GetModelNodeByShortObjectReference ("GenericIO/GGIO1.AnIn1"); GC.Collect();
DataAttribute ggio1AnIn1magF = (DataAttribute)ggio1AnIn1.GetChild ("mag.f"); DataObject ggio1AnIn1 = (DataObject)iedModel.GetModelNodeByShortObjectReference("GenericIO/GGIO1.AnIn1");
DataAttribute ggio1AnIn1T = (DataAttribute)ggio1AnIn1.GetChild ("t");
float floatVal = 1.0f; DataAttribute ggio1AnIn1magF = (DataAttribute)ggio1AnIn1.GetChild("mag.f");
DataAttribute ggio1AnIn1T = (DataAttribute)ggio1AnIn1.GetChild("t");
while (running) { float floatVal = 1.0f;
floatVal += 1f;
iedServer.UpdateTimestampAttributeValue (ggio1AnIn1T, new Timestamp (DateTime.Now)); while (running)
iedServer.UpdateFloatAttributeValue (ggio1AnIn1magF, floatVal); {
Thread.Sleep (100); floatVal += 1f;
} iedServer.UpdateTimestampAttributeValue(ggio1AnIn1T, new Timestamp(DateTime.Now));
iedServer.UpdateFloatAttributeValue(ggio1AnIn1magF, floatVal);
Thread.Sleep(100);
}
iedServer.Stop (); iedServer.Stop();
Console.WriteLine ("Server stopped"); Console.WriteLine("Server stopped");
}
else
{
Console.WriteLine("Failed to start server");
}
iedServer.Destroy (); iedServer.Destroy ();
} }

@ -2,13 +2,12 @@ MODEL(simpleIO){
LD(GenericIO){ LD(GenericIO){
LN(LLN0){ LN(LLN0){
DO(Mod 0){ DO(Mod 0){
DA(stVal 0 12 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
DA(ctlModel 0 12 4 0 0)=0; DA(ctlModel 0 12 4 0 0)=0;
} }
DO(Beh 0){ DO(Beh 0){
DA(stVal 0 12 0 1 0); DA(stVal 0 3 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
} }
@ -24,30 +23,22 @@ DA(d 0 20 5 0 0);
DA(configRev 0 20 5 0 0); DA(configRev 0 20 5 0 0);
DA(ldNs 0 20 11 0 0); DA(ldNs 0 20 11 0 0);
} }
DS(Events){ DS(ControlEvents){
DE(GGIO1$ST$SPCSO1$stVal); DE(GGIO1$ST$SPCSO1$stVal);
DE(GGIO1$ST$SPCSO2$stVal); DE(GGIO1$ST$SPCSO2$stVal);
DE(GGIO1$ST$SPCSO3$stVal); DE(GGIO1$ST$SPCSO3$stVal);
DE(GGIO1$ST$SPCSO4$stVal); DE(GGIO1$ST$SPCSO4$stVal);
} DE(GGIO1$ST$SPCSO5$stVal);
DS(AnalogValues){ DE(GGIO1$ST$SPCSO6$stVal);
DE(GGIO1$MX$AnIn1); DE(GGIO1$ST$SPCSO7$stVal);
DE(GGIO1$MX$AnIn2); DE(GGIO1$ST$SPCSO8$stVal);
DE(GGIO1$MX$AnIn3); DE(GGIO1$ST$SPCSO9$stVal);
DE(GGIO1$MX$AnIn4); DE(GGIO1$ST$SPCSO2$stSeld);
} DE(GGIO1$OR$SPCSO2$opRcvd);
RC(EventsRCB01 Events 0 Events 1 24 111 50 1000); DE(GGIO1$OR$SPCSO2$opOk);
RC(AnalogValuesRCB01 AnalogValues 0 AnalogValues 1 24 111 50 1000); }
LC(EventLog Events GenericIO/LLN0$EventLog 19 0 0 1); RC(ControlEventsRCB01 ControlEvents 0 ControlEvents 1 17 239 0 1000);
LC(GeneralLog - - 19 0 0 1); RC(ControlEventsRCB02 ControlEvents 0 ControlEvents 1 17 239 0 1000);
LOG(GeneralLog);
LOG(EventLog);
GC(gcbEvents events Events 2 0 -1 -1 ){
PA(4 273 4096 010ccd010001);
}
GC(gcbAnalogValues analog AnalogValues 2 0 -1 -1 ){
PA(4 273 4096 010ccd010001);
}
} }
LN(LPHD1){ LN(LPHD1){
DO(PhyNam 0){ DO(PhyNam 0){
@ -66,13 +57,12 @@ DA(t 0 22 0 0 0);
} }
LN(GGIO1){ LN(GGIO1){
DO(Mod 0){ DO(Mod 0){
DA(stVal 0 12 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
DA(ctlModel 0 12 4 0 0)=0; DA(ctlModel 0 12 4 0 0)=0;
} }
DO(Beh 0){ DO(Beh 0){
DA(stVal 0 12 0 1 0); DA(stVal 0 3 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
} }
@ -94,11 +84,11 @@ DA(q 0 23 1 2 0);
DA(t 0 22 1 0 0); DA(t 0 22 1 0 0);
} }
DO(AnIn2 0){ DO(AnIn2 0){
DA(mag 0 27 1 1 101){ DA(mag 0 27 1 1 0){
DA(f 0 10 1 1 0); DA(f 0 10 1 1 0);
} }
DA(q 0 23 1 2 0); DA(q 0 23 1 2 0);
DA(t 0 22 1 0 102); DA(t 0 22 1 0 0);
} }
DO(AnIn3 0){ DO(AnIn3 0){
DA(mag 0 27 1 1 0){ DA(mag 0 27 1 1 0){
@ -115,8 +105,6 @@ DA(q 0 23 1 2 0);
DA(t 0 22 1 0 0); DA(t 0 22 1 0 0);
} }
DO(SPCSO1 0){ DO(SPCSO1 0){
DA(stVal 0 0 0 1 0);
DA(q 0 23 0 2 0);
DA(Oper 0 27 12 0 0){ DA(Oper 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0); DA(ctlVal 0 0 12 0 0);
DA(origin 0 27 12 0 0){ DA(origin 0 27 12 0 0){
@ -128,12 +116,13 @@ DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0); DA(Test 0 0 12 0 0);
DA(Check 0 24 12 0 0); DA(Check 0 24 12 0 0);
} }
DA(ctlModel 0 12 4 0 0)=1; DA(stVal 0 0 0 1 0);
DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
DA(ctlModel 0 12 4 0 0)=1;
} }
DO(SPCSO2 0){ DO(SPCSO2 0){
DA(stVal 0 0 0 1 0); DA(SBO 0 17 12 0 0);
DA(q 0 23 0 2 0);
DA(Oper 0 27 12 0 0){ DA(Oper 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0); DA(ctlVal 0 0 12 0 0);
DA(origin 0 27 12 0 0){ DA(origin 0 27 12 0 0){
@ -145,12 +134,28 @@ DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0); DA(Test 0 0 12 0 0);
DA(Check 0 24 12 0 0); DA(Check 0 24 12 0 0);
} }
DA(ctlModel 0 12 4 0 0)=1; DA(Cancel 0 27 12 0 0){
DA(t 0 22 0 0 0); DA(ctlVal 0 0 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
} }
DO(SPCSO3 0){
DA(stVal 0 0 0 1 0); DA(stVal 0 0 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0);
DA(stSeld 0 0 0 1 0);
DA(opRcvd 0 0 9 1 0);
DA(opOk 0 0 9 1 0);
DA(tOpOk 0 22 9 0 0);
DA(ctlModel 0 12 4 0 0)=2;
DA(sboTimeout 0 9 4 1 0)=2000;
DA(sboClass 0 12 4 0 0);
}
DO(SPCSO3 0){
DA(Oper 0 27 12 0 0){ DA(Oper 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0); DA(ctlVal 0 0 12 0 0);
DA(origin 0 27 12 0 0){ DA(origin 0 27 12 0 0){
@ -162,12 +167,33 @@ DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0); DA(Test 0 0 12 0 0);
DA(Check 0 24 12 0 0); DA(Check 0 24 12 0 0);
} }
DA(ctlModel 0 12 4 0 0)=1; DA(Cancel 0 27 12 0 0){
DA(t 0 22 0 0 0); DA(ctlVal 0 0 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
} }
DO(SPCSO4 0){
DA(stVal 0 0 0 1 0); DA(stVal 0 0 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0);
DA(ctlModel 0 12 4 0 0)=3;
}
DO(SPCSO4 0){
DA(SBOw 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
DA(Check 0 24 12 0 0);
}
DA(Oper 0 27 12 0 0){ DA(Oper 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0); DA(ctlVal 0 0 12 0 0);
DA(origin 0 27 12 0 0){ DA(origin 0 27 12 0 0){
@ -179,58 +205,200 @@ DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0); DA(Test 0 0 12 0 0);
DA(Check 0 24 12 0 0); DA(Check 0 24 12 0 0);
} }
DA(ctlModel 0 12 4 0 0)=1; DA(Cancel 0 27 12 0 0){
DA(t 0 22 0 0 0); DA(ctlVal 0 0 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
} }
DO(Ind1 0){
DA(stVal 0 0 0 1 0); DA(stVal 0 0 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
DA(ctlModel 0 12 4 0 0)=4;
}
DO(SPCSO5 0){
DA(Oper 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0);
DA(operTm 0 22 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
DA(Check 0 24 12 0 0);
} }
DO(Ind2 0){
DA(stVal 0 0 0 1 0); DA(stVal 0 0 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
DA(ctlModel 0 12 4 0 0)=1;
DA(Cancel 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
}
}
DO(SPCSO6 0){
DA(SBO 0 17 12 0 0);
DA(Oper 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0);
DA(operTm 0 22 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
DA(Check 0 24 12 0 0);
}
DA(Cancel 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0);
DA(operTm 0 22 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
} }
DO(Ind3 0){
DA(stVal 0 0 0 1 0); DA(stVal 0 0 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
DA(ctlModel 0 12 4 0 0)=2;
}
DO(SPCSO7 0){
DA(Oper 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0);
DA(operTm 0 22 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
DA(Check 0 24 12 0 0);
}
DA(Cancel 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0);
DA(operTm 0 22 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
} }
DO(Ind4 0){
DA(stVal 0 0 0 1 0); DA(stVal 0 0 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
DA(ctlModel 0 12 4 0 0)=3;
} }
DO(SPCSO8 0){
DA(SBOw 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0);
DA(operTm 0 22 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
} }
LN(PDUP1){ DA(ctlNum 0 6 12 0 0);
DO(Beh 0){ DA(T 0 22 12 0 0);
DA(stVal 0 12 0 1 0); DA(Test 0 0 12 0 0);
DA(Check 0 24 12 0 0);
}
DA(Oper 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0);
DA(operTm 0 22 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
DA(Check 0 24 12 0 0);
}
DA(Cancel 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0);
DA(operTm 0 22 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
}
DA(origin 0 27 0 0 0){
DA(orCat 0 12 0 0 0);
DA(orIdent 0 13 0 0 0);
}
DA(ctlNum 0 6 0 0 0);
DA(stVal 0 0 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
DA(ctlModel 0 12 4 0 0)=4;
} }
DO(Mod 0){ DO(SPCSO9 0){
DA(stVal 0 12 0 1 0); DA(Oper 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
DA(Check 0 24 12 0 0);
}
DA(Cancel 0 27 12 0 0){
DA(ctlVal 0 0 12 0 0);
DA(origin 0 27 12 0 0){
DA(orCat 0 12 12 0 0);
DA(orIdent 0 13 12 0 0);
}
DA(ctlNum 0 6 12 0 0);
DA(T 0 22 12 0 0);
DA(Test 0 0 12 0 0);
}
DA(stVal 0 0 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
DA(ctlModel 0 12 4 0 0)=0; DA(ctlModel 0 12 4 0 0)=3;
} }
DO(Str 0){ DO(Ind1 0){
DA(general 0 0 0 1 0); DA(stVal 0 0 0 1 0);
DA(dirGeneral 0 12 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
} }
DO(Op 0){ DO(Ind2 0){
DA(general 0 0 0 1 0); DA(stVal 0 0 0 1 0);
DA(q 0 23 0 2 0); DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0); DA(t 0 22 0 0 0);
} }
DO(OpDlTmms 0){ DO(Ind3 0){
DA(setVal 0 3 2 1 0); DA(stVal 0 0 0 1 0);
DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0);
} }
DO(RsDlTmms 0){ DO(Ind4 0){
DA(setVal 0 3 2 1 0); DA(stVal 0 0 0 1 0);
DA(q 0 23 0 2 0);
DA(t 0 22 0 0 0);
} }
} }
} }

@ -1475,7 +1475,7 @@ IedServer_setWaitForExecutionHandler(IedServer self, DataObject* node, ControlWa
* \param self the instance of IedServer to operate on. * \param self the instance of IedServer to operate on.
* \param node the controllable data object handle * \param node the controllable data object handle
* \param handler a callback function of type ControlHandler * \param handler a callback function of type ControlHandler
* \param parameter a user provided parameter that is passed to the control handler. * \param parameter a user provided parameter that is passed to the callback handler.
*/ */
LIB61850_API void LIB61850_API void
IedServer_setSelectStateChangedHandler(IedServer self, DataObject* node, ControlSelectStateChangedHandler handler, void* parameter); IedServer_setSelectStateChangedHandler(IedServer self, DataObject* node, ControlSelectStateChangedHandler handler, void* parameter);

Loading…
Cancel
Save