IoAPC.cs 88 KB

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