IoHighTemperatureHeater.cs 30 KB

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