| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574 | 
							- using Aitex.Common.Util;
 
- using Aitex.Core.Common.DeviceData;
 
- using Aitex.Core.RT.DataCenter;
 
- using Aitex.Core.RT.Device;
 
- using Aitex.Core.RT.Device.Unit;
 
- using Aitex.Core.RT.Event;
 
- using Aitex.Core.RT.IOCore;
 
- using Aitex.Core.RT.Log;
 
- using Aitex.Core.RT.OperationCenter;
 
- using Aitex.Core.RT.ParameterCenter;
 
- using Aitex.Core.RT.SCCore;
 
- using Aitex.Core.Util;
 
- using FurnaceRT.Equipments.PMs;
 
- using FurnaceRT.Equipments.Systems;
 
- using MECF.Framework.Common.DataCenter;
 
- using MECF.Framework.Common.Equipment;
 
- using MECF.Framework.Common.Event;
 
- using System;
 
- using System.Collections.Generic;
 
- using System.Diagnostics;
 
- using System.IO;
 
- using System.Linq;
 
- using System.Text;
 
- using System.Threading.Tasks;
 
- using System.Xml;
 
- namespace FurnaceRT.Devices
 
- {
 
-     public class IoAPC : BaseDevice, IDevice
 
-     {
 
-         #region Filed
 
-         private DIAccessor _diP1ZeroOffsetOutRangeAlm;
 
-         private DIAccessor _diP1ZeroAdjOutRangeAlm;
 
-         private DIAccessor _diP1SpanAdjOutRangeAlm;
 
-         private DIAccessor _diP2ZeroOffsetOutRangeAlm;
 
-         private DIAccessor _diP2ZeroAdjOutRangeAlm;
 
-         private DIAccessor _diP2SpanAdjOutRangeAlm;
 
-         private DIAccessor _diP1PressCtrlInterlockAlm;
 
-         private DIAccessor _diP2PressCtrlInterlockAlm;
 
-         private DIAccessor _diValveOpenCtrlInterlockAlm;
 
-         private DIAccessor _diValveHoldCtrlInterlockAlm;
 
-         private DIAccessor _diValveCloseInterlockAlm;
 
-         private DIAccessor _diAutoTeachingInterlockAlm;
 
-         private DIAccessor _diP1DisconnectionAlm;
 
-         private DIAccessor _diP2DisconnectionAlm;
 
-         private DIAccessor _diPumpStopInterlockAlm;
 
-         private DIAccessor _diAutoTeachingErr1Alm;
 
-         private DIAccessor _diAutoTeachingErr2Alm;
 
-         
 
-         private DOAccessor _doVGUnit;
 
-         private DOAccessor _doAoDataReadSysConfig;
 
-         private DOAccessor _doAoDataWriteSysConfig;
 
-         private DOAccessor _doAoDataReadCusConfig;
 
-         private DOAccessor _doAoDataWriteCusConfig;
 
-         private AIAccessor _aiValueSensorInput1;
 
-         private AIAccessor _aiValueSensorInput2;
 
-         private AIAccessor _aiSelectController;
 
-         private AIAccessor _aiPositionActualValue;
 
-         private AIAccessor _aiControlModeStatus;
 
-         private AIAccessor _aiHomeStatus;
 
-         private AIAccessor _aiWarningStatus1;
 
-         private AIAccessor _aiWarningStatus2;
 
-         private AIAccessor _aiWarningStatus3;
 
-         private AIAccessor _aiWarningStatus4;
 
-         private AIAccessor _aiWarningStatus5;
 
-         private AIAccessor _aiWarningStatus6;
 
-         private AIAccessor _aiErrorStatus1;
 
-         private AIAccessor _aiErrorStatus2;
 
-         private AIAccessor _aiErrorStatus3;
 
-         private AIAccessor _aiErrorStatus4;
 
-         private AIAccessor _aiValveStatusThreshold;
 
-         private AIAccessor _aiForbidInterlockOutbreak;
 
-         private AIAccessor _aiSlowVacuumModeSetting;
 
-         private AIAccessor _aiInterlock1;
 
-         private AIAccessor _aiInterlock2;
 
-         private AIAccessor _aiInterlock3;
 
-         private AIAccessor _aiInterlockConstantOfInterlock3;
 
-         private AIAccessor _aiP1SensorOffsetSetting;
 
-         private AIAccessor _aiPosMonOffsetSetting;
 
-         private AOAccessor _aoZeroResetP1;
 
-         private AOAccessor _aoZeroAdjustP1;
 
-         private AOAccessor _aoSpanAdjustP1;
 
-         private AOAccessor _aoZeroResetP2;
 
-         private AOAccessor _aoZeroAdjustP2;
 
-         private AOAccessor _aoSpanAdjustP2;
 
-         private AOAccessor _aoSlowVacuumTargetPressure;
 
-         private AOAccessor _aoValveStatusThreshold;
 
-         private AOAccessor _aoForbidInterlockOutbreak;
 
-         private AOAccessor _aoSlowVacuumModeSetting;
 
-         private AOAccessor _aoInterlock1;
 
-         private AOAccessor _aoInterlock2;
 
-         private AOAccessor _aoInterlock3;
 
-         private AOAccessor _aoInterlockConstantOfInterlock3;
 
-         private AOAccessor _aoP1SensorOffsetSetting;
 
-         private AOAccessor _aoPosMonOffsetSetting;
 
-         private AOAccessor _aoSensorAdjustReset;
 
-         private AOAccessor _aoSlowVacuumRate;
 
-         private AOAccessor _aoSlowVacuumP;
 
-         private AOAccessor _aoSlowVacuumI;
 
-         private AOAccessor _aoSlowVacuumD;
 
-         private AOAccessor _aoSlowVacuumA;
 
-         private AOAccessor _aoControllerModeSelect;
 
-         private AOAccessor _aoSpecifyTargetVacuumPressureControl;
 
-         private AOAccessor _aoSpecifyTargetOpeningForValveOpeningControl;
 
-         private AOAccessor _aoSpecifyControlMode;
 
-         private AOAccessor _aoRangeUpperLimitSensorInput;
 
-         private AOAccessor _aoController1;
 
-         private AOAccessor _aoController1P;
 
-         private AOAccessor _aoController1I;
 
-         private AOAccessor _aoController1D;
 
-         private AOAccessor _aoController1A;
 
-         private AOAccessor _aoController1CH;
 
-         private AOAccessor _aoController1CL;
 
-         private AOAccessor _aoController1Offset;
 
-         private AOAccessor _aoController2;
 
-         private AOAccessor _aoController2P;
 
-         private AOAccessor _aoController2I;
 
-         private AOAccessor _aoController2D;
 
-         private AOAccessor _aoController2A;
 
-         private AOAccessor _aoController2CH;
 
-         private AOAccessor _aoController2CL;
 
-         private AOAccessor _aoController2Offset;
 
-         private AOAccessor _aoController3;
 
-         private AOAccessor _aoController3P;
 
-         private AOAccessor _aoController3I;
 
-         private AOAccessor _aoController3D;
 
-         private AOAccessor _aoController3A;
 
-         private AOAccessor _aoController3CH;
 
-         private AOAccessor _aoController3CL;
 
-         private AOAccessor _aoController3Offset;
 
-         private AOAccessor _aoController4;
 
-         private AOAccessor _aoController4P;
 
-         private AOAccessor _aoController4I;
 
-         private AOAccessor _aoController4D;
 
-         private AOAccessor _aoController4A;
 
-         private AOAccessor _aoController4CH;
 
-         private AOAccessor _aoController4CL;
 
-         private AOAccessor _aoController4Offset;
 
-         private AOAccessor _aoController5;
 
-         private AOAccessor _aoController5P;
 
-         private AOAccessor _aoController5I;
 
-         private AOAccessor _aoController5D;
 
-         private AOAccessor _aoController5A;
 
-         private AOAccessor _aoController5CH;
 
-         private AOAccessor _aoController5CL;
 
-         private AOAccessor _aoController5Offset;
 
-         private AOAccessor _aoController6;
 
-         private AOAccessor _aoController6P;
 
-         private AOAccessor _aoController6I;
 
-         private AOAccessor _aoController6D;
 
-         private AOAccessor _aoController6A;
 
-         private AOAccessor _aoController6CH;
 
-         private AOAccessor _aoController6CL;
 
-         private AOAccessor _aoController6Offset;
 
-         private AOAccessor _aoController7;
 
-         private AOAccessor _aoController7P;
 
-         private AOAccessor _aoController7I;
 
-         private AOAccessor _aoController7D;
 
-         private AOAccessor _aoController7A;
 
-         private AOAccessor _aoController7CH;
 
-         private AOAccessor _aoController7CL;
 
-         private AOAccessor _aoController7Offset;
 
-         private AOAccessor _aoController8;
 
-         private AOAccessor _aoController8P;
 
-         private AOAccessor _aoController8I;
 
-         private AOAccessor _aoController8D;
 
-         private AOAccessor _aoController8A;
 
-         private AOAccessor _aoController8CH;
 
-         private AOAccessor _aoController8CL;
 
-         private AOAccessor _aoController8Offset;
 
-         private AOAccessor _aoController9;
 
-         private AOAccessor _aoController9P;
 
-         private AOAccessor _aoController9I;
 
-         private AOAccessor _aoController9D;
 
-         private AOAccessor _aoController9A;
 
-         private AOAccessor _aoController9CH;
 
-         private AOAccessor _aoController9CL;
 
-         private AOAccessor _aoController9Offset;
 
-         private AOAccessor _aoController10;
 
-         private AOAccessor _aoController10P;
 
-         private AOAccessor _aoController10I;
 
-         private AOAccessor _aoController10D;
 
-         private AOAccessor _aoController10A;
 
-         private AOAccessor _aoController10CH;
 
-         private AOAccessor _aoController10CL;
 
-         private AOAccessor _aoController10Offset;
 
-         private bool _isFloatAioType = false;
 
-         private AITAPCData _deviceData;
 
-         private bool _isWait;
 
-         private float _waitHigh;
 
-         private float _waitLow;
 
-         private Stopwatch _unloadTimer = new Stopwatch();
 
-         private IoValve _valveAV71;
 
-         private R_TRIG _av71OpenTrig = new R_TRIG();
 
-         private Stopwatch _apcSetModeTimer = new Stopwatch();
 
-         private int _apcSetModeTimeOutSec = 5;
 
-         private bool _isInit = false;
 
-         private Stopwatch _initTimer = new Stopwatch();
 
-         private Stopwatch _readConfigTimer = new Stopwatch();
 
-         #endregion
 
-         #region Property
 
-         public int SelectedControllerFeedback => (int)(_aiSelectController.FloatValue + 0.0001);
 
-         public int ModeFeedback => (int)(_aiControlModeStatus.FloatValue + 0.0001);
 
-         public int ModeSetPoint => (int)(_aoSpecifyControlMode.FloatValue + 0.0001);
 
-         public int HomingStatus => (int)(_aiHomeStatus.FloatValue + 0.0001);
 
-         public bool IsError { get; set; }
 
-         public bool IsNeedWaitComplete { get; set; }
 
-         public string PressureUnit { get; set; }
 
-         private float _basePressure = 0;
 
-         private float _valveStausThreshold;
 
-         public float ValveStatusThreshold
 
-         {
 
-             get
 
-             {
 
-                 if(_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
 
-                 {
 
-                     return _aiValveStatusThreshold.FloatValue;
 
-                 }
 
-                 return _valveStausThreshold;
 
-             }
 
-             set
 
-             {
 
-                 _valveStausThreshold = value;
 
-                 SC.SetItemValue($"{Module}.{Name}.ValveStatusThreshold", value);
 
-             }
 
-         }
 
-         private float _slowVacuumModeSetting;
 
-         public float SlowVacuumModeSetting
 
-         {
 
-             get
 
-             {
 
-                 if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
 
-                 {
 
-                     return _aiSlowVacuumModeSetting.FloatValue;
 
-                 }
 
-                 return _slowVacuumModeSetting;
 
-             }
 
-             set
 
-             {
 
-                 _slowVacuumModeSetting = value;
 
-                 SC.SetItemValue($"{Module}.{Name}.SlowVacuumModeSetting", value);
 
-             }
 
-         }
 
-         private float interlock1;
 
-         public float Interlock1
 
-         {
 
-             get
 
-             {
 
-                 if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
 
-                 {
 
-                     return _aiInterlock1.FloatValue;
 
-                 }
 
-                 return interlock1;
 
-             }
 
-             set
 
-             {
 
-                 interlock1 = value;
 
-                 SC.SetItemValue($"{Module}.{Name}.Interlock1", value);
 
-             }
 
-         }
 
-         private float interlock2;
 
-         public float Interlock2
 
-         {
 
-             get
 
-             {
 
-                 if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
 
-                 {
 
-                     return _aiInterlock2.FloatValue;
 
-                 }
 
-                 return interlock2;
 
-             }
 
-             set
 
-             {
 
-                 interlock2 = value;
 
-                 SC.SetItemValue($"{Module}.{Name}.Interlock2", value);
 
-             }
 
-         }
 
-         private float interlock3;
 
-         public float Interlock3
 
-         {
 
-             get
 
-             {
 
-                 if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
 
-                 {
 
-                     return _aiInterlock3.FloatValue;
 
-                 }
 
-                 return interlock3;
 
-             }
 
-             set
 
-             {
 
-                 interlock3 = value;
 
-                 SC.SetItemValue($"{Module}.{Name}.Interlock3", value);
 
-             }
 
-         }
 
-         private float _interlockConstantOfInterlock3;
 
-         public float InterlockConstantOfInterlock3
 
-         {
 
-             get
 
-             {
 
-                 if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
 
-                 {
 
-                     return _aiInterlockConstantOfInterlock3.FloatValue;
 
-                 }
 
-                 return _interlockConstantOfInterlock3;
 
-             }
 
-             set
 
-             {
 
-                 _interlockConstantOfInterlock3 = value;
 
-                 SC.SetItemValue($"{Module}.{Name}.InterlockConstantOfInterlock3", value);
 
-             }
 
-         }
 
-         private float _p1SensorOffsetSetting;
 
-         public float P1SensorOffsetSetting
 
-         {
 
-             get
 
-             {
 
-                 if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
 
-                 {
 
-                     return _aiP1SensorOffsetSetting.FloatValue;
 
-                 }
 
-                 return _p1SensorOffsetSetting;
 
-             }
 
-             set
 
-             {
 
-                 _p1SensorOffsetSetting = value;
 
-                 SC.SetItemValue($"{Module}.{Name}.P1SensorOffsetSetting", value);
 
-             }
 
-         }
 
-         private float _posMonOffsetSetting;
 
-         public float PosMonOffsetSetting
 
-         {
 
-             get
 
-             {
 
-                 if (_unloadTimer != null && _unloadTimer.IsRunning && _unloadTimer.ElapsedMilliseconds > 3000)
 
-                 {
 
-                     return _aiPosMonOffsetSetting.FloatValue;
 
-                 }
 
-                 return _posMonOffsetSetting;
 
-             }
 
-             set
 
-             {
 
-                 _posMonOffsetSetting = value;
 
-                 SC.SetItemValue($"{Module}.{Name}.PosMonOffsetSetting", value);
 
-             }
 
-         }
 
-         public AlarmEventItem APCSetModeAlarm { get; set; }
 
-         public AlarmEventItem APCPressure1ToleranceWarning { get; set; }
 
-         public AlarmEventItem APCPressure1ToleranceAlarm { get; set; }
 
-         public AlarmEventItem APCPressure2ToleranceWarning { get; set; }
 
-         public AlarmEventItem APCPressure2ToleranceAlarm { get; set; }
 
-         public AlarmEventItem APCAngleToleranceWarning { get; set; }
 
-         public AlarmEventItem APCAngleToleranceAlarm { get; set; }
 
-         public AITAPCData DeviceData => _deviceData;
 
-         #endregion
 
-         public IoAPC(string module, XmlElement node, string ioModule = "")
 
-         {
 
-             base.Module = string.IsNullOrEmpty(node.GetAttribute("module")) ? module : node.GetAttribute("module");
 
-             base.Name = node.GetAttribute("id");
 
-             base.Display = node.GetAttribute("display");
 
-             base.DeviceID = node.GetAttribute("schematicId");
 
-             _isFloatAioType = !string.IsNullOrEmpty(node.GetAttribute("aioType")) && (node.GetAttribute("aioType") == "float");
 
-             _diP1ZeroOffsetOutRangeAlm = ParseDiNode("diP1ZeroOffsetOutRangeAlm", node, ioModule);
 
-             _diP1ZeroAdjOutRangeAlm = ParseDiNode("diP1ZeroAdjOutRangeAlm", node, ioModule);
 
-             _diP1SpanAdjOutRangeAlm = ParseDiNode("diP1SpanAdjOutRangeAlm", node, ioModule);
 
-             _diP2ZeroOffsetOutRangeAlm = ParseDiNode("diP2ZeroOffsetOutRangeAlm", node, ioModule);
 
-             _diP2ZeroAdjOutRangeAlm = ParseDiNode("diP2ZeroAdjOutRangeAlm", node, ioModule);
 
-             _diP2SpanAdjOutRangeAlm = ParseDiNode("diP2SpanAdjOutRangeAlm", node, ioModule);
 
-             _diP1PressCtrlInterlockAlm = ParseDiNode("diP1PressCtrlInterlockAlm", node, ioModule);
 
-             _diP2PressCtrlInterlockAlm = ParseDiNode("diP2PressCtrlInterlockAlm", node, ioModule);
 
-             _diValveOpenCtrlInterlockAlm = ParseDiNode("diValveOpenCtrlInterlockAlm", node, ioModule);
 
-             _diValveHoldCtrlInterlockAlm = ParseDiNode("diValveHoldCtrlInterlockAlm", node, ioModule);
 
-             _diValveCloseInterlockAlm = ParseDiNode("diValveCloseInterlockAlm", node, ioModule);
 
-             _diAutoTeachingInterlockAlm = ParseDiNode("diAutoTeachingInterlockAlm", node, ioModule);
 
-             _diP1DisconnectionAlm = ParseDiNode("diP1DisconnectionAlm", node, ioModule);
 
-             _diP2DisconnectionAlm = ParseDiNode("diP2DisconnectionAlm", node, ioModule);
 
-             _diPumpStopInterlockAlm = ParseDiNode("diPumpStopInterlockAlm", node, ioModule);
 
-             _diAutoTeachingErr1Alm = ParseDiNode("diAutoTeachingErr1Alm", node, ioModule);
 
-             _diAutoTeachingErr2Alm = ParseDiNode("diAutoTeachingErr2Alm", node, ioModule);
 
-             _doVGUnit = ParseDoNode("doVGUnit", node, ioModule);
 
-             _doAoDataWriteSysConfig = ParseDoNode("doAoDataWriteSysConfig", node, ioModule);
 
-             _doAoDataReadSysConfig = ParseDoNode("doAoDataReadSysConfig", node, ioModule);
 
-             _doAoDataReadCusConfig = ParseDoNode("doAoDataReadCusConfig", node, ioModule);
 
-             _doAoDataWriteCusConfig = ParseDoNode("doAoDataWriteCusConfig", node, ioModule);
 
-             _aiValueSensorInput1 = ParseAiNode("aiValueSensorInput1", node, ioModule);
 
-             _aiValueSensorInput2 = ParseAiNode("aiValueSensorInput2", node, ioModule);
 
-             _aiSelectController = ParseAiNode("aiSelectController", node, ioModule);
 
-             _aiPositionActualValue = ParseAiNode("aiPositionActualValue", node, ioModule);
 
-             _aiControlModeStatus = ParseAiNode("aiControlModeStatus", node, ioModule);
 
-             _aiHomeStatus = ParseAiNode("aiHomeStatus", node, ioModule);
 
-             _aiWarningStatus1 = ParseAiNode("aiWarningStatus1", node, ioModule);
 
-             _aiWarningStatus2 = ParseAiNode("aiWarningStatus2", node, ioModule);
 
-             _aiWarningStatus3 = ParseAiNode("aiWarningStatus3", node, ioModule);
 
-             _aiWarningStatus4 = ParseAiNode("aiWarningStatus4", node, ioModule);
 
-             _aiWarningStatus5 = ParseAiNode("aiWarningStatus5", node, ioModule);
 
-             _aiWarningStatus6 = ParseAiNode("aiWarningStatus6", node, ioModule);
 
-             _aiErrorStatus1 = ParseAiNode("aiErrorStatus1", node, ioModule);
 
-             _aiErrorStatus2 = ParseAiNode("aiErrorStatus2", node, ioModule);
 
-             _aiErrorStatus3 = ParseAiNode("aiErrorStatus3", node, ioModule);
 
-             _aiErrorStatus4 = ParseAiNode("aiErrorStatus4", node, ioModule);
 
-             _aiValveStatusThreshold = ParseAiNode("aiValveStatusThreshold", node, ioModule);
 
-             _aiForbidInterlockOutbreak = ParseAiNode("aiForbidInterlockOutbreak", node, ioModule);
 
-             _aiSlowVacuumModeSetting = ParseAiNode("aiSlowVacuumModeSetting", node, ioModule);
 
-             _aiInterlock1 = ParseAiNode("aiInterlock1", node, ioModule);
 
-             _aiInterlock2 = ParseAiNode("aiInterlock2", node, ioModule);
 
-             _aiInterlock3 = ParseAiNode("aiInterlock3", node, ioModule);
 
-             _aiInterlockConstantOfInterlock3 = ParseAiNode("aiInterlockConstantOfInterlock3", node, ioModule);
 
-             _aiP1SensorOffsetSetting = ParseAiNode("aiP1SensorOffsetSetting", node, ioModule);
 
-             _aiPosMonOffsetSetting = ParseAiNode("aiPosMonOffsetSetting", node, ioModule);
 
-             _aoZeroResetP1 = ParseAoNode("aoZeroResetP1", node, ioModule);
 
-             _aoZeroAdjustP1 = ParseAoNode("aoZeroAdjustP1", node, ioModule);
 
-             _aoSpanAdjustP1 = ParseAoNode("aoSpanAdjustP1", node, ioModule);
 
-             _aoZeroResetP2 = ParseAoNode("aoZeroResetP2", node, ioModule);
 
-             _aoZeroAdjustP2 = ParseAoNode("aoZeroAdjustP2", node, ioModule);
 
-             _aoSpanAdjustP2 = ParseAoNode("aoSpanAdjustP2", node, ioModule);
 
-             _aoSlowVacuumTargetPressure = ParseAoNode("aoSlowVacuumTargetPressure", node, ioModule);
 
-             _aoValveStatusThreshold = ParseAoNode("aoValveStatusThreshold", node, ioModule);
 
-             _aoForbidInterlockOutbreak = ParseAoNode("aoForbidInterlockOutbreak", node, ioModule);
 
-             _aoSlowVacuumModeSetting = ParseAoNode("aoSlowVacuumModeSetting", node, ioModule);
 
-             _aoInterlock1 = ParseAoNode("aoInterlock1", node, ioModule);
 
-             _aoInterlock2 = ParseAoNode("aoInterlock2", node, ioModule);
 
-             _aoInterlock3 = ParseAoNode("aoInterlock3", node, ioModule);
 
-             _aoInterlockConstantOfInterlock3 = ParseAoNode("aoInterlockConstantOfInterlock3", node, ioModule);
 
-             _aoP1SensorOffsetSetting = ParseAoNode("aoP1SensorOffsetSetting", node, ioModule);
 
-             _aoPosMonOffsetSetting = ParseAoNode("aoPosMonOffsetSetting", node, ioModule);
 
-             _aoSensorAdjustReset = ParseAoNode("aoSensorAdjustReset", node, ioModule);
 
-             _aoSlowVacuumRate = ParseAoNode("aoSlowVacuumRate", node, ioModule);
 
-             _aoSlowVacuumP = ParseAoNode("aoSlowVacuumP", node, ioModule);
 
-             _aoSlowVacuumI = ParseAoNode("aoSlowVacuumI", node, ioModule);
 
-             _aoSlowVacuumD = ParseAoNode("aoSlowVacuumD", node, ioModule);
 
-             _aoSlowVacuumA = ParseAoNode("aoSlowVacuumA", node, ioModule);
 
-             _aoControllerModeSelect = ParseAoNode("aoControllerModeSelect", node, ioModule);
 
-             _aoSpecifyTargetVacuumPressureControl = ParseAoNode("aoSpecifyTargetVacuumPressureControl", node, ioModule);
 
-             _aoSpecifyTargetOpeningForValveOpeningControl = ParseAoNode("aoSpecifyTargetOpeningForValveOpeningControl", node, ioModule);
 
-             _aoSpecifyControlMode = ParseAoNode("aoSpecifyControlMode", node, ioModule);
 
-             _aoRangeUpperLimitSensorInput = ParseAoNode("aoRangeUpperLimitSensorInput", node, ioModule);
 
-             _aoController1 = ParseAoNode("aoController1", node, ioModule);
 
-             _aoController1P = ParseAoNode("aoController1P", node, ioModule);
 
-             _aoController1I = ParseAoNode("aoController1I", node, ioModule);
 
-             _aoController1D = ParseAoNode("aoController1D", node, ioModule);
 
-             _aoController1A = ParseAoNode("aoController1A", node, ioModule);
 
-             _aoController1CH = ParseAoNode("aoController1CH", node, ioModule);
 
-             _aoController1CL = ParseAoNode("aoController1CL", node, ioModule);
 
-             _aoController1Offset = ParseAoNode("aoController1Offset", node, ioModule);
 
-             _aoController2 = ParseAoNode("aoController2", node, ioModule);
 
-             _aoController2P = ParseAoNode("aoController2P", node, ioModule);
 
-             _aoController2I = ParseAoNode("aoController2I", node, ioModule);
 
-             _aoController2D = ParseAoNode("aoController2D", node, ioModule);
 
-             _aoController2A = ParseAoNode("aoController2A", node, ioModule);
 
-             _aoController2CH = ParseAoNode("aoController2CH", node, ioModule);
 
-             _aoController2CL = ParseAoNode("aoController2CL", node, ioModule);
 
-             _aoController2Offset = ParseAoNode("aoController2Offset", node, ioModule);
 
-             _aoController3 = ParseAoNode("aoController3", node, ioModule);
 
-             _aoController3P = ParseAoNode("aoController3P", node, ioModule);
 
-             _aoController3I = ParseAoNode("aoController3I", node, ioModule);
 
-             _aoController3D = ParseAoNode("aoController3D", node, ioModule);
 
-             _aoController3A = ParseAoNode("aoController3A", node, ioModule);
 
-             _aoController3CH = ParseAoNode("aoController3CH", node, ioModule);
 
-             _aoController3CL = ParseAoNode("aoController3CL", node, ioModule);
 
-             _aoController3Offset = ParseAoNode("aoController3Offset", node, ioModule);
 
-             _aoController4 = ParseAoNode("aoController4", node, ioModule);
 
-             _aoController4P = ParseAoNode("aoController4P", node, ioModule);
 
-             _aoController4I = ParseAoNode("aoController4I", node, ioModule);
 
-             _aoController4D = ParseAoNode("aoController4D", node, ioModule);
 
-             _aoController4A = ParseAoNode("aoController4A", node, ioModule);
 
-             _aoController4CH = ParseAoNode("aoController4CH", node, ioModule);
 
-             _aoController4CL = ParseAoNode("aoController4CL", node, ioModule);
 
-             _aoController4Offset = ParseAoNode("aoController4Offset", node, ioModule);
 
-             _aoController5 = ParseAoNode("aoController5", node, ioModule);
 
-             _aoController5P = ParseAoNode("aoController5P", node, ioModule);
 
-             _aoController5I = ParseAoNode("aoController5I", node, ioModule);
 
-             _aoController5D = ParseAoNode("aoController5D", node, ioModule);
 
-             _aoController5A = ParseAoNode("aoController5A", node, ioModule);
 
-             _aoController5CH = ParseAoNode("aoController5CH", node, ioModule);
 
-             _aoController5CL = ParseAoNode("aoController5CL", node, ioModule);
 
-             _aoController5Offset = ParseAoNode("aoController5Offset", node, ioModule);
 
-             _aoController6 = ParseAoNode("aoController6", node, ioModule);
 
-             _aoController6P = ParseAoNode("aoController6P", node, ioModule);
 
-             _aoController6I = ParseAoNode("aoController6I", node, ioModule);
 
-             _aoController6D = ParseAoNode("aoController6D", node, ioModule);
 
-             _aoController6A = ParseAoNode("aoController6A", node, ioModule);
 
-             _aoController6CH = ParseAoNode("aoController6CH", node, ioModule);
 
-             _aoController6CL = ParseAoNode("aoController6CL", node, ioModule);
 
-             _aoController6Offset = ParseAoNode("aoController6Offset", node, ioModule);
 
-             _aoController7 = ParseAoNode("aoController7", node, ioModule);
 
-             _aoController7P = ParseAoNode("aoController7P", node, ioModule);
 
-             _aoController7I = ParseAoNode("aoController7I", node, ioModule);
 
-             _aoController7D = ParseAoNode("aoController7D", node, ioModule);
 
-             _aoController7A = ParseAoNode("aoController7A", node, ioModule);
 
-             _aoController7CH = ParseAoNode("aoController7CH", node, ioModule);
 
-             _aoController7CL = ParseAoNode("aoController7CL", node, ioModule);
 
-             _aoController7Offset = ParseAoNode("aoController7Offset", node, ioModule);
 
-             _aoController8 = ParseAoNode("aoController8", node, ioModule);
 
-             _aoController8P = ParseAoNode("aoController8P", node, ioModule);
 
-             _aoController8I = ParseAoNode("aoController8I", node, ioModule);
 
-             _aoController8D = ParseAoNode("aoController8D", node, ioModule);
 
-             _aoController8A = ParseAoNode("aoController8A", node, ioModule);
 
-             _aoController8CH = ParseAoNode("aoController8CH", node, ioModule);
 
-             _aoController8CL = ParseAoNode("aoController8CL", node, ioModule);
 
-             _aoController8Offset = ParseAoNode("aoController8Offset", node, ioModule);
 
-             _aoController9 = ParseAoNode("aoController9", node, ioModule);
 
-             _aoController9P = ParseAoNode("aoController9P", node, ioModule);
 
-             _aoController9I = ParseAoNode("aoController9I", node, ioModule);
 
-             _aoController9D = ParseAoNode("aoController9D", node, ioModule);
 
-             _aoController9A = ParseAoNode("aoController9A", node, ioModule);
 
-             _aoController9CH = ParseAoNode("aoController9CH", node, ioModule);
 
-             _aoController9CL = ParseAoNode("aoController9CL", node, ioModule);
 
-             _aoController9Offset = ParseAoNode("aoController9Offset", node, ioModule);
 
-             _aoController10 = ParseAoNode("aoController10", node, ioModule);
 
-             _aoController10P = ParseAoNode("aoController10P", node, ioModule);
 
-             _aoController10I = ParseAoNode("aoController10I", node, ioModule);
 
-             _aoController10D = ParseAoNode("aoController10D", node, ioModule);
 
-             _aoController10A = ParseAoNode("aoController10A", node, ioModule);
 
-             _aoController10CH = ParseAoNode("aoController10CH", node, ioModule);
 
-             _aoController10CL = ParseAoNode("aoController10CL", node, ioModule);
 
-             _aoController10Offset = ParseAoNode("aoController10Offset", node, ioModule);
 
-             PressureUnit = SC.GetStringValue($"{Module}.{Name}.PressureUnit");
 
-         }
 
-         public bool Initialize()
 
-         {
 
-             if (System.Diagnostics.Debugger.IsAttached)
 
-             {
 
-                 var oj = DEVICE.GetDevice<IoAPC>($"{Module}.{Name}");
 
-                 foreach (var pi in oj.GetType().GetProperties())
 
-                 {
 
-                     if (pi.PropertyType.Name.EndsWith("Accessor"))
 
-                     {
 
-                         var value = pi.GetValue(oj);
 
-                         if (value == null)
 
-                         {
 
-                             LOG.Write($"{Module}.{Name} {pi.Name} is null");
 
-                         }
 
-                     }
 
-                 }
 
-             }
 
-             _deviceData = new AITAPCData()
 
-             {
 
-                 Module = Module,
 
-                 DeviceName = Name,
 
-                 DeviceSchematicId = DeviceID,
 
-                 DisplayName = Display,
 
-             };
 
-             DATA.Subscribe($"{Module}.{Name}.DeviceData", () => _deviceData);
 
-             DATA.Subscribe($"{Module}.{Name}.Pressure1Feedback", () => _aiValueSensorInput1.FloatValue);
 
-             DATA.Subscribe($"{Module}.{Name}.Pressure2Feedback", () => _aiValueSensorInput2.FloatValue);
 
-             DATA.Subscribe($"{Module}.{Name}.PositionFeedback", () => _aiPositionActualValue.FloatValue);
 
-             DATA.Subscribe($"{Module}.{Name}.PositionSetPoint", () => _deviceData.PositionSetPoint);
 
-             DATA.Subscribe($"{Module}.{Name}.PressureSetPoint", () => _deviceData.PressureSetPoint);
 
-             DATA.Subscribe($"{Module}.{Name}.SlowRateSetPoint", () => _deviceData.SlowRateSetPoint);
 
-             DATA.Subscribe($"{Module}.{Name}.SelectedControllerFeedback", () => SelectedControllerFeedback);
 
-             DATA.Subscribe($"{Module}.{Name}.ModeFeedback", () => ModeFeedback);
 
-             DATA.Subscribe($"{Module}.{Name}.ModeSetPoint", () => ModeSetPoint);
 
-             DATA.Subscribe($"{Module}.{Name}.HomingStatus", () => HomingStatus);
 
-             DATA.Subscribe($"{Module}.{Name}.IsError", () => IsError);
 
-             DATA.Subscribe($"{Module}.{Name}.ValveStatusThreshold", () => ValveStatusThreshold);
 
-             DATA.Subscribe($"{Module}.{Name}.SlowVacuumModeSetting", () => SlowVacuumModeSetting);
 
-             DATA.Subscribe($"{Module}.{Name}.Interlock1", () => Interlock1);
 
-             DATA.Subscribe($"{Module}.{Name}.Interlock2", () => Interlock2);
 
-             DATA.Subscribe($"{Module}.{Name}.Interlock3", () => Interlock3);
 
-             DATA.Subscribe($"{Module}.{Name}.InterlockConstantOfInterlock3", () => InterlockConstantOfInterlock3);
 
-             DATA.Subscribe($"{Module}.{Name}.P1SensorOffsetSetting", () => P1SensorOffsetSetting);
 
-             DATA.Subscribe($"{Module}.{Name}.PosMonOffsetSetting", () => PosMonOffsetSetting);
 
-             //DATA.Subscribe($"{Module}.{Name}.IsSwitch", () => IsSwitch);
 
-             //DATA.Subscribe($"{Module}.{Name}.SetSpeed", () => SetSpeed);
 
-             //DATA.Subscribe($"{Module}.{Name}.MaxSpeed", () => MaxSpeed);
 
-             //DATA.Subscribe($"{Module}.{Name}.IsReset", () => IsReset);
 
-             //DATA.Subscribe($"{Module}.{Name}.ErrorTimer", () => ErrorTimer);
 
-             //DATA.Subscribe($"{Module}.{Name}.CurrentSpeed", () => CurrentSpeed);
 
-             //DATA.Subscribe($"{Module}.{Name}.Voltage", () => Voltage);
 
-             //DATA.Subscribe($"{Module}.{Name}.Current", () => Current);
 
-             OP.Subscribe($"{Module}.{Name}.SetParameters", (string cmd, object[] param) =>
 
-             {
 
-                 //command;pidTable;setValue;LowPressWait
 
-                 SetParameters(param);
 
-                 return true;
 
-             });
 
-             OP.Subscribe($"{Module}.{Name}.SetManualParameters", (string cmd, object[] param) =>
 
-             {
 
-                 //command;pidTable;setValue;LowPressWait
 
-                 SetManualParameters(param);
 
-                 return true;
 
-             });
 
-             OP.Subscribe($"{Module}.{Name}.SetUnit", (string cmd, object[] param) =>
 
-             {
 
-                 //command;pidTable;setValue;LowPressWait
 
-                 SetUnit(param);
 
-                 return true;
 
-             });
 
-             OP.Subscribe($"{Module}.{Name}.SetUpload", (string cmd, object[] param) =>
 
-             {
 
-                 SetUpload();
 
-                 return true;
 
-             });
 
-             OP.Subscribe($"{Module}.{Name}.SetDownload", (string cmd, object[] param) =>
 
-             {
 
-                 SetDownload(param);
 
-                 return true;
 
-             });
 
-             OP.Subscribe($"{Module}.{Name}.SetConfig", (string cmd, object[] param) =>
 
-             {
 
-                 //command;pidTable;setValue;LowPressWait
 
-                 SetConfig(param);
 
-                 return true;
 
-             });
 
-             OP.Subscribe($"{Module}.{Name}.SetPID", (string cmd, object[] param) =>
 
-             {
 
-                 if (param != null && param.Length > 1)
 
-                 {
 
-                     int.TryParse(param[1].ToString(), out int controllerID);
 
-                     SetControllerParameters(param[0].ToString(), controllerID);
 
-                 }
 
-                 return true;
 
-             });
 
-             ValveStatusThreshold = (float)SC.GetValue<double>($"{Module}.{Name}.ValveStatusThreshold");
 
-             SlowVacuumModeSetting = (float)SC.GetValue<double>($"{Module}.{Name}.SlowVacuumModeSetting");
 
-             Interlock1 = (float)SC.GetValue<double>($"{Module}.{Name}.Interlock1");
 
-             Interlock2 = (float)SC.GetValue<double>($"{Module}.{Name}.Interlock2");
 
-             Interlock3 = (float)SC.GetValue<double>($"{Module}.{Name}.Interlock3");
 
-             InterlockConstantOfInterlock3 = (float)SC.GetValue<double>($"{Module}.{Name}.InterlockConstantOfInterlock3");
 
-             P1SensorOffsetSetting = (float)SC.GetValue<double>($"{Module}.{Name}.P1SensorOffsetSetting");
 
-             PosMonOffsetSetting = (float)SC.GetValue<double>($"{Module}.{Name}.PosMonOffsetSetting");
 
-             return true;
 
-         }
 
-         private void SetUpload()
 
-         {
 
-             _unloadTimer.Restart();
 
-             _doAoDataReadSysConfig.SetPulseValue(true, 3000);
 
-         }
 
-         private void SetDownload(object[] param)
 
-         {
 
-             SetConfig(param);
 
-             if (param != null && param.Length > 7)
 
-             {
 
-                 float.TryParse(param[0].ToString(), out float value);
 
-                 _aoValveStatusThreshold.FloatValue = value;
 
-                 float.TryParse(param[1].ToString(), out value);
 
-                 _aoSlowVacuumModeSetting.FloatValue = value;
 
-                 float.TryParse(param[2].ToString(), out value);
 
-                 _aoInterlock1.FloatValue = value;
 
-                 float.TryParse(param[3].ToString(), out value);
 
-                 _aoInterlock2.FloatValue = value;
 
-                 float.TryParse(param[4].ToString(), out value);
 
-                 _aoInterlock3.FloatValue = value;
 
-                 float.TryParse(param[5].ToString(), out value);
 
-                 _aoInterlockConstantOfInterlock3.FloatValue = value;
 
-                 float.TryParse(param[6].ToString(), out value);
 
-                 _aoP1SensorOffsetSetting.FloatValue = value;
 
-                 float.TryParse(param[7].ToString(), out value);
 
-                 _aoPosMonOffsetSetting.FloatValue = value;
 
-             }
 
-             _doAoDataWriteSysConfig.SetPulseValue(true, 3000);
 
-         }
 
-         private void SetConfig(object[] param)
 
-         {
 
-             if(param != null && param.Length > 7)
 
-             {
 
-                 float.TryParse(param[0].ToString(), out float value);
 
-                 ValveStatusThreshold = value;
 
-                 float.TryParse(param[1].ToString(), out value);
 
-                 SlowVacuumModeSetting = value;
 
-                 float.TryParse(param[2].ToString(), out value);
 
-                 Interlock1 = value;
 
-                 float.TryParse(param[3].ToString(), out value);
 
-                 Interlock2 = value;
 
-                 float.TryParse(param[4].ToString(), out value);
 
-                 Interlock3= value;
 
-                 float.TryParse(param[5].ToString(), out value);
 
-                 InterlockConstantOfInterlock3 = value;
 
-                 float.TryParse(param[6].ToString(), out value);
 
-                 P1SensorOffsetSetting = value;
 
-                 float.TryParse(param[7].ToString(), out value);
 
-                 PosMonOffsetSetting = value;
 
-             }
 
-         }
 
-         public void Monitor()
 
-         {
 
-             if(!_isInit)
 
-             {
 
-                 if (!_initTimer.IsRunning)
 
-                     _initTimer.Start();
 
-                 if(_initTimer.ElapsedMilliseconds > 5 * 1000)
 
-                 {
 
-                     _initTimer.Stop();
 
-                     _isInit = true;
 
-                     var pidTableName = SC.GetStringValue("PM1.APCPID");
 
-                     int.TryParse(SC.GetStringValue("PM1.APCPIDControllerID"), out int controllerID);
 
-                     SetControllerParameters(pidTableName, controllerID);
 
-                 }
 
-             }
 
-             if(_valveAV71 == null)
 
-                 _valveAV71 = DEVICE.GetDevice<IoValve>($"{Module}.ValveAV71");
 
-             //if(_valveAV71 != null && Singleton<EquipmentManager>.Instance.Modules.ContainsKey(ModuleName.PM1) &&
 
-             //    !(Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).IsProcessing)
 
-             //{
 
-             //    _av71OpenTrig.CLK = _valveAV71.Status;
 
-             //    if (!_valveAV71.Status)
 
-             //    {
 
-             //        if (_aoSpecifyControlMode.FloatValue != (int)PressureControlMode.Close)
 
-             //            _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Close;
 
-             //        if (_deviceData.ModeSetPoint != (int)PressureControlMode.Close)
 
-             //            _deviceData.ModeSetPoint = (int)PressureControlMode.Close;
 
-             //    }
 
-             //    if(_av71OpenTrig.Q)
 
-             //    {
 
-             //        if (_aoSpecifyControlMode.FloatValue != (int)PressureControlMode.Open)
 
-             //            _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Open;
 
-             //        if (_deviceData.ModeSetPoint != (int)PressureControlMode.Open)
 
-             //            _deviceData.ModeSetPoint = (int)PressureControlMode.Open;
 
-             //    }
 
-             //}
 
-             if(_apcSetModeTimer.IsRunning && _apcSetModeTimer.ElapsedMilliseconds > _apcSetModeTimeOutSec * 1000)
 
-             {
 
-                 APCSetModeAlarm.Set("APC set mode timeout");
 
-             }
 
-             _deviceData.Pressure1Feedback = _aiValueSensorInput1.FloatValue;
 
-             _deviceData.Pressure2Feedback = _aiValueSensorInput2.FloatValue;
 
-             _deviceData.SelectedControllerFeedback = SelectedControllerFeedback;
 
-             _deviceData.PositionFeedback = _aiPositionActualValue.FloatValue;
 
-             _deviceData.ModeFeedback = ModeFeedback;
 
-             _deviceData.HomingStatus = HomingStatus;
 
-             _deviceData.PressureFeedback = GetPressure();
 
-             var hardError1 = _aiErrorStatus1.FloatValue > 0 ? "Active manufacturer Error Details (Device Management)" : "";
 
-             var hardError2 = _aiErrorStatus2.FloatValue > 0 ? "Active manufacturer Error Details(Sensor Input1))" : "";
 
-             var hardError3 = _aiErrorStatus3.FloatValue > 0 ? "Active manufacturer Error Details (Sensor Input2)" : "";
 
-             var hardError4 = _aiErrorStatus4.FloatValue > 0 ? "Active manufacturer Error Details (Valve)" : "";
 
-             if (!string.IsNullOrEmpty(hardError1) || !string.IsNullOrEmpty(hardError2) || !string.IsNullOrEmpty(hardError3) || !string.IsNullOrEmpty(hardError4))
 
-             {
 
-                 var status = !string.IsNullOrEmpty(hardError1) ? hardError1 : "";
 
-                 status += !string.IsNullOrEmpty(status) ? !string.IsNullOrEmpty(hardError2) ? $"----{hardError2}" : "" : hardError2;
 
-                 status += !string.IsNullOrEmpty(status) ? !string.IsNullOrEmpty(hardError3) ? $"----{hardError3}" : "" : hardError3;
 
-                 status += !string.IsNullOrEmpty(status) ? !string.IsNullOrEmpty(hardError4) ? $"----{hardError4}" : "" : hardError4;
 
-                 _deviceData.HardError = status;
 
-                 IsError = true;
 
-             }
 
-             else
 
-             {
 
-                 IsError = false;
 
-                 _deviceData.HardError = "";
 
-             }
 
-             switch ((int)(_aiHomeStatus.FloatValue + 0.0001))
 
-             {
 
-                 case 0:
 
-                     _deviceData.HomeStatusDisplay = "Homing not started";
 
-                     break;
 
-                 case 1:
 
-                     _deviceData.HomeStatusDisplay = "Homing interrupted";
 
-                     break;
 
-                 case 2:
 
-                     _deviceData.HomeStatusDisplay = "Homing completed-no error";
 
-                     break;
 
-                 case 3:
 
-                     _deviceData.HomeStatusDisplay = "Homing completed-error20";
 
-                     break;
 
-                 case 4:
 
-                     _deviceData.HomeStatusDisplay = "Homing in progress";
 
-                     break;
 
-                 default:
 
-                     _deviceData.HomeStatusDisplay = "";
 
-                     break;
 
-             }
 
-             if (_readConfigTimer != null && _readConfigTimer.IsRunning && _readConfigTimer.ElapsedMilliseconds > 3000)
 
-             {
 
-                 _readConfigTimer.Stop();
 
-                 _doAoDataReadCusConfig.SetPulseValue(true, 3000);
 
-             }
 
-         }
 
-         public void Reset()
 
-         {
 
-             //APCSetModeAlarm.Reset();
 
-         }
 
-         public void SetUnit(object[] param)
 
-         {
 
-             if ((string)param[0] == "Pa")
 
-             {
 
-                 _doVGUnit.SetValue(true, out _);
 
-             }
 
-             else
 
-             {
 
-                 _doVGUnit.SetValue(false, out _);
 
-             }
 
-         }
 
-         public void Terminate()
 
-         {
 
-             _valveAV71.TurnValve(false, out _);
 
-             _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Close;
 
-             _deviceData.ModeSetPoint = (int)PressureControlMode.Close;
 
-         }
 
-         private float GetPressure()
 
-         {
 
-             if (_deviceData.ModeFeedback == (int)(PressureControlMode.Press1Control))
 
-                 return _aiValueSensorInput1.FloatValue;
 
-             if (_deviceData.ModeFeedback == (int)(PressureControlMode.Press2Control))
 
-                 return _aiValueSensorInput2.FloatValue;
 
-             return _aiValueSensorInput2.FloatValue > SC.GetValue<double>("PM1.APC.VG1.PressureScale") ? _aiValueSensorInput2.FloatValue : _aiValueSensorInput1.FloatValue;
 
-         }
 
-         private void SetParameters(object[] param)
 
-         {
 
-             if (param == null || param.Length < 1)
 
-             {
 
-                 EV.PostWarningLog(Module, $"Invalid APC set parameter");
 
-                 return;
 
-             }
 
-             var paras = param[0].ToString().Split(';');
 
-             if (paras.Length < 11)
 
-             {
 
-                 EV.PostWarningLog(Module, $"Invalid APC set parameter");
 
-                 return;
 
-             }
 
-             var command = paras[0];
 
-             var pidTables = paras[1].Split(',');
 
-             string pidTableName = "";
 
-             int controllerID = 0;
 
-             _deviceData.CommandSetPoint = command;
 
-             IsNeedWaitComplete = false;
 
-             if (command == "Press" || command == "Press2")
 
-             {
 
-                 if (pidTables.Length < 2)
 
-                 {
 
-                     pidTableName = SC.GetStringValue("PM1.APCPID");
 
-                     int.TryParse(SC.GetStringValue("PM1.APCPIDControllerID"), out controllerID);
 
-                 }
 
-                 else
 
-                 {
 
-                     pidTableName = string.IsNullOrEmpty(pidTables[0]) ? paras[10] : pidTables[0];
 
-                     int.TryParse(pidTables[1], out controllerID);
 
-                 }
 
-             }
 
-             float setValue = 0;
 
-             float.TryParse(paras[2], out float pressreValue);
 
-             float.TryParse(paras[3], out float slowVacSet);
 
-             float.TryParse(paras[4], out float valveAngleSet);
 
-             bool.TryParse(paras[5], out _isWait);
 
-             float.TryParse(paras[6], out _waitLow);
 
-             float.TryParse(paras[7], out _waitHigh);
 
-             var waitUnit = paras[8].ToString();
 
-             float.TryParse(paras[9], out float waitPress);
 
-             var recipePIDTableName = paras[10].ToString();
 
-             var av71 = paras[11].ToString().ToLower();//open,close
 
-             switch (command)
 
-             {
 
-                 case "Press":
 
-                 case "Press2":
 
-                     setValue = pressreValue;
 
-                     IsNeedWaitComplete = _isWait;
 
-                     break;
 
-                 case "Slow Vac":
 
-                     setValue = slowVacSet;
 
-                     break;
 
-                 case "Valve Angle":
 
-                     setValue = valveAngleSet;
 
-                     IsNeedWaitComplete = _isWait;
 
-                     if (_waitLow == 0 || _waitHigh == 0)
 
-                         IsNeedWaitComplete = false;//_waitLow,_waitHigh为0不能wait
 
-                     if (waitUnit == "%")
 
-                     {
 
-                         _waitLow = setValue - _waitLow;//角度的要算出范围
 
-                         _waitHigh = setValue + _waitHigh;//角度的要算出范围
 
-                     }
 
-                     if (waitUnit == "%d")
 
-                     {
 
-                         //_waitLow,_waitHigh的设定本身就是范围
 
-                     }
 
-                     break;
 
-                 case "WaitPressDown1":
 
-                 case "WaitPressDown2":
 
-                 case "WaitPressUp1":
 
-                 case "WaitPressUp2":
 
-                     setValue = waitPress;
 
-                     IsNeedWaitComplete = true;
 
-                     break;
 
-             }
 
-             _deviceData.SetPoint = setValue;
 
-             _deviceData.PIDTable = $"{controllerID}:{paras[10]}";
 
-             _deviceData.LowPressWaitSetPoint = paras[3];
 
-             if(av71 == "close")
 
-             {
 
-                 //av71 close,就设置为close
 
-                 _valveAV71.TurnValve(false, out _);
 
-                 _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Close;
 
-                 _deviceData.ModeSetPoint = (int)PressureControlMode.Close;
 
-                 _apcSetModeTimer.Stop();
 
-             }
 
-             else
 
-             {
 
-                 if (_deviceData.Pressure2Feedback >= 10)
 
-                 {
 
-                     if (command.ToLower() == "none" || command == "")
 
-                         _apcSetModeTimer.Restart();
 
-                     else
 
-                         _apcSetModeTimer.Stop();
 
-                 }
 
-                 else
 
-                 {
 
-                     _apcSetModeTimer.Stop();
 
-                     if (command.ToLower() == "none" || command == "")
 
-                         command = "Full Open";
 
-                 }
 
-                 if (command.ToLower() == "none")
 
-                     return;
 
-                 SetCommandParameters(command, setValue, pidTableName, controllerID, recipePIDTableName);
 
-             }
 
-         }
 
-         private void SetManualParameters(object[] param)
 
-         {
 
-             if(param == null || param.Length < 1)
 
-             {
 
-                 EV.PostWarningLog(Module, $"Invalid APC set parameter");
 
-                 return;
 
-             }
 
-             var paras = param[0].ToString().Split(';');
 
-             if(paras.Length < 4)
 
-             {
 
-                 EV.PostWarningLog(Module, $"Invalid APC set parameter");
 
-                 return;
 
-             }
 
-             var command = paras[0];
 
-             var pidTables = paras[1].Split(',');
 
-             string pidTableName = "";
 
-             int controllerID = 0;
 
-             bool av71 = _valveAV71.Status;
 
-             if (paras.Length > 4)
 
-                 bool.TryParse(paras[4], out av71);
 
-             
 
-             //小于 10 torr, full open或者根据设定的模式
 
-             //大于10 torr,5秒内需要设定的模式
 
-             if (av71)
 
-             {
 
-                 if (_deviceData.Pressure2Feedback >= 10)
 
-                 {
 
-                     if (command.ToLower() == "none" || command == "")
 
-                         _apcSetModeTimer.Restart();
 
-                     else
 
-                         _apcSetModeTimer.Stop();
 
-                 }
 
-                 else
 
-                 {
 
-                     _apcSetModeTimer.Stop();
 
-                     if (command.ToLower() == "none" || command == "")
 
-                         command = "Full Open";
 
-                 }
 
-             }
 
-             else
 
-             {
 
-                 command = "Full Close";
 
-                 _apcSetModeTimer.Stop();
 
-             }
 
-             
 
-             if (command.ToLower() == "none")
 
-                 return;
 
-             if (command == "Press" || command == "Press2")
 
-             {
 
-                 if (pidTables.Length < 2)
 
-                 {
 
-                     pidTableName = SC.GetStringValue("PM1.APCPID");
 
-                     int.TryParse(SC.GetStringValue("PM1.APCPIDControllerID"), out controllerID);
 
-                 }
 
-                 else
 
-                 {
 
-                     pidTableName = pidTables[0];
 
-                     int.TryParse(pidTables[1], out controllerID);
 
-                 }
 
-             }
 
-             
 
-             float.TryParse(paras[2], out float setValue);
 
-             _deviceData.SetPoint = setValue;
 
-             _deviceData.CommandSetPoint = command;
 
-             _deviceData.PIDTable = $"{controllerID}:{pidTableName}";
 
-             _deviceData.LowPressWaitSetPoint = paras[3];
 
-             SetCommandParameters(command, setValue, pidTableName, controllerID);
 
-         }
 
-         private void SetCommandParameters(string command, float setValue, string pidTableName, int controllerID, string recipePIDTableName="")
 
-         {
 
-             LOG.Write($"APC command={command}, setpoint={setValue}, Controller ID={controllerID}, PID={pidTableName}");
 
-             switch (command)
 
-             {
 
-                 case "Press":
 
-                     _valveAV71.TurnValve(true, out _);
 
-                     _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Press1Control;
 
-                     _aoSpecifyTargetVacuumPressureControl.FloatValue = setValue;
 
-                     SetControllerParameters(pidTableName, controllerID, recipePIDTableName);
 
-                     _aoControllerModeSelect.FloatValue = controllerID;
 
-                     _deviceData.ModeSetPoint = (int)PressureControlMode.Press1Control;
 
-                     _aoSlowVacuumRate.FloatValue = 0;
 
-                     _aoSlowVacuumTargetPressure.FloatValue = 0;
 
-                     _deviceData.PressureSetPoint = setValue;
 
-                     break;
 
-                 case "Press2":
 
-                     _valveAV71.TurnValve(true, out _);
 
-                     _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Press2Control;
 
-                     _aoSpecifyTargetVacuumPressureControl.FloatValue = setValue;
 
-                     SetControllerParameters(pidTableName, controllerID, recipePIDTableName);
 
-                     _aoControllerModeSelect.FloatValue = controllerID;
 
-                     _deviceData.ModeSetPoint = (int)PressureControlMode.Press2Control;
 
-                     _aoSlowVacuumRate.FloatValue = 0;
 
-                     _aoSlowVacuumTargetPressure.FloatValue = 0;
 
-                     _deviceData.PressureSetPoint = setValue;
 
-                     break;
 
-                 case "Slow Vac":
 
-                     _valveAV71.TurnValve(true, out _);
 
-                     _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.SlowVacuum;
 
-                     _aoSlowVacuumRate.FloatValue = setValue;
 
-                     _aoSlowVacuumTargetPressure.FloatValue = 0;
 
-                     _deviceData.ModeSetPoint = (int)PressureControlMode.SlowVacuum;
 
-                     SetSlowVacParameters(pidTableName);
 
-                     _deviceData.SlowRateSetPoint = setValue;
 
-                     break;
 
-                 case "Valve Angle":
 
-                     _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.PositionControl;
 
-                     _aoSpecifyTargetOpeningForValveOpeningControl.FloatValue = setValue;
 
-                     _deviceData.ModeSetPoint = (int)PressureControlMode.PositionControl;
 
-                     _deviceData.PositionSetPoint = setValue;
 
-                     _aoSlowVacuumRate.FloatValue = 0;
 
-                     _aoSlowVacuumTargetPressure.FloatValue = 0;
 
-                     break;
 
-                 case "Full Open":
 
-                     _valveAV71.TurnValve(true, out _);
 
-                     _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Open;
 
-                     _deviceData.ModeSetPoint = (int)PressureControlMode.Open;
 
-                     _aoSlowVacuumRate.FloatValue = 0;
 
-                     _aoSlowVacuumTargetPressure.FloatValue = 0;
 
-                     break;
 
-                 case "Full Close":
 
-                     _valveAV71.TurnValve(false, out _);
 
-                     _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Close;
 
-                     _deviceData.ModeSetPoint = (int)PressureControlMode.Close;
 
-                     _aoSlowVacuumRate.FloatValue = 0;
 
-                     _aoSlowVacuumTargetPressure.FloatValue = 0;
 
-                     break;
 
-                 case "Hold":
 
-                     _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Hold;
 
-                     _deviceData.ModeSetPoint = (int)PressureControlMode.Hold;
 
-                     _aoSlowVacuumRate.FloatValue = 0;
 
-                     _aoSlowVacuumTargetPressure.FloatValue = 0;
 
-                     break;
 
-                 case "Home":
 
-                     _aoSpecifyControlMode.FloatValue = (int)PressureControlMode.Homing;
 
-                     _deviceData.ModeSetPoint = (int)PressureControlMode.Homing;
 
-                     _aoSlowVacuumRate.FloatValue = 0;
 
-                     _aoSlowVacuumTargetPressure.FloatValue = 0;
 
-                     break;
 
-                 case "WaitPressUp1":
 
-                     //wait: sensor 1的压力小于basePressure
 
-                     _basePressure = setValue;
 
-                     _aoSlowVacuumTargetPressure.FloatValue = setValue;
 
-                     break;
 
-                 case "WaitPressDown1":
 
-                     //wait: sensor 1的压力大于basePressure
 
-                     _basePressure = setValue;
 
-                     _aoSlowVacuumTargetPressure.FloatValue = setValue;
 
-                     break;
 
-                 case "WaitPressUp2":
 
-                     //wait: sensor 2的压力小于basePressure
 
-                     _basePressure = setValue;
 
-                     _aoSlowVacuumTargetPressure.FloatValue = setValue;
 
-                     break;
 
-                 case "WaitPressDown2":
 
-                     //wait: sensor 2的压力大于basePressure
 
-                     _basePressure = setValue;
 
-                     _aoSlowVacuumTargetPressure.FloatValue = setValue;
 
-                     break;
 
-                 case "Zero Set":
 
-                     //offset cancle
 
-                     break;
 
-                 case "Cancel Zero":
 
-                     //cancle Zero Set
 
-                     break;
 
-             }
 
-         }
 
-         private void SetSlowVacParameters(string fileNameAndPath)
 
-         {
 
-             if (string.IsNullOrEmpty(fileNameAndPath))
 
-             {
 
-                 fileNameAndPath = SC.GetStringValue("PM1.APCPID");
 
-             }
 
-             if (!File.Exists($"{PathManager.GetParameterDir()}\\{fileNameAndPath}.rcp"))
 
-             {
 
-                 fileNameAndPath = SC.GetStringValue("PM1.APCPID");
 
-             }
 
-             var para = fileNameAndPath.Split('\\').ToList().Skip(2);//"Parameter\\APCPID"
 
-             if (para == null)
 
-             {
 
-                 EV.PostWarningLog(Module, $"{fileNameAndPath} APC PID name is empty");
 
-                 return;
 
-             }
 
-             var fileName = string.Join("\\", para.ToArray());
 
-             var content = ParameterFileManager.Instance.LoadParameter("Parameter\\APCPID", fileName, false);
 
-             if (string.IsNullOrEmpty(content))
 
-             {
 
-                 EV.PostWarningLog(Module, $"{fileNameAndPath} APC PID file is empty");
 
-                 return;
 
-             }
 
-             var doc = new XmlDocument();
 
-             doc.LoadXml(content);
 
-             XmlNodeList nodeSteps = doc.SelectNodes($"Aitex/TableParameterData");
 
-             if (nodeSteps == null)
 
-             {
 
-                 EV.PostWarningLog(Module, $"Invalid APC PID file {fileNameAndPath}");
 
-                 return;
 
-             }
 
-             foreach (var step in nodeSteps)
 
-             {
 
-                 XmlElement stepNode = step as XmlElement;
 
-                 float value = 0;
 
-                 var hasSetValue = false;
 
-                 foreach (XmlAttribute att in stepNode.Attributes)
 
-                 {
 
-                     switch (att.Name.ToUpper())
 
-                     {
 
-                         case "P":
 
-                             float.TryParse(att.Value, out value);
 
-                             _aoSlowVacuumP.FloatValue = value;
 
-                             break;
 
-                         case "I":
 
-                             float.TryParse(att.Value, out value);
 
-                             _aoSlowVacuumI.FloatValue = value;
 
-                             break;
 
-                         case "D":
 
-                             float.TryParse(att.Value, out value);
 
-                             _aoSlowVacuumD.FloatValue = value;
 
-                             break;
 
-                         case "A":
 
-                             float.TryParse(att.Value, out value);
 
-                             _aoSlowVacuumA.FloatValue = value;
 
-                             break;
 
-                     }
 
-                     hasSetValue = true;
 
-                 }
 
-                 _doAoDataWriteCusConfig.SetPulseValue(true, 3000);
 
-                 _readConfigTimer.Restart();
 
-                 if (hasSetValue)
 
-                     return;
 
-             }
 
-             if (SC.GetStringValue("PM1.APCPID") != fileNameAndPath)
 
-                 SC.SetItemValueFromString("PM1.APCPID", fileNameAndPath);
 
-         }
 
-         private void SetControllerParameters(string fileNameAndPath, int controllerID, string recipePIDTableName = "")
 
-         {
 
-             //var defaultPID = SC.GetStringValue("PM1.APCPID");
 
-             if(string.IsNullOrEmpty(fileNameAndPath))
 
-             {
 
-                 fileNameAndPath = SC.GetStringValue("PM1.APCPID");
 
-             }
 
-             if (!File.Exists($"{PathManager.GetParameterDir()}\\{fileNameAndPath}.rcp"))
 
-             {
 
-                 fileNameAndPath = SC.GetStringValue("PM1.APCPID");
 
-             }
 
-             var para = fileNameAndPath.Split('\\').ToList().Skip(2);//"Parameter\\APCPID"
 
-             if (para == null)
 
-             {
 
-                 EV.PostWarningLog(Module, $"{fileNameAndPath} APC PID name is empty");
 
-                 return;
 
-             }
 
-             var fileName = string.Join( "\\", para.ToArray());
 
-             if (!string.IsNullOrEmpty(recipePIDTableName))
 
-                 fileName = recipePIDTableName;
 
-             if(controllerID <= 0)
 
-             {
 
-                 int.TryParse(SC.GetStringValue("PM1.APCPIDControllerID"), out controllerID);
 
-             }
 
-             _deviceData.PIDTable = $"{controllerID}:{fileName}";
 
-             var content = ParameterFileManager.Instance.LoadParameter("Parameter\\APCPID", fileName, false);
 
-             if (string.IsNullOrEmpty(content))
 
-             {
 
-                 EV.PostWarningLog(Module, $"{fileNameAndPath} APC PID file is empty");
 
-                 return;
 
-             }
 
-             var doc = new XmlDocument();
 
-             doc.LoadXml(content);
 
-             XmlNodeList nodeSteps = doc.SelectNodes($"Aitex/TableParameterData/Module[@Name='']/Step");
 
-             if (nodeSteps == null)
 
-                 nodeSteps = doc.SelectNodes($"Aitex/TableParameterData/Step");
 
-             if(nodeSteps == null)
 
-             {
 
-                 EV.PostWarningLog(Module, $"Invalid APC PID file {fileNameAndPath}");
 
-                 return;
 
-             }
 
-             Dictionary<int, ControllerParameter> dic = new Dictionary<int, ControllerParameter>();
 
-             float p = 0;
 
-             float i = 0;
 
-             float d = 0;
 
-             float a = 0;
 
-             float ch = 0;
 
-             float cl = 0;
 
-             float offset = 0;
 
-             foreach (var step in nodeSteps)
 
-             {
 
-                 XmlElement stepNode = step as XmlElement;
 
-                 var parameters = new Dictionary<string, string>();
 
-                 foreach (XmlAttribute att in stepNode.Attributes)
 
-                 {
 
-                     parameters.Add(att.Name, att.Value);
 
-                 }
 
-                 int.TryParse(parameters["StepNo"], out int no);
 
-                 float.TryParse(parameters["P"], out p);
 
-                 float.TryParse(parameters["I"], out i);
 
-                 float.TryParse(parameters["D"], out d);
 
-                 float.TryParse(parameters["a"], out a);
 
-                 float.TryParse(parameters["offset"], out offset);
 
-                 float.TryParse(parameters["CH"], out ch);
 
-                 float.TryParse(parameters["CL"], out cl);
 
-                 if(dic.ContainsKey(no))
 
-                 {
 
-                     EV.PostWarningLog(Module, $"Invalid APC PID file {fileNameAndPath}, duplicate no={no}");
 
-                     return;
 
-                 }
 
-                 dic.Add(no, new ControllerParameter()
 
-                 {
 
-                     No = no,
 
-                     Name = parameters["Name"],
 
-                     P = p,
 
-                     I = i,
 
-                     D = d,
 
-                     A = a,
 
-                     Offset = offset,
 
-                     CH = ch,
 
-                     CL = cl,
 
-                 });
 
-             }
 
-             if (!dic.ContainsKey(controllerID))
 
-             {
 
-                 int.TryParse(SC.GetStringValue("PM1.APCPIDControllerID"), out controllerID);
 
-             }
 
-             if (!dic.ContainsKey(controllerID))
 
-                 return;
 
-                 
 
-             p = dic[controllerID].P;
 
-             i = dic[controllerID].I;
 
-             d = dic[controllerID].D;
 
-             a = dic[controllerID].A;
 
-             ch = dic[controllerID].CH;
 
-             cl = dic[controllerID].CL;
 
-             offset = dic[controllerID].Offset;
 
-             switch(controllerID)
 
-             {
 
-                 case 1:
 
-                     _aoController1P.FloatValue = p;
 
-                     _aoController1I.FloatValue = i;
 
-                     _aoController1D.FloatValue = d;
 
-                     _aoController1A.FloatValue = a;
 
-                     _aoController1CH.FloatValue = ch;
 
-                     _aoController1CL.FloatValue = cl;
 
-                     _aoController1Offset.FloatValue = offset;
 
-                     break;
 
-                 case 2:
 
-                     _aoController2P.FloatValue = p;
 
-                     _aoController2I.FloatValue = i;
 
-                     _aoController2D.FloatValue = d;
 
-                     _aoController2A.FloatValue = a;
 
-                     _aoController2CH.FloatValue = ch;
 
-                     _aoController2CL.FloatValue = cl;
 
-                     _aoController2Offset.FloatValue = offset;
 
-                     break;
 
-                 case 3:
 
-                     _aoController3P.FloatValue = p;
 
-                     _aoController3I.FloatValue = i;
 
-                     _aoController3D.FloatValue = d;
 
-                     _aoController3A.FloatValue = a;
 
-                     _aoController3CH.FloatValue = ch;
 
-                     _aoController3CL.FloatValue = cl;
 
-                     _aoController3Offset.FloatValue = offset;
 
-                     break;
 
-                 case 4:
 
-                     _aoController4P.FloatValue = p;
 
-                     _aoController4I.FloatValue = i;
 
-                     _aoController4D.FloatValue = d;
 
-                     _aoController4A.FloatValue = a;
 
-                     _aoController4CH.FloatValue = ch;
 
-                     _aoController4CL.FloatValue = cl;
 
-                     _aoController4Offset.FloatValue = offset;
 
-                     break;
 
-                 case 5:
 
-                     _aoController5P.FloatValue = p;
 
-                     _aoController5I.FloatValue = i;
 
-                     _aoController5D.FloatValue = d;
 
-                     _aoController5A.FloatValue = a;
 
-                     _aoController5CH.FloatValue = ch;
 
-                     _aoController5CL.FloatValue = cl;
 
-                     _aoController5Offset.FloatValue = offset;
 
-                     break;
 
-                 case 6:
 
-                     _aoController6P.FloatValue = p;
 
-                     _aoController6I.FloatValue = i;
 
-                     _aoController6D.FloatValue = d;
 
-                     _aoController6A.FloatValue = a;
 
-                     _aoController6CH.FloatValue = ch;
 
-                     _aoController6CL.FloatValue = cl;
 
-                     _aoController6Offset.FloatValue = offset;
 
-                     break;
 
-                 case 7:
 
-                     _aoController7P.FloatValue = p;
 
-                     _aoController7I.FloatValue = i;
 
-                     _aoController7D.FloatValue = d;
 
-                     _aoController7A.FloatValue = a;
 
-                     _aoController7CH.FloatValue = ch;
 
-                     _aoController7CL.FloatValue = cl;
 
-                     _aoController7Offset.FloatValue = offset;
 
-                     break;
 
-                 case 8:
 
-                     _aoController8P.FloatValue = p;
 
-                     _aoController8I.FloatValue = i;
 
-                     _aoController8D.FloatValue = d;
 
-                     _aoController8A.FloatValue = a;
 
-                     _aoController8CH.FloatValue = ch;
 
-                     _aoController8CL.FloatValue = cl;
 
-                     _aoController8Offset.FloatValue = offset;
 
-                     break;
 
-                 case 9:
 
-                     _aoController9P.FloatValue = p;
 
-                     _aoController9I.FloatValue = i;
 
-                     _aoController9D.FloatValue = d;
 
-                     _aoController9A.FloatValue = a;
 
-                     _aoController9CH.FloatValue = ch;
 
-                     _aoController9CL.FloatValue = cl;
 
-                     _aoController9Offset.FloatValue = offset;
 
-                     break;
 
-                 case 10:
 
-                     _aoController10P.FloatValue = p;
 
-                     _aoController10I.FloatValue = i;
 
-                     _aoController10D.FloatValue = d;
 
-                     _aoController10A.FloatValue = a;
 
-                     _aoController10CH.FloatValue = ch;
 
-                     _aoController10CL.FloatValue = cl;
 
-                     _aoController10Offset.FloatValue = offset;
 
-                     break;
 
-             }
 
-             _doAoDataWriteCusConfig.SetPulseValue(true, 3000);
 
-             _readConfigTimer.Restart();
 
-             if (SC.GetStringValue("PM1.APCPID") != fileNameAndPath)
 
-                 SC.SetItemValueFromString("PM1.APCPID", fileNameAndPath);
 
-             if (SC.GetStringValue("PM1.APCPIDControllerID") != controllerID.ToString())
 
-                 SC.SetItemValueFromString("PM1.APCPIDControllerID", controllerID.ToString());
 
-         }
 
-         public bool CheckWaitCondition(out string reason)
 
-         {
 
-             reason = "";
 
-             if(IsNeedWaitComplete)
 
-             {
 
-                 var command = _deviceData.CommandSetPoint;
 
-                 var setValue = _deviceData.SetPoint;
 
-                 switch (command)
 
-                 {
 
-                     case "Press":
 
-                         if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.Press1Control &&
 
-                            ((_deviceData.Pressure1Feedback > _deviceData.PressureSetPoint - _waitLow &&
 
-                             _deviceData.Pressure1Feedback < _deviceData.PressureSetPoint + _waitHigh) ||
 
-                             (_waitLow <= 0 && _waitHigh <= 0)))
 
-                         {
 
-                             return true;
 
-                         }
 
-                         else
 
-                         {
 
-                             reason = $"press1 feedback={_deviceData.Pressure1Feedback}, wait condition is ({_deviceData.PressureSetPoint - _waitLow}, {_deviceData.PressureSetPoint + _waitHigh})";
 
-                         }
 
-                         break;
 
-                     case "Press2":
 
-                         if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.Press2Control &&
 
-                           ((_deviceData.Pressure2Feedback > _deviceData.PressureSetPoint - _waitLow &&
 
-                             _deviceData.Pressure2Feedback < _deviceData.PressureSetPoint + _waitHigh )||
 
-                             (_waitLow <= 0 && _waitHigh <= 0)))
 
-                         {
 
-                             return true;
 
-                         }
 
-                         else
 
-                         {
 
-                             reason = $"press2 feedback={_deviceData.Pressure2Feedback}, wait condition is ({_deviceData.PressureSetPoint - _waitLow}, {_deviceData.PressureSetPoint + _waitHigh})";
 
-                         }
 
-                         break;
 
-                     case "Slow Vac":
 
-                         if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.SlowVacuum)
 
-                         {
 
-                             return true;
 
-                         }
 
-                         else
 
-                         {
 
-                             reason = $"slow vac wait";
 
-                         }
 
-                         break;
 
-                     case "Valve Angle":
 
-                         if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.PositionControl &&
 
-                            ((_deviceData.PositionFeedback > _waitLow && _deviceData.PositionFeedback < _waitHigh )||
 
-                            (_waitLow <= 0 && _waitHigh <= 0)))
 
-                         {
 
-                             return true;
 
-                         }
 
-                         else
 
-                         {
 
-                             reason = $"position feedback={_deviceData.PositionFeedback}, wait condition is ({_waitLow}, {_waitHigh})";
 
-                         }
 
-                         break;
 
-                     case "Full Open":
 
-                         if(_deviceData.ModeSetPoint== _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.Open)
 
-                         {
 
-                             return true;
 
-                         }
 
-                         else
 
-                         {
 
-                             reason = $"full open wait";
 
-                         }
 
-                         break;
 
-                     case "Full Close":
 
-                         if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.Close)
 
-                         {
 
-                             return true;
 
-                         }
 
-                         else
 
-                         {
 
-                             reason = $"full close wait";
 
-                         }
 
-                         break;
 
-                     case "Hold":
 
-                         if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.Hold)
 
