static Algorithm() { string configurationPathName = (@"C:\Users\Chetan\Documents\openECA Projects\Zhijie\LVC20170203\Data\Configurations_test1.xml"); vca = new VoltVarControllerAdapter(); vca.ConfigurationPathName = configurationPathName; vca.Initialize(); PreviousFrame = new VoltVarController(); PreviousFrame = VoltVarController.DeserializeFromXml(configurationPathName); /* * Testing Files Configurations * test1.xml - Verify if the controller can RAISE both transformers' taps when voltages on both buses are lower than the limit (VLLIM = 114.5kV) * test2.xml - Verify if the controller is still able to operate (VLLIM = 114.5kV), when the other transformer's tap has reached the highest tap position (16) * test3.xml - Verify if the controller can switch ON the capacitor bank when the voltage in Pamplin substation reach the lower limit (Clov = 113.5kV) * test4.xml - Verify if the controller can switch OFF the capacitor bank when the voltage in Crewe substation reach the higher limit (Chiv = 119.7kV) */ }
internal static Output Execute(Inputs inputData, _InputsMeta inputMeta) { Output output = Output.CreateNew(); DateTime runTime = DateTime.UtcNow; #region [ Message Output ] const bool EnableXmlFileLog = false; const bool EnableMainWindowMessageDisplay = true; #endregion #region [ Environment Settings ] string MainFolderPath = (@"C:\Users\niezj\Documents\dom\ShadowSys118\"); string ActionChannelFolderPath = Path.Combine(MainFolderPath, @"ActionChannel"); string DataFolderPath = Path.Combine(MainFolderPath, @"Data"); string LogFolderPath = Path.Combine(MainFolderPath, @"Log"); string ConfigurationFolderPath = Path.Combine(MainFolderPath, @"ShadowSysConfiguration"); string ProjFolderPath = Path.Combine(MainFolderPath, @"ShadowSysLibrary"); string PythonCodeFolderPath = Path.Combine(MainFolderPath, @"PythonCode"); string CaseFileName = "IEEE_118_Bus.sav"; string CsvOutputsFileName = "Outputs.csv"; string ConfigurationFileName = "Configurations.xml"; string InitSysConfigFrameFileName = "init_SysConfigFrame.xml"; string PrevSysConfigFrameFileName = "prev_SysConfigFrame.xml"; string CaseFilePath = Path.Combine(PythonCodeFolderPath, CaseFileName); string CsvOutputsFilePath = Path.Combine(LogFolderPath, CsvOutputsFileName); string ConfigurationFilePath = Path.Combine(ConfigurationFolderPath, ConfigurationFileName); string InitSysConfigFrameFilePath = Path.Combine(ConfigurationFolderPath, InitSysConfigFrameFileName); string PrevSysConfigFrameFilePath = Path.Combine(ConfigurationFolderPath, PrevSysConfigFrameFileName); #endregion #region [ Update Configurations of Controlled Devices ] VoltVarController frame = new VoltVarController(); // Read System Initial Configuration from XML file if (inputData.ResetSignal != 0) { MainWindow.WriteMessage($"Initialized Local Voltage Controller Test #{inputData.ResetSignal}"); InitSysConfigFrameFileName = $"init_SysConfigFrame_test{inputData.ResetSignal}.xml"; InitSysConfigFrameFilePath = Path.Combine(ConfigurationFolderPath, InitSysConfigFrameFileName); frame = VoltVarController.DeserializeFromXml(InitSysConfigFrameFilePath); File.Delete(PrevSysConfigFrameFilePath); ActionsAdapter initAction = new ActionsAdapter(); frame.ExecuteControl(initAction); } else { if (File.Exists(PrevSysConfigFrameFilePath)) { frame = VoltVarController.DeserializeFromXml(PrevSysConfigFrameFilePath); } else { frame = VoltVarController.DeserializeFromXml(InitSysConfigFrameFilePath); } } #endregion ActionsAdapter action = new ActionsAdapter(); frame.SubstationInformation.ConsecCap += 1; frame.SubstationInformation.ConsecTap += 1; frame.SubstationInformation.Ncdel += 1; frame.SubstationInformation.Ntdel += 1; #region [ Receive Control Decision from LVC ] action.ReadFromEcaInputData(inputData); frame.ExecuteControl(action); #endregion #region [ Pending: Avoid logic conflict before execute control ] #endregion #region [ Run Power Flow Calculation using PSS/E ] // Call Python script to run power flow calculation PythonScripts Python = new PythonScripts(); List <string> outputFrameList = new List <string>(); outputFrameList = Python.RunPythonCmd(Path.Combine(PythonCodeFolderPath, "CalculatePowerFlow.py"), MainFolderPath, CaseFileName, CsvOutputsFileName, inputData.LoadIncrementPercentage, frame.ControlTransformers[0].TapV, frame.ControlCapacitorBanks[0].CapBkrV, frame.ControlCapacitorBanks[1].CapBkrV, frame.ControlCapacitorBanks[0].BusBkrV, frame.ControlCapacitorBanks[1].BusBkrV, 0, // RegionalLoadIncrementPercentage frame.ControlCapacitorBanks[0].CapBkrV, // SnB34 frame.ControlCapacitorBanks[2].CapBkrV, // SnB44 frame.ControlCapacitorBanks[3].CapBkrV, // SnB45 frame.ControlCapacitorBanks[4].CapBkrV, // SnB48 frame.ControlCapacitorBanks[5].CapBkrV, // SnB74 frame.ControlCapacitorBanks[6].CapBkrV // SnB105 ); frame.SerializeToXml(PrevSysConfigFrameFilePath); #endregion #region [ Convert Calculated Values to OutputData ] // Read LVC Measurement Values from python outputs output.OutputData.StateTxTapV = Convert.ToInt16(outputFrameList[0]); output.OutputData.StateSn1CapBkrV = Convert.ToInt16(outputFrameList[1]); output.OutputData.StateSn2CapBkrV = Convert.ToInt16(outputFrameList[2]); output.OutputData.StateSn1BusBkrV = Convert.ToInt16(outputFrameList[3]); output.OutputData.StateSn2BusBkrV = Convert.ToInt16(outputFrameList[4]); output.OutputData.MeasTxVoltV = Convert.ToDouble(outputFrameList[5]); output.OutputData.MeasSn1VoltV = Convert.ToDouble(outputFrameList[6]); output.OutputData.MeasSn2VoltV = Convert.ToDouble(outputFrameList[7]); output.OutputData.MeasTxMwV = Convert.ToDouble(outputFrameList[8]); output.OutputData.MeasTxMvrV = Convert.ToDouble(outputFrameList[9]); output.OutputData.MeasGn1MwV = Convert.ToDouble(outputFrameList[10]); output.OutputData.MeasGn1MvrV = Convert.ToDouble(outputFrameList[11]); output.OutputData.MeasGn2MwV = Convert.ToDouble(outputFrameList[12]); output.OutputData.MeasGn2MvrV = Convert.ToDouble(outputFrameList[13]); // Read RVC Measurement Values from python outputs output.OutputData.StateSnB34CapBkrV = Convert.ToInt16(outputFrameList[14]); output.OutputData.StateSnB44CapBkrV = Convert.ToInt16(outputFrameList[15]); output.OutputData.StateSnB45CapBkrV = Convert.ToInt16(outputFrameList[16]); output.OutputData.StateSnB48CapBkrV = Convert.ToInt16(outputFrameList[17]); output.OutputData.StateSnB74CapBkrV = Convert.ToInt16(outputFrameList[18]); output.OutputData.StateSnB105CapBkrV = Convert.ToInt16(outputFrameList[19]); output.OutputData.MeasB1VoltV = Convert.ToDouble(outputFrameList[20]); output.OutputData.MeasB2VoltV = Convert.ToDouble(outputFrameList[21]); output.OutputData.MeasB3VoltV = Convert.ToDouble(outputFrameList[22]); output.OutputData.MeasB4VoltV = Convert.ToDouble(outputFrameList[23]); output.OutputData.MeasB5VoltV = Convert.ToDouble(outputFrameList[24]); output.OutputData.MeasB6VoltV = Convert.ToDouble(outputFrameList[25]); output.OutputData.MeasB7VoltV = Convert.ToDouble(outputFrameList[26]); output.OutputData.MeasB8VoltV = Convert.ToDouble(outputFrameList[27]); output.OutputData.MeasB9VoltV = Convert.ToDouble(outputFrameList[28]); output.OutputData.MeasB10VoltV = Convert.ToDouble(outputFrameList[29]); output.OutputData.MeasB11VoltV = Convert.ToDouble(outputFrameList[30]); output.OutputData.MeasB12VoltV = Convert.ToDouble(outputFrameList[31]); output.OutputData.MeasB13VoltV = Convert.ToDouble(outputFrameList[32]); output.OutputData.MeasB14VoltV = Convert.ToDouble(outputFrameList[33]); output.OutputData.MeasB15VoltV = Convert.ToDouble(outputFrameList[34]); output.OutputData.MeasB16VoltV = Convert.ToDouble(outputFrameList[35]); output.OutputData.MeasB17VoltV = Convert.ToDouble(outputFrameList[36]); output.OutputData.MeasB18VoltV = Convert.ToDouble(outputFrameList[37]); output.OutputData.MeasB19VoltV = Convert.ToDouble(outputFrameList[38]); output.OutputData.MeasB20VoltV = Convert.ToDouble(outputFrameList[39]); output.OutputData.MeasB21VoltV = Convert.ToDouble(outputFrameList[40]); output.OutputData.MeasB22VoltV = Convert.ToDouble(outputFrameList[41]); output.OutputData.MeasB23VoltV = Convert.ToDouble(outputFrameList[42]); output.OutputData.MeasB24VoltV = Convert.ToDouble(outputFrameList[43]); output.OutputData.MeasB25VoltV = Convert.ToDouble(outputFrameList[44]); output.OutputData.MeasB26VoltV = Convert.ToDouble(outputFrameList[45]); output.OutputData.MeasB27VoltV = Convert.ToDouble(outputFrameList[46]); output.OutputData.MeasB28VoltV = Convert.ToDouble(outputFrameList[47]); output.OutputData.MeasB29VoltV = Convert.ToDouble(outputFrameList[48]); output.OutputData.MeasB30VoltV = Convert.ToDouble(outputFrameList[49]); output.OutputData.MeasB31VoltV = Convert.ToDouble(outputFrameList[50]); output.OutputData.MeasB32VoltV = Convert.ToDouble(outputFrameList[51]); output.OutputData.MeasB33VoltV = Convert.ToDouble(outputFrameList[52]); output.OutputData.MeasB34VoltV = Convert.ToDouble(outputFrameList[53]); output.OutputData.MeasB35VoltV = Convert.ToDouble(outputFrameList[54]); output.OutputData.MeasB36VoltV = Convert.ToDouble(outputFrameList[55]); output.OutputData.MeasB37VoltV = Convert.ToDouble(outputFrameList[56]); output.OutputData.MeasB38VoltV = Convert.ToDouble(outputFrameList[57]); output.OutputData.MeasB39VoltV = Convert.ToDouble(outputFrameList[58]); output.OutputData.MeasB40VoltV = Convert.ToDouble(outputFrameList[59]); output.OutputData.MeasB41VoltV = Convert.ToDouble(outputFrameList[60]); output.OutputData.MeasB42VoltV = Convert.ToDouble(outputFrameList[61]); output.OutputData.MeasB43VoltV = Convert.ToDouble(outputFrameList[62]); output.OutputData.MeasB44VoltV = Convert.ToDouble(outputFrameList[63]); output.OutputData.MeasB45VoltV = Convert.ToDouble(outputFrameList[64]); output.OutputData.MeasB46VoltV = Convert.ToDouble(outputFrameList[65]); output.OutputData.MeasB47VoltV = Convert.ToDouble(outputFrameList[66]); output.OutputData.MeasB48VoltV = Convert.ToDouble(outputFrameList[67]); output.OutputData.MeasB49VoltV = Convert.ToDouble(outputFrameList[68]); output.OutputData.MeasB50VoltV = Convert.ToDouble(outputFrameList[69]); output.OutputData.MeasB51VoltV = Convert.ToDouble(outputFrameList[70]); output.OutputData.MeasB52VoltV = Convert.ToDouble(outputFrameList[71]); output.OutputData.MeasB53VoltV = Convert.ToDouble(outputFrameList[72]); output.OutputData.MeasB54VoltV = Convert.ToDouble(outputFrameList[73]); output.OutputData.MeasB55VoltV = Convert.ToDouble(outputFrameList[74]); output.OutputData.MeasB56VoltV = Convert.ToDouble(outputFrameList[75]); output.OutputData.MeasB57VoltV = Convert.ToDouble(outputFrameList[76]); output.OutputData.MeasB58VoltV = Convert.ToDouble(outputFrameList[77]); output.OutputData.MeasB59VoltV = Convert.ToDouble(outputFrameList[78]); output.OutputData.MeasB60VoltV = Convert.ToDouble(outputFrameList[79]); output.OutputData.MeasB61VoltV = Convert.ToDouble(outputFrameList[80]); output.OutputData.MeasB62VoltV = Convert.ToDouble(outputFrameList[81]); output.OutputData.MeasB63VoltV = Convert.ToDouble(outputFrameList[82]); output.OutputData.MeasB64VoltV = Convert.ToDouble(outputFrameList[83]); output.OutputData.MeasB65VoltV = Convert.ToDouble(outputFrameList[84]); output.OutputData.MeasB66VoltV = Convert.ToDouble(outputFrameList[85]); output.OutputData.MeasB67VoltV = Convert.ToDouble(outputFrameList[86]); output.OutputData.MeasB68VoltV = Convert.ToDouble(outputFrameList[87]); output.OutputData.MeasB69VoltV = Convert.ToDouble(outputFrameList[88]); output.OutputData.MeasB70VoltV = Convert.ToDouble(outputFrameList[89]); output.OutputData.MeasB71VoltV = Convert.ToDouble(outputFrameList[90]); output.OutputData.MeasB72VoltV = Convert.ToDouble(outputFrameList[91]); output.OutputData.MeasB73VoltV = Convert.ToDouble(outputFrameList[92]); output.OutputData.MeasB74VoltV = Convert.ToDouble(outputFrameList[93]); output.OutputData.MeasB75VoltV = Convert.ToDouble(outputFrameList[94]); output.OutputData.MeasB76VoltV = Convert.ToDouble(outputFrameList[95]); output.OutputData.MeasB77VoltV = Convert.ToDouble(outputFrameList[96]); output.OutputData.MeasB78VoltV = Convert.ToDouble(outputFrameList[97]); output.OutputData.MeasB79VoltV = Convert.ToDouble(outputFrameList[98]); output.OutputData.MeasB80VoltV = Convert.ToDouble(outputFrameList[99]); output.OutputData.MeasB81VoltV = Convert.ToDouble(outputFrameList[100]); output.OutputData.MeasB82VoltV = Convert.ToDouble(outputFrameList[101]); output.OutputData.MeasB83VoltV = Convert.ToDouble(outputFrameList[102]); output.OutputData.MeasB84VoltV = Convert.ToDouble(outputFrameList[103]); output.OutputData.MeasB85VoltV = Convert.ToDouble(outputFrameList[104]); output.OutputData.MeasB86VoltV = Convert.ToDouble(outputFrameList[105]); output.OutputData.MeasB87VoltV = Convert.ToDouble(outputFrameList[106]); output.OutputData.MeasB88VoltV = Convert.ToDouble(outputFrameList[107]); output.OutputData.MeasB89VoltV = Convert.ToDouble(outputFrameList[108]); output.OutputData.MeasB90VoltV = Convert.ToDouble(outputFrameList[109]); output.OutputData.MeasB91VoltV = Convert.ToDouble(outputFrameList[110]); output.OutputData.MeasB92VoltV = Convert.ToDouble(outputFrameList[111]); output.OutputData.MeasB93VoltV = Convert.ToDouble(outputFrameList[112]); output.OutputData.MeasB94VoltV = Convert.ToDouble(outputFrameList[113]); output.OutputData.MeasB95VoltV = Convert.ToDouble(outputFrameList[114]); output.OutputData.MeasB96VoltV = Convert.ToDouble(outputFrameList[115]); output.OutputData.MeasB97VoltV = Convert.ToDouble(outputFrameList[116]); output.OutputData.MeasB98VoltV = Convert.ToDouble(outputFrameList[117]); output.OutputData.MeasB99VoltV = Convert.ToDouble(outputFrameList[118]); output.OutputData.MeasB100VoltV = Convert.ToDouble(outputFrameList[119]); output.OutputData.MeasB101VoltV = Convert.ToDouble(outputFrameList[120]); output.OutputData.MeasB102VoltV = Convert.ToDouble(outputFrameList[121]); output.OutputData.MeasB103VoltV = Convert.ToDouble(outputFrameList[122]); output.OutputData.MeasB104VoltV = Convert.ToDouble(outputFrameList[123]); output.OutputData.MeasB105VoltV = Convert.ToDouble(outputFrameList[124]); output.OutputData.MeasB106VoltV = Convert.ToDouble(outputFrameList[125]); output.OutputData.MeasB107VoltV = Convert.ToDouble(outputFrameList[126]); output.OutputData.MeasB108VoltV = Convert.ToDouble(outputFrameList[127]); output.OutputData.MeasB109VoltV = Convert.ToDouble(outputFrameList[128]); output.OutputData.MeasB110VoltV = Convert.ToDouble(outputFrameList[129]); output.OutputData.MeasB111VoltV = Convert.ToDouble(outputFrameList[130]); output.OutputData.MeasB112VoltV = Convert.ToDouble(outputFrameList[131]); output.OutputData.MeasB113VoltV = Convert.ToDouble(outputFrameList[132]); output.OutputData.MeasB114VoltV = Convert.ToDouble(outputFrameList[133]); output.OutputData.MeasB115VoltV = Convert.ToDouble(outputFrameList[134]); output.OutputData.MeasB116VoltV = Convert.ToDouble(outputFrameList[135]); output.OutputData.MeasB117VoltV = Convert.ToDouble(outputFrameList[136]); output.OutputData.MeasB118VoltV = Convert.ToDouble(outputFrameList[137]); output.OutputData.StateLoad = Convert.ToDouble(inputData.LoadIncrementPercentage); #endregion try { // TODO: Implement your algorithm here... // You can also write messages to the main window: #region [ Write Xml Log File ] if (EnableXmlFileLog) { string ConfigFrameXMLLogFileName = $"Log_SysConfigFrame_{DateTime.UtcNow:yyMMdd_HHmmss}.xml"; string ConfigFrameXMLLogFilePath = Path.Combine(LogFolderPath, ConfigFrameXMLLogFileName); frame.SerializeToXml(ConfigFrameXMLLogFilePath); } #endregion #region [ Write openECA Client Windows Message ] if (EnableMainWindowMessageDisplay) { StringBuilder _message = new StringBuilder(); _message.AppendLine($" ================ ShadowSys Analytics ================"); _message.AppendLine($" Run Time: {runTime:yyyy-MM-dd HH:mm:ss.fff}"); _message.AppendLine($" Completion Time: {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss.fff}"); _message.AppendLine($" InputData Timestamp: {inputMeta.LoadIncrementPercentage.Timestamp:yyyy-MM-dd HH:mm:ss.fff}"); //_message.AppendLine($" ------------------ CsvInputAdapter ------------------ "); //_message.AppendLine($" LoadIncrementPercentage: {inputData.LoadIncrementPercentage:0.0000} %"); //_message.AppendLine($" ------------------- ActionChannel ------------------- "); //_message.AppendLine($" ActTxRaise: {inputData.ActTxRaise}"); //_message.AppendLine($" ActTxLower: {inputData.ActTxLower}"); //_message.AppendLine($" ActSn1Close: {inputData.ActSn1Close}"); //_message.AppendLine($" ActSn1Trip: {inputData.ActSn1Trip}"); //_message.AppendLine($" ActSn2Close: {inputData.ActSn2Close}"); //_message.AppendLine($" ActSn2Trip: {inputData.ActSn2Trip}"); //_message.AppendLine($" ---------------- MeasurementChannel ----------------- "); //_message.AppendLine($" MeasTxVoltV: {output.OutputData.MeasTxVoltV:0.000} Volts"); //_message.AppendLine($" MeasSn1VoltV: {output.OutputData.MeasSn1VoltV:0.000} Volts"); //_message.AppendLine($" MeasSn2VoltV: {output.OutputData.MeasSn2VoltV:0.000} Volts"); //_message.AppendLine($" MeasTxMwV: {output.OutputData.MeasTxMwV:0.000} MW"); //_message.AppendLine($" MeasTxMvrV: {output.OutputData.MeasTxMvrV:0.000} MVar"); //_message.AppendLine($" MeasGn1MwV: {output.OutputData.MeasGn1MwV:0.000} MW"); //_message.AppendLine($" MeasGn1MvrV: {output.OutputData.MeasGn1MvrV:0.000} MVar"); //_message.AppendLine($" MeasGn2MwV: {output.OutputData.MeasGn2MwV:0.000} MW"); //_message.AppendLine($" MeasGn2MvrV: {output.OutputData.MeasGn2MvrV:0.000} MVar"); //_message.AppendLine($" ------------------- StateChannel -------------------- "); _message.AppendLine($" StateLoad: {output.OutputData.StateLoad} "); //_message.AppendLine($" StateTxTapV: {output.OutputData.StateTxTapV}"); //_message.AppendLine($" StateSn1CapBkrV: {output.OutputData.StateSn1CapBkrV}"); //_message.AppendLine($" StateSn2CapBkrV: {output.OutputData.StateSn2CapBkrV}"); //_message.AppendLine($" StateSn1BusBkrV: {output.OutputData.StateSn1BusBkrV}"); //_message.AppendLine($" StateSn2BusBkrV: {output.OutputData.StateSn2BusBkrV}"); //_message.AppendLine($" StateSnB34CapBkrV: {output.OutputData.StateSnB34CapBkrV}"); //_message.AppendLine($" StateSnB44CapBkrV: {output.OutputData.StateSnB44CapBkrV}"); //_message.AppendLine($" StateSnB45CapBkrV: {output.OutputData.StateSnB45CapBkrV}"); //_message.AppendLine($" StateSnB48CapBkrV: {output.OutputData.StateSnB48CapBkrV}"); //_message.AppendLine($" StateSnB74CapBkrV: {output.OutputData.StateSnB74CapBkrV}"); //_message.AppendLine($" StateSnB105CapBkrV: {output.OutputData.StateSnB105CapBkrV}"); _message.AppendLine($" ------------------ RVCActionChannel ----------------- "); _message.AppendLine($" * : | 34 | 44 | 45 | 48 | 74 | 105 |"); _message.AppendLine($" ActSnB*Close: | {inputData.ActSnB34Close} | {inputData.ActSnB44Close} | {inputData.ActSnB45Close} | {inputData.ActSnB48Close} | {inputData.ActSnB74Close} | {inputData.ActSnB105Close} |"); _message.AppendLine($" ActSnB*Trip: | {inputData.ActSnB34Trip} | {inputData.ActSnB44Trip} | {inputData.ActSnB45Trip} | {inputData.ActSnB48Trip} | {inputData.ActSnB74Trip} | {inputData.ActSnB105Trip} |"); _message.AppendLine($" StateSnB*CapBkrV: | {output.OutputData.StateSnB34CapBkrV} | {output.OutputData.StateSnB44CapBkrV} | {output.OutputData.StateSnB45CapBkrV} | {output.OutputData.StateSnB48CapBkrV} | {output.OutputData.StateSnB74CapBkrV} | {output.OutputData.StateSnB105CapBkrV} |"); _message.AppendLine($" ====================================================="); MainWindow.WriteMessage(_message.ToString()); } #endregion } catch (Exception ex) { // Display exceptions to the main window MainWindow.WriteError(new InvalidOperationException($"Algorithm exception: {ex.Message}", ex)); } return(output); }
public void Initialize() { m_inputFrame = VoltVarController.DeserializeFromXml(m_configurationPathName); m_logMessage = null; }
public static void Main() { // set the directory string testCase = (@"C:\Users\Duotong\Desktop\2019SUM\LocalVoltageControl\Test1\\"); string inputdatafolder = (@"C:\Users\Duotong\Desktop\2019SUM\LocalVoltageControl\Test1\Data\\"); string logsfolder = (@"C:\Users\Duotong\Desktop\2019SUM\LocalVoltageControl\Test1\Logs\\"); string pythonCmdPath = (@"C:\Users\Duotong\Desktop\2019SUM\LocalVoltageControl\Test1\pythonCode\\"); // Set the Path for BenchMark Model and Configuration string caseName = testCase + "2019SUM_2013Series_Updated_forLocalVoltageControl_BenchMark.sav"; string testCaseName = testCase + "2019SUM_2013Series_Updated_forLocalVoltageControl_BenchMark_test.sav"; string configurationPathName = inputdatafolder + "Configurations.xml"; VoltVarControllerAdapter VCAdapter = new VoltVarControllerAdapter(); ReadInputAdapter ReadIn = new ReadInputAdapter(); VoltVarController Frame = new VoltVarController(); PythonScripts Python = new PythonScripts(); VoltVarController PreviousFrame = new VoltVarController(); #region [ Initialization ] Python.CleanCmd(pythonCmdPath + "CleanData.py", inputdatafolder, logsfolder, pythonCmdPath, caseName, testCaseName); // clean the inputd data, delete the logs, and copy the benchmark model VCAdapter.ConfigurationPathName = configurationPathName; VCAdapter.Initialize(); PreviousFrame = VoltVarController.DeserializeFromXml(configurationPathName); #endregion #region [ Execute Program for Each Frame ] for (int i = 0; i < 30; i++) { int rowNumber = i + 1; string inputFileName = inputdatafolder + String.Format("{0:yyyy-MM-dd hh-mm-ss}_{1}", DateTime.UtcNow, rowNumber) + ".xml"; string logsFileName = logsfolder + String.Format("{0:yyyy-MM-dd hh-mm-ss}_{1}", DateTime.UtcNow, rowNumber) + " Logs.xml"; Frame = ReadIn.ReadFrame(inputdatafolder, inputFileName, rowNumber); VCAdapter.PublishFrame(Frame, inputdatafolder, PreviousFrame); PreviousFrame = VCAdapter.InputFrame; VCAdapter.InputFrame.SerializeToXml(inputFileName); VCAdapter.SerializeToXml(logsFileName); #region [ Control PSSE ] try { Python.RunCmd(pythonCmdPath + "DVPScaleLoad.py", VCAdapter.LogMessage, inputdatafolder, VCAdapter.InputFrame.SubstationInformation, testCaseName, VCAdapter.InputFrame.ControlCapacitorBanks[0], VCAdapter.InputFrame.ControlCapacitorBanks[1]); //Console.ReadLine(); //if (i == 0) //{ // Console.ReadLine(); //} } catch { Console.ReadLine(); } #endregion } #endregion }
internal static Output Execute(Inputs inputData, _InputsMeta inputMeta) { Output output = Output.CreateNew(); DateTime runTime = DateTime.UtcNow; try { // TODO: Implement your algorithm here... // You can also write messages to the main window: #region [ Message Output ] bool EnableVoltageControlsMessageOutput = true; #endregion #region [ Environment Settings ] string MainFolderPath = (@"C:\Users\niezj\Documents\dom\LVC118\"); string DataFolderPath = Path.Combine(MainFolderPath, @"Data"); string LogFolderPath = Path.Combine(MainFolderPath, @"Log"); string ActionChannelFolderPath = Path.Combine(MainFolderPath, @"ActionChannel"); string[] LogFileNameList = Directory.GetFiles(LogFolderPath, "CtrlDecisionLog_*.xml"); string LogFileName = $"CtrlDecisionLog_{LogFileNameList.Length + 1:000}_{DateTime.UtcNow:yyyyMMdd_HHmmssfff}.xml"; string LogFilePath = Path.Combine(LogFolderPath, LogFileName); #endregion VoltVarControllerAdapter vca; VoltVarController PreviousFrame; /* * Testing Files Configurations * test1.xml - Verify if the controller can RAISE both transformers' taps when voltages on both buses are lower than the limit (VLLIM = 114.5kV) * test2.xml - Verify if the controller is still able to operate (VLLIM = 114.5kV), when the other transformer's tap has reached the highest tap position (16) * test3.xml - Verify if the controller can switch ON the capacitor bank when the voltage in Pamplin substation reach the lower limit (Clov = 113.5kV) * test4.xml - Verify if the controller can switch OFF the capacitor bank when the voltage in Crewe substation reach the higher limit (Chiv = 119.7kV) */ string configurationPathName = (@"C:\Users\niezj\Documents\dom\ShadowSys118\ShadowSysConfiguration\prev_SysConfigFrame.xml"); vca = new VoltVarControllerAdapter() { ConfigurationPathName = configurationPathName }; vca.Initialize(); PreviousFrame = new VoltVarController(); PreviousFrame = VoltVarController.DeserializeFromXml(configurationPathName); // Extract inputData from openECA then Call SubRoutine vca.GetData(inputData, inputMeta, PreviousFrame); // Logging control decision to *.xml files vca.SerializeToXml(LogFilePath); // Store Current vca.InputFrame to previous.InputFrame for the next InputFrame //PreviousFrame = vca.InputFrame; //PreviousFrame.SerializeToXml(@"C:\Users\niezj\Documents\dom\ShadowSys118\ShadowSysConfiguration\ctrl_SysConfigFrame.xml"); #region [ Mimic an ActionChannel ] ActionsAdapter actChannel = new ActionsAdapter(); bool actFlag = false; if (vca.InputFrame.ControlTransformers[0].TapV != PreviousFrame.ControlTransformers[0].TapV) { actFlag = true; if (vca.InputFrame.ControlTransformers[0].TapV > PreviousFrame.ControlTransformers[0].TapV) { actChannel.ActTxRaise = 1; } else { actChannel.ActTxLower = 1; } } if (vca.InputFrame.ControlCapacitorBanks[0].CapBkrV != PreviousFrame.ControlCapacitorBanks[0].CapBkrV) { actFlag = true; switch (vca.InputFrame.ControlCapacitorBanks[0].CapBkrV) { case 1: actChannel.ActSn1Close = 1; break; case 0: actChannel.ActSn1Trip = 1; break; default: break; } } if (vca.InputFrame.ControlCapacitorBanks[1].CapBkrV != PreviousFrame.ControlCapacitorBanks[1].CapBkrV) { actFlag = true; switch (vca.InputFrame.ControlCapacitorBanks[1].CapBkrV) { case 1: actChannel.ActSn2Close = 1; break; case 0: actChannel.ActSn2Trip = 1; break; default: break; } } if (actFlag) { actChannel.SerializeToXml(Path.Combine(ActionChannelFolderPath, "act.xml")); // Local //actChannel.SerializeToXml(@"C:\Users\niezj\Documents\dom\ShadowSys118\ActionChannel\act.xml"); // External } #endregion #region [ Update Timestamps for Control Signals ] output.OutputData.ActTxRaise = actChannel.ActTxRaise; output.OutputData.ActTxLower = actChannel.ActTxLower; output.OutputData.ActSn1Close = actChannel.ActSn1Close; output.OutputData.ActSn1Trip = actChannel.ActSn1Trip; output.OutputData.ActSn2Close = actChannel.ActSn2Close; output.OutputData.ActSn2Trip = actChannel.ActSn2Trip; output.OutputMeta.ActTxRaise = UpdateTime(output.OutputMeta.ActTxRaise); output.OutputMeta.ActTxLower = UpdateTime(output.OutputMeta.ActTxLower); output.OutputMeta.ActSn1Close = UpdateTime(output.OutputMeta.ActSn1Close); output.OutputMeta.ActSn1Trip = UpdateTime(output.OutputMeta.ActSn1Trip); output.OutputMeta.ActSn2Close = UpdateTime(output.OutputMeta.ActSn2Close); output.OutputMeta.ActSn2Trip = UpdateTime(output.OutputMeta.ActSn2Trip); #endregion #region [ Write openECA Client Windows Message] if (EnableVoltageControlsMessageOutput) { StringBuilder _message = new StringBuilder(); _message.AppendLine($" ================= LVC118 Analytics ================== "); _message.AppendLine($" Run Time: {runTime:yyyy-MM-dd HH:mm:ss.fff}"); _message.AppendLine($" Completion Time: {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss.fff}"); _message.AppendLine($" InputData Timestamp: {inputMeta.MeasGn1MvrV.Timestamp:yyyy-MM-dd HH:mm:ss.fff}"); _message.AppendLine($" OutputData Timestamp: {output.OutputMeta.ActTxRaise.Timestamp:yyyy-MM-dd HH:mm:ss.fff}"); //_message.AppendLine($" ------------------ CsvInputAdapter ------------------ "); _message.AppendLine($" ------------------- ActionChannel ------------------- "); _message.AppendLine($" ActTxRaise: {output.OutputData.ActTxRaise}"); _message.AppendLine($" ActTxLower: {output.OutputData.ActTxLower}"); _message.AppendLine($" ActSn1Close: {output.OutputData.ActSn1Close}"); _message.AppendLine($" ActSn1Trip: {output.OutputData.ActSn1Trip}"); _message.AppendLine($" ActSn2Close: {output.OutputData.ActSn2Close}"); _message.AppendLine($" ActSn2Trip: {output.OutputData.ActSn2Trip}"); _message.AppendLine($" ---------------- MeasurementChannel ----------------- "); _message.AppendLine($" MeasTxVoltV: {inputData.MeasTxVoltV:0.000} Volts"); _message.AppendLine($" MeasSn1VoltV: {inputData.MeasSn1VoltV:0.000} Volts"); _message.AppendLine($" MeasSn2VoltV: {inputData.MeasSn2VoltV:0.000} Volts"); _message.AppendLine($" MeasTxMwV: {inputData.MeasTxMwV:0.000} MW"); _message.AppendLine($" MeasTxMvrV: {inputData.MeasTxMvrV:0.000} MVar"); _message.AppendLine($" MeasGn1MwV: {inputData.MeasGn1MwV:0.000} MW"); _message.AppendLine($" MeasGn1MvrV: {inputData.MeasGn1MvrV:0.000} MVar"); _message.AppendLine($" MeasGn2MwV: {inputData.MeasGn2MwV:0.000} MW"); _message.AppendLine($" MeasGn2MvrV: {inputData.MeasGn2MvrV:0.000} MVar"); _message.AppendLine($" ------------------- StateChannel -------------------- "); _message.AppendLine($" StateTxTapV: {inputData.StateTxTapV}"); _message.AppendLine($" StateSn1CapBkrV: {inputData.StateSn1CapBkrV}"); _message.AppendLine($" StateSn2CapBkrV: {inputData.StateSn2CapBkrV}"); _message.AppendLine($" StateSn1BusBkrV: {inputData.StateSn1BusBkrV}"); _message.AppendLine($" StateSn2BusBkrV: {inputData.StateSn2BusBkrV}"); _message.AppendLine($" -------------- Control Decision Message ------------- "); _message.AppendLine($" {vca.LogMessage}"); _message.AppendLine($" ===================================================== "); MainWindow.WriteMessage(_message.ToString()); } #endregion } catch (Exception ex) { // Display exceptions to the main window MainWindow.WriteError(new InvalidOperationException($"Algorithm exception: {ex.Message}", ex)); } return(output); }