IoHighTemperatureHeater.cs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.IOCore;
  4. using Aitex.Core.RT.Log;
  5. using Aitex.Core.RT.OperationCenter;
  6. using Aitex.Core.RT.SCCore;
  7. using Aitex.Core.Util;
  8. using MECF.Framework.Common.CommonData;
  9. using MECF.Framework.Common.CommonData.DeviceData;
  10. using System;
  11. using System.Threading.Tasks;
  12. using System.Xml;
  13. using Venus_Core;
  14. namespace Venus_RT.Devices.IODevices
  15. {
  16. public class IoHighTemperatureHeater : BaseDevice, IDevice
  17. {
  18. private readonly DIAccessor _diPowerOnFeedback;
  19. private readonly DOAccessor _doPowerOn;
  20. private readonly AIAccessor _aiTemperatureFeedback;
  21. private readonly AOAccessor _aoTemperatureSetPoint;
  22. private readonly DIAccessor _diGoPosition1Feedback;
  23. private readonly DOAccessor _doGoPosition1On;
  24. private readonly DIAccessor _diGoPosition2Feedback;
  25. private readonly DOAccessor _doGoPosition2On;
  26. private readonly DIAccessor _diGoPosition3Feedback;
  27. private readonly DOAccessor _doGoPosition3On;
  28. private readonly DIAccessor _diGoPosition4Feedback;
  29. private readonly DOAccessor _doGoPosition4On;
  30. private readonly DIAccessor _diGoPosition5Feedback;
  31. private readonly DOAccessor _doGoPosition5On;
  32. private readonly DIAccessor _diGoOriginFeedback;
  33. private readonly DOAccessor _doGoOriginOn;
  34. private readonly AOAccessor _aoLiftServoPosition1;
  35. private readonly AOAccessor _aoLiftServoPosition2;
  36. private readonly AOAccessor _aoLiftServoPosition3;
  37. private readonly AOAccessor _aoLiftServoPosition4;
  38. private readonly AOAccessor _aoLiftServoPosition5;
  39. private readonly AOAccessor _aoOriginSearchHighSpeed;
  40. private readonly AOAccessor _aoOriginSearchLowSpeed;
  41. private readonly AOAccessor _aoAbsMoveSpeed;
  42. private readonly AOAccessor _aoMaximusMoveSpeed;
  43. private readonly AOAccessor _aoSoftDownLimit;
  44. private readonly AOAccessor _aoSoftUpLimit;
  45. private readonly AOAccessor _aoRatio;
  46. private readonly DIAccessor _diDriverAlarm;
  47. private readonly DIAccessor _diPosiModuleAlarm;
  48. private readonly DIAccessor _diORGFailAlarm;
  49. private readonly DOAccessor _doResetLift;
  50. private readonly DOAccessor _doResetHeater;
  51. private readonly AIAccessor _aiHeaterPurgeN2Flow;
  52. private readonly DIAccessor _diMhtrErrorHeatStop;
  53. private readonly DOAccessor _doMhtrErrorReset;
  54. private readonly DIAccessor _diWaferTransferPosiSW;
  55. private readonly DeviceTimer _originTimer = new DeviceTimer();
  56. private readonly DeviceTimer _position1Timer = new DeviceTimer();
  57. private readonly DeviceTimer _position2Timer = new DeviceTimer();
  58. private readonly DeviceTimer _position3Timer = new DeviceTimer();
  59. private readonly DeviceTimer _position4Timer = new DeviceTimer();
  60. private readonly DeviceTimer _position5Timer = new DeviceTimer();
  61. private int _goPositionTime = 30 * 1000;
  62. private float HighTemperatureHeaterTemperatureSetPoint;
  63. private string HighTemperatureHeaterPositipnSetPoint;
  64. private float HighTemperatureHeaterRatioSetPoint;
  65. private float _maxTemperatureSetPoint;
  66. private float _minTemperatureSetPoint;
  67. private float _maxRatioSetPoint;
  68. private float _minRatioSetPoint;
  69. private int _clearAlarmCounter;
  70. private AITHighTemperatureHeaterData DeviceData
  71. {
  72. get
  73. {
  74. return new AITHighTemperatureHeaterData
  75. {
  76. Module = Module,
  77. DeviceName = Name,
  78. DisplayName = Display,
  79. HighTemperatureHeaterPositionFeedBack = CurrentPosition.ToString(),
  80. HighTemperatureHeaterIsonFeedBack = HighTemperatureHeaterIsOn,
  81. HighTemperatureHeaterTemperatureFeedBack = HighTemperatureHighHeaterTemperature,
  82. HighTemperatureHeaterRatioFeedBack = HighTemperatureHeaterRatio,
  83. HighTemperatureHeaterPositionSetPoint = HighTemperatureHeaterPositipnSetPoint,
  84. HighTemperatureHeaterTemperatureSetPoint = HighTemperatureHeaterTemperatureSetPoint,
  85. HighTemperatureHeaterRatioSetPoint = HighTemperatureHeaterRatioSetPoint,
  86. HighTemperatureHeaterN2Flow= HighTemperatureHeaterN2Flow,
  87. LiftIsAlarm = IsDriverAlarm || IsPosiModuleAlarm || IsORGFailAlarm
  88. };
  89. }
  90. }
  91. public bool IsDriverAlarm => _diDriverAlarm.Value;
  92. public bool IsPosiModuleAlarm => _diPosiModuleAlarm.Value;
  93. public bool IsORGFailAlarm => _diORGFailAlarm.Value;
  94. public HighTemperatureHeaterPosition CurrentPosition
  95. {
  96. get
  97. {
  98. if (_diDriverAlarm.Value || _diPosiModuleAlarm.Value || _diORGFailAlarm.Value)
  99. {
  100. return HighTemperatureHeaterPosition.UnKnow;
  101. }
  102. if (_diGoOriginFeedback.Value == true && _diGoPosition1Feedback.Value == false && _diGoPosition2Feedback.Value == false && _diGoPosition3Feedback.Value == false && _diGoPosition4Feedback.Value == false && _diGoPosition5Feedback.Value == false)
  103. {
  104. return HighTemperatureHeaterPosition.Origin;
  105. }
  106. if (_diGoOriginFeedback.Value == false && _diGoPosition1Feedback.Value == true && _diGoPosition2Feedback.Value == false && _diGoPosition3Feedback.Value == false && _diGoPosition4Feedback.Value == false && _diGoPosition5Feedback.Value == false)
  107. {
  108. return HighTemperatureHeaterPosition.Position1;
  109. }
  110. else if (_diGoOriginFeedback.Value == false && _diGoPosition1Feedback.Value == false && _diGoPosition2Feedback.Value == true && _diGoPosition3Feedback.Value == false && _diGoPosition4Feedback.Value == false && _diGoPosition5Feedback.Value == false)
  111. {
  112. return HighTemperatureHeaterPosition.Position2;
  113. }
  114. else if (_diGoOriginFeedback.Value == false && _diGoPosition1Feedback.Value == false && _diGoPosition2Feedback.Value == false && _diGoPosition3Feedback.Value == true && _diGoPosition4Feedback.Value == false && _diGoPosition5Feedback.Value == false)
  115. {
  116. return HighTemperatureHeaterPosition.Position3;
  117. }
  118. else if (_diGoOriginFeedback.Value == false && _diGoPosition1Feedback.Value == false && _diGoPosition2Feedback.Value == false && _diGoPosition3Feedback.Value == false && _diGoPosition4Feedback.Value == true && _diGoPosition5Feedback.Value == false)
  119. {
  120. return HighTemperatureHeaterPosition.Position4;
  121. }
  122. else if (_diGoOriginFeedback.Value == false && _diGoPosition1Feedback.Value == false && _diGoPosition2Feedback.Value == false && _diGoPosition3Feedback.Value == false && _diGoPosition4Feedback.Value == false && _diGoPosition5Feedback.Value == true)
  123. {
  124. return HighTemperatureHeaterPosition.Position5;
  125. }
  126. else
  127. {
  128. return HighTemperatureHeaterPosition.UnKnow;
  129. }
  130. }
  131. }
  132. public bool HighTemperatureHeaterIsOn
  133. {
  134. get
  135. {
  136. if (_diPowerOnFeedback.Value == true && _doPowerOn.Value == true)
  137. {
  138. return true;
  139. }
  140. else
  141. {
  142. return false;
  143. }
  144. }
  145. set
  146. {
  147. SC.SetItemValue($"{Module}.HighTemperatureHeater.IsOn", value);
  148. }
  149. }
  150. public float HighTemperatureHighHeaterTemperature
  151. {
  152. get
  153. {
  154. if (_aiTemperatureFeedback == null) return -1;
  155. return _GetRealFloat(_aiTemperatureFeedback);
  156. }
  157. set
  158. {
  159. if (value <= _maxTemperatureSetPoint && value >= _minTemperatureSetPoint)
  160. {
  161. LOG.Write(eEvent.INFO_HighTemperatureHeater, Module, $" Set Temperature to {value}");
  162. HighTemperatureHeaterTemperatureSetPoint = value;
  163. SC.SetItemValue($"{Module}.HighTemperatureHeater.Temperature", value);
  164. }
  165. else
  166. {
  167. LOG.Write(eEvent.ERR_HighTemperatureHeater_SetTemperature_OverRange, Module, value.ToString(),_minTemperatureSetPoint.ToString(),_maxTemperatureSetPoint.ToString());
  168. }
  169. }
  170. }
  171. public float HighTemperatureHeaterRatio
  172. {
  173. get
  174. {
  175. if (_aoRatio == null) return -1;
  176. return _GetRealFloat(_aoRatio);
  177. }
  178. set
  179. {
  180. if (value <= _maxRatioSetPoint && value >= _minRatioSetPoint)
  181. {
  182. LOG.Write(eEvent.INFO_HighTemperatureHeater, Module, $" Set Ratio to {value}");
  183. HighTemperatureHeaterRatioSetPoint = value;
  184. SC.SetItemValue($"{Module}.HighTemperatureHeater.Ratio", value);
  185. }
  186. else
  187. {
  188. LOG.Write(eEvent.ERR_HighTemperatureHeater_SetRatio_OverRange, Module, value.ToString(),_minRatioSetPoint.ToString(),_maxRatioSetPoint.ToString());
  189. }
  190. }
  191. }
  192. public float HighTemperatureHeaterN2Flow
  193. {
  194. get
  195. {
  196. if (_aiHeaterPurgeN2Flow == null) return -1;
  197. return _GetRealFloat(_aiHeaterPurgeN2Flow);
  198. }
  199. }
  200. public IoHighTemperatureHeater(string module, XmlElement node, string ioModule = "")
  201. {
  202. base.Module = module;
  203. base.Name = node.GetAttribute("id");
  204. base.Display = node.GetAttribute("display");
  205. base.DeviceID = node.GetAttribute("schematicId");
  206. _diPowerOnFeedback = ParseDiNode("diPowerOnFeedback", node, ioModule);
  207. _doPowerOn = ParseDoNode("doPowerOn", node, ioModule);
  208. _aiTemperatureFeedback = ParseAiNode("aiTemperatureFeedback", node, ioModule);
  209. _aoTemperatureSetPoint = ParseAoNode("aoTemperatureSetPoint", node, ioModule);
  210. _diGoPosition1Feedback = ParseDiNode("diGoPosition1Feedback", node, ioModule);
  211. _doGoPosition1On = ParseDoNode("doGoPosition1On", node, ioModule);
  212. _diGoPosition2Feedback = ParseDiNode("diGoPosition2Feedback", node, ioModule);
  213. _doGoPosition2On = ParseDoNode("doGoPosition2On", node, ioModule);
  214. _diGoPosition3Feedback = ParseDiNode("diGoPosition3Feedback", node, ioModule);
  215. _doGoPosition3On = ParseDoNode("doGoPosition3On", node, ioModule);
  216. _diGoPosition4Feedback = ParseDiNode("diGoPosition4Feedback", node, ioModule);
  217. _doGoPosition4On = ParseDoNode("doGoPosition4On", node, ioModule);
  218. _diGoPosition5Feedback = ParseDiNode("diGoPosition5Feedback", node, ioModule);
  219. _doGoPosition5On = ParseDoNode("doGoPosition5On", node, ioModule);
  220. _diGoOriginFeedback = ParseDiNode("diGoOriginFeedback", node, ioModule);
  221. _doGoOriginOn = ParseDoNode("doGoOriginOn", node, ioModule);
  222. _aoLiftServoPosition1 = ParseAoNode("aoLiftServoPosition1", node, ioModule);
  223. _aoLiftServoPosition2 = ParseAoNode("aoLiftServoPosition2", node, ioModule);
  224. _aoLiftServoPosition3 = ParseAoNode("aoLiftServoPosition3", node, ioModule);
  225. _aoLiftServoPosition4 = ParseAoNode("aoLiftServoPosition4", node, ioModule);
  226. _aoLiftServoPosition5 = ParseAoNode("aoLiftServoPosition5", node, ioModule);
  227. _aoOriginSearchHighSpeed = ParseAoNode("aoOriginSearchHighSpeed", node, ioModule);
  228. _aoOriginSearchLowSpeed = ParseAoNode("aoOriginSearchLowSpeed", node, ioModule);
  229. _aoAbsMoveSpeed = ParseAoNode("aoAbsMoveSpeed", node, ioModule);
  230. _aoMaximusMoveSpeed = ParseAoNode("aoMaximusMoveSpeed", node, ioModule);
  231. _aoSoftDownLimit = ParseAoNode("aoSoftDownLimit", node, ioModule);
  232. _aoSoftUpLimit = ParseAoNode("aoSoftUpLimit", node, ioModule);
  233. _aoRatio = ParseAoNode("aoRatio", node, ioModule);
  234. _maxTemperatureSetPoint = Convert.ToSingle(SC.GetConfigItem($"{module}.HighTemperatureHeater.Temperature").Max);
  235. _minTemperatureSetPoint = Convert.ToSingle(SC.GetConfigItem($"{module}.HighTemperatureHeater.Temperature").Min);
  236. _maxRatioSetPoint = Convert.ToSingle(SC.GetConfigItem($"{module}.HighTemperatureHeater.Ratio").Max);
  237. _minRatioSetPoint = Convert.ToSingle(SC.GetConfigItem($"{module}.HighTemperatureHeater.Ratio").Min);
  238. _diDriverAlarm = ParseDiNode("diDriverAlarm", node, ioModule);
  239. _diPosiModuleAlarm = ParseDiNode("diPosiModuleAlarm", node, ioModule);
  240. _diORGFailAlarm = ParseDiNode("diORGFailAlarm", node, ioModule);
  241. _doResetLift = ParseDoNode("doResetLift", node, ioModule);
  242. _doResetHeater = ParseDoNode("doResetHeater", node, ioModule);
  243. _aiHeaterPurgeN2Flow = ParseAiNode("aiHeaterPurgeN2Flow", node, ioModule);
  244. _diMhtrErrorHeatStop = ParseDiNode("diMhtrErrorHeatStop", node, ioModule);
  245. _doMhtrErrorReset = ParseDoNode("doMhtrErrorReset", node, ioModule);
  246. _diWaferTransferPosiSW = ParseDiNode("diWaferTransferPosiSW", node, ioModule);
  247. }
  248. public bool GotoPosition(HighTemperatureHeaterPosition highTemperatureHeaterPosition)
  249. {
  250. if (!LiftHardwareIsOK())
  251. {
  252. LOG.Write(eEvent.ERR_HighTemperatureHeater, Module, $"{Name} Lift Servo Alarm,can not go to {highTemperatureHeaterPosition}");
  253. return false;
  254. }
  255. if (highTemperatureHeaterPosition != HighTemperatureHeaterPosition.Origin && !LiftSoftwareIsOK())
  256. {
  257. LOG.Write(eEvent.ERR_HighTemperatureHeater, Module, $"{Name} Lift Servo Alarm,can not go to {highTemperatureHeaterPosition}");
  258. return false;
  259. }
  260. LOG.Write(eEvent.INFO_HighTemperatureHeater, Module, $"{Name} start to {highTemperatureHeaterPosition.ToString()}");
  261. HighTemperatureHeaterPositipnSetPoint = highTemperatureHeaterPosition.ToString();
  262. switch (highTemperatureHeaterPosition)
  263. {
  264. case HighTemperatureHeaterPosition.Origin:
  265. _doGoPosition1On.Value = false;
  266. _doGoPosition2On.Value = false;
  267. _doGoPosition3On.Value = false;
  268. _doGoPosition4On.Value = false;
  269. _doGoPosition5On.Value = false;
  270. _doGoOriginOn.Value = true;
  271. _originTimer.Start(_goPositionTime);
  272. break;
  273. case HighTemperatureHeaterPosition.Position1:
  274. _doGoPosition2On.Value = false;
  275. _doGoPosition3On.Value = false;
  276. _doGoPosition4On.Value = false;
  277. _doGoPosition5On.Value = false;
  278. _doGoOriginOn.Value = false;
  279. _doGoPosition1On.Value = true;
  280. _position1Timer.Start(_goPositionTime);
  281. break;
  282. case HighTemperatureHeaterPosition.Position2:
  283. _doGoPosition1On.Value = false;
  284. _doGoPosition3On.Value = false;
  285. _doGoPosition4On.Value = false;
  286. _doGoPosition5On.Value = false;
  287. _doGoOriginOn.Value = false;
  288. _doGoPosition2On.Value = true;
  289. _position2Timer.Start(_goPositionTime);
  290. break;
  291. case HighTemperatureHeaterPosition.Position3:
  292. _doGoPosition1On.Value = false;
  293. _doGoPosition2On.Value = false;
  294. _doGoPosition4On.Value = false;
  295. _doGoPosition5On.Value = false;
  296. _doGoOriginOn.Value = false;
  297. _doGoPosition3On.Value = true;
  298. _position3Timer.Start(_goPositionTime);
  299. break;
  300. case HighTemperatureHeaterPosition.Position4:
  301. _doGoPosition1On.Value = false;
  302. _doGoPosition2On.Value = false;
  303. _doGoPosition3On.Value = false;
  304. _doGoPosition5On.Value = false;
  305. _doGoOriginOn.Value = false;
  306. _doGoPosition4On.Value = true;
  307. _position4Timer.Start(_goPositionTime);
  308. break;
  309. case HighTemperatureHeaterPosition.Position5:
  310. _doGoPosition1On.Value = false;
  311. _doGoPosition2On.Value = false;
  312. _doGoPosition3On.Value = false;
  313. _doGoPosition4On.Value = false;
  314. _doGoOriginOn.Value = false;
  315. _doGoPosition5On.Value = true;
  316. _position5Timer.Start(_goPositionTime);
  317. break;
  318. }
  319. return true;
  320. }
  321. public bool Initialize()
  322. {
  323. OP.Subscribe($"{Module}.{Name}.GotoPosition", (cmd, args) =>
  324. {
  325. var currentPosition = (HighTemperatureHeaterPosition)Enum.Parse(typeof(HighTemperatureHeaterPosition), args[0].ToString());
  326. GotoPosition(currentPosition);
  327. return true;
  328. });
  329. OP.Subscribe($"{Module}.{Name}.SwitchHighTemperatureHeater", (cmd, args) =>
  330. {
  331. HighTemperatureHeaterIsOn = Convert.ToBoolean(args[0].ToString());
  332. return true;
  333. });
  334. OP.Subscribe($"{Module}.{Name}.SetHighTemperatureHeaterTemperature", (cmd, args) =>
  335. {
  336. HighTemperatureHighHeaterTemperature = Convert.ToSingle(args[0]);
  337. return true;
  338. });
  339. OP.Subscribe($"{Module}.{Name}.SetHighTemperatureHeaterRatio", (cmd, args) =>
  340. {
  341. HighTemperatureHeaterRatio = Convert.ToSingle(args[0]);
  342. return true;
  343. });
  344. OP.Subscribe($"{Module}.{Name}.ResetHighTemperatureHeater", (cmd, args) =>
  345. {
  346. ResetSignal();
  347. return true;
  348. });
  349. DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  350. DATA.Subscribe($"{Module}.{Name}.Temperature", () => DeviceData.HighTemperatureHeaterTemperatureFeedBack);
  351. DATA.Subscribe($"{Module}.{Name}.Position", () => (int)CurrentPosition - 1);
  352. DATA.Subscribe($"{Module}.{Name}.IsOn", () => DeviceData.HighTemperatureHeaterIsonFeedBack);
  353. DATA.Subscribe($"{Module}.{Name}.TemperatureSetPoint", () => DeviceData.HighTemperatureHeaterTemperatureSetPoint);
  354. DATA.Subscribe($"{Module}.{Name}.Power_Output", () => GetAiValue($"{Module}.AI_CHB_M-HT_Reference_Power_Output"));
  355. DATA.Subscribe($"{Module}.{Name}.MaxPower", () => GetAiValue($"{Module}.AI_CHB_M-HT_Max_Power"));
  356. DATA.Subscribe($"{Module}.{Name}.MinPower", () => GetAiValue($"{Module}.AI_CHB_M-HT_Min_Power"));
  357. DATA.Subscribe($"{Module}.{Name}.Speed", () => GetAiValue($"{Module}.AI_CHB_M-HT_Current_Speed"));
  358. DATA.Subscribe($"{Module}.{Name}.Posi_Mm", () => GetAiValue($"{Module}.AI_Lift_Servo_Current_Posi_Mm"));
  359. DATA.Subscribe($"{Module}.{Name}.TM_Temp", () => GetAiValue($"{Module}.AI_CHB_M-HT_Control_TM_Temp"));
  360. DATA.Subscribe($"{Module}.{Name}.InnerCurrent", () => GetAiValue($"{Module}.AI_CHB_M-HT_Inner_Current_FB"));
  361. DATA.Subscribe($"{Module}.{Name}.InnerVoltage", () => GetAiValue($"{Module}.AI_CHB_M-HT_Inner_Voltage_FB"));
  362. DATA.Subscribe($"{Module}.{Name}.InnerPower", () => GetAiValue($"{Module}.AI_CHB_M-HT_Inner_Power_FB"));
  363. DATA.Subscribe($"{Module}.{Name}.InnerResistance", () => GetAiValue($"{Module}.AI_CHB_M-HT_Inner_Resistance_FB"));
  364. DATA.Subscribe($"{Module}.{Name}.OuterCurrent", () => GetAiValue($"{Module}.AI_CHB_M-HT_Outer_Current_FB"));
  365. DATA.Subscribe($"{Module}.{Name}.OuterVoltage", () => GetAiValue($"{Module}.AI_CHB_M-HT_Outer_Voltage_FB"));
  366. DATA.Subscribe($"{Module}.{Name}.OuterPower", () => GetAiValue($"{Module}.AI_CHB_M-HT_Outer_Power_FB"));
  367. DATA.Subscribe($"{Module}.{Name}.OuterResistance", () => GetAiValue($"{Module}.AI_CHB_M-HT_Outer_Resistance_FB"));
  368. DATA.Subscribe($"{Module}.{Name}.PurgeN2Flow", () => GetAiValue($"{Module}.AI_Heater_Purge_N2_Flow"));
  369. DATA.Subscribe($"{Module}.{Name}.ShaftTCTemp", () => GetAiValue($"{Module}.AI_HTR_Shaft_TC_Temp"));
  370. DATA.Subscribe($"{Module}.{Name}.SourceTCTemp", () => GetAiValue($"{Module}.AI_Source_TC_Temp"));
  371. DATA.Subscribe($"{Module}.{Name}.Ratio", () => HighTemperatureHeaterRatio);
  372. _SetRealFloat(_aoLiftServoPosition1, 20);
  373. _SetRealFloat(_aoLiftServoPosition2, -30);
  374. _SetRealFloat(_aoLiftServoPosition3, -40);
  375. _SetRealFloat(_aoLiftServoPosition4, 20);
  376. _SetRealFloat(_aoLiftServoPosition5, 50);
  377. _SetRealFloat(_aoOriginSearchHighSpeed, 10);
  378. _SetRealFloat(_aoOriginSearchLowSpeed, 5);
  379. _SetRealFloat(_aoAbsMoveSpeed, 10);
  380. _SetRealFloat(_aoMaximusMoveSpeed, 20);
  381. _SetRealFloat(_aoSoftDownLimit, 100);
  382. _SetRealFloat(_aoSoftUpLimit, 300);
  383. return true;
  384. }
  385. public void Stop()
  386. {
  387. }
  388. public void Terminate()
  389. {
  390. }
  391. public void Monitor()
  392. {
  393. if (_originTimer.IsTimeout())
  394. {
  395. _originTimer.Stop();
  396. if (_diGoOriginFeedback.Value == false)
  397. {
  398. LOG.Write(eEvent.ERR_HighTemperatureHeater_GoOriginTimeOut, Module, $"{Name} {_goPositionTime / 1000} s 内未到原点");
  399. }
  400. }
  401. else if (_originTimer.IsIdle() == false)
  402. {
  403. if (_diGoOriginFeedback.Value == true)
  404. {
  405. LOG.Write(eEvent.INFO_HighTemperatureHeater, Module, $"{Name} to Origin");
  406. _doGoOriginOn.Value = false;
  407. _originTimer.Stop();
  408. }
  409. }
  410. if (_position1Timer.IsTimeout())
  411. {
  412. _position1Timer.Stop();
  413. if (_diGoPosition1Feedback.Value == false)
  414. {
  415. LOG.Write(eEvent.ERR_HighTemperatureHeater_GoPosition1TimeOut, Module, $"{Name} {_goPositionTime / 1000} s 内未到Position1");
  416. }
  417. if (_diWaferTransferPosiSW.Value == false)
  418. {
  419. LOG.Write(eEvent.ERR_HighTemperatureHeater_TransferPosition, Module, $"{Name} {_goPositionTime / 1000} s 内未到传片位");
  420. }
  421. }
  422. else if (_position1Timer.IsIdle() == false)
  423. {
  424. if (_diGoPosition1Feedback.Value == true && _diWaferTransferPosiSW.Value==true)
  425. {
  426. LOG.Write(eEvent.INFO_HighTemperatureHeater, Module, $"{Name} to Position1");
  427. _doGoPosition1On.Value = false;
  428. _position1Timer.Stop();
  429. }
  430. }
  431. if (_position2Timer.IsTimeout())
  432. {
  433. _position2Timer.Stop();
  434. if (_diGoPosition2Feedback.Value == false)
  435. {
  436. LOG.Write(eEvent.ERR_HighTemperatureHeater_GoPosition2TimeOut, Module, $"{Name} {_goPositionTime / 1000} s 内未到Position2");
  437. }
  438. }
  439. else if (_position2Timer.IsIdle() == false)
  440. {
  441. if (_diGoPosition2Feedback.Value == true)
  442. {
  443. LOG.Write(eEvent.INFO_HighTemperatureHeater, Module, $"{Name} to Position2");
  444. _doGoPosition2On.Value = false;
  445. _position2Timer.Stop();
  446. }
  447. }
  448. if (_position3Timer.IsTimeout())
  449. {
  450. _position3Timer.Stop();
  451. if (_diGoPosition3Feedback.Value == false)
  452. {
  453. LOG.Write(eEvent.ERR_HighTemperatureHeater_GoPosition3TimeOut, Module, $"{Name} {_goPositionTime / 1000} s 内未到Position3");
  454. }
  455. }
  456. else if (_position3Timer.IsIdle() == false)
  457. {
  458. if (_diGoPosition3Feedback.Value == true)
  459. {
  460. LOG.Write(eEvent.INFO_HighTemperatureHeater, Module, $"{Name} to Position3");
  461. _doGoPosition3On.Value = false;
  462. _position3Timer.Stop();
  463. }
  464. }
  465. if (_position4Timer.IsTimeout())
  466. {
  467. _position4Timer.Stop();
  468. if (_diGoPosition4Feedback.Value == false)
  469. {
  470. LOG.Write(eEvent.ERR_HighTemperatureHeater_GoPosition4TimeOut, Module, $"{Name} {_goPositionTime / 1000} s 内未到Position4");
  471. }
  472. }
  473. else if (_position4Timer.IsIdle() == false)
  474. {
  475. if (_diGoPosition4Feedback.Value == true)
  476. {
  477. LOG.Write(eEvent.INFO_HighTemperatureHeater, Module, $"{Name} to Position4");
  478. _doGoPosition4On.Value = false;
  479. _position4Timer.Stop();
  480. }
  481. }
  482. if (_position5Timer.IsTimeout())
  483. {
  484. _position5Timer.Stop();
  485. if (_diGoPosition5Feedback.Value == false)
  486. {
  487. LOG.Write(eEvent.ERR_HighTemperatureHeater_GoPosition5TimeOut, Module, $"{Name} {_goPositionTime / 1000} s 内未到Position5");
  488. }
  489. }
  490. else if (_position5Timer.IsIdle() == false)
  491. {
  492. if (_diGoPosition5Feedback.Value == true)
  493. {
  494. LOG.Write(eEvent.INFO_HighTemperatureHeater, Module, $"{Name} to Position5");
  495. _doGoPosition5On.Value = false;
  496. _position5Timer.Stop();
  497. }
  498. }
  499. var position1Value = (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.LiftServoPosition1");
  500. var position2Value = (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.LiftServoPosition2") + (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.LiftServoPositionOffset");
  501. var position3Value = (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.LiftServoPosition3") + (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.LiftServoPositionOffset");
  502. var position4Value = (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.LiftServoPosition4") + (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.LiftServoPositionOffset");
  503. var position5Value = (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.LiftServoPosition5") + (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.LiftServoPositionOffset");
  504. _SetRealFloat(_aoLiftServoPosition1, position1Value);
  505. _SetRealFloat(_aoLiftServoPosition2, position2Value);
  506. _SetRealFloat(_aoLiftServoPosition3, position3Value);
  507. _SetRealFloat(_aoLiftServoPosition4, position4Value);
  508. _SetRealFloat(_aoLiftServoPosition5, position5Value);
  509. _SetRealFloat(_aoOriginSearchHighSpeed, (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.OriginSearchHighSpeed"));
  510. _SetRealFloat(_aoOriginSearchLowSpeed, (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.OriginSearchLowSpeed"));
  511. _SetRealFloat(_aoAbsMoveSpeed, (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.AbsMoveSpeed"));
  512. _SetRealFloat(_aoMaximusMoveSpeed, (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.MaximusMoveSpeed"));
  513. _SetRealFloat(_aoSoftDownLimit, (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.SoftDownLimit"));
  514. _SetRealFloat(_aoSoftUpLimit, (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.SoftUpLimit"));
  515. _SetRealFloat(_aoTemperatureSetPoint, (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.Temperature"));
  516. _SetRealFloat(_aoRatio, (float)SC.GetValue<double>($"{Module}.HighTemperatureHeater.Ratio"));
  517. _doPowerOn.Value = SC.GetValue<bool>($"{Module}.HighTemperatureHeater.IsOn");
  518. }
  519. public bool LiftIsOK()
  520. {
  521. if (IsDriverAlarm)
  522. {
  523. LOG.Write(eEvent.ERR_HighTemperatureHeater, Module, $"{Name} Lift Servo Driver Alarm");
  524. return false;
  525. }
  526. if (IsPosiModuleAlarm)
  527. {
  528. LOG.Write(eEvent.ERR_HighTemperatureHeater, Module, $"{Name} Lift Servo Position Module Alarm");
  529. return false;
  530. }
  531. if (IsORGFailAlarm)
  532. {
  533. LOG.Write(eEvent.ERR_HighTemperatureHeater, Module, $"{Name} Lift Servo ORG Fail Alarm");
  534. return false;
  535. }
  536. return true;
  537. }
  538. private bool LiftHardwareIsOK()
  539. {
  540. if (IsDriverAlarm)
  541. {
  542. LOG.Write(eEvent.ERR_HighTemperatureHeater, Module, $"{Name} Lift Servo Driver Alarm");
  543. return false;
  544. }
  545. if (IsPosiModuleAlarm)
  546. {
  547. LOG.Write(eEvent.ERR_HighTemperatureHeater, Module, $"{Name} Lift Servo Position Module Alarm");
  548. return false;
  549. }
  550. return true;
  551. }
  552. private bool LiftSoftwareIsOK()
  553. {
  554. if (IsORGFailAlarm)
  555. {
  556. LOG.Write(eEvent.ERR_HighTemperatureHeater, Module, $"{Name} Lift Servo ORG Fail Alarm");
  557. return false;
  558. }
  559. return true;
  560. }
  561. public async void ResetSignal()
  562. {
  563. //if (_diMhtrErrorHeatStop.Value)
  564. //{
  565. // if (_doMhtrErrorReset.Value == true)
  566. // {
  567. // _doMhtrErrorReset.Value = false;
  568. // await Task.Delay(200);
  569. // }
  570. // _doMhtrErrorReset.Value = true;
  571. //}
  572. if (_doResetHeater.Value == true)
  573. {
  574. _doResetHeater.Value = false;
  575. await Task.Delay(200);
  576. }
  577. _doResetHeater.Value = true;
  578. await Task.Delay(1000);
  579. _doResetHeater.Value = true;
  580. if (_doResetLift.Value == true)
  581. {
  582. _doResetLift.Value = false;
  583. await Task.Delay(200);
  584. }
  585. _doResetLift.Value = true;
  586. await Task.Delay(1000);
  587. _doResetLift.Value = false;
  588. _clearAlarmCounter = 0;
  589. while (IsDriverAlarm || IsPosiModuleAlarm)
  590. {
  591. _clearAlarmCounter += 1;
  592. if (_clearAlarmCounter > 5)
  593. {
  594. LOG.Write(eEvent.ERR_HighTemperatureHeater, Module, $"{Name} Clear Alarm Failed");
  595. return;
  596. }
  597. else
  598. {
  599. LOG.Write(eEvent.INFO_PM, Module, $"{Name} Clearing Alarm,Please wait");
  600. }
  601. await Task.Delay(1000);
  602. }
  603. GotoPosition(HighTemperatureHeaterPosition.Origin);
  604. }
  605. public void Reset()
  606. {
  607. }
  608. }
  609. }