public void UpdateServerData(NodeData data, NodeData quality, bool updateQuality, NodeData time, bool updateTimestamp) { DataAttribute da = (DataAttribute)data.SCLServerModelObject; IedServer iedSvr = GetIedServer(); if (da != null && iedSvr != null) { iedSvr.LockDataModel(); if (quality != null && updateQuality) { DataAttribute daq = (DataAttribute)quality.SCLServerModelObject; if (daq != null) { daq.UpdateValue(iedSvr, quality.DataValue); } } if (time != null && updateTimestamp) { DataAttribute dat = (DataAttribute)time.SCLServerModelObject; time.DataValue = DateTime.Now; if (dat != null) { dat.UpdateValue(iedSvr, Util.GetTimeInMs()); } } da.UpdateValue(iedSvr, data.DataValue); iedSvr.UnlockDataModel(); } }
private void TestServer(object obj) { SCLServer self = (SCLServer)obj; IedModel model = new IedModel("bubak"); LogicalDevice ldevice1 = new LogicalDevice("strasidlo", model); LogicalNode lln0 = new LogicalNode("LLN0", ldevice1); DataObject lln0_mod = CDCFactory.CDC_ENG("Mod", lln0, CDCOptions.NONE); DataObject lln0_health = CDCFactory.CDC_ENG("Health", lln0, CDCOptions.NONE); SettingGroupControlBlock sgcb = new SettingGroupControlBlock(lln0, 1, 1); /* Add a temperature sensor LN */ LogicalNode ttmp1 = new LogicalNode("TTMP1", ldevice1); DataObject ttmp1_tmpsv = CDCFactory.CDC_SAV("TmpSv", ttmp1, 0, false); DataAttribute temperatureValue = ttmp1_tmpsv.GetChild_DataAttribute("instMag.f"); DataAttribute temperatureTimestamp = ttmp1_tmpsv.GetChild_DataAttribute("t"); IEC61850.Server.DataSet dataSet = new IEC61850.Server.DataSet("events", lln0); DataSetEntry dse = new DataSetEntry(dataSet, "TTMP1$MX$TmpSv$instMag$f", -1, null); IEC61850.Common.ReportOptions rptOptions = IEC61850.Common.ReportOptions.SEQ_NUM | IEC61850.Common.ReportOptions.TIME_STAMP | IEC61850.Common.ReportOptions.REASON_FOR_INCLUSION; IEC61850.Server.ReportControlBlock rcb1 = new IEC61850.Server.ReportControlBlock("events01", lln0, "events01", false, null, 1, IEC61850.Common.TriggerOptions.DATA_CHANGED, rptOptions, 50, 0); IEC61850.Server.ReportControlBlock rcb2 = new IEC61850.Server.ReportControlBlock("events02", lln0, "events02", true, null, 1, IEC61850.Common.TriggerOptions.DATA_CHANGED | IEC61850.Common.TriggerOptions.GI, rptOptions, 50, 0); IedServer server = new IedServer(model); server.Start(tcpPort); logger.LogInfo(String.Format("SCL Server Started at port 102!!!")); float val = 0.0f; while (_run) { server.LockDataModel(); temperatureValue.MmsValue.SetFloat(val); temperatureTimestamp.MmsValue.SetUtcTimeMs(Util.GetTimeInMs()); server.UnlockDataModel(); val += 0.1f; int waitres = WaitHandle.WaitAny(_waitHandles, 500); switch (waitres) { case 0: // endthread self._run = false; break; case WaitHandle.WaitTimeout: break; } } logger.LogInfo(String.Format("SCL Server Finished!!!")); }
private static void UpdateUshort(string path, string value, IedServer iedServer, IedModel iedModel) { iedServer.LockDataModel(); try { ushort str = Convert.ToUInt16(value); iedServer.UpdateQuality((DataAttribute)iedModel.GetModelNodeByShortObjectReference(path), str); } catch { // ignored } iedServer.UnlockDataModel(); }
private static void UpdateDateTime(string path, string value, IedServer iedServer, IedModel iedModel) { iedServer.LockDataModel(); try { DateTime str = Convert.ToDateTime(value); iedServer.UpdateUTCTimeAttributeValue((DataAttribute)iedModel.GetModelNodeByShortObjectReference(path), str); } catch { // ignored } iedServer.UnlockDataModel(); }