using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using Aitex.Core.RT.Device; using Aitex.Core.RT.Event; using Aitex.Core.RT.IOCore; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.DataCenter; using MECF.Framework.Common.Equipment; namespace SicPM1.Routines { public class PMPcCalibrationRoutine : PMBaseRoutine { private PM1Module _pm1Module; public double pc4FB1; public double pc4FB2; public double pc4FB3; public double pc5FB1; public double pc6FB2; public double pc7FB3; public List pc4FeedBack = new List(); public List pc5FeedBack = new List(); public List pc6FeedBack = new List(); public List pc7FeedBack = new List(); private Stopwatch _swTimer = new Stopwatch(); public int ElapsedTime { get { return _swTimer.IsRunning ? (int)(_swTimer.ElapsedMilliseconds / 1000) : 0; } } enum RoutineStep { SetCloseV41, SetOpenV42, SetCloseV55, SetOpenV56, SetCloseV59, SetOpenV60, SetPC4Mode, TimeDelay1, SetPC4Default, TimeDelay2, SetOpenV41, SetPC5Close, TimeDelay3, SetClose2V41, SetPC5Mode, TimeDelay4, SetPC5Default, TimeDelay5, SetOpenV55, SetPC6Close, TimeDelay6, SetClose2V55, SetPC6Mode, TimeDelay7, SetPC6Default, TimeDelay8, SetOpenV59, SetPC7Close, TimeDelay9, SetClose2V59, SetPC7Mode, TimeDelay10, SetPC7Default, GetPC45FeedBack, SetPC5Offset, GetPC46FeedBack, SetPC6Offset, GetPC47FeedBack, SetPC7Offset } public PMPcCalibrationRoutine(ModuleName module, PM1Module pm1) : base(module, pm1) { Module = module.ToString(); Name = "PcCalibration"; _pm1Module = pm1; } public override Result Start(params object[] objs) { _swTimer.Restart(); Reset(); Notify("Start"); return Result.RUN; } public override Result Monitor() { try { //CloseV41 SetIoValueByName((int)RoutineStep.SetCloseV41, "V41", false, 2); //OpenV42 SetIoValueByName((int)RoutineStep.SetOpenV42, "V42", true, 2); //CloseV55 SetIoValueByName((int)RoutineStep.SetCloseV55, "V55", false, 2); //OpenV56 SetIoValueByName((int)RoutineStep.SetOpenV56, "V56", true, 2); //CloseV59 SetIoValueByName((int)RoutineStep.SetCloseV59, "V59", false, 2); //OpenV60 SetIoValueByName((int)RoutineStep.SetOpenV60, "V60", true, 2); //PC4设置为默认值 SetPcModeToNormal((int)RoutineStep.SetPC4Mode, new List { 4 }); TimeDelay((int)RoutineStep.TimeDelay1, 1); SetPcToDefault((int)RoutineStep.SetPC4Default, new List { 4 }); //等待2S TimeDelay((int)RoutineStep.TimeDelay2, 2); //OpenV41 SetIoValueByName((int)RoutineStep.SetOpenV41, "V41", true, 2); //ClosePC5 SetPcModel((int)RoutineStep.SetPC5Close, new List { 5 }, Aitex.Core.Common.DeviceData.PcCtrlMode.Close); //等待5S TimeDelay((int)RoutineStep.TimeDelay3, 5); //计算10s PC4 PC5 反馈值平均数 GetPCFeedBackByName((int)RoutineStep.GetPC45FeedBack, "Pressure5", 12); SetPcOffsetToConfig((int)RoutineStep.SetPC5Offset, "Pressure5"); //CloseV41 2 SetIoValueByName((int)RoutineStep.SetClose2V41, "V41", false, 2); //PC5设置为默认值 SetPcModeToNormal((int)RoutineStep.SetPC5Mode, new List { 5 }); TimeDelay((int)RoutineStep.TimeDelay4, 1); SetPcToDefault((int)RoutineStep.SetPC5Default, new List { 5 }); //等待2S TimeDelay((int)RoutineStep.TimeDelay5, 2); //OpenV55 SetIoValueByName((int)RoutineStep.SetOpenV55, "V55", true, 2); //ClosePC6 SetPcModel((int)RoutineStep.SetPC6Close, new List { 6 }, Aitex.Core.Common.DeviceData.PcCtrlMode.Close); //等待5S TimeDelay((int)RoutineStep.TimeDelay6, 5); //计算10s PC4 PC6 反馈值平均数 GetPCFeedBackByName((int)RoutineStep.GetPC46FeedBack, "Pressure6", 12); SetPcOffsetToConfig((int)RoutineStep.SetPC6Offset, "Pressure6"); //CloseV55 2 SetIoValueByName((int)RoutineStep.SetClose2V55, "V55", false, 2); //PC6设置为默认值 SetPcModeToNormal((int)RoutineStep.SetPC6Mode, new List { 6 }); TimeDelay((int)RoutineStep.TimeDelay7, 1); SetPcToDefault((int)RoutineStep.SetPC6Default, new List { 6 }); //等待2S TimeDelay((int)RoutineStep.TimeDelay8, 2); //OpenV59 SetIoValueByName((int)RoutineStep.SetOpenV59, "V59", true, 2); //ClosePC7 SetPcModel((int)RoutineStep.SetPC7Close, new List { 7 }, Aitex.Core.Common.DeviceData.PcCtrlMode.Close); //等待5S TimeDelay((int)RoutineStep.TimeDelay9, 5); //计算10s PC4 PC6 反馈值平均数 GetPCFeedBackByName((int)RoutineStep.GetPC47FeedBack, "Pressure7", 12); SetPcOffsetToConfig((int)RoutineStep.SetPC7Offset, "Pressure7"); //CloseV59 2 SetIoValueByName((int)RoutineStep.SetClose2V59, "V59", false, 2); //PC7设置为默认值 SetPcModeToNormal((int)RoutineStep.SetPC7Mode, new List { 7 }); TimeDelay((int)RoutineStep.TimeDelay10, 1); SetPcToDefault((int)RoutineStep.SetPC7Default, new List { 7 }); } catch (RoutineBreakException) { return Result.RUN; } catch (RoutineFaildException ex) { if (ex.Message == "Timeout") { Notify("Timeout"); } return Result.FAIL; } _swTimer.Stop(); Notify("Finished"); return Result.DONE; } protected void SetIoValueByName(int id, string ioName, bool close, int timeout) { Tuple ret = ExecuteAndWait(id, () => { Notify((close ? "Open" : "Close") + $"{ioName} value"); _pm1Module.SetIoValue(new System.Collections.Generic.List { ioName }, close); return true; }, () => { return _pm1Module.CheckIoValue(new System.Collections.Generic.List { ioName }, close); }, timeout * 1000); if (ret.Item1) { if (ret.Item2 == Result.FAIL) { throw (new RoutineFaildException()); } else if (ret.Item2 == Result.TIMEOUT) { Stop((close ? "Open" : "Close") + $"{ioName} value timeout, over {timeout} seconds"); throw (new RoutineFaildException()); } else throw (new RoutineBreakException()); } } protected void GetPCFeedBackByName(int id, string ioName, int timeout) { Tuple ret = ExecuteAndWait(id, () => { pc4FeedBack.Clear(); pc5FeedBack.Clear(); pc6FeedBack.Clear(); pc7FeedBack.Clear(); _swTimer.Restart(); Notify($"Get {ioName} FeedBack 10s"); return true; }, () => { pc4FeedBack.Add(PmDevice.Pressure4.FeedBack); if (ioName == "Pressure5") { pc5FeedBack.Add(PmDevice.Pressure5.FeedBack); } else if(ioName == "Pressure6") { pc6FeedBack.Add(PmDevice.Pressure6.FeedBack); } else if (ioName == "Pressure7") { pc7FeedBack.Add(PmDevice.Pressure7.FeedBack); } return ElapsedTime>=10; }, timeout * 1000); if (ret.Item1) { if (ret.Item2 == Result.FAIL) { throw (new RoutineFaildException()); } else if (ret.Item2 == Result.TIMEOUT) { throw (new RoutineFaildException("Timeout")); } else throw (new RoutineBreakException()); } } protected void SetPcOffsetToConfig(int id, string ioName) { Tuple ret = Execute(id, () => { _swTimer.Stop(); double average = 0; if (ioName == "Pressure5") { pc4FB1 = pc4FeedBack.Average(); pc5FB1 = pc5FeedBack.Average(); average = Convert.ToDouble((pc5FB1 - pc4FB1).ToString("0.00")) ; Notify($"PC4FeedBack average: {pc4FB1.ToString("0.00")} , PC5FeedBack average: {pc5FB1.ToString("0.00")}"); //SC.SetItemValue($"PM.{Module}.PC5Offset", average); } else if (ioName == "Pressure6") { pc4FB2 = pc4FeedBack.Average(); pc6FB2 = pc6FeedBack.Average(); average = Convert.ToDouble((pc6FB2 - pc4FB2).ToString("0.00")); Notify($"PC4FeedBack average: {pc4FB2.ToString("0.00")} , PC6FeedBack average: {pc6FB2.ToString("0.00")}"); //SC.SetItemValue($"PM.{Module}.PC6Offset", average); } else if (ioName == "Pressure7") { pc4FB3 = pc4FeedBack.Average(); pc7FB3 = pc7FeedBack.Average(); average = Convert.ToDouble((pc7FB3 - pc4FB3).ToString("0.00")); Notify($"PC4FeedBack average: {pc4FB3.ToString("0.00")} , PC7FeedBack average: {pc7FB3.ToString("0.00")}"); //SC.SetItemValue($"PM.{Module}.PC7Offset", average); } Notify($"Set {ioName} offset {average} to config"); return true; }); if (ret.Item1) { if (ret.Item2 == Result.FAIL) { throw (new RoutineFaildException()); } else throw (new RoutineBreakException()); } } } }