-                         {
 
-                             return true;
 
-                         }
 
-                         else
 
-                         {
 
-                             reason = $"hold wait";
 
-                         }
 
-                         break;
 
-                     case "Home":
 
-                         if (_deviceData.ModeSetPoint == _deviceData.ModeFeedback && _deviceData.ModeSetPoint == (int)PressureControlMode.Homing)
 
-                         {
 
-                             return true;
 
-                         }
 
-                         else
 
-                         {
 
-                             reason = $"home wait";
 
-                         }
 
-                         break;
 
-                     case "WaitPressUp1":
 
-                         //wait: sensor 1的压力大于等于basePressure
 
-                         if (_deviceData.Pressure1Feedback >= _basePressure)
 
-                         {
 
-                             return true;
 
-                         }
 
-                         else
 
-                         {
 
-                             reason = $"WaitPressUp1 press1 feedback={_deviceData.Pressure1Feedback} < basePressure={_basePressure}";
 
-                         }
 
-                         break;
 
-                     case "WaitPressDown1":
 
-                         //wait: sensor 1的压力小于等于basePressure
 
-                         if (_deviceData.Pressure1Feedback <= _basePressure)
 
-                         {
 
-                             return true;
 
-                         }
 
-                         else
 
-                         {
 
-                             reason = $"WaitPressDown1 press1 feedback={_deviceData.Pressure1Feedback} > basePressure={_basePressure}";
 
-                         }
 
