PMAlarmCondition.cs 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291
  1. using Aitex.Core.Common.DeviceData;
  2. using Aitex.Core.RT.DataCenter;
  3. using Aitex.Core.RT.Device.Unit;
  4. using Aitex.Core.RT.Event;
  5. using Aitex.Core.RT.IOCore;
  6. using Aitex.Core.RT.Log;
  7. using Aitex.Core.RT.OperationCenter;
  8. using Aitex.Core.RT.ParameterCenter;
  9. using Aitex.Core.RT.SCCore;
  10. using Aitex.Core.RT.Tolerance;
  11. using Aitex.Core.Util;
  12. using DocumentFormat.OpenXml.Drawing.Charts;
  13. using FurnaceRT.Equipments.PMs.RecipeExecutions;
  14. using FurnaceRT.Equipments.Systems;
  15. using MECF.Framework.Common.CommonData.EnumData;
  16. using MECF.Framework.Common.Equipment;
  17. using MECF.Framework.Common.Event;
  18. using MECF.Framework.Common.OperationCenter;
  19. using System;
  20. using System.Collections;
  21. using System.Collections.Generic;
  22. using System.Diagnostics;
  23. using System.Linq;
  24. using System.Web.ApplicationServices;
  25. using System.Xml;
  26. namespace FurnaceRT.Equipments.PMs
  27. {
  28. public partial class PMModule
  29. {
  30. private string _currentAlarmConditionFileName;
  31. private int _currentAlarmConditionIndex;
  32. private Dictionary<int, AlarmConditionTableParameter> _alarmConditionDic;
  33. private List<AlarmConditionChecker> _heaterChecker;
  34. private List<AlarmConditionChecker> _mfcChecker;
  35. private List<AlarmConditionChecker> _apcChecker;
  36. private List<AlarmConditionChecker> _auxChecker;
  37. private List<AlarmConditionChecker> _hwILKChecker;
  38. private object _alarmConditionLocker = new object();
  39. private bool _isAlarmConditionHasRecipeCommand;//End,Reset,Hold,JumpStep,CallAlarmRecipe,CallAbortRecipe
  40. private Dictionary<string, string> _hardwareInterlockAlarmConditionDic;
  41. private Dictionary<string, string> _clnAlarmConditionDic;
  42. private AlarmEventItem _lastAlarmInAlarmCondition;
  43. private void SetAlarmConditionTableIndex(int index)
  44. {
  45. if (_alarmConditionDic == null)
  46. return;
  47. var ret = _alarmConditionDic.TryGetValue(index, out var currentParameter);
  48. if (!ret)
  49. return;
  50. _currentAlarmConditionIndex = index;
  51. SC.SetItemValueFromString("PM1.AlarmConditionIndex", index.ToString());
  52. //ResetAlarmCondition();
  53. for (int i = 0; i < _heaterChecker.Count; i++)
  54. {
  55. var checker = _heaterChecker[i];
  56. //checker.Parameter = checker.Parameter.Clone(currentParameter.HeaterParameterLst.Find(x => x.Name == checker.Heater.Display));
  57. checker.Parameter = currentParameter.HeaterParameterLst[i];
  58. //checker.ToleranceCheckerWarning.Reset(checker.Parameter.WarningTime);
  59. //checker.ToleranceCheckerAlarm.Reset(checker.Parameter.AlarmTime);
  60. }
  61. for (int i = 0; i < _mfcChecker.Count && i < currentParameter.MFCParameterLst.Count; i++)
  62. {
  63. var checker = _mfcChecker[i];
  64. checker.Parameter = currentParameter.MFCParameterLst[i];
  65. }
  66. for (int i = 0; i < _apcChecker.Count && i < currentParameter.APCParameterLst.Count; i++)
  67. {
  68. var checker = _apcChecker[i];
  69. checker.Parameter = currentParameter.APCParameterLst[i];
  70. }
  71. for (int i = 0; i < _auxChecker.Count && i < currentParameter.AUXParameterLst.Count; i++)
  72. {
  73. var checker = _auxChecker[i];
  74. checker.Parameter = currentParameter.AUXParameterLst[i];
  75. }
  76. for (int i = 0; i < _hwILKChecker.Count && i < currentParameter.InterlockParameterLst.Count; i++)
  77. {
  78. var checker = _hwILKChecker[i];
  79. checker.DIParameter = currentParameter.InterlockParameterLst[i];
  80. }
  81. }
  82. public void ResetAlarmCondition()
  83. {
  84. for (int i = 0; i < _heaterChecker.Count; i++)
  85. {
  86. var checker = _heaterChecker[i];
  87. checker.ToleranceCheckerWarning.RST = true;
  88. checker.ToleranceCheckerAlarm.RST = true;
  89. checker?.DelayTimer.Restart();
  90. }
  91. for (int i = 0; i < _mfcChecker.Count; i++)
  92. {
  93. var checker = _mfcChecker[i];
  94. checker.ToleranceCheckerWarning.RST = true;
  95. checker.ToleranceCheckerAlarm.RST = true;
  96. checker?.DelayTimer.Restart();
  97. }
  98. for (int i = 0; i < _apcChecker.Count; i++)
  99. {
  100. var checker = _apcChecker[i];
  101. checker.ToleranceCheckerWarning.RST = true;
  102. checker.ToleranceCheckerAlarm.RST = true;
  103. checker?.DelayTimer.Restart();
  104. }
  105. for (int i = 0; i < _hwILKChecker.Count; i++)
  106. {
  107. var checker = _hwILKChecker[i];
  108. checker.ToleranceCheckerAlarm.RST = true;
  109. checker?.DelayTimer?.Restart();
  110. }
  111. for (int i = 0; i < _auxChecker.Count; i++)
  112. {
  113. var checker = _auxChecker[i];
  114. if (checker == null)
  115. continue;
  116. checker.ToleranceCheckerWarning.RST = true;
  117. checker.ToleranceCheckerAlarm.RST = true;
  118. checker?.DelayTimer.Restart();
  119. }
  120. }
  121. private void InitAlarmConditionChecker()
  122. {
  123. InitHeaterChecker();
  124. InitMFCChecker();
  125. InitAPCChecker();
  126. InitAUXChecker();
  127. InitHWILKChecker();
  128. //_hardwareInterlockAlarmConditionDic = new Dictionary<string, string>()
  129. //{
  130. // {"AlarmSignalOPBoxPS11Out1", "Air/N2-7 Pressure Too Low"},//deviceModel的名称和AlarmCondition ParameterFormat.xml的名称
  131. // {"AlarmSignalGLBoxPG1CNT1Alarm", "N2-1 Pressure Too Low"},
  132. // {"AlarmSignalGLBoxPG1CNT2Alarm", "N2-1 Pressure Too High"},
  133. // {"AlarmSignalGLBoxPG2CNT1Alarm", "SiH2Cl2 Pressure Too Low"},
  134. // {"AlarmSignalGLBoxPG2CNT2Alarm", "SiH2Cl2 Pressure Too High"},
  135. // {"AlarmSignalGLBoxPG3CNT1Alarm", "NH3-1 Pressure To Low"},
  136. // {"AlarmSignalGLBoxPG3CNT2Alarm", "NH3-1 Pressure Too High"},
  137. // {"AlarmSignalGLBoxPG4CNT1Alarm", "NH3-2 Pressure Too Low"},
  138. // {"AlarmSignalGLBoxPG4CNT2Alarm", "NH3-2 Pressure Too High"},
  139. // {"AlarmSignalGLBoxPG5CNT1Alarm", "N2-2 Pressure Too Low"},
  140. // {"AlarmSignalGLBoxPG5CNT2Alarm", "N2-2 Pressure Too High"},
  141. // {"AlarmSignalGLBoxPG6CNT1Alarm", "20% F2/N2 Pressure Too Low"},
  142. // {"AlarmSignalGLBoxPG6CNT2Alarm", "20% F2/N2 Pressure Too High"},
  143. // {"AlarmSignalPG12OUT1", "N2-8-1 Pressure Too Low"},
  144. // {"AlarmSignalPG12OUT2", "N2-8-1 Pressure Too High"},
  145. // {"AlarmSignalPG13OUT1", "N2-8-2 Pressure Too Low"},
  146. // {"AlarmSignalPS14OUT1", "O.PRS-PS14 Pressure Too High"},
  147. // {"AlarmSignalPS14OUT2", "O.PRS-PS14 Pressure Too High"},
  148. // {"AlarmSignalN2PurgeBOXPG16CNT1", "N2-6 Pressure Too Low"},
  149. // {"AlarmSignalN2PurgeBOXPG70CNT2", "N2-70 Pressure Too Low"},
  150. // {"AlarmSignalPS17ValueLowLimitAlarm", "Air/N2-1 Pressure Too Low"},
  151. // {"AlarmSignalHeatingExhaust1stAlarmMS1", "Heater Exhaust Pressure Too Low"},
  152. // {"AlarmSignalScavengeExhaust1stAlarmMS3", "Scavenge Exhaust Pressure Too Low"},
  153. // {"AlarmSignalValveBoxExhaust1stAlarmMS4", "ValveBox Exhaust Pressure Too Low"},
  154. // {"AlarmSignalGasBoxExhaust1stAlarmMS2", "GasBox Exhaust Pressure Too Low"},
  155. // {"AlarmSignalLAExhaust1stAlarmMS7", "LA Exhaust Pressure Too Low"},
  156. // {"AlarmSignalRHC1stAlarmMS8", "RHC Exhaust Pressure Too Low"},
  157. // {"AlarmSignalLoadingAreaExhaust1stAlarmMS5", "Loading Area Exhaust Abnormal"},
  158. // {"AlarmSignalFrontBodyExhaust1stAlarmMS6", "FrontBody Exhaust Pressure Too Low"},
  159. // {"AlarmSignalMainFurnaceCellingTS306", "TEMP1 HTR Abnormal"},
  160. // {"AlarmSignalT101TempStatus", "TEMP3 TR1 Abnormal"},
  161. // {"AlarmSignalT102TempStatus", "TEMP4 TR2 Abnormal"},
  162. // {"AlarmSignalT103TempStatus", "TEMP5 TR3 Abnormal"},
  163. // {"AlarmSignalMagneticFluidLeak", "Magnetic Water Leak"},
  164. // {"AlarmSignalCoolingWaterLeak", "Cooling Water Leak"},
  165. // {"AlarmSignalFBFrontDoorSwitch", "Front Panel Abnormal"},
  166. // {"AlarmSignalFilterBox1DoorSwitch", "Filter Box Cover Abnormal"},
  167. // {"AlarmSignalLABacksideDoorSwitch", "Transfer Room Panel Abnormal"},
  168. // {"AlarmSignalHeaterRoomSWS11S12", "Heater Room Panel Abnormal"},
  169. // {"AlarmSignalGasBoxLowerDoorSW", "GasBox Lower Door Abnormal"},
  170. // {"AlarmSignalGasBoxUpperDoorSW", "GasBox Upper Door Abnormal"},
  171. // {"AlarmSignalRHCTS305", "RHC Abnormal Radiator"},
  172. // {"AlarmSignalRHCFlowAlarmFL901", "RHC Flow Abnormal"},
  173. // {"AlarmSignalCoolingWaterFlowAlarmOfFurnaceFL902", "Cooling Water Flow Of Furnace Abnormal"},
  174. // {"AlarmSignalCoolingWaterFlowAlarmOfShuttleFL903", "Cooling Water Flow Of Shuttle Abnormal"},
  175. // {"AlarmSignalCoolingWaterFlowAlarmOfBoatRotationFL904", "Cooling Water Flow Of BoatRotation Abnormal"},
  176. // {"AlarmSignalCoolingWaterFlowAlarmOfFlangeFL905", "Cooling Water Flow Of Flange Abnormal"},
  177. // {"AlarmSignalCoolingWaterFlowAlarmOfLoadingAreaFL906", "Cooling Water Flow Of Loading Area Abnormal"},
  178. // {"AlarmSignalRFAlarm", "RF Alarm"},
  179. // {"AlarmSignalAirFlowFL70", "RF N2 Flow Abnormal"},
  180. // {"AlarmSignalAirFlowFL71", "RF N2 Flow Abnormal"},
  181. // {"AlarmSignalFilterBox1Fan1Alarm", "Filter Box Fan Abnormal"},
  182. // {"AlarmSignalFilterBox1Fan2Alarm", "Filter Box Fan Abnormal"},
  183. // {"AlarmSignalHCLGasLeak1stAlarm", "SiH2CL2 Gas Leak"},
  184. // {"AlarmSignalHCLGasLeak2ndAlarm", "SiH2CL2 Gas Leak"},
  185. // {"AlarmSignalNH3GasLeak1stAlarm", "NH3 Gas Leak"},
  186. // {"AlarmSignalNH3GasLeak2ndAlarm", "NH3 Gas Leak"},
  187. // {"AlarmSignalF2GasLeak1stAlarm", "F2 Gas Leak"},
  188. // {"AlarmSignalF2GasLeak2ndAlarm", "F2 Gas Leak"},
  189. // {"AlarmSignalGasLeakFault", "Gas Leak Fault"},
  190. // //{"AlarmSignalFurnaceMainCircuitBreakerStatusMonitor", "Heater Power Down"},
  191. // {"AlarmSignalVaccumPumpWarning", "Vacuum Pump Warning"},
  192. // {"AlarmSignalVaccumPumpAlarm", "Vacuum Pump Alarm"},
  193. // {"AlarmSignalPS13HStatus", "O.PRS Too High"},
  194. // {"AlarmSignalPS13LStatus", "CK.PRS Too Low"},
  195. // {"AlarmSignalDG1Output1", "P.CNT Pressure NG"},
  196. // {"AlarmSignalDG1Output2", "P.CNT Pressure NG"},
  197. // {"AlarmSignalAV91_1RHCAirInOpened", "RHC.DMR Abnormal"},
  198. // {"AlarmSignalAV91_2RHCAirInOpened", "RHC.DMR Abnormal"},
  199. // {"AlarmSignalAV91_3RHCAirInOpened", "RHC.DMR Abnormal"},
  200. // {"AlarmSignalAV91_4RHCAirInOpened", "RHC.DMR Abnormal"},
  201. // {"AlarmSignalBlowerPower", "BlowerPower Overload"},
  202. // {"AlarmSignalRFSetPowerReached", "RF Output Abnormal"},
  203. // {"AlarmSignalN2FlowInFOUPAbnormal", "N2 Flow in FOUP Abnormal"},
  204. // {"AlarmSignalCapHeaterAbnormal", "Cap Heater Abnormal"},
  205. // {"AlarmSignalHeaterUOverTemp", "Tube Heater OverTemp"},
  206. // {"AlarmSignalHeaterCUOverTemp", "Tube Heater OverTemp"},
  207. // {"AlarmSignalHeaterCOverTemp", "Tube Heater OverTemp"},
  208. // {"AlarmSignalHeaterCLOverTemp", "Tube Heater OverTemp"},
  209. // {"AlarmSignalHeaterLOverTemp", "Tube Heater OverTemp"},
  210. // {"InterlockAlarm", "Valve Interlock"},
  211. // {"GasLine1AlarmSignalTempOutRange", "temp range alarm"},
  212. // {"GasLine2AlarmSignalTempOutRange", "temp range alarm"},
  213. // {"GasLine3AlarmSignalTempOutRange", "temp range alarm"},
  214. // {"GasLine4AlarmSignalTempOutRange", "temp range alarm"},
  215. // {"GasLine5AlarmSignalTempOutRange", "temp range alarm"},
  216. // {"GasLine6AlarmSignalTempOutRange", "temp range alarm"},
  217. // {"GasLine7AlarmSignalTempOutRange", "temp range alarm"},
  218. // {"GasLine1AlarmSignalCLN", "CLN alarm"},
  219. // {"GasLine2AlarmSignalCLN", "CLN alarm"},
  220. // {"GasLine3AlarmSignalCLN", "CLN alarm"},
  221. // {"GasLine4AlarmSignalCLN", "CLN alarm"},
  222. // {"GasLine5AlarmSignalCLN", "CLN alarm"},
  223. // {"GasLine6AlarmSignalCLN", "CLN alarm"},
  224. // {"GasLine7AlarmSignalCLN", "CLN alarm"},
  225. //};
  226. _clnAlarmConditionDic = new Dictionary<string, string>()
  227. {
  228. {"AlarmSignalOPBoxPS11Out1", "temp range warning"},//deviceModel的名称和AlarmCondition ParameterFormat.xml的名称
  229. {"AlarmSignalTempOutRange", "temp range alarm"},
  230. {"AlarmSignalGLBoxPG1CNT2Alarm", "CLN warning"},
  231. {"AlarmSignalCLN", "CLN alarm"},
  232. };
  233. if (!string.IsNullOrEmpty(SC.GetStringValue("PM1.AlarmCondition")))
  234. {
  235. InitAlarmCondition(SC.GetStringValue("PM1.AlarmCondition"));
  236. int.TryParse(SC.GetStringValue("PM1.AlarmConditionIndex"), out int index);
  237. SetAlarmConditionTableIndex(index);
  238. }
  239. }
  240. private void InitHWILKChecker()
  241. {
  242. _hwILKChecker = new List<AlarmConditionChecker>();
  243. foreach (var item in _sensors)
  244. {
  245. if (item.Value == null)
  246. continue;
  247. if (item.Value.SensorCategoryKey != ((int)SensorCategoryEnum.HWILK).ToString())
  248. continue;
  249. var checker = new AlarmConditionChecker()
  250. {
  251. Name = item.Value.Name,
  252. ToleranceCheckerAlarm = new ToleranceChecker(),
  253. Parameter = new AlarmConditionAIParameter(),
  254. };
  255. _hwILKChecker.Add(checker);
  256. }
  257. }
  258. private void InitAUXChecker()
  259. {
  260. _auxChecker = new List<AlarmConditionChecker>();
  261. for (int index = 0; index < 512; index++)
  262. {
  263. if (!SC.ContainsItem($"PM1.RecipeEditParameter.AUX.{index}.AI"))
  264. continue;
  265. var checker = new AlarmConditionChecker()
  266. {
  267. AUXIOName = SC.GetStringValue($"PM1.RecipeEditParameter.AUX.{index}.AI"),
  268. AUXIndex = index,
  269. ToleranceCheckerWarning = new ToleranceChecker(),
  270. ToleranceCheckerAlarm = new ToleranceChecker(),
  271. Parameter = new AlarmConditionAIParameter(),
  272. DelayTimer = new Stopwatch(),
  273. };
  274. _auxChecker.Add(checker);
  275. }
  276. }
  277. private void InitAPCChecker()
  278. {
  279. _apcChecker = new List<AlarmConditionChecker>()
  280. {
  281. new AlarmConditionChecker()
  282. {
  283. APC = APC,
  284. ToleranceCheckerWarning = new ToleranceChecker(),
  285. ToleranceCheckerAlarm = new ToleranceChecker(),
  286. Parameter = new AlarmConditionAIParameter(),
  287. DelayTimer = new Stopwatch(),
  288. },
  289. new AlarmConditionChecker()
  290. {
  291. APC = APC,
  292. ToleranceCheckerWarning = new ToleranceChecker(),
  293. ToleranceCheckerAlarm = new ToleranceChecker(),
  294. Parameter = new AlarmConditionAIParameter(),
  295. DelayTimer = new Stopwatch(),
  296. },
  297. new AlarmConditionChecker()
  298. {
  299. APC = APC,
  300. ToleranceCheckerWarning = new ToleranceChecker(),
  301. ToleranceCheckerAlarm = new ToleranceChecker(),
  302. Parameter = new AlarmConditionAIParameter(),
  303. DelayTimer = new Stopwatch(),
  304. },
  305. };
  306. }
  307. private void InitMFCChecker()
  308. {
  309. _mfcChecker = new List<AlarmConditionChecker>()
  310. {
  311. new AlarmConditionChecker()
  312. {
  313. MFC = MFC1,
  314. ToleranceCheckerWarning = new ToleranceChecker(),
  315. ToleranceCheckerAlarm = new ToleranceChecker(),
  316. Parameter = new AlarmConditionAIParameter(),
  317. DelayTimer = new Stopwatch(),
  318. },
  319. new AlarmConditionChecker()
  320. {
  321. MFC = MFC2,
  322. ToleranceCheckerWarning = new ToleranceChecker(),
  323. ToleranceCheckerAlarm = new ToleranceChecker(),
  324. Parameter = new AlarmConditionAIParameter(),
  325. DelayTimer = new Stopwatch(),
  326. },
  327. new AlarmConditionChecker()
  328. {
  329. MFC = MFC3,
  330. ToleranceCheckerWarning = new ToleranceChecker(),
  331. ToleranceCheckerAlarm = new ToleranceChecker(),
  332. Parameter = new AlarmConditionAIParameter(),
  333. DelayTimer = new Stopwatch(),
  334. },
  335. new AlarmConditionChecker()
  336. {
  337. MFC = MFC4,
  338. ToleranceCheckerWarning = new ToleranceChecker(),
  339. ToleranceCheckerAlarm = new ToleranceChecker(),
  340. Parameter = new AlarmConditionAIParameter(),
  341. DelayTimer = new Stopwatch(),
  342. },
  343. new AlarmConditionChecker()
  344. {
  345. MFC = MFC5,
  346. ToleranceCheckerWarning = new ToleranceChecker(),
  347. ToleranceCheckerAlarm = new ToleranceChecker(),
  348. Parameter = new AlarmConditionAIParameter(),
  349. DelayTimer = new Stopwatch(),
  350. },
  351. new AlarmConditionChecker()
  352. {
  353. MFC = MFC6,
  354. ToleranceCheckerWarning = new ToleranceChecker(),
  355. ToleranceCheckerAlarm = new ToleranceChecker(),
  356. Parameter = new AlarmConditionAIParameter(),
  357. DelayTimer = new Stopwatch(),
  358. },
  359. new AlarmConditionChecker()
  360. {
  361. MFC = MFC7,
  362. ToleranceCheckerWarning = new ToleranceChecker(),
  363. ToleranceCheckerAlarm = new ToleranceChecker(),
  364. Parameter = new AlarmConditionAIParameter(),
  365. DelayTimer = new Stopwatch(),
  366. },
  367. new AlarmConditionChecker()
  368. {
  369. MFC = MFC8,
  370. ToleranceCheckerWarning = new ToleranceChecker(),
  371. ToleranceCheckerAlarm = new ToleranceChecker(),
  372. Parameter = new AlarmConditionAIParameter(),
  373. DelayTimer = new Stopwatch(),
  374. },
  375. new AlarmConditionChecker()
  376. {
  377. MFC = MFC9,
  378. ToleranceCheckerWarning = new ToleranceChecker(),
  379. ToleranceCheckerAlarm = new ToleranceChecker(),
  380. Parameter = new AlarmConditionAIParameter(),
  381. DelayTimer = new Stopwatch(),
  382. },
  383. new AlarmConditionChecker()
  384. {
  385. MFC = MFC10,
  386. ToleranceCheckerWarning = new ToleranceChecker(),
  387. ToleranceCheckerAlarm = new ToleranceChecker(),
  388. Parameter = new AlarmConditionAIParameter(),
  389. DelayTimer = new Stopwatch(),
  390. },
  391. new AlarmConditionChecker()
  392. {
  393. MFC = MFC11,
  394. ToleranceCheckerWarning = new ToleranceChecker(),
  395. ToleranceCheckerAlarm = new ToleranceChecker(),
  396. Parameter = new AlarmConditionAIParameter(),
  397. DelayTimer = new Stopwatch(),
  398. },
  399. new AlarmConditionChecker()
  400. {
  401. MFC = MFC12,
  402. ToleranceCheckerWarning = new ToleranceChecker(),
  403. ToleranceCheckerAlarm = new ToleranceChecker(),
  404. Parameter = new AlarmConditionAIParameter(),
  405. DelayTimer = new Stopwatch(),
  406. },
  407. };
  408. if (MFC13 != null)
  409. {
  410. _mfcChecker.Add(new AlarmConditionChecker()
  411. {
  412. MFC = MFC13,
  413. ToleranceCheckerWarning = new ToleranceChecker(),
  414. ToleranceCheckerAlarm = new ToleranceChecker(),
  415. Parameter = new AlarmConditionAIParameter(),
  416. DelayTimer = new Stopwatch(),
  417. });
  418. }
  419. if (MFC14 != null)
  420. {
  421. _mfcChecker.Add(new AlarmConditionChecker()
  422. {
  423. MFC = MFC14,
  424. ToleranceCheckerWarning = new ToleranceChecker(),
  425. ToleranceCheckerAlarm = new ToleranceChecker(),
  426. Parameter = new AlarmConditionAIParameter(),
  427. DelayTimer = new Stopwatch(),
  428. });
  429. }
  430. if (MFC15 != null)
  431. {
  432. _mfcChecker.Add(new AlarmConditionChecker()
  433. {
  434. MFC = MFC15,
  435. ToleranceCheckerWarning = new ToleranceChecker(),
  436. ToleranceCheckerAlarm = new ToleranceChecker(),
  437. Parameter = new AlarmConditionAIParameter(),
  438. DelayTimer = new Stopwatch(),
  439. });
  440. }
  441. if (MFC16 != null)
  442. {
  443. _mfcChecker.Add(new AlarmConditionChecker()
  444. {
  445. MFC = MFC16,
  446. ToleranceCheckerWarning = new ToleranceChecker(),
  447. ToleranceCheckerAlarm = new ToleranceChecker(),
  448. Parameter = new AlarmConditionAIParameter(),
  449. DelayTimer = new Stopwatch(),
  450. });
  451. }
  452. }
  453. private void InitHeaterChecker()
  454. {
  455. _heaterChecker = new List<AlarmConditionChecker>()
  456. {
  457. new AlarmConditionChecker()
  458. {
  459. Heater = HeaterU,
  460. ToleranceCheckerWarning = new ToleranceChecker(),
  461. ToleranceCheckerAlarm = new ToleranceChecker(),
  462. Parameter = new AlarmConditionAIParameter(),
  463. DelayTimer = new Stopwatch(),
  464. },
  465. new AlarmConditionChecker()
  466. {
  467. Heater = HeaterCU,
  468. ToleranceCheckerWarning = new ToleranceChecker(),
  469. ToleranceCheckerAlarm = new ToleranceChecker(),
  470. Parameter = new AlarmConditionAIParameter(),
  471. DelayTimer = new Stopwatch(),
  472. },
  473. new AlarmConditionChecker()
  474. {
  475. Heater = HeaterC,
  476. ToleranceCheckerWarning = new ToleranceChecker(),
  477. ToleranceCheckerAlarm = new ToleranceChecker(),
  478. Parameter = new AlarmConditionAIParameter(),
  479. DelayTimer = new Stopwatch(),
  480. },
  481. new AlarmConditionChecker()
  482. {
  483. Heater = HeaterCL,
  484. ToleranceCheckerWarning = new ToleranceChecker(),
  485. ToleranceCheckerAlarm = new ToleranceChecker(),
  486. Parameter = new AlarmConditionAIParameter(),
  487. DelayTimer = new Stopwatch(),
  488. },
  489. new AlarmConditionChecker()
  490. {
  491. Heater = HeaterL,
  492. ToleranceCheckerWarning = new ToleranceChecker(),
  493. ToleranceCheckerAlarm = new ToleranceChecker(),
  494. Parameter = new AlarmConditionAIParameter(),
  495. DelayTimer = new Stopwatch(),
  496. },
  497. };
  498. }
  499. public void InitAlarmCondition(string fileName)
  500. {
  501. if (string.IsNullOrEmpty(fileName))
  502. {
  503. //EV.PostWarningLog(ModuleName.PM1.ToString(), $"Heater temperature correct file is empty");
  504. return;
  505. }
  506. _currentAlarmConditionFileName = fileName;
  507. //_currentAlarmConditionIndex = index;
  508. var content = ParameterFileManager.Instance.LoadParameter("Parameter\\AlarmCondition", fileName, false);
  509. if (string.IsNullOrEmpty(content))
  510. {
  511. //EV.PostWarningLog(ModuleName.PM1.ToString(), $"{fileNameAndPath} heater temperature correct file is empty");
  512. return;
  513. }
  514. var doc = new XmlDocument();
  515. doc.LoadXml(content);
  516. XmlNodeList nodeSteps = doc.SelectNodes($"Aitex/TableParameterData/Module[@Name='']/Step");
  517. if (nodeSteps == null)
  518. nodeSteps = doc.SelectNodes($"Aitex/TableParameterData/Step");
  519. if (nodeSteps == null)
  520. {
  521. EV.PostWarningLog(ModuleName.PM1.ToString(), $"Invalid alarm condition file {fileName}");
  522. return;
  523. }
  524. SC.SetItemValueFromString("PM1.AlarmCondition", fileName);
  525. _alarmConditionDic = new Dictionary<int, AlarmConditionTableParameter>();
  526. for (int i = 0; i < nodeSteps.Count; i++)
  527. {
  528. var step = nodeSteps[i];
  529. XmlElement stepNode = step as XmlElement;
  530. int tableIndex = i + 1;
  531. AlarmConditionTableParameter table = new AlarmConditionTableParameter();
  532. List<AlarmConditionDIParameter> valveInterlockParameterLst = null;
  533. List<AlarmConditionDIParameter> clnParameterLst = null;
  534. foreach (XmlAttribute att in stepNode.Attributes)
  535. {
  536. switch (att.Name)
  537. {
  538. case "StepNo":
  539. int.TryParse(att.Value, out int no);
  540. table.No = no;
  541. break;
  542. case "Name":
  543. table.Name = att.Value;
  544. break;
  545. case "TempHeater":
  546. table.HeaterParameterLst = InitAlarmConditionItem(att.Value);
  547. break;
  548. case "TempBoat":
  549. break;
  550. case "FlowDeviation":
  551. table.MFCParameterLst = InitAlarmConditionItem(att.Value);
  552. break;
  553. case "Press":
  554. table.APCParameterLst = InitAlarmConditionItem(att.Value);
  555. break;
  556. case "AUX":
  557. table.AUXParameterLst = InitAlarmConditionItem(att.Value);
  558. break;
  559. case "HWILK":
  560. table.InterlockParameterLst = InitAlarmConditionDIItem(att.Value);
  561. break;
  562. case "ValveILK":
  563. valveInterlockParameterLst = InitAlarmConditionDIItem(att.Value);
  564. break;
  565. case "TempController":
  566. break;
  567. case "APCController":
  568. break;
  569. case "TransferError":
  570. break;
  571. case "SerialLineDown":
  572. break;
  573. case "LanLineDown":
  574. break;
  575. case "DeviceNetLineDown":
  576. break;
  577. case "Sensor":
  578. break;
  579. case "CLNAlarmList":
  580. clnParameterLst = InitAlarmConditionDIItem(att.Value);
  581. break;
  582. }
  583. }
  584. if (table.InterlockParameterLst != null && valveInterlockParameterLst != null)
  585. table.InterlockParameterLst.AddRange(valveInterlockParameterLst);
  586. if (table.InterlockParameterLst != null && clnParameterLst != null)
  587. table.InterlockParameterLst.AddRange(clnParameterLst);
  588. if (!_alarmConditionDic.ContainsKey(table.No))
  589. _alarmConditionDic.Add(table.No, table);
  590. _alarmConditionDic[table.No] = table;
  591. }
  592. }
  593. public void MonitorAlarmCondition()
  594. {
  595. if (_alarmConditionDic == null)
  596. return;
  597. _isAlarmConditionHasRecipeCommand = false;
  598. MonitorHeaterAlarmCondition();
  599. MonitorMFCAlarmCondition();
  600. MonitorAUXAlarmCondition();
  601. MonitorAPCAlarmCondition();
  602. MonitorInterlockAlarmCondition();
  603. }
  604. private void MonitorInterlockAlarmCondition()
  605. {
  606. foreach (var item in _hwILKChecker)
  607. {
  608. if (item.DIParameter == null || item.DIParameter.IsEnable == false)
  609. continue;
  610. if (!_sensors.TryGetValue(item.Name, out var sensor))
  611. continue;
  612. if (!sensor.Value)
  613. continue;
  614. //ProcessAlarmConditionErrorCommand(item.Command);
  615. }
  616. //if (_triggeredAlarmList == null || _triggeredAlarmList.Count == 0)
  617. // return;
  618. //if (_hardwareInterlockAlarmConditionDic == null)
  619. // return;
  620. //if (_alarmConditionDic == null || !_alarmConditionDic.ContainsKey(_currentAlarmConditionIndex) || _alarmConditionDic[_currentAlarmConditionIndex].InterlockParameterLst == null)
  621. // return;
  622. //var newAlarm = _triggeredAlarmList[_triggeredAlarmList.Count - 1];
  623. //var alarmConditionItemName = "";
  624. //for (int i = _triggeredAlarmList.Count - 1; i >= 0; i--)
  625. //{
  626. // var alarm = _triggeredAlarmList[i];
  627. // var interval = DateTime.Now - newAlarm.OccuringTime;
  628. // if (interval.TotalMilliseconds > 1000)//老的alarm
  629. // continue;
  630. // var paras = newAlarm.EventEnum.Split('.');
  631. // if (paras.Length < 2)
  632. // continue;
  633. // var ret = _hardwareInterlockAlarmConditionDic.TryGetValue(paras[1], out string name);
  634. // if (ret)
  635. // {
  636. // newAlarm = alarm;
  637. // alarmConditionItemName = name;
  638. // var alarmConditionItem = _alarmConditionDic[_currentAlarmConditionIndex].InterlockParameterLst.FirstOrDefault(x => x.Name == alarmConditionItemName);
  639. // if (alarmConditionItem == null)
  640. // continue;
  641. // if (alarmConditionItem.IsEnable)
  642. // ProcessAlarmConditionErrorCommand(alarmConditionItem.Command);
  643. // break;
  644. // }
  645. //}
  646. }
  647. private void MonitorAPCAlarmCondition()
  648. {
  649. for (int i = 0; i < _apcChecker.Count; i++)
  650. {
  651. var checker = _apcChecker[i];
  652. if (checker.Parameter.Unit == null)
  653. continue;
  654. var warningLow = checker.Parameter.WarningLow;
  655. var warningHigh = checker.Parameter.WarningHigh;
  656. var alarmLow = checker.Parameter.AlarmLow;
  657. var alarmHigh = checker.Parameter.AlarmHigh;
  658. var unit = checker.Parameter.Unit;
  659. if (checker.Parameter.Unit.ToLower().Contains("%"))
  660. {
  661. unit = "%";
  662. //angle
  663. if (checker.Parameter.Unit.ToLower() == "%d")
  664. {
  665. //do nothing
  666. }
  667. else
  668. {
  669. warningLow = (float)checker.APC.DeviceData.PositionSetPoint * warningLow;
  670. warningHigh = (float)checker.APC.DeviceData.PositionSetPoint * warningHigh;
  671. alarmLow = (float)checker.APC.DeviceData.PositionSetPoint * alarmLow;
  672. alarmHigh = (float)checker.APC.DeviceData.PositionSetPoint * alarmHigh;
  673. }
  674. if (checker.Parameter.IsWarningEnable && checker.Parameter.WarningTime > 0 && checker.DelayTimer.IsRunning && checker.DelayTimer.ElapsedMilliseconds >= checker.Parameter.WarningDelayDetectTimeS * 1000)
  675. checker.ToleranceCheckerWarning.Monitor(checker.APC.DeviceData.PositionFeedback,
  676. checker.APC.DeviceData.PositionSetPoint - warningLow, checker.APC.DeviceData.PositionSetPoint + warningHigh, checker.Parameter.WarningTime);
  677. if (checker.Parameter.IsAlarmEnable && checker.Parameter.AlarmTime > 0 && checker.DelayTimer.IsRunning && checker.DelayTimer.ElapsedMilliseconds >= checker.Parameter.AlarmDelayDetectTimeS * 1000)
  678. checker.ToleranceCheckerAlarm.Monitor(checker.APC.DeviceData.PositionFeedback,
  679. checker.APC.DeviceData.PositionSetPoint - alarmLow, checker.APC.DeviceData.PositionSetPoint + alarmHigh, checker.Parameter.AlarmTime);
  680. if (checker.ToleranceCheckerAlarm.Trig || checker.ToleranceCheckerWarning.Trig)
  681. {
  682. var range = "";
  683. var time = "";
  684. var command = checker.Parameter.AlarmCommand;
  685. if (checker.ToleranceCheckerAlarm.Trig)
  686. {
  687. range = $"({checker.APC.DeviceData.PositionSetPoint - alarmLow},{checker.APC.DeviceData.PositionSetPoint + alarmHigh})";
  688. time = $"{checker.Parameter.AlarmTime:F1}";
  689. checker.APC.APCAngleToleranceAlarm.Set($"APC angle out of range {range} {unit} in {time} seconds");
  690. command = checker.Parameter.AlarmCommand;
  691. }
  692. else if (checker.ToleranceCheckerWarning.Trig)
  693. {
  694. range = $"({checker.APC.DeviceData.PositionSetPoint - warningLow},{checker.APC.DeviceData.PositionSetPoint + warningHigh})";
  695. time = $"{checker.Parameter.WarningTime:F1}";
  696. checker.APC.APCAngleToleranceWarning.Set($"APC angle out of range {range} {unit} in {time} seconds");
  697. command = checker.Parameter.WarningCommand;
  698. }
  699. ProcessAlarmConditionErrorCommand(command);
  700. }
  701. }
  702. else
  703. {
  704. warningLow = (float)checker.APC.DeviceData.PressureSetPoint * warningLow;
  705. warningHigh = (float)checker.APC.DeviceData.PressureSetPoint * warningHigh;
  706. alarmLow = (float)checker.APC.DeviceData.PressureSetPoint * alarmLow;
  707. alarmHigh = (float)checker.APC.DeviceData.PressureSetPoint * alarmHigh;
  708. var alarmToleranceAlarm = checker.APC.APCPressure2ToleranceAlarm;
  709. var alarmToleranceWarning = checker.APC.APCPressure2ToleranceWarning;
  710. var pressureFeedback = checker.APC.DeviceData.Pressure2Feedback;
  711. if (i == 0)
  712. {
  713. alarmToleranceAlarm = checker.APC.APCPressure1ToleranceAlarm;
  714. alarmToleranceWarning = checker.APC.APCPressure1ToleranceWarning;
  715. pressureFeedback = checker.APC.DeviceData.Pressure1Feedback;
  716. }
  717. if (checker.Parameter.IsWarningEnable && checker.Parameter.WarningTime > 0)
  718. checker.ToleranceCheckerWarning.Monitor(pressureFeedback,
  719. checker.APC.DeviceData.PressureSetPoint - warningLow, checker.APC.DeviceData.PressureSetPoint + warningHigh, checker.Parameter.WarningTime);
  720. if (checker.Parameter.IsAlarmEnable && checker.Parameter.AlarmTime > 0)
  721. checker.ToleranceCheckerAlarm.Monitor(pressureFeedback,
  722. checker.APC.DeviceData.PressureSetPoint - alarmLow, checker.APC.DeviceData.PressureSetPoint + alarmHigh, checker.Parameter.AlarmTime);
  723. if (checker.ToleranceCheckerAlarm.Trig || checker.ToleranceCheckerWarning.Trig)
  724. {
  725. var range = "";
  726. var time = "";
  727. var command = checker.Parameter.AlarmCommand;
  728. if (checker.ToleranceCheckerAlarm.Trig)
  729. {
  730. range = $"({checker.APC.DeviceData.PressureSetPoint - alarmLow},{checker.APC.DeviceData.PressureSetPoint + alarmHigh})";
  731. time = $"{checker.Parameter.AlarmTime:F1}";
  732. alarmToleranceAlarm.Set($"APC Press{i + 1} out of range {range} {unit} in {time} seconds");
  733. command = checker.Parameter.AlarmCommand;
  734. }
  735. else if (checker.ToleranceCheckerWarning.Trig)
  736. {
  737. range = $"({checker.APC.DeviceData.PressureSetPoint - warningLow},{checker.APC.DeviceData.PressureSetPoint + warningHigh})";
  738. time = $"{checker.Parameter.WarningTime:F1}";
  739. alarmToleranceWarning.Set($"APC Press{i + 1} out of range {range} {unit} in {time} seconds");
  740. command = checker.Parameter.WarningCommand;
  741. }
  742. ProcessAlarmConditionErrorCommand(command);
  743. }
  744. }
  745. }
  746. }
  747. private void MonitorAUXAlarmCondition()
  748. {
  749. if (SC.ContainsItem("Minics.EnableMinics") && SC.GetValue<bool>("Minics.EnableMinics"))
  750. { return; }
  751. for (int i = 0; i < _auxChecker.Count; i++)
  752. {
  753. var checker = _auxChecker[i];
  754. if (checker.Parameter.Unit == null)
  755. continue;
  756. var warningLow = checker.Parameter.WarningLow;
  757. var warningHigh = checker.Parameter.WarningHigh;
  758. var alarmLow = checker.Parameter.AlarmLow;
  759. var alarmHigh = checker.Parameter.AlarmHigh;
  760. var unit = "";
  761. var setpoint = 0.0f;
  762. var feedback = 0.0f;
  763. var display = "";
  764. if (_auxDic != null && _auxDic.ContainsKey(_currentAuxTable))
  765. {
  766. foreach (var item in _auxDic[_currentAuxTable])
  767. {
  768. if (item == null || checker.AUXIOName != item.IOName)
  769. continue;
  770. setpoint = (float)item.SetPointConfig.DoubleValue;
  771. unit = item.Unit;
  772. display = item.DisplayNameConfig.StringValue;
  773. feedback = IO.AI[$"{Module}.{item.IOName}"] != null ? IO.AI[$"{Module}.{item.IOName}"].FloatValue : 0;
  774. break;
  775. }
  776. }
  777. if (checker.Parameter.Unit.ToLower() == "%sv")
  778. {
  779. warningLow = (float)setpoint * warningLow / 100.0f;
  780. warningHigh = (float)setpoint * warningHigh / 100.0f;
  781. alarmLow = (float)setpoint * alarmLow / 100.0f;
  782. alarmHigh = (float)setpoint * alarmHigh / 100.0f;
  783. }
  784. else if (checker.Parameter.Unit.ToLower() == "%fs")
  785. {
  786. //后续改为scale
  787. warningLow = (float)setpoint * warningLow / 100.0f;
  788. warningHigh = (float)setpoint * warningHigh / 100.0f;
  789. alarmLow = (float)setpoint * alarmLow / 100.0f;
  790. alarmHigh = (float)setpoint * alarmHigh / 100.0f;
  791. }
  792. if (checker.Parameter.IsWarningEnable && checker.Parameter.WarningTime > 0 && checker.DelayTimer.IsRunning && checker.DelayTimer.ElapsedMilliseconds >= checker.Parameter.WarningDelayDetectTimeS * 1000)
  793. checker.ToleranceCheckerWarning.Monitor(feedback,
  794. setpoint - warningLow, setpoint + warningHigh, checker.Parameter.WarningTime);
  795. if (checker.Parameter.IsAlarmEnable && checker.Parameter.AlarmTime > 0 && checker.DelayTimer.IsRunning && checker.DelayTimer.ElapsedMilliseconds >= checker.Parameter.AlarmDelayDetectTimeS * 1000)
  796. checker.ToleranceCheckerAlarm.Monitor(feedback,
  797. setpoint - alarmLow, setpoint + alarmHigh, checker.Parameter.AlarmTime);
  798. if (checker.ToleranceCheckerAlarm.Trig || checker.ToleranceCheckerWarning.Trig)
  799. {
  800. var range = "";
  801. var time = "";
  802. var ret = AUXAlarmDic.TryGetValue(checker.AUXIndex, out var AUXAlarm);
  803. if (ret)
  804. {
  805. var command = checker.Parameter.AlarmCommand;
  806. if (checker.ToleranceCheckerAlarm.Trig)
  807. {
  808. range = $"({(setpoint - alarmLow).ToString("f3")},{(setpoint + alarmHigh).ToString("f3")})";
  809. time = $"{checker.Parameter.AlarmTime:F1}";
  810. AUXAlarm.Item2.Set($"AUX {display} value out of range {range} {unit} in {time} seconds");
  811. command = checker.Parameter.AlarmCommand;
  812. }
  813. else if (checker.ToleranceCheckerWarning.Trig)
  814. {
  815. range = $"({(setpoint - warningLow).ToString("f3")},{(setpoint + warningHigh).ToString("f3")})";
  816. time = $"{checker.Parameter.WarningTime:F1}";
  817. AUXAlarm.Item1.Set($"AUX {display} value out of range {range} {unit} in {time} seconds");
  818. command = checker.Parameter.WarningCommand;
  819. }
  820. ProcessAlarmConditionErrorCommand(command);
  821. }
  822. }
  823. }
  824. }
  825. private void MonitorMFCAlarmCondition()
  826. {
  827. for (int i = 0; i < _mfcChecker.Count; i++)
  828. {
  829. var checker = _mfcChecker[i];
  830. if (checker.Parameter.Unit == null)
  831. continue;
  832. var warningLow = checker.Parameter.WarningLow;
  833. var warningHigh = checker.Parameter.WarningHigh;
  834. var alarmLow = checker.Parameter.AlarmLow;
  835. var alarmHigh = checker.Parameter.AlarmHigh;
  836. var unit = checker.MFC.Unit;
  837. if (checker.Parameter.Unit.ToLower() == "%sv")
  838. {
  839. warningLow = (float)checker.MFC.SetPoint * warningLow / 100.0f;
  840. warningHigh = (float)checker.MFC.SetPoint * warningHigh / 100.0f;
  841. alarmLow = (float)checker.MFC.SetPoint * alarmLow / 100.0f;
  842. alarmHigh = (float)checker.MFC.SetPoint * alarmHigh / 100.0f;
  843. }
  844. else if (checker.Parameter.Unit.ToLower() == "%fs")
  845. {
  846. warningLow = (float)checker.MFC.Scale * warningLow / 100.0f;
  847. warningHigh = (float)checker.MFC.Scale * warningHigh / 100.0f;
  848. alarmLow = (float)checker.MFC.Scale * alarmLow / 100.0f;
  849. alarmHigh = (float)checker.MFC.Scale * alarmHigh / 100.0f;
  850. }
  851. if (checker.Parameter.IsWarningEnable && checker.Parameter.WarningTime > 0 && checker.DelayTimer.IsRunning && checker.DelayTimer.ElapsedMilliseconds >= checker.Parameter.WarningDelayDetectTimeS * 1000)
  852. checker.ToleranceCheckerWarning.Monitor(checker.MFC.FeedBack,
  853. checker.MFC.SetPoint - warningLow, checker.MFC.SetPoint + warningHigh, checker.Parameter.WarningTime);
  854. if (checker.Parameter.IsAlarmEnable && checker.Parameter.AlarmTime > 0 && checker.DelayTimer.IsRunning && checker.DelayTimer.ElapsedMilliseconds >= checker.Parameter.AlarmDelayDetectTimeS * 1000)
  855. checker.ToleranceCheckerAlarm.Monitor(checker.MFC.FeedBack,
  856. checker.MFC.SetPoint - alarmLow, checker.MFC.SetPoint + alarmHigh, checker.Parameter.AlarmTime);
  857. if (checker.ToleranceCheckerAlarm.Trig || checker.ToleranceCheckerWarning.Trig)
  858. {
  859. var range = "";
  860. var time = "";
  861. var command = checker.Parameter.AlarmCommand;
  862. if (checker.ToleranceCheckerAlarm.Trig)
  863. {
  864. range = $"({(checker.MFC.SetPoint - alarmLow).ToString("f3")},{(checker.MFC.SetPoint + alarmHigh).ToString("f3")})";
  865. time = $"{checker.Parameter.AlarmTime:F1}";
  866. checker.MFC.AlarmToleranceAlarm.Set($"{Display} flow out of range {range} {unit} in {time} seconds");
  867. command = checker.Parameter.AlarmCommand;
  868. }
  869. else if (checker.ToleranceCheckerWarning.Trig)
  870. {
  871. range = $"({(checker.MFC.SetPoint - warningLow).ToString("f3")},{(checker.MFC.SetPoint + warningHigh).ToString("f3")})";
  872. time = $"{checker.Parameter.WarningTime:F1}";
  873. checker.MFC.AlarmToleranceWarning.Set($"{Display} flow out of range {range} {unit} in {time} seconds");
  874. command = checker.Parameter.WarningCommand;
  875. }
  876. ProcessAlarmConditionErrorCommand(command);
  877. }
  878. }
  879. }
  880. private void MonitorHeaterAlarmCondition()
  881. {
  882. for (int i = 0; i < _heaterChecker.Count; i++)
  883. {
  884. var checker = _heaterChecker[i];
  885. if (checker.Parameter.Unit == null)
  886. continue;
  887. if (checker.Parameter.IsWarningEnable && checker.Parameter.WarningTime > 0 && checker.DelayTimer.IsRunning && checker.DelayTimer.ElapsedMilliseconds >= checker.Parameter.WarningDelayDetectTimeS * 1000)
  888. checker.ToleranceCheckerWarning.Monitor(checker.Heater.TempFeedback,
  889. checker.Heater.TempSetPoint - checker.Parameter.WarningLow, checker.Heater.TempSetPoint + checker.Parameter.WarningHigh, checker.Parameter.WarningTime);
  890. if (checker.Parameter.IsAlarmEnable && checker.Parameter.AlarmTime > 0 && checker.DelayTimer.IsRunning && checker.DelayTimer.ElapsedMilliseconds >= checker.Parameter.AlarmDelayDetectTimeS * 1000)
  891. checker.ToleranceCheckerAlarm.Monitor(checker.Heater.TempFeedback,
  892. checker.Heater.TempSetPoint - checker.Parameter.AlarmLow, checker.Heater.TempSetPoint + checker.Parameter.AlarmHigh, checker.Parameter.AlarmTime);
  893. if (checker.ToleranceCheckerAlarm.Trig || checker.ToleranceCheckerWarning.Trig)
  894. {
  895. var range = "";
  896. var time = "";
  897. var command = checker.Parameter.AlarmCommand;
  898. if (checker.ToleranceCheckerAlarm.Trig)
  899. {
  900. range = $"({checker.Heater.TempSetPoint - checker.Parameter.AlarmLow},{checker.Heater.TempSetPoint + checker.Parameter.AlarmHigh})";
  901. time = $"{checker.Parameter.AlarmTime:F1}";
  902. checker.Heater.AlarmToleranceAlarm.Set($"{Display} temperature out of range {range} °C in {time} seconds");
  903. command = checker.Parameter.AlarmCommand;
  904. }
  905. else if (checker.ToleranceCheckerWarning.Trig)
  906. {
  907. range = $"({checker.Heater.TempSetPoint - checker.Parameter.WarningLow},{checker.Heater.TempSetPoint + checker.Parameter.WarningHigh})";
  908. time = $"{checker.Parameter.WarningTime:F1}";
  909. checker.Heater.AlarmToleranceWarning.Set($"{Display} temperature out of range {range} °C in {time} seconds");
  910. command = checker.Parameter.WarningCommand;
  911. }
  912. ProcessAlarmConditionErrorCommand(command);
  913. }
  914. }
  915. }
  916. private void ProcessAlarmConditionErrorCommand(string command)
  917. {
  918. var recipe = "";
  919. var recipeType = "";
  920. var recipeTable = "";
  921. switch (command)
  922. {
  923. case "Reset":
  924. if (_isAlarmConditionHasRecipeCommand)
  925. break;
  926. _isAlarmConditionHasRecipeCommand = true;
  927. recipe = SC.GetStringValue("System.Recipe.Reset Recipe");
  928. recipeType = "Reset";
  929. RecipeExecEntryEnumValue = RecipeExecEntryEnum.AlarmConditonTrigger;
  930. CheckToPostMessage((int)MSG.RunOtherRecipe, recipe, recipeType);
  931. LOG.Write($"Alarm condition: command={command} recipe={recipe}");
  932. break;
  933. case "End":
  934. if (_isAlarmConditionHasRecipeCommand)
  935. break;
  936. _isAlarmConditionHasRecipeCommand = true;
  937. if (IsProcessing)
  938. {
  939. //因为要跳到执行最后一步,所以stepNumber需要减一
  940. _processRoutine.JumpCurrentRecipeStep(RecipeRunningInfo.RecipeStepList.Count - 1, RecipeRunningInfo.RecipeStepList[RecipeRunningInfo.RecipeStepList.Count - 1].StepName);
  941. }
  942. else
  943. {
  944. if (!RecipeParser.Parse(SC.GetStringValue("PM1.ProcessRecipe"), Module, out var recipeHead, out var recipeSteps, out var reason, "Process"))
  945. {
  946. PreprocessStartFailedWarning.Set($"Load process recipe {SC.GetStringValue("PM1.ProcessRecipe")} failed, {reason}");
  947. return;
  948. }
  949. RecipeRunningInfo.MainRecipeName = SC.GetStringValue("PM1.ProcessRecipe");
  950. RecipeRunningInfo.Head = recipeHead;
  951. RecipeRunningInfo.RecipeStepList = recipeSteps;
  952. CheckToPostMessage((int)MSG.AlarmConditionJumpStep, RecipeRunningInfo.RecipeStepList.Count - 1);
  953. }
  954. LOG.Write($"Alarm condition: command={command} step name={RecipeRunningInfo.RecipeStepList[RecipeRunningInfo.RecipeStepList.Count - 1].StepName}");
  955. break;
  956. case "Hold":
  957. if (_isAlarmConditionHasRecipeCommand)
  958. break;
  959. _isAlarmConditionHasRecipeCommand = true;
  960. _processRoutine.PauseRecipe();
  961. LOG.Write($"Alarm condition: command={command}");
  962. break;
  963. case "Monitor":
  964. LOG.Write($"Alarm condition: command={command}");
  965. break;
  966. case "Buzzer":
  967. Singleton<EquipmentManager>.Instance.IsAlarmConditionBuzzerOn = true;
  968. LOG.Write($"Alarm condition: command={command}");
  969. break;
  970. default:
  971. if (_isAlarmConditionHasRecipeCommand)
  972. break;
  973. _isAlarmConditionHasRecipeCommand = true;
  974. if (command.StartsWith("JUMP"))
  975. {
  976. //Jump step
  977. //Jump 1:
  978. var stepName = command.Replace("JUMP ", "");
  979. if (IsProcessing)
  980. {
  981. var jumpStepNumber = RecipeRunningInfo.RecipeStepList.FindIndex(x => x.StepName == stepName);
  982. if (jumpStepNumber > 0)
  983. {
  984. _processRoutine.JumpCurrentRecipeStep(jumpStepNumber, stepName);
  985. }
  986. }
  987. else
  988. {
  989. if (!RecipeParser.Parse(SC.GetStringValue("PM1.ProcessRecipe"), Module, out var recipeHead, out var recipeSteps, out var reason, "Process"))
  990. {
  991. PreprocessStartFailedWarning.Set($"Load process recipe {SC.GetStringValue("PM1.ProcessRecipe")} failed, {reason}");
  992. return;
  993. }
  994. RecipeRunningInfo.MainRecipeName = SC.GetStringValue("PM1.ProcessRecipe");
  995. RecipeRunningInfo.Head = recipeHead;
  996. RecipeRunningInfo.RecipeStepList = recipeSteps;
  997. var jumpStepNumber = RecipeRunningInfo.RecipeStepList.FindIndex(x => x.StepName == stepName);
  998. if (jumpStepNumber > 0)
  999. {
  1000. CheckToPostMessage((int)MSG.AlarmConditionJumpStep, jumpStepNumber);
  1001. }
  1002. }
  1003. LOG.Write($"Alarm condition: command={command} step name={stepName}");
  1004. }
  1005. else if (command.StartsWith("CALL"))
  1006. {
  1007. //call Alarm recipe
  1008. //Call 1:
  1009. var paras = command.Split(':');
  1010. if (paras.Length > 0)
  1011. {
  1012. RecipeExecEntryEnumValue = RecipeExecEntryEnum.AlarmConditonTrigger;
  1013. recipe = RecipeRunningInfo.Head.AlarmRecipe;
  1014. recipeType = "Alarm";
  1015. recipeTable = paras[0].Replace("CALL", "").Replace(" ", "").Replace(":", "").Replace(":", "");
  1016. CheckToPostMessage((int)MSG.RunOtherRecipe, recipe, recipeType, recipeTable);
  1017. LOG.Write($"Alarm condition: command={command} recipe={recipe}");
  1018. }
  1019. }
  1020. else if (command.StartsWith("ABORT"))
  1021. {
  1022. //call Abort recipe
  1023. //Abort 1:
  1024. var paras = command.Split(':');
  1025. if (paras.Length > 0)
  1026. {
  1027. RecipeExecEntryEnumValue = RecipeExecEntryEnum.AlarmConditonTrigger;
  1028. recipe = RecipeRunningInfo.Head.AbortRecipe;
  1029. recipeType = "Abort";
  1030. recipeTable = paras[0].Replace("ABORT", "").Replace(" ", "").Replace(":", "").Replace(":", "");
  1031. CheckToPostMessage((int)MSG.RunOtherRecipe, recipe, recipeType, recipeTable);
  1032. LOG.Write($"Alarm condition: command={command} recipe={recipe}");
  1033. }
  1034. }
  1035. break;
  1036. }
  1037. }
  1038. private List<AlarmConditionAIParameter> InitAlarmConditionItem(string content)
  1039. {
  1040. List<AlarmConditionAIParameter> items = new List<AlarmConditionAIParameter>();
  1041. if (string.IsNullOrEmpty(content))
  1042. return items;
  1043. var zoneParas = content.Split('|');
  1044. foreach (var zonePara in zoneParas)
  1045. {
  1046. //U;Alert,True,0,0,℃,5,Monitor;Alarm,True,0,0,℃,6,Buzzer
  1047. //1;C1-N2-1;Alert,True,0,0,%fs,5,Buzzer;Alarm,True,0,0,%fs,6,Buzzer
  1048. //1;MS1;Alert,True,0,0,%fs,5,Monitor;Alarm,True,0,0,%fs,6,Monitor
  1049. AlarmConditionAIParameter item = new AlarmConditionAIParameter();
  1050. var array = zonePara.Split(';');
  1051. if (array.Length > 2)
  1052. {
  1053. item.Name = array[0];
  1054. var warningParas = array[array.Length - 2].Split(',');
  1055. var alarmParas = array[array.Length - 1].Split(',');
  1056. if (warningParas.Length > 6)
  1057. {
  1058. bool.TryParse(warningParas[1], out bool isEnable);
  1059. float.TryParse(warningParas[2], out float high);
  1060. float.TryParse(warningParas[3], out float low);
  1061. item.Unit = warningParas[4];
  1062. float.TryParse(warningParas[5], out float time);
  1063. item.WarningCommand = warningParas[6];
  1064. item.IsWarningEnable = isEnable;
  1065. item.WarningHigh = high;
  1066. item.WarningLow = low;
  1067. item.WarningTime = time;
  1068. }
  1069. if (warningParas.Length > 7)
  1070. {
  1071. float.TryParse(warningParas[7], out float time);
  1072. item.WarningDelayDetectTimeS = time;
  1073. }
  1074. if (alarmParas.Length > 6)
  1075. {
  1076. bool.TryParse(alarmParas[1], out bool isEnable);
  1077. float.TryParse(alarmParas[2], out float high);
  1078. float.TryParse(alarmParas[3], out float low);
  1079. item.Unit = alarmParas[4];
  1080. float.TryParse(alarmParas[5], out float time);
  1081. item.AlarmCommand = alarmParas[6];
  1082. item.IsAlarmEnable = isEnable;
  1083. item.AlarmHigh = high;
  1084. item.AlarmLow = low;
  1085. item.AlarmTime = time;
  1086. }
  1087. if (alarmParas.Length > 7)
  1088. {
  1089. float.TryParse(alarmParas[7], out float time);
  1090. item.AlarmDelayDetectTimeS = time;
  1091. }
  1092. }
  1093. items.Add(item);
  1094. }
  1095. return items;
  1096. }
  1097. private List<AlarmConditionDIParameter> InitAlarmConditionDIItem(string content)
  1098. {
  1099. List<AlarmConditionDIParameter> items = new List<AlarmConditionDIParameter>();
  1100. if (string.IsNullOrEmpty(content))
  1101. return items;
  1102. var zoneParas = content.Split('|');
  1103. foreach (var zonePara in zoneParas)
  1104. {
  1105. //1,Air/N2-7 Pressure Too Low,Alert,False,Buzzer|2,N2-1 Pressure Too Low,Alert,False,End
  1106. AlarmConditionDIParameter item = new AlarmConditionDIParameter();
  1107. var array = zonePara.Split(',');
  1108. if (array.Length > 4)
  1109. {
  1110. item.Name = array[1];
  1111. item.IsAlarm = array[2].ToLower() == "alarm";
  1112. bool.TryParse(array[3], out bool isEnable);
  1113. item.IsEnable = isEnable;
  1114. item.Command = array[4];
  1115. }
  1116. items.Add(item);
  1117. }
  1118. return items;
  1119. }
  1120. class AlarmConditionChecker
  1121. {
  1122. public FurnaceRT.Devices.IoHeater Heater { get; set; }
  1123. public FurnaceRT.Devices.IoAPC APC { get; set; }
  1124. public FurnaceRT.Equipments.PMs.Devices.IoMFC MFC { get; set; }
  1125. public string AUXIOName { get; set; }
  1126. public int AUXIndex { get; set; }
  1127. public string Name { get; set; }
  1128. public ToleranceChecker ToleranceCheckerWarning { get; set; }
  1129. public ToleranceChecker ToleranceCheckerAlarm { get; set; }
  1130. public AlarmConditionAIParameter Parameter { get; set; }
  1131. public AlarmConditionDIParameter DIParameter { get; set; }
  1132. public Stopwatch DelayTimer { get; set; }//N秒过后才检测
  1133. }
  1134. class AlarmConditionTableParameter
  1135. {
  1136. public int No { get; set; }
  1137. public string Name { get; set; }
  1138. public List<AlarmConditionAIParameter> HeaterParameterLst { get; set; }
  1139. public List<AlarmConditionAIParameter> MFCParameterLst { get; set; }
  1140. public List<AlarmConditionAIParameter> APCParameterLst { get; set; }
  1141. public List<AlarmConditionAIParameter> AUXParameterLst { get; set; }
  1142. public List<AlarmConditionDIParameter> InterlockParameterLst { get; set; }
  1143. }
  1144. class AlarmConditionAIParameter
  1145. {
  1146. //类似AI的
  1147. public string Name { get; set; }
  1148. public string Unit { get; set; }
  1149. public string DataPoll { get; set; }
  1150. public float WarningHigh { get; set; }
  1151. public float WarningLow { get; set; }
  1152. public float WarningTime { get; set; }
  1153. public string WarningCommand { get; set; }
  1154. public bool IsWarningEnable { get; set; }
  1155. public float AlarmHigh { get; set; }
  1156. public float AlarmLow { get; set; }
  1157. public float AlarmTime { get; set; }
  1158. public string AlarmCommand { get; set; }
  1159. public bool IsAlarmEnable { get; set; }
  1160. public float WarningDelayDetectTimeS { get; set; } = 0;//N秒过后才检测
  1161. public float AlarmDelayDetectTimeS { get; set; } = 0;//N秒过后才检测
  1162. public AlarmConditionAIParameter Clone(AlarmConditionAIParameter source)
  1163. {
  1164. AlarmConditionAIParameter clone = new AlarmConditionAIParameter();
  1165. clone.Name = source.Name;
  1166. clone.Unit = source.Unit;
  1167. clone.DataPoll = source.DataPoll;
  1168. clone.WarningHigh = source.WarningHigh;
  1169. clone.WarningLow = source.WarningLow;
  1170. clone.WarningTime = source.WarningTime;
  1171. clone.WarningCommand = source.WarningCommand;
  1172. clone.IsWarningEnable = source.IsWarningEnable;
  1173. clone.AlarmHigh = source.AlarmHigh;
  1174. clone.AlarmLow = source.AlarmLow;
  1175. clone.AlarmTime = source.AlarmTime;
  1176. clone.AlarmCommand = source.AlarmCommand;
  1177. clone.IsAlarmEnable = source.IsAlarmEnable;
  1178. return clone;
  1179. }
  1180. }
  1181. class AlarmConditionDIParameter
  1182. {
  1183. //类似DI的
  1184. public string Name { get; set; }
  1185. public string DataPoll { get; set; }
  1186. public bool IsAlarm { get; set; }
  1187. public bool IsEnable { get; set; }
  1188. public string Command { get; set; }
  1189. }
  1190. class AlarmConditionBoatParameter
  1191. {
  1192. //Boat load,unload温度判断
  1193. public string Name { get; set; }
  1194. public string DataPoll { get; set; }
  1195. public bool IsAlarm { get; set; }
  1196. public bool IsEnable { get; set; }
  1197. public float AlarmHighLimit { get; set; }
  1198. }
  1199. }
  1200. }