IoAPC.cs 72 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565
  1. using Aitex.Common.Util;
  2. using Aitex.Core.Common.DeviceData;
  3. using Aitex.Core.RT.DataCenter;
  4. using Aitex.Core.RT.Device;
  5. using Aitex.Core.RT.Device.Unit;
  6. using Aitex.Core.RT.Event;
  7. using Aitex.Core.RT.IOCore;
  8. using Aitex.Core.RT.Log;
  9. using Aitex.Core.RT.OperationCenter;
  10. using Aitex.Core.RT.ParameterCenter;
  11. using Aitex.Core.RT.SCCore;
  12. using Aitex.Core.Util;
  13. using FurnaceRT.Equipments.PMs;
  14. using FurnaceRT.Equipments.Systems;
  15. using MECF.Framework.Common.DataCenter;
  16. using MECF.Framework.Common.Equipment;
  17. using MECF.Framework.Common.Event;
  18. using System;
  19. using System.Collections.Generic;
  20. using System.Diagnostics;
  21. using System.IO;
  22. using System.Linq;
  23. using System.Text;
  24. using System.Threading.Tasks;
  25. using System.Xml;
  26. namespace FurnaceRT.Devices
  27. {
  28. public class IoAPC : BaseDevice, IDevice
  29. {
  30. #region Filed
  31. private DIAccessor _diP1ZeroOffsetOutRangeAlm;
  32. private DIAccessor _diP1ZeroAdjOutRangeAlm;
  33. private DIAccessor _diP1SpanAdjOutRangeAlm;
  34. private DIAccessor _diP2ZeroOffsetOutRangeAlm;
  35. private DIAccessor _diP2ZeroAdjOutRangeAlm;
  36. private DIAccessor _diP2SpanAdjOutRangeAlm;
  37. private DIAccessor _diP1PressCtrlInterlockAlm;
  38. private DIAccessor _diP2PressCtrlInterlockAlm;
  39. private DIAccessor _diValveOpenCtrlInterlockAlm;
  40. private DIAccessor _diValveHoldCtrlInterlockAlm;
  41. private DIAccessor _diValveCloseInterlockAlm;
  42. private DIAccessor _diAutoTeachingInterlockAlm;
  43. private DIAccessor _diP1DisconnectionAlm;
  44. private DIAccessor _diP2DisconnectionAlm;
  45. private DIAccessor _diPumpStopInterlockAlm;
  46. private DIAccessor _diAutoTeachingErr1Alm;
  47. private DIAccessor _diAutoTeachingErr2Alm;
  48. private DOAccessor _doVGUnit;
  49. private DOAccessor _doAoDataReadSysConfig;
  50. private DOAccessor _doAoDataWriteSysConfig;
  51. private DOAccessor _doAoDataReadCusConfig;
  52. private DOAccessor _doAoDataWriteCusConfig;
  53. private AIAccessor _aiValueSensorInput1;
  54. private AIAccessor _aiValueSensorInput2;
  55. private AIAccessor _aiSelectController;
  56. private AIAccessor _aiPositionActualValue;
  57. private AIAccessor _aiControlModeStatus;
  58. private AIAccessor _aiHomeStatus;
  59. private AIAccessor _aiWarningStatus1;
  60. private AIAccessor _aiWarningStatus2;
  61. private AIAccessor _aiWarningStatus3;
  62. private AIAccessor _aiWarningStatus4;
  63. private AIAccessor _aiWarningStatus5;
  64. private AIAccessor _aiWarningStatus6;
  65. private AIAccessor _aiErrorStatus1;
  66. private AIAccessor _aiErrorStatus2;
  67. private AIAccessor _aiErrorStatus3;
  68. private AIAccessor _aiErrorStatus4;
  69. private AIAccessor _aiValveStatusThreshold;
  70. private AIAccessor _aiForbidInterlockOutbreak;
  71. private AIAccessor _aiSlowVacuumModeSetting;
  72. private AIAccessor _aiInterlock1;
  73. private AIAccessor _aiInterlock2;
  74. private AIAccessor _aiInterlock3;
  75. private AIAccessor _aiInterlockConstantOfInterlock3;
  76. private AIAccessor _aiP1SensorOffsetSetting;
  77. private AIAccessor _aiPosMonOffsetSetting;
  78. private AOAccessor _aoZeroResetP1;
  79. private AOAccessor _aoZeroAdjustP1;
  80. private AOAccessor _aoSpanAdjustP1;
  81. private AOAccessor _aoZeroResetP2;
  82. private AOAccessor _aoZeroAdjustP2;
  83. private AOAccessor _aoSpanAdjustP2;
  84. private AOAccessor _aoSlowVacuumTargetPressure;
  85. private AOAccessor _aoValveStatusThreshold;
  86. private AOAccessor _aoForbidInterlockOutbreak;
  87. private AOAccessor _aoSlowVacuumModeSetting;
  88. private AOAccessor _aoInterlock1;
  89. private AOAccessor _aoInterlock2;
  90. private AOAccessor _aoInterlock3;
  91. private AOAccessor _aoInterlockConstantOfInterlock3;
  92. private AOAccessor _aoP1SensorOffsetSetting;
  93. private AOAccessor _aoPosMonOffsetSetting;
  94. private AOAccessor _aoSensorAdjustReset;
  95. private AOAccessor _aoSlowVacuumRate;
  96. private AOAccessor _aoSlowVacuumP;
  97. private AOAccessor _aoSlowVacuumI;
  98. private AOAccessor _aoSlowVacuumD;
  99. private AOAccessor _aoSlowVacuumA;
  100. private AOAccessor _aoControllerModeSelect;
  101. private AOAccessor _aoSpecifyTargetVacuumPressureControl;
  102. private AOAccessor _aoSpecifyTargetOpeningForValveOpeningControl;
  103. private AOAccessor _aoSpecifyControlMode;
  104. private AOAccessor _aoRangeUpperLimitSensorInput;
  105. private AOAccessor _aoController1;
  106. private AOAccessor _aoController1P;
  107. private AOAccessor _aoController1I;
  108. private AOAccessor _aoController1D;
  109. private AOAccessor _aoController1A;
  110. private AOAccessor _aoController1CH;
  111. private AOAccessor _aoController1CL;
  112. private AOAccessor _aoController1Offset;
  113. private AOAccessor _aoController2;
  114. private AOAccessor _aoController2P;
  115. private AOAccessor _aoController2I;
  116. private AOAccessor _aoController2D;
  117. private AOAccessor _aoController2A;
  118. private AOAccessor _aoController2CH;
  119. private AOAccessor _aoController2CL;
  120. private AOAccessor _aoController2Offset;
  121. private AOAccessor _aoController3;
  122. private AOAccessor _aoController3P;
  123. private AOAccessor _aoController3I;
  124. private AOAccessor _aoController3D;
  125. private AOAccessor _aoController3A;
  126. private AOAccessor _aoController3CH;
  127. private AOAccessor _aoController3CL;
  128. private AOAccessor _aoController3Offset;
  129. private AOAccessor _aoController4;
  130. private AOAccessor _aoController4P;
  131. private AOAccessor _aoController4I;
  132. private AOAccessor _aoController4D;
  133. private AOAccessor _aoController4A;
  134. private AOAccessor _aoController4CH;
  135. private AOAccessor _aoController4CL;
  136. private AOAccessor _aoController4Offset;
  137. private AOAccessor _aoController5;
  138. private AOAccessor _aoController5P;
  139. private AOAccessor _aoController5I;
  140. private AOAccessor _aoController5D;
  141. private AOAccessor _aoController5A;
  142. private AOAccessor _aoController5CH;
  143. private AOAccessor _aoController5CL;
  144. private AOAccessor _aoController5Offset;
  145. private AOAccessor _aoController6;
  146. private AOAccessor _aoController6P;
  147. private AOAccessor _aoController6I;
  148. private AOAccessor _aoController6D;
  149. private AOAccessor _aoController6A;
  150. private AOAccessor _aoController6CH;
  151. private AOAccessor _aoController6CL;
  152. private AOAccessor _aoController6Offset;
  153. private AOAccessor _aoController7;
  154. private AOAccessor _aoController7P;
  155. private AOAccessor _aoController7I;
  156. private AOAccessor _aoController7D;
  157. private AOAccessor _aoController7A;
  158. private AOAccessor _aoController7CH;
  159. private AOAccessor _aoController7CL;
  160. private AOAccessor _aoController7Offset;
  161. private AOAccessor _aoController8;
  162. private AOAccessor _aoController8P;
  163. private AOAccessor _aoController8I;
  164. private AOAccessor _aoController8D;
  165. private AOAccessor _aoController8A;
  166. private AOAccessor _aoController8CH;
  167. private AOAccessor _aoController8CL;
  168. private AOAccessor _aoController8Offset;
  169. private AOAccessor _aoController9;
  170. private AOAccessor _aoController9P;
  171. private AOAccessor _aoController9I;
  172. private AOAccessor _aoController9D;
  173. private AOAccessor _aoController9A;
  174. private AOAccessor _aoController9CH;
  175. private AOAccessor _aoController9CL;
  176. private AOAccessor _aoController9Offset;
  177. private AOAccessor _aoController10;
  178. private AOAccessor _aoController10P;
  179. private AOAccessor _aoController10I;
  180. private AOAccessor _aoController10D;
  181. private AOAccessor _aoController10A;
  182. private AOAccessor _aoController10CH;
  183. private AOAccessor _aoController10CL;
  184. private AOAccessor _aoController10Offset;
  185. private bool _isFloatAioType = false;
  186. private AITAPCData _deviceData;
  187. private bool _isWait;
  188. private float _waitHigh;
  189. private float _waitLow;
  190. private Stopwatch _unloadTimer = new Stopwatch();
  191. private IoValve _valveAV71;
  192. private R_TRIG _av71OpenTrig = new R_TRIG();
  193. private Stopwatch _apcSetModeTimer = new Stopwatch();
  194. private int _apcSetModeTimeOutSec = 5;
  195. private bool _isInit = false;
  196. private Stopwatch _initTimer = new Stopwatch();
  197. #endregion
  198. #region Property
  199. public int SelectedControllerFeedback => (int)(_aiSelectController.FloatValue + 0.0001);
  200. public int ModeFeedback => (int)(_aiControlModeStatus.FloatValue + 0.0001);
  201. public int ModeSetPoint => (int)(_aoSpecifyControlMode.FloatValue + 0.0001);
  202. public int HomingStatus => (int)(_aiHomeStatus.FloatValue + 0.0001);
  203. public bool IsError { get; set; }
  204. public bool IsNeedWaitComplete { get; set; }
  205. public string PressureUnit { get; set; }
  206. private float _basePressure = 0;
  207. private float _valveStausThreshold;
  208. public float ValveStatusThreshold
  209. {
  210. get
  211. {
  212. if(_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
  213. {
  214. return _aiValveStatusThreshold.FloatValue;
  215. }
  216. return _valveStausThreshold;
  217. }
  218. set
  219. {
  220. _valveStausThreshold = value;
  221. SC.SetItemValue($"{Module}.{Name}.ValveStatusThreshold", value);
  222. }
  223. }
  224. private float _slowVacuumModeSetting;
  225. public float SlowVacuumModeSetting
  226. {
  227. get
  228. {
  229. if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
  230. {
  231. return _aiSlowVacuumModeSetting.FloatValue;
  232. }
  233. return _slowVacuumModeSetting;
  234. }
  235. set
  236. {
  237. _slowVacuumModeSetting = value;
  238. SC.SetItemValue($"{Module}.{Name}.SlowVacuumModeSetting", value);
  239. }
  240. }
  241. private float interlock1;
  242. public float Interlock1
  243. {
  244. get
  245. {
  246. if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
  247. {
  248. return _aiInterlock1.FloatValue;
  249. }
  250. return interlock1;
  251. }
  252. set
  253. {
  254. interlock1 = value;
  255. SC.SetItemValue($"{Module}.{Name}.Interlock1", value);
  256. }
  257. }
  258. private float interlock2;
  259. public float Interlock2
  260. {
  261. get
  262. {
  263. if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
  264. {
  265. return _aiInterlock2.FloatValue;
  266. }
  267. return interlock2;
  268. }
  269. set
  270. {
  271. interlock2 = value;
  272. SC.SetItemValue($"{Module}.{Name}.Interlock2", value);
  273. }
  274. }
  275. private float interlock3;
  276. public float Interlock3
  277. {
  278. get
  279. {
  280. if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
  281. {
  282. return _aiInterlock3.FloatValue;
  283. }
  284. return interlock3;
  285. }
  286. set
  287. {
  288. interlock3 = value;
  289. SC.SetItemValue($"{Module}.{Name}.Interlock3", value);
  290. }
  291. }
  292. private float _interlockConstantOfInterlock3;
  293. public float InterlockConstantOfInterlock3
  294. {
  295. get
  296. {
  297. if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
  298. {
  299. return _aiInterlockConstantOfInterlock3.FloatValue;
  300. }
  301. return _interlockConstantOfInterlock3;
  302. }
  303. set
  304. {
  305. _interlockConstantOfInterlock3 = value;
  306. SC.SetItemValue($"{Module}.{Name}.InterlockConstantOfInterlock3", value);
  307. }
  308. }
  309. private float _p1SensorOffsetSetting;
  310. public float P1SensorOffsetSetting
  311. {
  312. get
  313. {
  314. if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
  315. {
  316. return _aiP1SensorOffsetSetting.FloatValue;
  317. }
  318. return _p1SensorOffsetSetting;
  319. }
  320. set
  321. {
  322. _p1SensorOffsetSetting = value;
  323. SC.SetItemValue($"{Module}.{Name}.P1SensorOffsetSetting", value);
  324. }
  325. }
  326. private float _posMonOffsetSetting;
  327. public float PosMonOffsetSetting
  328. {
  329. get
  330. {
  331. if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
  332. {
  333. return _aiPosMonOffsetSetting.FloatValue;
  334. }
  335. return _posMonOffsetSetting;
  336. }
  337. set
  338. {
  339. _posMonOffsetSetting = value;
  340. SC.SetItemValue($"{Module}.{Name}.PosMonOffsetSetting", value);
  341. }
  342. }
  343. public AlarmEventItem APCSetModeAlarm { get; set; }
  344. public AlarmEventItem APCPressure1ToleranceWarning { get; set; }
  345. public AlarmEventItem APCPressure1ToleranceAlarm { get; set; }
  346. public AlarmEventItem APCPressure2ToleranceWarning { get; set; }
  347. public AlarmEventItem APCPressure2ToleranceAlarm { get; set; }
  348. public AlarmEventItem APCAngleToleranceWarning { get; set; }
  349. public AlarmEventItem APCAngleToleranceAlarm { get; set; }
  350. public AITAPCData DeviceData => _deviceData;
  351. #endregion
  352. public IoAPC(string module, XmlElement node, string ioModule = "")
  353. {
  354. base.Module = string.IsNullOrEmpty(node.GetAttribute("module")) ? module : node.GetAttribute("module");
  355. base.Name = node.GetAttribute("id");
  356. base.Display = node.GetAttribute("display");
  357. base.DeviceID = node.GetAttribute("schematicId");
  358. _isFloatAioType = !string.IsNullOrEmpty(node.GetAttribute("aioType")) && (node.GetAttribute("aioType") == "float");
  359. _diP1ZeroOffsetOutRangeAlm = ParseDiNode("diP1ZeroOffsetOutRangeAlm", node, ioModule);
  360. _diP1ZeroAdjOutRangeAlm = ParseDiNode("diP1ZeroAdjOutRangeAlm", node, ioModule);
  361. _diP1SpanAdjOutRangeAlm = ParseDiNode("diP1SpanAdjOutRangeAlm", node, ioModule);
  362. _diP2ZeroOffsetOutRangeAlm = ParseDiNode("diP2ZeroOffsetOutRangeAlm", node, ioModule);
  363. _diP2ZeroAdjOutRangeAlm = ParseDiNode("diP2ZeroAdjOutRangeAlm", node, ioModule);
  364. _diP2SpanAdjOutRangeAlm = ParseDiNode("diP2SpanAdjOutRangeAlm", node, ioModule);
  365. _diP1PressCtrlInterlockAlm = ParseDiNode("diP1PressCtrlInterlockAlm", node, ioModule);
  366. _diP2PressCtrlInterlockAlm = ParseDiNode("diP2PressCtrlInterlockAlm", node, ioModule);
  367. _diValveOpenCtrlInterlockAlm = ParseDiNode("diValveOpenCtrlInterlockAlm", node, ioModule);
  368. _diValveHoldCtrlInterlockAlm = ParseDiNode("diValveHoldCtrlInterlockAlm", node, ioModule);
  369. _diValveCloseInterlockAlm = ParseDiNode("diValveCloseInterlockAlm", node, ioModule);
  370. _diAutoTeachingInterlockAlm = ParseDiNode("diAutoTeachingInterlockAlm", node, ioModule);
  371. _diP1DisconnectionAlm = ParseDiNode("diP1DisconnectionAlm", node, ioModule);
  372. _diP2DisconnectionAlm = ParseDiNode("diP2DisconnectionAlm", node, ioModule);
  373. _diPumpStopInterlockAlm = ParseDiNode("diPumpStopInterlockAlm", node, ioModule);
  374. _diAutoTeachingErr1Alm = ParseDiNode("diAutoTeachingErr1Alm", node, ioModule);
  375. _diAutoTeachingErr2Alm = ParseDiNode("diAutoTeachingErr2Alm", node, ioModule);
  376. _doVGUnit = ParseDoNode("doVGUnit", node, ioModule);
  377. _doAoDataWriteSysConfig = ParseDoNode("doAoDataWriteSysConfig", node, ioModule);
  378. _doAoDataReadSysConfig = ParseDoNode("doAoDataReadSysConfig", node, ioModule);
  379. _doAoDataReadCusConfig = ParseDoNode("doAoDataReadCusConfig", node, ioModule);
  380. _doAoDataWriteCusConfig = ParseDoNode("doAoDataWriteCusConfig", node, ioModule);
  381. _aiValueSensorInput1 = ParseAiNode("aiValueSensorInput1", node, ioModule);
  382. _aiValueSensorInput2 = ParseAiNode("aiValueSensorInput2", node, ioModule);
  383. _aiSelectController = ParseAiNode("aiSelectController", node, ioModule);
  384. _aiPositionActualValue = ParseAiNode("aiPositionActualValue", node, ioModule);
  385. _aiControlModeStatus = ParseAiNode("aiControlModeStatus", node, ioModule);
  386. _aiHomeStatus = ParseAiNode("aiHomeStatus", node, ioModule);
  387. _aiWarningStatus1 = ParseAiNode("aiWarningStatus1", node, ioModule);
  388. _aiWarningStatus2 = ParseAiNode("aiWarningStatus2", node, ioModule);
  389. _aiWarningStatus3 = ParseAiNode("aiWarningStatus3", node, ioModule);
  390. _aiWarningStatus4 = ParseAiNode("aiWarningStatus4", node, ioModule);
  391. _aiWarningStatus5 = ParseAiNode("aiWarningStatus5", node, ioModule);
  392. _aiWarningStatus6 = ParseAiNode("aiWarningStatus6", node, ioModule);
  393. _aiErrorStatus1 = ParseAiNode("aiErrorStatus1", node, ioModule);
  394. _aiErrorStatus2 = ParseAiNode("aiErrorStatus2", node, ioModule);
  395. _aiErrorStatus3 = ParseAiNode("aiErrorStatus3", node, ioModule);
  396. _aiErrorStatus4 = ParseAiNode("aiErrorStatus4", node, ioModule);
  397. _aiValveStatusThreshold = ParseAiNode("aiValveStatusThreshold", node, ioModule);
  398. _aiForbidInterlockOutbreak = ParseAiNode("aiForbidInterlockOutbreak", node, ioModule);
  399. _aiSlowVacuumModeSetting = ParseAiNode("aiSlowVacuumModeSetting", node, ioModule);
  400. _aiInterlock1 = ParseAiNode("aiInterlock1", node, ioModule);
  401. _aiInterlock2 = ParseAiNode("aiInterlock2", node, ioModule);
  402. _aiInterlock3 = ParseAiNode("aiInterlock3", node, ioModule);
  403. _aiInterlockConstantOfInterlock3 = ParseAiNode("aiInterlockConstantOfInterlock3", node, ioModule);
  404. _aiP1SensorOffsetSetting = ParseAiNode("aiP1SensorOffsetSetting", node, ioModule);
  405. _aiPosMonOffsetSetting = ParseAiNode("aiPosMonOffsetSetting", node, ioModule);
  406. _aoZeroResetP1 = ParseAoNode("aoZeroResetP1", node, ioModule);
  407. _aoZeroAdjustP1 = ParseAoNode("aoZeroAdjustP1", node, ioModule);
  408. _aoSpanAdjustP1 = ParseAoNode("aoSpanAdjustP1", node, ioModule);
  409. _aoZeroResetP2 = ParseAoNode("aoZeroResetP2", node, ioModule);
  410. _aoZeroAdjustP2 = ParseAoNode("aoZeroAdjustP2", node, ioModule);
  411. _aoSpanAdjustP2 = ParseAoNode("aoSpanAdjustP2", node, ioModule);
  412. _aoSlowVacuumTargetPressure = ParseAoNode("aoSlowVacuumTargetPressure", node, ioModule);
  413. _aoValveStatusThreshold = ParseAoNode("aoValveStatusThreshold", node, ioModule);
  414. _aoForbidInterlockOutbreak = ParseAoNode("aoForbidInterlockOutbreak", node, ioModule);
  415. _aoSlowVacuumModeSetting = ParseAoNode("aoSlowVacuumModeSetting", node, ioModule);
  416. _aoInterlock1 = ParseAoNode("aoInterlock1", node, ioModule);
  417. _aoInterlock2 = ParseAoNode("aoInterlock2", node, ioModule);
  418. _aoInterlock3 = ParseAoNode("aoInterlock3", node, ioModule);
  419. _aoInterlockConstantOfInterlock3 = ParseAoNode("aoInterlockConstantOfInterlock3", node, ioModule);
  420. _aoP1SensorOffsetSetting = ParseAoNode("aoP1SensorOffsetSetting", node, ioModule);
  421. _aoPosMonOffsetSetting = ParseAoNode("aoPosMonOffsetSetting", node, ioModule);
  422. _aoSensorAdjustReset = ParseAoNode("aoSensorAdjustReset", node, ioModule);
  423. _aoSlowVacuumRate = ParseAoNode("aoSlowVacuumRate", node, ioModule);
  424. _aoSlowVacuumP = ParseAoNode("aoSlowVacuumP", node, ioModule);
  425. _aoSlowVacuumI = ParseAoNode("aoSlowVacuumI", node, ioModule);
  426. _aoSlowVacuumD = ParseAoNode("aoSlowVacuumD", node, ioModule);
  427. _aoSlowVacuumA = ParseAoNode("aoSlowVacuumA", node, ioModule);
  428. _aoControllerModeSelect = ParseAoNode("aoControllerModeSelect", node, ioModule);
  429. _aoSpecifyTargetVacuumPressureControl = ParseAoNode("aoSpecifyTargetVacuumPressureControl", node, ioModule);
  430. _aoSpecifyTargetOpeningForValveOpeningControl = ParseAoNode("aoSpecifyTargetOpeningForValveOpeningControl", node, ioModule);
  431. _aoSpecifyControlMode = ParseAoNode("aoSpecifyControlMode", node, ioModule);
  432. _aoRangeUpperLimitSensorInput = ParseAoNode("aoRangeUpperLimitSensorInput", node, ioModule);
  433. _aoController1 = ParseAoNode("aoController1", node, ioModule);
  434. _aoController1P = ParseAoNode("aoController1P", node, ioModule);
  435. _aoController1I = ParseAoNode("aoController1I", node, ioModule);
  436. _aoController1D = ParseAoNode("aoController1D", node, ioModule);
  437. _aoController1A = ParseAoNode("aoController1A", node, ioModule);
  438. _aoController1CH = ParseAoNode("aoController1CH", node, ioModule);
  439. _aoController1CL = ParseAoNode("aoController1CL", node, ioModule);
  440. _aoController1Offset = ParseAoNode("aoController1Offset", node, ioModule);
  441. _aoController2 = ParseAoNode("aoController2", node, ioModule);
  442. _aoController2P = ParseAoNode("aoController2P", node, ioModule);
  443. _aoController2I = ParseAoNode("aoController2I", node, ioModule);
  444. _aoController2D = ParseAoNode("aoController2D", node, ioModule);
  445. _aoController2A = ParseAoNode("aoController2A", node, ioModule);
  446. _aoController2CH = ParseAoNode("aoController2CH", node, ioModule);
  447. _aoController2CL = ParseAoNode("aoController2CL", node, ioModule);
  448. _aoController2Offset = ParseAoNode("aoController2Offset", node, ioModule);
  449. _aoController3 = ParseAoNode("aoController3", node, ioModule);
  450. _aoController3P = ParseAoNode("aoController3P", node, ioModule);
  451. _aoController3I = ParseAoNode("aoController3I", node, ioModule);
  452. _aoController3D = ParseAoNode("aoController3D", node, ioModule);
  453. _aoController3A = ParseAoNode("aoController3A", node, ioModule);
  454. _aoController3CH = ParseAoNode("aoController3CH", node, ioModule);
  455. _aoController3CL = ParseAoNode("aoController3CL", node, ioModule);
  456. _aoController3Offset = ParseAoNode("aoController3Offset", node, ioModule);
  457. _aoController4 = ParseAoNode("aoController4", node, ioModule);
  458. _aoController4P = ParseAoNode("aoController4P", node, ioModule);
  459. _aoController4I = ParseAoNode("aoController4I", node, ioModule);
  460. _aoController4D = ParseAoNode("aoController4D", node, ioModule);
  461. _aoController4A = ParseAoNode("aoController4A", node, ioModule);
  462. _aoController4CH = ParseAoNode("aoController4CH", node, ioModule);
  463. _aoController4CL = ParseAoNode("aoController4CL", node, ioModule);
  464. _aoController4Offset = ParseAoNode("aoController4Offset", node, ioModule);
  465. _aoController5 = ParseAoNode("aoController5", node, ioModule);
  466. _aoController5P = ParseAoNode("aoController5P", node, ioModule);
  467. _aoController5I = ParseAoNode("aoController5I", node, ioModule);
  468. _aoController5D = ParseAoNode("aoController5D", node, ioModule);
  469. _aoController5A = ParseAoNode("aoController5A", node, ioModule);
  470. _aoController5CH = ParseAoNode("aoController5CH", node, ioModule);
  471. _aoController5CL = ParseAoNode("aoController5CL", node, ioModule);
  472. _aoController5Offset = ParseAoNode("aoController5Offset", node, ioModule);
  473. _aoController6 = ParseAoNode("aoController6", node, ioModule);
  474. _aoController6P = ParseAoNode("aoController6P", node, ioModule);
  475. _aoController6I = ParseAoNode("aoController6I", node, ioModule);
  476. _aoController6D = ParseAoNode("aoController6D", node, ioModule);
  477. _aoController6A = ParseAoNode("aoController6A", node, ioModule);
  478. _aoController6CH = ParseAoNode("aoController6CH", node, ioModule);
  479. _aoController6CL = ParseAoNode("aoController6CL", node, ioModule);
  480. _aoController6Offset = ParseAoNode("aoController6Offset", node, ioModule);
  481. _aoController7 = ParseAoNode("aoController7", node, ioModule);
  482. _aoController7P = ParseAoNode("aoController7P", node, ioModule);
  483. _aoController7I = ParseAoNode("aoController7I", node, ioModule);
  484. _aoController7D = ParseAoNode("aoController7D", node, ioModule);
  485. _aoController7A = ParseAoNode("aoController7A", node, ioModule);
  486. _aoController7CH = ParseAoNode("aoController7CH", node, ioModule);
  487. _aoController7CL = ParseAoNode("aoController7CL", node, ioModule);
  488. _aoController7Offset = ParseAoNode("aoController7Offset", node, ioModule);
  489. _aoController8 = ParseAoNode("aoController8", node, ioModule);
  490. _aoController8P = ParseAoNode("aoController8P", node, ioModule);
  491. _aoController8I = ParseAoNode("aoController8I", node, ioModule);
  492. _aoController8D = ParseAoNode("aoController8D", node, ioModule);
  493. _aoController8A = ParseAoNode("aoController8A", node, ioModule);
  494. _aoController8CH = ParseAoNode("aoController8CH", node, ioModule);
  495. _aoController8CL = ParseAoNode("aoController8CL", node, ioModule);
  496. _aoController8Offset = ParseAoNode("aoController8Offset", node, ioModule);
  497. _aoController9 = ParseAoNode("aoController9", node, ioModule);
  498. _aoController9P = ParseAoNode("aoController9P", node, ioModule);
  499. _aoController9I = ParseAoNode("aoController9I", node, ioModule);
  500. _aoController9D = ParseAoNode("aoController9D", node, ioModule);
  501. _aoController9A = ParseAoNode("aoController9A", node, ioModule);
  502. _aoController9CH = ParseAoNode("aoController9CH", node, ioModule);
  503. _aoController9CL = ParseAoNode("aoController9CL", node, ioModule);
  504. _aoController9Offset = ParseAoNode("aoController9Offset", node, ioModule);
  505. _aoController10 = ParseAoNode("aoController10", node, ioModule);
  506. _aoController10P = ParseAoNode("aoController10P", node, ioModule);
  507. _aoController10I = ParseAoNode("aoController10I", node, ioModule);
  508. _aoController10D = ParseAoNode("aoController10D", node, ioModule);
  509. _aoController10A = ParseAoNode("aoController10A", node, ioModule);
  510. _aoController10CH = ParseAoNode("aoController10CH", node, ioModule);
  511. _aoController10CL = ParseAoNode("aoController10CL", node, ioModule);
  512. _aoController10Offset = ParseAoNode("aoController10Offset", node, ioModule);
  513. PressureUnit = SC.GetStringValue($"{Module}.{Name}.PressureUnit");
  514. }
  515. public bool Initialize()
  516. {
  517. if (System.Diagnostics.Debugger.IsAttached)
  518. {
  519. var oj = DEVICE.GetDevice<IoAPC>($"{Module}.{Name}");
  520. foreach (var pi in oj.GetType().GetProperties())
  521. {
  522. if (pi.PropertyType.Name.EndsWith("Accessor"))
  523. {
  524. var value = pi.GetValue(oj);
  525. if (value == null)
  526. {
  527. LOG.Write($"{Module}.{Name} {pi.Name} is null");
  528. }
  529. }
  530. }
  531. }
  532. _deviceData = new AITAPCData()
  533. {
  534. Module = Module,
  535. DeviceName = Name,
  536. DeviceSchematicId = DeviceID,
  537. DisplayName = Display,
  538. };
  539. DATA.Subscribe($"{Module}.{Name}.DeviceData", () => _deviceData);
  540. DATA.Subscribe($"{Module}.{Name}.Pressure1Feedback", () => _aiValueSensorInput1.FloatValue);
  541. DATA.Subscribe($"{Module}.{Name}.Pressure2Feedback", () => _aiValueSensorInput2.FloatValue);
  542. DATA.Subscribe($"{Module}.{Name}.PositionFeedback", () => _aiPositionActualValue.FloatValue);
  543. DATA.Subscribe($"{Module}.{Name}.PositionSetPoint", () => _deviceData.PositionSetPoint);
  544. DATA.Subscribe($"{Module}.{Name}.PressureSetPoint", () => _deviceData.PressureSetPoint);
  545. DATA.Subscribe($"{Module}.{Name}.SlowRateSetPoint", () => _deviceData.SlowRateSetPoint);
  546. DATA.Subscribe($"{Module}.{Name}.SelectedControllerFeedback", () => SelectedControllerFeedback);
  547. DATA.Subscribe($"{Module}.{Name}.ModeFeedback", () => ModeFeedback);
  548. DATA.Subscribe($"{Module}.{Name}.ModeSetPoint", () => ModeSetPoint);
  549. DATA.Subscribe($"{Module}.{Name}.HomingStatus", () => HomingStatus);
  550. DATA.Subscribe($"{Module}.{Name}.IsError", () => IsError);
  551. DATA.Subscribe($"{Module}.{Name}.ValveStatusThreshold", () => ValveStatusThreshold);
  552. DATA.Subscribe($"{Module}.{Name}.SlowVacuumModeSetting", () => SlowVacuumModeSetting);
  553. DATA.Subscribe($"{Module}.{Name}.Interlock1", () => Interlock1);
  554. DATA.Subscribe($"{Module}.{Name}.Interlock2", () => Interlock2);
  555. DATA.Subscribe($"{Module}.{Name}.Interlock3", () => Interlock3);
  556. DATA.Subscribe($"{Module}.{Name}.InterlockConstantOfInterlock3", () => InterlockConstantOfInterlock3);
  557. DATA.Subscribe($"{Module}.{Name}.P1SensorOffsetSetting", () => P1SensorOffsetSetting);
  558. DATA.Subscribe($"{Module}.{Name}.PosMonOffsetSetting", () => PosMonOffsetSetting);
  559. //DATA.Subscribe($"{Module}.{Name}.IsSwitch", () => IsSwitch);
  560. //DATA.Subscribe($"{Module}.{Name}.SetSpeed", () => SetSpeed);
  561. //DATA.Subscribe($"{Module}.{Name}.MaxSpeed", () => MaxSpeed);
  562. //DATA.Subscribe($"{Module}.{Name}.IsReset", () => IsReset);
  563. //DATA.Subscribe($"{Module}.{Name}.ErrorTimer", () => ErrorTimer);
  564. //DATA.Subscribe($"{Module}.{Name}.CurrentSpeed", () => CurrentSpeed);
  565. //DATA.Subscribe($"{Module}.{Name}.Voltage", () => Voltage);
  566. //DATA.Subscribe($"{Module}.{Name}.Current", () => Current);
  567. OP.Subscribe($"{Module}.{Name}.SetParameters", (string cmd, object[] param) =>
  568. {
  569. //command;pidTable;setValue;LowPressWait
  570. SetParameters(param);
  571. return true;
  572. });
  573. OP.Subscribe($"{Module}.{Name}.SetManualParameters", (string cmd, object[] param) =>
  574. {
  575. //command;pidTable;setValue;LowPressWait
  576. SetManualParameters(param);
  577. return true;
  578. });
  579. OP.Subscribe($"{Module}.{Name}.SetUnit", (string cmd, object[] param) =>
  580. {
  581. //command;pidTable;setValue;LowPressWait
  582. SetUnit(param);
  583. return true;
  584. });
  585. OP.Subscribe($"{Module}.{Name}.SetUpload", (string cmd, object[] param) =>
  586. {
  587. SetUpload();
  588. return true;
  589. });
  590. OP.Subscribe($"{Module}.{Name}.SetDownload", (string cmd, object[] param) =>
  591. {
  592. SetDownload(param);
  593. return true;
  594. });
  595. OP.Subscribe($"{Module}.{Name}.SetConfig", (string cmd, object[] param) =>
  596. {
  597. //command;pidTable;setValue;LowPressWait
  598. SetConfig(param);
  599. return true;
  600. });
  601. OP.Subscribe($"{Module}.{Name}.SetPID", (string cmd, object[] param) =>
  602. {
  603. if (param != null && param.Length > 1)
  604. {
  605. int.TryParse(param[1].ToString(), out int controllerID);
  606. SetControllerParameters(param[0].ToString(), controllerID);
  607. }
  608. return true;
  609. });
  610. ValveStatusThreshold = (float)SC.GetValue<double>($"{Module}.{Name}.ValveStatusThreshold");
  611. SlowVacuumModeSetting = (float)SC.GetValue<double>($"{Module}.{Name}.SlowVacuumModeSetting");
  612. Interlock1 = (float)SC.GetValue<double>($"{Module}.{Name}.Interlock1");
  613. Interlock2 = (float)SC.GetValue<double>($"{Module}.{Name}.Interlock2");
  614. Interlock3 = (float)SC.GetValue<double>($"{Module}.{Name}.Interlock3");
  615. InterlockConstantOfInterlock3 = (float)SC.GetValue<double>($"{Module}.{Name}.InterlockConstantOfInterlock3");
  616. P1SensorOffsetSetting = (float)SC.GetValue<double>($"{Module}.{Name}.P1SensorOffsetSetting");
  617. PosMonOffsetSetting = (float)SC.GetValue<double>($"{Module}.{Name}.PosMonOffsetSetting");
  618. return true;
  619. }
  620. private void SetUpload()
  621. {
  622. _unloadTimer.Restart();
  623. _doAoDataReadSysConfig.SetPulseValue(true, 3000);
  624. }
  625. private void SetDownload(object[] param)
  626. {
  627. SetConfig(param);
  628. if (param != null && param.Length > 7)
  629. {
  630. float.TryParse(param[0].ToString(), out float value);
  631. _aoValveStatusThreshold.FloatValue = value;
  632. float.TryParse(param[1].ToString(), out value);
  633. _aoSlowVacuumModeSetting.FloatValue = value;
  634. float.TryParse(param[2].ToString(), out value);
  635. _aoInterlock1.FloatValue = value;
  636. float.TryParse(param[3].ToString(), out value);
  637. _aoInterlock2.FloatValue = value;
  638. float.TryParse(param[4].ToString(), out value);
  639. _aoInterlock3.FloatValue = value;
  640. float.TryParse(param[5].ToString(), out value);
  641. _aoInterlockConstantOfInterlock3.FloatValue = value;
  642. float.TryParse(param[6].ToString(), out value);
  643. _aoP1SensorOffsetSetting.FloatValue = value;
  644. float.TryParse(param[7].ToString(), out value);
  645. _aoPosMonOffsetSetting.FloatValue = value;
  646. }
  647. _doAoDataWriteSysConfig.SetPulseValue(true, 3000);
  648. }
  649. private void SetConfig(object[] param)
  650. {
  651. if(param != null && param.Length > 7)
  652. {
  653. float.TryParse(param[0].ToString(), out float value);
  654. ValveStatusThreshold = value;
  655. float.TryParse(param[1].ToString(), out value);
  656. SlowVacuumModeSetting = value;
  657. float.TryParse(param[2].ToString(), out value);
  658. Interlock1 = value;
  659. float.TryParse(param[3].ToString(), out value);
  660. Interlock2 = value;
  661. float.TryParse(param[4].ToString(), out value);
  662. Interlock3= value;
  663. float.TryParse(param[5].ToString(), out value);
  664. InterlockConstantOfInterlock3 = value;
  665. float.TryParse(param[6].ToString(), out value);
  666. P1SensorOffsetSetting = value;
  667. float.TryParse(param[7].ToString(), out value);
  668. PosMonOffsetSetting = value;
  669. }
  670. }
  671. public void Monitor()
  672. {
  673. if(!_isInit)
  674. {
  675. if (!_initTimer.IsRunning)
  676. _initTimer.Start();
  677. if(_initTimer.ElapsedMilliseconds > 5 * 1000)
  678. {
  679. _initTimer.Stop();
  680. _isInit = true;
  681. var pidTableName = SC.GetStringValue("PM1.APCPID");
  682. int.TryParse(SC.GetStringValue("PM1.APCPIDControllerID"), out int controllerID);
  683. SetControllerParameters(pidTableName, controllerID);
  684. }
  685. }
  686. if(_valveAV71 == null)
  687. _valveAV71 = DEVICE.GetDevice<IoValve>($"{Module}.ValveAV71");
  688. //if(_valveAV71 != null && Singleton<EquipmentManager>.Instance.Modules.ContainsKey(ModuleName.PM1) &&
  689. // !(Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).IsProcessing)
  690. //{
  691. // _av71OpenTrig.CLK = _valveAV71.Status;
  692. // if (!_valveAV71.Status)
  693. // {
  694. // if (_aoSpecifyControlMode.FloatValue != (int)PressureControlMode.Close)
  695. // _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Close;
  696. // if (_deviceData.ModeSetPoint != (int)PressureControlMode.Close)
  697. // _deviceData.ModeSetPoint = (int)PressureControlMode.Close;
  698. // }
  699. // if(_av71OpenTrig.Q)
  700. // {
  701. // if (_aoSpecifyControlMode.FloatValue != (int)PressureControlMode.Open)
  702. // _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Open;
  703. // if (_deviceData.ModeSetPoint != (int)PressureControlMode.Open)
  704. // _deviceData.ModeSetPoint = (int)PressureControlMode.Open;
  705. // }
  706. //}
  707. if(_apcSetModeTimer.IsRunning && _apcSetModeTimer.ElapsedMilliseconds > _apcSetModeTimeOutSec * 1000)
  708. {
  709. APCSetModeAlarm.Set("APC set mode timeout");
  710. }
  711. _deviceData.Pressure1Feedback = _aiValueSensorInput1.FloatValue;
  712. _deviceData.Pressure2Feedback = _aiValueSensorInput2.FloatValue;
  713. _deviceData.SelectedControllerFeedback = SelectedControllerFeedback;
  714. _deviceData.PositionFeedback = _aiPositionActualValue.FloatValue;
  715. _deviceData.ModeFeedback = ModeFeedback;
  716. _deviceData.HomingStatus = HomingStatus;
  717. _deviceData.PressureFeedback = GetPressure();
  718. var hardError1 = _aiErrorStatus1.FloatValue > 0 ? "Active manufacturer Error Details (Device Management)" : "";
  719. var hardError2 = _aiErrorStatus2.FloatValue > 0 ? "Active manufacturer Error Details(Sensor Input1))" : "";
  720. var hardError3 = _aiErrorStatus3.FloatValue > 0 ? "Active manufacturer Error Details (Sensor Input2)" : "";
  721. var hardError4 = _aiErrorStatus4.FloatValue > 0 ? "Active manufacturer Error Details (Valve)" : "";
  722. if (!string.IsNullOrEmpty(hardError1) || !string.IsNullOrEmpty(hardError2) || !string.IsNullOrEmpty(hardError3) || !string.IsNullOrEmpty(hardError4))
  723. {
  724. var status = !string.IsNullOrEmpty(hardError1) ? hardError1 : "";
  725. status += !string.IsNullOrEmpty(status) ? !string.IsNullOrEmpty(hardError2) ? $"----{hardError2}" : "" : hardError2;
  726. status += !string.IsNullOrEmpty(status) ? !string.IsNullOrEmpty(hardError3) ? $"----{hardError3}" : "" : hardError3;
  727. status += !string.IsNullOrEmpty(status) ? !string.IsNullOrEmpty(hardError4) ? $"----{hardError4}" : "" : hardError4;
  728. _deviceData.HardError = status;
  729. IsError = true;
  730. }
  731. else
  732. {
  733. IsError = false;
  734. _deviceData.HardError = "";
  735. }
  736. switch ((int)(_aiHomeStatus.FloatValue + 0.0001))
  737. {
  738. case 0:
  739. _deviceData.HomeStatusDisplay = "Homing not started";
  740. break;
  741. case 1:
  742. _deviceData.HomeStatusDisplay = "Homing interrupted";
  743. break;
  744. case 2:
  745. _deviceData.HomeStatusDisplay = "Homing completed-no error";
  746. break;
  747. case 3:
  748. _deviceData.HomeStatusDisplay = "Homing completed-error20";
  749. break;
  750. case 4:
  751. _deviceData.HomeStatusDisplay = "Homing in progress";
  752. break;
  753. default:
  754. _deviceData.HomeStatusDisplay = "";
  755. break;
  756. }
  757. }
  758. public void Reset()
  759. {
  760. //APCSetModeAlarm.Reset();
  761. }
  762. public void SetUnit(object[] param)
  763. {
  764. if ((string)param[0] == "Pa")
  765. {
  766. _doVGUnit.SetValue(true, out _);
  767. }
  768. else
  769. {
  770. _doVGUnit.SetValue(false, out _);
  771. }
  772. }
  773. public void Terminate()
  774. {
  775. _valveAV71.TurnValve(false, out _);
  776. _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Close;
  777. _deviceData.ModeSetPoint = (int)PressureControlMode.Close;
  778. }
  779. private float GetPressure()
  780. {
  781. if (_deviceData.ModeFeedback == (int)(PressureControlMode.Press1Control))
  782. return _aiValueSensorInput1.FloatValue;
  783. if (_deviceData.ModeFeedback == (int)(PressureControlMode.Press2Control))
  784. return _aiValueSensorInput2.FloatValue;
  785. return _aiValueSensorInput2.FloatValue > SC.GetValue<double>("PM1.APC.VG1.PressureScale") ? _aiValueSensorInput2.FloatValue : _aiValueSensorInput1.FloatValue;
  786. }
  787. private void SetParameters(object[] param)
  788. {
  789. if (param == null || param.Length < 1)
  790. {
  791. EV.PostWarningLog(Module, $"Invalid APC set parameter");
  792. return;
  793. }
  794. var paras = param[0].ToString().Split(';');
  795. if (paras.Length < 11)
  796. {
  797. EV.PostWarningLog(Module, $"Invalid APC set parameter");
  798. return;
  799. }
  800. var command = paras[0];
  801. var pidTables = paras[1].Split(',');
  802. string pidTableName = "";
  803. int controllerID = 0;
  804. _deviceData.CommandSetPoint = command;
  805. IsNeedWaitComplete = false;
  806. if (command == "Press" || command == "Press2")
  807. {
  808. if (pidTables.Length < 2)
  809. {
  810. pidTableName = SC.GetStringValue("PM1.APCPID");
  811. int.TryParse(SC.GetStringValue("PM1.APCPIDControllerID"), out controllerID);
  812. }
  813. else
  814. {
  815. pidTableName = string.IsNullOrEmpty(pidTables[0]) ? paras[10] : pidTables[0];
  816. int.TryParse(pidTables[1], out controllerID);
  817. }
  818. }
  819. float setValue = 0;
  820. float.TryParse(paras[2], out float pressreValue);
  821. float.TryParse(paras[3], out float slowVacSet);
  822. float.TryParse(paras[4], out float valveAngleSet);
  823. bool.TryParse(paras[5], out _isWait);
  824. float.TryParse(paras[6], out _waitLow);
  825. float.TryParse(paras[7], out _waitHigh);
  826. var waitUnit = paras[8].ToString();
  827. float.TryParse(paras[9], out float waitPress);
  828. var recipePIDTableName = paras[10].ToString();
  829. var av71 = paras[11].ToString().ToLower();//open,close
  830. switch (command)
  831. {
  832. case "Press":
  833. case "Press2":
  834. setValue = pressreValue;
  835. IsNeedWaitComplete = _isWait;
  836. break;
  837. case "Slow Vac":
  838. setValue = slowVacSet;
  839. break;
  840. case "Valve Angle":
  841. setValue = valveAngleSet;
  842. IsNeedWaitComplete = _isWait;
  843. if (_waitLow == 0 || _waitHigh == 0)
  844. IsNeedWaitComplete = false;//_waitLow,_waitHigh为0不能wait
  845. if (waitUnit == "%")
  846. {
  847. _waitLow = setValue - _waitLow;//角度的要算出范围
  848. _waitHigh = setValue + _waitHigh;//角度的要算出范围
  849. }
  850. if (waitUnit == "%d")
  851. {
  852. //_waitLow,_waitHigh的设定本身就是范围
  853. }
  854. break;
  855. case "WaitPressDown1":
  856. case "WaitPressDown2":
  857. case "WaitPressUp1":
  858. case "WaitPressUp2":
  859. setValue = waitPress;
  860. IsNeedWaitComplete = true;
  861. break;
  862. }
  863. _deviceData.SetPoint = setValue;
  864. _deviceData.PIDTable = $"{controllerID}:{paras[10]}";
  865. _deviceData.LowPressWaitSetPoint = paras[3];
  866. if(av71 == "close")
  867. {
  868. //av71 close,就设置为close
  869. _valveAV71.TurnValve(false, out _);
  870. _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Close;
  871. _deviceData.ModeSetPoint = (int)PressureControlMode.Close;
  872. _apcSetModeTimer.Stop();
  873. }
  874. else
  875. {
  876. if (_deviceData.Pressure2Feedback >= 10)
  877. {
  878. if (command.ToLower() == "none" || command == "")
  879. _apcSetModeTimer.Restart();
  880. else
  881. _apcSetModeTimer.Stop();
  882. }
  883. else
  884. {
  885. _apcSetModeTimer.Stop();
  886. if (command.ToLower() == "none" || command == "")
  887. command = "Full Open";
  888. }
  889. if (command.ToLower() == "none")
  890. return;
  891. SetCommandParameters(command, setValue, pidTableName, controllerID, recipePIDTableName);
  892. }
  893. }
  894. private void SetManualParameters(object[] param)
  895. {
  896. if(param == null || param.Length < 1)
  897. {
  898. EV.PostWarningLog(Module, $"Invalid APC set parameter");
  899. return;
  900. }
  901. var paras = param[0].ToString().Split(';');
  902. if(paras.Length < 4)
  903. {
  904. EV.PostWarningLog(Module, $"Invalid APC set parameter");
  905. return;
  906. }
  907. var command = paras[0];
  908. var pidTables = paras[1].Split(',');
  909. string pidTableName = "";
  910. int controllerID = 0;
  911. bool av71 = _valveAV71.Status;
  912. if (paras.Length > 4)
  913. bool.TryParse(paras[4], out av71);
  914. //小于 10 torr, full open或者根据设定的模式
  915. //大于10 torr,5秒内需要设定的模式
  916. if (av71)
  917. {
  918. if (_deviceData.Pressure2Feedback >= 10)
  919. {
  920. if (command.ToLower() == "none" || command == "")
  921. _apcSetModeTimer.Restart();
  922. else
  923. _apcSetModeTimer.Stop();
  924. }
  925. else
  926. {
  927. _apcSetModeTimer.Stop();
  928. if (command.ToLower() == "none" || command == "")
  929. command = "Full Open";
  930. }
  931. }
  932. else
  933. {
  934. command = "Full Close";
  935. _apcSetModeTimer.Stop();
  936. }
  937. if (command.ToLower() == "none")
  938. return;
  939. if (command == "Press" || command == "Press2")
  940. {
  941. if (pidTables.Length < 2)
  942. {
  943. pidTableName = SC.GetStringValue("PM1.APCPID");
  944. int.TryParse(SC.GetStringValue("PM1.APCPIDControllerID"), out controllerID);
  945. }
  946. else
  947. {
  948. pidTableName = pidTables[0];
  949. int.TryParse(pidTables[1], out controllerID);
  950. }
  951. }
  952. float.TryParse(paras[2], out float setValue);
  953. _deviceData.SetPoint = setValue;
  954. _deviceData.CommandSetPoint = command;
  955. _deviceData.PIDTable = $"{controllerID}:{pidTableName}";
  956. _deviceData.LowPressWaitSetPoint = paras[3];
  957. SetCommandParameters(command, setValue, pidTableName, controllerID);
  958. }
  959. private void SetCommandParameters(string command, float setValue, string pidTableName, int controllerID, string recipePIDTableName="")
  960. {
  961. LOG.Write($"APC command={command}, setpoint={setValue}, Controller ID={controllerID}, PID={pidTableName}");
  962. switch (command)
  963. {
  964. case "Press":
  965. _valveAV71.TurnValve(true, out _);
  966. _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Press1Control;
  967. _aoSpecifyTargetVacuumPressureControl.FloatValue = setValue;
  968. SetControllerParameters(pidTableName, controllerID, recipePIDTableName);
  969. _aoControllerModeSelect.FloatValue = controllerID;
  970. _deviceData.ModeSetPoint = (int)PressureControlMode.Press1Control;
  971. _aoSlowVacuumRate.FloatValue = 0;
  972. _aoSlowVacuumTargetPressure.FloatValue = 0;
  973. _deviceData.PressureSetPoint = setValue;
  974. break;
  975. case "Press2":
  976. _valveAV71.TurnValve(true, out _);
  977. _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Press2Control;
  978. _aoSpecifyTargetVacuumPressureControl.FloatValue = setValue;
  979. SetControllerParameters(pidTableName, controllerID, recipePIDTableName);
  980. _aoControllerModeSelect.FloatValue = controllerID;
  981. _deviceData.ModeSetPoint = (int)PressureControlMode.Press2Control;
  982. _aoSlowVacuumRate.FloatValue = 0;
  983. _aoSlowVacuumTargetPressure.FloatValue = 0;
  984. _deviceData.PressureSetPoint = setValue;
  985. break;
  986. case "Slow Vac":
  987. _valveAV71.TurnValve(true, out _);
  988. _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.SlowVacuum;
  989. _aoSlowVacuumRate.FloatValue = setValue;
  990. _aoSlowVacuumTargetPressure.FloatValue = 0;
  991. _deviceData.ModeSetPoint = (int)PressureControlMode.SlowVacuum;
  992. SetSlowVacParameters(pidTableName);
  993. _deviceData.SlowRateSetPoint = setValue;
  994. break;
  995. case "Valve Angle":
  996. _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.PositionControl;
  997. _aoSpecifyTargetOpeningForValveOpeningControl.FloatValue = setValue;
  998. _deviceData.ModeSetPoint = (int)PressureControlMode.PositionControl;
  999. _deviceData.PositionSetPoint = setValue;
  1000. _aoSlowVacuumRate.FloatValue = 0;
  1001. _aoSlowVacuumTargetPressure.FloatValue = 0;
  1002. break;
  1003. case "Full Open":
  1004. _valveAV71.TurnValve(true, out _);
  1005. _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Open;
  1006. _deviceData.ModeSetPoint = (int)PressureControlMode.Open;
  1007. _aoSlowVacuumRate.FloatValue = 0;
  1008. _aoSlowVacuumTargetPressure.FloatValue = 0;
  1009. break;
  1010. case "Full Close":
  1011. _valveAV71.TurnValve(false, out _);
  1012. _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Close;
  1013. _deviceData.ModeSetPoint = (int)PressureControlMode.Close;
  1014. _aoSlowVacuumRate.FloatValue = 0;
  1015. _aoSlowVacuumTargetPressure.FloatValue = 0;
  1016. break;
  1017. case "Hold":
  1018. _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Hold;
  1019. _deviceData.ModeSetPoint = (int)PressureControlMode.Hold;
  1020. _aoSlowVacuumRate.FloatValue = 0;
  1021. _aoSlowVacuumTargetPressure.FloatValue = 0;
  1022. break;
  1023. case "Home":
  1024. _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Homing;
  1025. _deviceData.ModeSetPoint = (int)PressureControlMode.Homing;
  1026. _aoSlowVacuumRate.FloatValue = 0;
  1027. _aoSlowVacuumTargetPressure.FloatValue = 0;
  1028. break;
  1029. case "WaitPressUp1":
  1030. //wait: sensor 1的压力小于basePressure
  1031. _basePressure = setValue;
  1032. _aoSlowVacuumTargetPressure.FloatValue = setValue;
  1033. break;
  1034. case "WaitPressDown1":
  1035. //wait: sensor 1的压力大于basePressure
  1036. _basePressure = setValue;
  1037. _aoSlowVacuumTargetPressure.FloatValue = setValue;
  1038. break;
  1039. case "WaitPressUp2":
  1040. //wait: sensor 2的压力小于basePressure
  1041. _basePressure = setValue;
  1042. _aoSlowVacuumTargetPressure.FloatValue = setValue;
  1043. break;
  1044. case "WaitPressDown2":
  1045. //wait: sensor 2的压力大于basePressure
  1046. _basePressure = setValue;
  1047. _aoSlowVacuumTargetPressure.FloatValue = setValue;
  1048. break;
  1049. case "Zero Set":
  1050. //offset cancle
  1051. break;
  1052. case "Cancel Zero":
  1053. //cancle Zero Set
  1054. break;
  1055. }
  1056. }
  1057. private void SetSlowVacParameters(string fileNameAndPath)
  1058. {
  1059. if (string.IsNullOrEmpty(fileNameAndPath))
  1060. {
  1061. fileNameAndPath = SC.GetStringValue("PM1.APCPID");
  1062. }
  1063. if (!File.Exists($"{PathManager.GetParameterDir()}\\{fileNameAndPath}.rcp"))
  1064. {
  1065. fileNameAndPath = SC.GetStringValue("PM1.APCPID");
  1066. }
  1067. var para = fileNameAndPath.Split('\\').ToList().Skip(2);//"Parameter\\APCPID"
  1068. if (para == null)
  1069. {
  1070. EV.PostWarningLog(Module, $"{fileNameAndPath} APC PID name is empty");
  1071. return;
  1072. }
  1073. var fileName = string.Join("\\", para.ToArray());
  1074. var content = ParameterFileManager.Instance.LoadParameter("Parameter\\APCPID", fileName, false);
  1075. if (string.IsNullOrEmpty(content))
  1076. {
  1077. EV.PostWarningLog(Module, $"{fileNameAndPath} APC PID file is empty");
  1078. return;
  1079. }
  1080. var doc = new XmlDocument();
  1081. doc.LoadXml(content);
  1082. XmlNodeList nodeSteps = doc.SelectNodes($"Aitex/TableParameterData");
  1083. if (nodeSteps == null)
  1084. {
  1085. EV.PostWarningLog(Module, $"Invalid APC PID file {fileNameAndPath}");
  1086. return;
  1087. }
  1088. foreach (var step in nodeSteps)
  1089. {
  1090. XmlElement stepNode = step as XmlElement;
  1091. float value = 0;
  1092. var hasSetValue = false;
  1093. foreach (XmlAttribute att in stepNode.Attributes)
  1094. {
  1095. switch (att.Name.ToUpper())
  1096. {
  1097. case "P":
  1098. float.TryParse(att.Value, out value);
  1099. _aoSlowVacuumP.FloatValue = value;
  1100. break;
  1101. case "I":
  1102. float.TryParse(att.Value, out value);
  1103. _aoSlowVacuumI.FloatValue = value;
  1104. break;
  1105. case "D":
  1106. float.TryParse(att.Value, out value);
  1107. _aoSlowVacuumD.FloatValue = value;
  1108. break;
  1109. case "A":
  1110. float.TryParse(att.Value, out value);
  1111. _aoSlowVacuumA.FloatValue = value;
  1112. break;
  1113. }
  1114. hasSetValue = true;
  1115. }
  1116. _doAoDataWriteCusConfig.SetPulseValue(true, 3000);
  1117. if (hasSetValue)
  1118. return;
  1119. }
  1120. if (SC.GetStringValue("PM1.APCPID") != fileNameAndPath)
  1121. SC.SetItemValueFromString("PM1.APCPID", fileNameAndPath);
  1122. }
  1123. private void SetControllerParameters(string fileNameAndPath, int controllerID, string recipePIDTableName = "")
  1124. {
  1125. //var defaultPID = SC.GetStringValue("PM1.APCPID");
  1126. if(string.IsNullOrEmpty(fileNameAndPath))
  1127. {
  1128. fileNameAndPath = SC.GetStringValue("PM1.APCPID");
  1129. }
  1130. if (!File.Exists($"{PathManager.GetParameterDir()}\\{fileNameAndPath}.rcp"))
  1131. {
  1132. fileNameAndPath = SC.GetStringValue("PM1.APCPID");
  1133. }
  1134. var para = fileNameAndPath.Split('\\').ToList().Skip(2);//"Parameter\\APCPID"
  1135. if (para == null)
  1136. {
  1137. EV.PostWarningLog(Module, $"{fileNameAndPath} APC PID name is empty");
  1138. return;
  1139. }
  1140. var fileName = string.Join( "\\", para.ToArray());
  1141. if (!string.IsNullOrEmpty(recipePIDTableName))
  1142. fileName = recipePIDTableName;
  1143. if(controllerID <= 0)
  1144. {
  1145. int.TryParse(SC.GetStringValue("PM1.APCPIDControllerID"), out controllerID);
  1146. }
  1147. _deviceData.PIDTable = $"{controllerID}:{fileName}";
  1148. var content = ParameterFileManager.Instance.LoadParameter("Parameter\\APCPID", fileName, false);
  1149. if (string.IsNullOrEmpty(content))
  1150. {
  1151. EV.PostWarningLog(Module, $"{fileNameAndPath} APC PID file is empty");
  1152. return;
  1153. }
  1154. var doc = new XmlDocument();
  1155. doc.LoadXml(content);
  1156. XmlNodeList nodeSteps = doc.SelectNodes($"Aitex/TableParameterData/Module[@Name='']/Step");
  1157. if (nodeSteps == null)
  1158. nodeSteps = doc.SelectNodes($"Aitex/TableParameterData/Step");
  1159. if(nodeSteps == null)
  1160. {
  1161. EV.PostWarningLog(Module, $"Invalid APC PID file {fileNameAndPath}");
  1162. return;
  1163. }
  1164. Dictionary<int, ControllerParameter> dic = new Dictionary<int, ControllerParameter>();
  1165. float p = 0;
  1166. float i = 0;
  1167. float d = 0;
  1168. float a = 0;
  1169. float ch = 0;
  1170. float cl = 0;
  1171. float offset = 0;
  1172. foreach (var step in nodeSteps)
  1173. {
  1174. XmlElement stepNode = step as XmlElement;
  1175. var parameters = new Dictionary<string, string>();
  1176. foreach (XmlAttribute att in stepNode.Attributes)
  1177. {
  1178. parameters.Add(att.Name, att.Value);
  1179. }
  1180. int.TryParse(parameters["StepNo"], out int no);
  1181. float.TryParse(parameters["P"], out p);
  1182. float.TryParse(parameters["I"], out i);
  1183. float.TryParse(parameters["D"], out d);
  1184. float.TryParse(parameters["a"], out a);
  1185. float.TryParse(parameters["offset"], out offset);
  1186. float.TryParse(parameters["CH"], out ch);
  1187. float.TryParse(parameters["CL"], out cl);
  1188. if(dic.ContainsKey(no))
  1189. {
  1190. EV.PostWarningLog(Module, $"Invalid APC PID file {fileNameAndPath}, duplicate no={no}");
  1191. return;
  1192. }
  1193. dic.Add(no, new ControllerParameter()
  1194. {
  1195. No = no,
  1196. Name = parameters["Name"],
  1197. P = p,
  1198. I = i,
  1199. D = d,
  1200. A = a,
  1201. Offset = offset,
  1202. CH = ch,
  1203. CL = cl,
  1204. });
  1205. }
  1206. if (!dic.ContainsKey(controllerID))
  1207. {
  1208. int.TryParse(SC.GetStringValue("PM1.APCPIDControllerID"), out controllerID);
  1209. }
  1210. if (!dic.ContainsKey(controllerID))
  1211. return;
  1212. p = dic[controllerID].P;
  1213. i = dic[controllerID].I;
  1214. d = dic[controllerID].D;
  1215. a = dic[controllerID].A;
  1216. ch = dic[controllerID].CH;
  1217. cl = dic[controllerID].CL;
  1218. offset = dic[controllerID].Offset;
  1219. switch(controllerID)
  1220. {
  1221. case 1:
  1222. _aoController1P.FloatValue = p;
  1223. _aoController1I.FloatValue = i;
  1224. _aoController1D.FloatValue = d;
  1225. _aoController1A.FloatValue = a;
  1226. _aoController1CH.FloatValue = ch;
  1227. _aoController1CL.FloatValue = cl;
  1228. _aoController1Offset.FloatValue = offset;
  1229. break;
  1230. case 2:
  1231. _aoController2P.FloatValue = p;
  1232. _aoController2I.FloatValue = i;
  1233. _aoController2D.FloatValue = d;
  1234. _aoController2A.FloatValue = a;
  1235. _aoController2CH.FloatValue = ch;
  1236. _aoController2CL.FloatValue = cl;
  1237. _aoController2Offset.FloatValue = offset;
  1238. break;
  1239. case 3:
  1240. _aoController3P.FloatValue = p;
  1241. _aoController3I.FloatValue = i;
  1242. _aoController3D.FloatValue = d;
  1243. _aoController3A.FloatValue = a;
  1244. _aoController3CH.FloatValue = ch;
  1245. _aoController3CL.FloatValue = cl;
  1246. _aoController3Offset.FloatValue = offset;
  1247. break;
  1248. case 4:
  1249. _aoController4P.FloatValue = p;
  1250. _aoController4I.FloatValue = i;
  1251. _aoController4D.FloatValue = d;
  1252. _aoController4A.FloatValue = a;
  1253. _aoController4CH.FloatValue = ch;
  1254. _aoController4CL.FloatValue = cl;
  1255. _aoController4Offset.FloatValue = offset;
  1256. break;
  1257. case 5:
  1258. _aoController5P.FloatValue = p;
  1259. _aoController5I.FloatValue = i;
  1260. _aoController5D.FloatValue = d;
  1261. _aoController5A.FloatValue = a;
  1262. _aoController5CH.FloatValue = ch;
  1263. _aoController5CL.FloatValue = cl;
  1264. _aoController5Offset.FloatValue = offset;
  1265. break;
  1266. case 6:
  1267. _aoController6P.FloatValue = p;
  1268. _aoController6I.FloatValue = i;
  1269. _aoController6D.FloatValue = d;
  1270. _aoController6A.FloatValue = a;
  1271. _aoController6CH.FloatValue = ch;
  1272. _aoController6CL.FloatValue = cl;
  1273. _aoController6Offset.FloatValue = offset;
  1274. break;
  1275. case 7:
  1276. _aoController7P.FloatValue = p;
  1277. _aoController7I.FloatValue = i;
  1278. _aoController7D.FloatValue = d;
  1279. _aoController7A.FloatValue = a;
  1280. _aoController7CH.FloatValue = ch;
  1281. _aoController7CL.FloatValue = cl;
  1282. _aoController7Offset.FloatValue = offset;
  1283. break;
  1284. case 8:
  1285. _aoController8P.FloatValue = p;
  1286. _aoController8I.FloatValue = i;
  1287. _aoController8D.FloatValue = d;
  1288. _aoController8A.FloatValue = a;
  1289. _aoController8CH.FloatValue = ch;
  1290. _aoController8CL.FloatValue = cl;
  1291. _aoController8Offset.FloatValue = offset;
  1292. break;
  1293. case 9:
  1294. _aoController9P.FloatValue = p;
  1295. _aoController9I.FloatValue = i;
  1296. _aoController9D.FloatValue = d;
  1297. _aoController9A.FloatValue = a;
  1298. _aoController9CH.FloatValue = ch;
  1299. _aoController9CL.FloatValue = cl;
  1300. _aoController9Offset.FloatValue = offset;
  1301. break;
  1302. case 10:
  1303. _aoController10P.FloatValue = p;
  1304. _aoController10I.FloatValue = i;
  1305. _aoController10D.FloatValue = d;
  1306. _aoController10A.FloatValue = a;
  1307. _aoController10CH.FloatValue = ch;
  1308. _aoController10CL.FloatValue = cl;
  1309. _aoController10Offset.FloatValue = offset;
  1310. break;
  1311. }
  1312. _doAoDataWriteCusConfig.SetPulseValue(true, 3000);
  1313. if (SC.GetStringValue("PM1.APCPID") != fileNameAndPath)
  1314. SC.SetItemValueFromString("PM1.APCPID", fileNameAndPath);
  1315. if (SC.GetStringValue("PM1.APCPIDControllerID") != controllerID.ToString())
  1316. SC.SetItemValueFromString("PM1.APCPIDControllerID", controllerID.ToString());
  1317. }
  1318. public bool CheckWaitCondition(out string reason)
  1319. {
  1320. reason = "";
  1321. if(IsNeedWaitComplete)
  1322. {
  1323. var command = _deviceData.CommandSetPoint;
  1324. var setValue = _deviceData.SetPoint;
  1325. switch (command)
  1326. {
  1327. case "Press":
  1328. if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.Press1Control &&
  1329. ((_deviceData.Pressure1Feedback > _deviceData.PressureSetPoint - _waitLow &&
  1330. _deviceData.Pressure1Feedback < _deviceData.PressureSetPoint + _waitHigh) ||
  1331. (_waitLow <= 0 && _waitHigh <= 0)))
  1332. {
  1333. return true;
  1334. }
  1335. else
  1336. {
  1337. reason = $"press1 feedback={_deviceData.Pressure1Feedback}, wait condition is ({_deviceData.PressureSetPoint - _waitLow}, {_deviceData.PressureSetPoint + _waitHigh})";
  1338. }
  1339. break;
  1340. case "Press2":
  1341. if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.Press2Control &&
  1342. ((_deviceData.Pressure2Feedback > _deviceData.PressureSetPoint - _waitLow &&
  1343. _deviceData.Pressure2Feedback < _deviceData.PressureSetPoint + _waitHigh )||
  1344. (_waitLow <= 0 && _waitHigh <= 0)))
  1345. {
  1346. return true;
  1347. }
  1348. else
  1349. {
  1350. reason = $"press2 feedback={_deviceData.Pressure2Feedback}, wait condition is ({_deviceData.PressureSetPoint - _waitLow}, {_deviceData.PressureSetPoint + _waitHigh})";
  1351. }
  1352. break;
  1353. case "Slow Vac":
  1354. if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.SlowVacuum)
  1355. {
  1356. return true;
  1357. }
  1358. else
  1359. {
  1360. reason = $"slow vac wait";
  1361. }
  1362. break;
  1363. case "Valve Angle":
  1364. if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.PositionControl &&
  1365. ((_deviceData.PositionFeedback > _waitLow && _deviceData.PositionFeedback < _waitHigh )||
  1366. (_waitLow <= 0 && _waitHigh <= 0)))
  1367. {
  1368. return true;
  1369. }
  1370. else
  1371. {
  1372. reason = $"position feedback={_deviceData.PositionFeedback}, wait condition is ({_waitLow}, {_waitHigh})";
  1373. }
  1374. break;
  1375. case "Full Open":
  1376. if(_deviceData.ModeSetPoint== _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.Open)
  1377. {
  1378. return true;
  1379. }
  1380. else
  1381. {
  1382. reason = $"full open wait";
  1383. }
  1384. break;
  1385. case "Full Close":
  1386. if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.Close)
  1387. {
  1388. return true;
  1389. }
  1390. else
  1391. {
  1392. reason = $"full close wait";
  1393. }
  1394. break;
  1395. case "Hold":
  1396. if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.Hold)
  1397. {
  1398. return true;
  1399. }
  1400. else
  1401. {
  1402. reason = $"hold wait";
  1403. }
  1404. break;
  1405. case "Home":
  1406. if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.Homing)
  1407. {
  1408. return true;
  1409. }
  1410. else
  1411. {
  1412. reason = $"home wait";
  1413. }
  1414. break;
  1415. case "WaitPressUp1":
  1416. //wait: sensor 1的压力大于等于basePressure
  1417. if (_deviceData.Pressure1Feedback >= _basePressure)
  1418. {
  1419. return true;
  1420. }
  1421. else
  1422. {
  1423. reason = $"WaitPressUp1 press1 feedback={_deviceData.Pressure1Feedback} < basePressure={_basePressure}";
  1424. }
  1425. break;
  1426. case "WaitPressDown1":
  1427. //wait: sensor 1的压力小于等于basePressure
  1428. if (_deviceData.Pressure1Feedback <= _basePressure)
  1429. {
  1430. return true;
  1431. }
  1432. else
  1433. {
  1434. reason = $"WaitPressDown1 press1 feedback={_deviceData.Pressure1Feedback} > basePressure={_basePressure}";
  1435. }
  1436. break;
  1437. case "WaitPressUp2":
  1438. //wait: sensor 2的压力大于等于basePressure
  1439. if (_deviceData.Pressure2Feedback >= _basePressure)
  1440. {
  1441. return true;
  1442. }
  1443. else
  1444. {
  1445. reason = $"WaitPressUp2 press2 feedback={_deviceData.Pressure2Feedback} < basePressure={_basePressure}";
  1446. }
  1447. break;
  1448. case "WaitPressDown2":
  1449. //wait: sensor 2的压力小于等于basePressure
  1450. if (_deviceData.Pressure2Feedback <= _basePressure)
  1451. {
  1452. return true;
  1453. }
  1454. else
  1455. {
  1456. reason = $"WaitPressDown2 press2 feedback={_deviceData.Pressure2Feedback} > basePressure={_basePressure}";
  1457. }
  1458. break;
  1459. case "Zero Set":
  1460. //offset cancle
  1461. break;
  1462. case "Cancel Zero":
  1463. //cancle Zero Set
  1464. break;
  1465. }
  1466. return false;
  1467. }
  1468. else
  1469. {
  1470. return true;
  1471. }
  1472. }
  1473. struct ControllerParameter
  1474. {
  1475. public int No { get; set; }
  1476. public string Name { get; set; }
  1477. public float P { get; set; }
  1478. public float I { get; set; }
  1479. public float D { get; set; }
  1480. public float A { get; set; }
  1481. public float Offset { get; set; }
  1482. public float CH { get; set; }
  1483. public float CL { get; set; }
  1484. }
  1485. }
  1486. }