-                         break;
 
-                     case "WaitPressUp2":
 
-                         //wait: sensor 2的压力大于等于basePressure
 
-                         if (_deviceData.Pressure2Feedback >= _basePressure)
 
-                         {
 
-                             return true;
 
-                         }
 
-                         else
 
-                         {
 
-                             reason = $"WaitPressUp2 press2 feedback={_deviceData.Pressure2Feedback} < basePressure={_basePressure}";
 
-                         }
 
-                         break;
 
-                     case "WaitPressDown2":
 
-                         //wait: sensor 2的压力小于等于basePressure
 
-                         if (_deviceData.Pressure2Feedback <= _basePressure)
 
-                         {
 
-                             return true;
 
-                         }
 
-                         else
 
-                         {
 
-                             reason = $"WaitPressDown2 press2 feedback={_deviceData.Pressure2Feedback} > basePressure={_basePressure}";
 
-                         }
 
-                         break;
 
-                     case "Zero Set":
 
-                         //offset cancle
 
-                         break;
 
-                     case "Cancel Zero":
 
-                         //cancle Zero Set
 
-                         break;
 
-                 }
 
-                 return false;
 
-             }
 
-             else
 
-             {
 
-                 return true;
 
-             }
 
-         }
 
-         struct ControllerParameter
 
-         {
 
-             public int No { get; set; }
 
-             public string Name { get; set; }
 
-             public float P { get; set; }
 
-             public float I { get; set; }
 
-             public float D { get; set; }
 
-             public float A { get; set; }
 
-             public float Offset { get; set; }
 
-             public float CH { get; set; }
 
-             public float CL { get; set; }
 
-         }
 
-     }
 
- }
 
 
  |