IoAPC.cs 74 KB

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