InterlockViewModel.cs 85 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226
  1. using Aitex.Common.Util;
  2. using Aitex.Core.Util;
  3. using Aitex.Core.RT.SCCore;
  4. using Aitex.Core.Common.DeviceData;
  5. using Caliburn.Micro;
  6. using MECF.Framework.Common.IOCore;
  7. using MECF.Framework.Common.DataCenter;
  8. using MECF.Framework.Common.OperationCenter;
  9. using MECF.Framework.UI.Client.CenterViews.Configs.SystemConfig;
  10. using MECF.Framework.UI.Client.CenterViews.Dialogs;
  11. using OpenSEMI.ClientBase;
  12. using Caliburn.Micro.Core;
  13. using OpenSEMI.ClientBase.Command;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Collections.ObjectModel;
  17. using System.Globalization;
  18. using System.Linq;
  19. using System.Text;
  20. using System.Threading.Tasks;
  21. using System.Windows;
  22. using System.Windows.Controls;
  23. using System.Windows.Data;
  24. using System.Xml;
  25. using System.Windows.Media;
  26. using MECF.Framework.Common.CommonData;
  27. using MECF.Framework.Common.Utilities;
  28. using Aitex.Core.RT.Log;
  29. using MECF.Framework.UI.Client.ClientBase;
  30. namespace MECF.Framework.UI.Client.CenterViews.Parameter
  31. {
  32. public class InterlockViewModel : ModuleUiViewModelBase
  33. {
  34. public bool IsPermission { get => this.Permission == 3; }
  35. private ObservableCollection<InterlockBase> _interlockTreePM = new ObservableCollection<InterlockBase>();
  36. public ObservableCollection<InterlockBase> InterlockTreePM
  37. {
  38. get => _interlockTreePM;
  39. set
  40. {
  41. _interlockTreePM = value;
  42. NotifyOfPropertyChange(nameof(InterlockTreePM));
  43. }
  44. }
  45. private SolidColorBrush _greenFill = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF07FF07"));
  46. private SolidColorBrush _redFill = new SolidColorBrush(Colors.Red);
  47. private ObservableCollection<InterlockBase> _interlockTreeMF = new ObservableCollection<InterlockBase>();
  48. public ObservableCollection<InterlockBase> InterlockTreeMF
  49. {
  50. get => _interlockTreeMF;
  51. set
  52. {
  53. _interlockTreeMF = value;
  54. NotifyOfPropertyChange(nameof(InterlockTreeMF));
  55. }
  56. }
  57. private ObservableCollection<InterlockBase> _interlockTreeEdit = new ObservableCollection<InterlockBase>();
  58. public ObservableCollection<InterlockBase> InterlockTreeEdit
  59. {
  60. get => _interlockTreeEdit;
  61. set
  62. {
  63. _interlockTreeEdit = value;
  64. NotifyOfPropertyChange(nameof(InterlockTreeEdit));
  65. }
  66. }
  67. public InterlockBase CurrentInterlock = new InterlockBase();
  68. public ObservableCollection<InterlockLimit> InterlockLimits { get; set; } = new ObservableCollection<InterlockLimit>();
  69. private int _interlockLimitsSelectIndex;
  70. public int InterlockLimitSelectIndex
  71. {
  72. get => _interlockLimitsSelectIndex;
  73. set
  74. {
  75. _interlockLimitsSelectIndex = value;
  76. NotifyOfPropertyChange(nameof(InterlockLimitSelectIndex));
  77. }
  78. }
  79. private bool _isShowInterlockMF = true;
  80. public bool IsShowInterlockMF
  81. {
  82. get => _isShowInterlockMF;
  83. set
  84. {
  85. _isShowInterlockMF = value;
  86. NotifyOfPropertyChange(nameof(IsShowInterlockMF));
  87. }
  88. }
  89. private bool _isShowInterlockPM = false;
  90. public bool IsShowInterlockPM
  91. {
  92. get => _isShowInterlockPM;
  93. set
  94. {
  95. _isShowInterlockPM = value;
  96. NotifyOfPropertyChange(nameof(IsShowInterlockPM));
  97. }
  98. }
  99. private bool _isShowInterlockEdit = false;
  100. public bool IsShowInterlockEdit
  101. {
  102. get => _isShowInterlockEdit;
  103. set
  104. {
  105. _isShowInterlockEdit = value;
  106. NotifyOfPropertyChange(nameof(IsShowInterlockEdit));
  107. }
  108. }
  109. private bool _isShowInterlockEditDetail = false;
  110. public bool IsShowInterlockEditDetail
  111. {
  112. get => _isShowInterlockEditDetail;
  113. set
  114. {
  115. _isShowInterlockEditDetail = value;
  116. NotifyOfPropertyChange(nameof(IsShowInterlockEditDetail));
  117. }
  118. }
  119. private List<string> _interlockEditAction = new List<string>();
  120. public List<string> InterlockEditAction
  121. {
  122. get => _interlockEditAction;
  123. set
  124. {
  125. _interlockEditAction = value;
  126. NotifyOfPropertyChange(nameof(InterlockEditAction));
  127. }
  128. }
  129. private string _interlockEditActionSelect;
  130. public string InterLockEditActionSelect
  131. {
  132. get => _interlockEditActionSelect;
  133. set
  134. {
  135. _interlockEditActionSelect = value;
  136. NotifyOfPropertyChange(nameof(InterLockEditActionSelect));
  137. }
  138. }
  139. private List<string> _interlockEditLimit = new List<string>();
  140. public List<string> InterlockEditLimit
  141. {
  142. get => _interlockEditLimit;
  143. set
  144. {
  145. _interlockEditLimit = value;
  146. NotifyOfPropertyChange(nameof(InterlockEditLimit));
  147. }
  148. }
  149. private string _interlockEditLimitSelect;
  150. public string InterLockEditLimitSelect
  151. {
  152. get => _interlockEditLimitSelect;
  153. set
  154. {
  155. _interlockEditLimitSelect = value;
  156. NotifyOfPropertyChange(nameof(InterLockEditLimitSelect));
  157. }
  158. }
  159. private int _interlockEditLimitSelectIndex;
  160. public int InterlockEditLimitSelectIndex
  161. {
  162. get => _interlockEditLimitSelectIndex;
  163. set
  164. {
  165. _interlockEditLimitSelectIndex = value;
  166. NotifyOfPropertyChange(nameof(InterlockEditLimitSelectIndex));
  167. }
  168. }
  169. private bool _actionValueTrue;
  170. public bool ActionValueTrue
  171. {
  172. get => _actionValueTrue;
  173. set
  174. {
  175. _actionValueTrue = value;
  176. NotifyOfPropertyChange(nameof(ActionValueTrue));
  177. }
  178. }
  179. private bool _actionValueFalse;
  180. public bool ActionValueFalse
  181. {
  182. get => _actionValueFalse;
  183. set
  184. {
  185. _actionValueFalse = value;
  186. NotifyOfPropertyChange(nameof(ActionValueFalse));
  187. }
  188. }
  189. private bool _limitValueTrue;
  190. public bool LimitValueTrue
  191. {
  192. get => _limitValueTrue;
  193. set
  194. {
  195. _limitValueTrue = value;
  196. NotifyOfPropertyChange(nameof(LimitValueTrue));
  197. }
  198. }
  199. private bool _limitValueFalse;
  200. public bool LimitValueFalse
  201. {
  202. get => _limitValueFalse;
  203. set
  204. {
  205. _limitValueFalse = value;
  206. NotifyOfPropertyChange(nameof(LimitValueFalse));
  207. }
  208. }
  209. private string _limitValueTrueName = "true";
  210. public string LimitValueTrueName
  211. {
  212. get => _limitValueTrueName;
  213. set
  214. {
  215. _limitValueTrueName = value;
  216. NotifyOfPropertyChange(nameof(LimitValueTrueName));
  217. }
  218. }
  219. private string _limitValueFalseName = "false";
  220. public string LimitValueFalseName
  221. {
  222. get => _limitValueFalseName;
  223. set
  224. {
  225. _limitValueFalseName = value;
  226. NotifyOfPropertyChange(nameof(LimitValueFalseName));
  227. }
  228. }
  229. private bool _limitConditionAND;
  230. public bool LimitConditionAND
  231. {
  232. get => _limitConditionAND;
  233. set
  234. {
  235. _limitConditionAND = value;
  236. NotifyOfPropertyChange(nameof(LimitConditionAND));
  237. }
  238. }
  239. private bool _limitConditionOR;
  240. public bool LimitConditionOR
  241. {
  242. get => _limitConditionOR;
  243. set
  244. {
  245. _limitConditionOR = value;
  246. NotifyOfPropertyChange(nameof(LimitConditionOR));
  247. }
  248. }
  249. private Visibility _isShowLimitValue = Visibility.Hidden;
  250. public Visibility IsShowLimitValue
  251. {
  252. get => _isShowLimitValue;
  253. set
  254. {
  255. _isShowLimitValue = value;
  256. NotifyOfPropertyChange(nameof(IsShowLimitValue));
  257. }
  258. }
  259. private bool _isInterlockEdit;
  260. public bool IsInterlockEdit
  261. {
  262. get => _isInterlockEdit;
  263. set
  264. {
  265. _isInterlockEdit = value;
  266. NotifyOfPropertyChange(nameof(IsInterlockEdit));
  267. }
  268. }
  269. private bool _isInterlockEditCancel;
  270. public bool IsInterlockEditCancel
  271. {
  272. get => _isInterlockEditCancel;
  273. set
  274. {
  275. _isInterlockEditCancel = value;
  276. NotifyOfPropertyChange(nameof(IsInterlockEditCancel));
  277. }
  278. }
  279. private bool _isInterlockEditSet = false;
  280. private List<string> _moduleName = new List<string>() { "PM1" };
  281. private string _actionItem = "BLANK";
  282. public string ActionItem
  283. {
  284. get => _actionItem;
  285. set
  286. {
  287. _actionItem = value;
  288. NotifyOfPropertyChange(nameof(ActionItem));
  289. }
  290. }
  291. private string _actionCheck = "BLANK";
  292. public string ActionCheck
  293. {
  294. get => _actionCheck;
  295. set
  296. {
  297. _actionCheck = value;
  298. NotifyOfPropertyChange(nameof(ActionCheck));
  299. }
  300. }
  301. private string _actionTimeCheck = "BLANK";
  302. public string ActionTimeCheck
  303. {
  304. get => _actionTimeCheck;
  305. set
  306. {
  307. _actionTimeCheck = value;
  308. NotifyOfPropertyChange(nameof(ActionTimeCheck));
  309. }
  310. }
  311. private string _actionValue;
  312. public string ActionValue
  313. {
  314. get => _actionValue;
  315. set
  316. {
  317. _actionValue = value;
  318. NotifyOfPropertyChange(nameof(ActionValue));
  319. }
  320. }
  321. private string _actionTimeValue = "0";
  322. public string ActionTimeValue
  323. {
  324. get => _actionTimeValue;
  325. set
  326. {
  327. _actionTimeValue = value;
  328. NotifyOfPropertyChange(nameof(ActionTimeValue));
  329. }
  330. }
  331. private string _actionAuto = "Auto";
  332. public string ActionAuto
  333. {
  334. get => _actionAuto;
  335. set
  336. {
  337. _actionAuto = value;
  338. NotifyOfPropertyChange(nameof(ActionAuto));
  339. }
  340. }
  341. private bool _isEnabledActionTimeValue;
  342. public bool IsEnabledActionTimeValue
  343. {
  344. get => _isEnabledActionTimeValue;
  345. set
  346. {
  347. _isEnabledActionTimeValue = value;
  348. NotifyOfPropertyChange(nameof(IsEnabledActionTimeValue));
  349. }
  350. }
  351. private string _limitItem = "BLANK";
  352. public string LimitItem
  353. {
  354. get => _limitItem;
  355. set
  356. {
  357. _limitItem = value;
  358. NotifyOfPropertyChange(nameof(LimitItem));
  359. }
  360. }
  361. private string _limitCondition = "AND";
  362. public string LimitCondition
  363. {
  364. get => _limitCondition;
  365. set
  366. {
  367. _limitCondition = value;
  368. NotifyOfPropertyChange(nameof(LimitCondition));
  369. }
  370. }
  371. private string _limitCheck = "BLANK";
  372. public string LimitCheck
  373. {
  374. get => _limitCheck;
  375. set
  376. {
  377. _limitCheck = value;
  378. NotifyOfPropertyChange(nameof(LimitCheck));
  379. }
  380. }
  381. private string _limitValue = "0";
  382. public string LimitValue
  383. {
  384. get => _limitValue;
  385. set
  386. {
  387. _limitValue = value;
  388. NotifyOfPropertyChange(nameof(LimitValue));
  389. }
  390. }
  391. private string _limitUnit;
  392. public string LimitUnit
  393. {
  394. get => _limitUnit;
  395. set
  396. {
  397. _limitUnit = value;
  398. NotifyOfPropertyChange(nameof(LimitUnit));
  399. }
  400. }
  401. private bool _isEnabledLimitValue;
  402. public bool IsEnabledLimitValue
  403. {
  404. get => _isEnabledLimitValue;
  405. set
  406. {
  407. _isEnabledLimitValue = value;
  408. NotifyOfPropertyChange(nameof(IsEnabledLimitValue));
  409. }
  410. }
  411. private Dictionary<string, string> _editInterlockIOReferenceDic;
  412. private Dictionary<string, string> _editLimitCheckReferenceDic;
  413. #region PM
  414. [Subscription("IO.PM1.DI_CAPClosePosition")]
  415. public bool PM1_DI_PumpDI_CAPClosePosition { get; set; }
  416. [Subscription("IO.PM1.DI_PumpON")]
  417. public bool DI_PumpON { get; set; }
  418. [Subscription("IO.PM1.DO_MVValveOpen")]
  419. public bool PM1_DO_MVValveOpen { get; set; }
  420. [Subscription("IO.PM1.DO_J11ValveOpen")]
  421. public bool PM1_DO_J11ValveOpen { get; set; }
  422. [Subscription("IO.PM1.DI_J11REALOUT")]
  423. public bool PM1_DI_J11REALOUT { get; set; }
  424. [Subscription("IO.PM1.DI_HeaterMCON")]
  425. public bool PM1_DI_HeaterMCON { get; set; }
  426. [Subscription("IO.PM1.DI_GASDetectorOK")]
  427. public bool PM1_DI_GASDetectorOK { get; set; }
  428. [Subscription("IO.PM1.DI_CAPClosePosition")]
  429. public bool PM1_DI_CAPClosePosition { get; set; }
  430. [Subscription("IO.PM1.DI_M11REALOUT")]
  431. public bool PM1_DI_M11REALOUT { get; set; }
  432. [Subscription("IO.PM1.DI_M21REALOUT")]
  433. public bool PM1_DI_M21REALOUT { get; set; }
  434. [Subscription("IO.PM1.DO_M11ValveOpen")]
  435. public bool PM1_DO_M11ValveOpen { get; set; }
  436. [Subscription("IO.PM1.DO_M21ValveOpen")]
  437. public bool PM1_DO_M21ValveOpen { get; set; }
  438. [Subscription("IO.PM1.DO_D11ValveOpen")]
  439. public bool PM1_DO_D11ValveOpen { get; set; }
  440. [Subscription("IO.PM1.DI_D11REALOUT")]
  441. public bool PM1_DI_D11REALOUT { get; set; }
  442. [Subscription("IO.PM1.DI_TubeATMPressure")]
  443. public bool PM1_DI_TubeATMPressure { get; set; }
  444. [Subscription("IO.PM1.DI_HeaterWaterFlowOK")]
  445. public bool PM1_DI_HeaterWaterFlowOK { get; set; }
  446. [Subscription("IO.PM1.DI_MFWaterFlowOK")]
  447. public bool PM1_DI_MFWaterFlowOK { get; set; }
  448. [Subscription("IO.PM1.DI_CAPWaterFlowOK")]
  449. public bool PM1_DI_CAPWaterFlowOK { get; set; }
  450. [Subscription("IO.PM1.DI_A_SWaterFlowOK")]
  451. public bool PM1_DI_A_SWaterFlowOK { get; set; }
  452. [Subscription("IO.PM1.DI_SpareWaterFlowOK")]
  453. public bool PM1_DI_SpareWaterFlowOK { get; set; }
  454. [Subscription("IO.PM1.DI_HeaterTempOK")]
  455. public bool PM1_DI_HeaterTempOK { get; set; }
  456. [Subscription("IO.PM1.DI_ChamberTempOK")]
  457. public bool PM1_DI_ChamberTempOK { get; set; }
  458. [Subscription("IO.PM1.DI_SCRTempOK")]
  459. public bool PM1_DI_SCRTempOK { get; set; }
  460. [Subscription("IO.PM1.DI_FNCPanelClose")]
  461. public bool PM1_DI_FNCPanelClose { get; set; }
  462. [Subscription("IO.PM1.DI_HeaterControllerOK")]
  463. public bool PM1_DI_HeaterControllerOK { get; set; }
  464. [Subscription("IO.PM1.DI_CAPOpenPosition")]
  465. public bool PM1_DI_CAPOpenPosition { get; set; }
  466. [Subscription("IO.PM1.DI_HtRCUPowerON")]
  467. public bool PM1_DI_HtRCUPowerON { get; set; }
  468. [Subscription("IO.PM1.DI_HECDoorClosed")]
  469. public bool PM1_DI_HECDoorClosed { get; set; }
  470. [Subscription("IO.PM1.DI_HECWaterLeakDetectOK")]
  471. public bool PM1_DI_HECWaterLeakDetectOK { get; set; }
  472. [Subscription("IO.PM1.DI_HECWaterLevelOK")]
  473. public bool PM1_DI_HECWaterLevelOK { get; set; }
  474. [Subscription("IO.PM1.DI_HECTempOK")]
  475. public bool PM1_DI_HECTempOK { get; set; }
  476. #endregion
  477. #region MF
  478. [Subscription("IO.MF.DI_ASOpenPosition")]
  479. public bool MF_DI_ASOpenPosition { get; set; }
  480. [Subscription("IO.MF.DI_ASDownPosition")]
  481. public bool MF_DI_ASDownPosition { get; set; }
  482. [Subscription("IO.MF.DI_BEHumanInterlockSensor")]
  483. public bool MF_DI_BEHumanInterlockSensor { get; set; }
  484. [Subscription("IO.MF.DI_ASTiltStatus")]
  485. public bool MF_DI_ASTiltStatus { get; set; }
  486. [Subscription("IO.MF.DI_R5ArmNotExtendToBE")]
  487. public bool MF_DI_R5ArmNotExtendToBE { get; set; }
  488. [Subscription("IO.EFEM.DI_Stage1LockPosition")]
  489. public bool EFEM_DI_Stage1LockPosition { get; set; }
  490. [Subscription("IO.EFEM.DI_Stage1CASSPresenceSensor")]
  491. public bool EFEM_DI_Stage1CASSPresenceSensor { get; set; }
  492. [Subscription("IO.EFEM.DI_R3NotExtendToStage1")]
  493. public bool EFEM_DI_R3NotExtendToStage1 { get; set; }
  494. [Subscription("IO.EFEM.DI_Stage2LockPosition")]
  495. public bool EFEM_DI_Stage2LockPosition { get; set; }
  496. [Subscription("IO.EFEM.DI_Stage2CASSPresenceSensor")]
  497. public bool EFEM_DI_Stage2CASSPresenceSensor { get; set; }
  498. [Subscription("IO.EFEM.DI_R3NotExtendToStage2")]
  499. public bool EFEM_DI_R3NotExtendToStage2 { get; set; }
  500. [Subscription("IO.EFEM.DI_Stage1UnlockPosition")]
  501. public bool EFEM_DI_Stage1UnlockPosition { get; set; }
  502. [Subscription("IO.EFEM.DI_R5NotExtendToStage1")]
  503. public bool EFEM_DI_R5NotExtendToStage1 { get; set; }
  504. [Subscription("IO.EFEM.DI_Stage2UnlockPosition")]
  505. public bool EFEM_DI_Stage2UnlockPosition { get; set; }
  506. [Subscription("IO.EFEM.DI_R5NotExtendToStage2")]
  507. public bool EFEM_DI_R5NotExtendToStage2 { get; set; }
  508. [Subscription("IO.MF.DI_ZAxisUpLimit")]
  509. public bool MF_DI_ZAxisUpLimit { get; set; }
  510. [Subscription("IO.MF.DI_ZAxisDownLimit")]
  511. public bool MF_DI_ZAxisDownLimit { get; set; }
  512. [Subscription("IO.MF.DI_TAxisHome")]
  513. public bool MF_DI_TAxisHome { get; set; }
  514. [Subscription("IO.MF.DI_Smif1SlideAxisRetractSensor")]
  515. public bool MF_DI_Smif1SlideAxisRetractSensor { get; set; }
  516. [Subscription("IO.MF.DO_R3ExtendToSmif1Enable")]
  517. public bool MF_DO_R3ExtendToSmif1Enable { get; set; }
  518. [Subscription("IO.MF.DI_Smif2SlideAxisRetractSensor")]
  519. public bool MF_DI_Smif2SlideAxisRetractSensor { get; set; }
  520. [Subscription("IO.MF.DO_R3ExtendToSmif2Enable")]
  521. public bool MF_DO_R3ExtendToSmif2Enable { get; set; }
  522. [Subscription("IO.MF.DI_ASUpPosition")]
  523. public bool MF_DI_ASUpPosition { get; set; }
  524. [Subscription("IO.MF.DI_ASOpenStatus")]
  525. public bool MF_DI_ASOpenStatus { get; set; }
  526. [Subscription("IO.SMIF.DI_Smif1PodUnlockPositionSersor")]
  527. public bool SMIF_DI_Smif1PodUnlockPositionSersor { get; set; }
  528. [Subscription("IO.SMIF.DI_Smif1PodPresenceSensor")]
  529. public bool SMIF_DI_Smif1PodPresenceSensor { get; set; }
  530. [Subscription("IO.SMIF.DI_Smif1PodLockPosition")]
  531. public bool SMIF_DI_Smif1PodLockPosition { get; set; }
  532. [Subscription("IO.SMIF.DI_Smif1PodClosePositionSensor")]
  533. public bool SMIF_DI_Smif1PodClosePositionSensor { get; set; }
  534. [Subscription("IO.SMIF.DI_Smif1PodOpenPositionSensor")]
  535. public bool SMIF_DI_Smif1PodOpenPositionSensor { get; set; }
  536. [Subscription("IO.SMIF.DI_Smif1ZAxisPosition1Sensor")]
  537. public bool SMIF_DI_Smif1ZAxisPosition1Sensor { get; set; }
  538. [Subscription("IO.SMIF.DI_Smif1RotateAxisCheckSensor2")]
  539. public bool SMIF_DI_Smif1RotateAxisCheckSensor2 { get; set; }
  540. [Subscription("IO.SMIF.DI_R3ArmNotExtendToSmif1")]
  541. public bool SMIF_DI_R3ArmNotExtendToSmif1 { get; set; }
  542. [Subscription("IO.SMIF.DI_Smif1RotateAxisCheckSensor1")]
  543. public bool SMIF_DI_Smif1RotateAxisCheckSensor1 { get; set; }
  544. [Subscription("IO.SMIF.DI_Smif1ZAxisPosition2Sensor")]
  545. public bool SMIF_DI_Smif1ZAxisPosition2Sensor { get; set; }
  546. [Subscription("IO.SMIF.DI_Smif1SlideAxisRetractSensor")]
  547. public bool SMIF_DI_Smif1SlideAxisRetractSensor { get; set; }
  548. [Subscription("IO.SMIF.DI_Smif1SlideAxisExtendSensor")]
  549. public bool SMIF_DI_Smif1SlideAxisExtendSensor { get; set; }
  550. [Subscription("IO.SMIF.DI_Smif1ProtrudedWaferSensor")]
  551. public bool SMIF_DI_Smif1ProtrudedWaferSensor { get; set; }
  552. [Subscription("IO.SMIF.DI_Smif1ZAxisUnloadPositionSensor")]
  553. public bool SMIF_DI_Smif1ZAxisUnloadPositionSensor { get; set; }
  554. [Subscription("IO.SMIF.DI_Smif1ZAxisLoadPositionSensor")]
  555. public bool SMIF_DI_Smif1ZAxisLoadPositionSensor { get; set; }
  556. [Subscription("IO.SMIF.DI_Smif2PodUnlockPositionSersor")]
  557. public bool SMIF_DI_Smif2PodUnlockPositionSersor { get; set; }
  558. [Subscription("IO.SMIF.DI_Smif2PodPresenceSensor")]
  559. public bool SMIF_DI_Smif2PodPresenceSensor { get; set; }
  560. [Subscription("IO.SMIF.DI_Smif2PodLockPosition")]
  561. public bool SMIF_DI_Smif2PodLockPosition { get; set; }
  562. [Subscription("IO.SMIF.DI_Smif2PodClosePositionSensor")]
  563. public bool SMIF_DI_Smif2PodClosePositionSensor { get; set; }
  564. [Subscription("IO.SMIF.DI_Smif2PodOpenPositionSensor")]
  565. public bool SMIF_DI_Smif2PodOpenPositionSensor { get; set; }
  566. [Subscription("IO.SMIF.DI_Smif2ZAxisPosition1Sensor")]
  567. public bool SMIF_DI_Smif2ZAxisPosition1Sensor { get; set; }
  568. [Subscription("IO.SMIF.DI_Smif2RotateAxisCheckSensor2")]
  569. public bool SMIF_DI_Smif2RotateAxisCheckSensor2 { get; set; }
  570. [Subscription("IO.SMIF.DI_R3ArmNotExtendToSmif2")]
  571. public bool SMIF_DI_R3ArmNotExtendToSmif2 { get; set; }
  572. [Subscription("IO.SMIF.DI_Smif2RotateAxisCheckSensor1")]
  573. public bool SMIF_DI_Smif2RotateAxisCheckSensor1 { get; set; }
  574. [Subscription("IO.SMIF.DI_Smif2ZAxisPosition2Sensor")]
  575. public bool SMIF_DI_Smif2ZAxisPosition2Sensor { get; set; }
  576. [Subscription("IO.SMIF.DI_Smif2SlideAxisExtendSensor")]
  577. public bool SMIF_DI_Smif2SlideAxisExtendSensor { get; set; }
  578. [Subscription("IO.SMIF.DI_Smif2ProtrudedWaferSensor")]
  579. public bool SMIF_DI_Smif2ProtrudedWaferSensor { get; set; }
  580. [Subscription("IO.SMIF.DI_Smif2ZAxisUnloadPositionSensor")]
  581. public bool SMIF_DI_Smif2ZAxisUnloadPositionSensor { get; set; }
  582. [Subscription("IO.SMIF.DI_Smif2ZAxisLoadPositionSensor")]
  583. public bool SMIF_DI_Smif2ZAxisLoadPositionSensor { get; set; }
  584. #endregion
  585. public InterlockViewModel()
  586. {
  587. }
  588. protected override void OnInitialize()
  589. {
  590. base.OnInitialize();
  591. InitEditInterlockIODic();
  592. InitMFTree("");
  593. InitPMTree("");
  594. InitEditTree("");
  595. InitActionLists();
  596. InitLimitLists();
  597. }
  598. private void InitEditInterlockIODic()
  599. {
  600. _editInterlockIOReferenceDic = new Dictionary<string, string>()
  601. {
  602. {"EXTIN001", "PM1.DI_FNCPowerLatchON" },
  603. {"EXTIN002", "PM1.DI_HeaterPowerONSW" },
  604. {"EXTIN003", "PM1.DI_PCMCON" },
  605. {"EXTIN004", "PM1.DI_HeaterMCON" },
  606. {"EXTIN005", "PM1.DI_FNCBreakTrip" },
  607. {"EXTIN006", "PM1.DI_HeaterBreakTrip" },
  608. {"EXTIN007", "PM1.DI_HeaterPowerOK" },
  609. {"EXTIN008", "PM1.DI_SCRFAN1OK" },
  610. {"EXTIN009", "PM1.DI_SCRFAN2OK" },
  611. {"EXTIN010", "PM1.DI_EXHFanOK" },
  612. {"EXTIN011", "PM1.DI_EnvironmentTempOK" },
  613. {"EXTIN012", "PM1.DI_HeaterOHOK" },
  614. {"EXTIN013", "PM1.DI_FNCWaterLeakDetOK" },
  615. {"EXTIN014", "PM1.DI_CKDMVInnerTemp" },
  616. {"EXTIN015", "PM1.DI_CKDMVOuterTemp" },
  617. {"EXTIN016", "PM1.DI_HeaterBreakOK" },
  618. {"EXTIN017", "PM1.DI_HeaterWaterFlowOK" },
  619. {"EXTIN018", "PM1.DI_HeaterWaterFlowOK1" },
  620. {"EXTIN019", "PM1.DI_MFWaterFlowOK" },
  621. {"EXTIN020", "PM1.DI_MFWaterFlowOK1" },
  622. {"EXTIN021", "PM1.DI_CAPWaterFlowOK" },
  623. {"EXTIN022", "PM1.DI_CAPWaterFlowOK1" },
  624. {"EXTIN023", "PM1.DI_ASWaterFlowOK" },
  625. {"EXTIN024", "PM1.DI_ASWaterFlowOK1" },
  626. {"EXTIN025", "PM1.DI_FNCPanelClose" },
  627. {"EXTIN026", "PM1.DI_APCVLVCLOSE" },
  628. {"EXTIN027", "PM1.DI_APCSTATUSOK" },
  629. {"EXTIN028", "PM1.DI_EXTIN1" },
  630. {"EXTIN029", "PM1.DI_EXTIN2" },
  631. {"EXTIN030", "PM1.DI_EXTIN3" },
  632. {"EXTIN031", "PM1.DI_EXTIN4" },
  633. {"EXTIN032", "PM1.DI_EXTIN5" },
  634. {"EXTIN033", "PM1.DI_EXTIN6" },
  635. {"EXTIN034", "PM1.DI_EXTIN7" },
  636. {"EXTIN035", "PM1.DI_EXTIN8" },
  637. {"EXTIN036", "PM1.DI_PT1OK" },
  638. {"EXTIN037", "PM1.DI_PT2OK" },
  639. {"EXTIN038", "PM1.DI_PT3OK" },
  640. {"EXTIN039", "PM1.DI_PT4OK" },
  641. {"EXTIN040", "PM1.DI_PT5OK" },
  642. {"EXTIN041", "PM1.DI_PSW1LOW" },
  643. {"EXTIN042", "PM1.DI_PSW2LOW" },
  644. {"EXTIN043", "PM1.DI_PT6OK" },
  645. {"EXTIN044", "PM1.DI_GUEXHOK" },
  646. {"EXTIN046", "PM1.DI_GUUDoorOK" },
  647. {"EXTIN047", "PM1.DI_H2Leak" },
  648. {"EXTIN048", "PM1.DI_NO2Leak" },
  649. {"EXTIN049", "PM1.DI_GASDetectorOK" },
  650. {"EXTIN050", "PM1.DI_H2Density" },
  651. {"EXTIN051", "PM1.DI_H2AIRFlowOK" },
  652. {"EXTIN052", "PM1.DI_O2Density" },
  653. {"EXTIN053", "PM1.DI_O2AIRFlowOK" },
  654. {"EXTIN054", "PM1.DI_SCVEXHOK" },
  655. {"EXTIN055", "PM1.DI_CAPClosePosition" },
  656. {"EXTIN056", "PM1.DI_TubeATMPressure" },
  657. {"EXTIN057", "PM1.DI_TubeOverPressure" },
  658. {"EXTIN058", "PM1.DI_VG2OK" },
  659. {"EXTIN059", "PM1.DI_VG1OK" },
  660. {"EXTIN060", "PM1.DI_ALYCAPATMPressure" },
  661. {"EXTIN061", "PM1.DI_CAPHWILKOK" },
  662. {"EXTIN062", "PM1.DI_PumpON" },
  663. {"EXTIN063", "PM1.DI_PumpRunning" },
  664. {"EXTIN064", "PM1.DI_PumpRemote" },
  665. {"EXTIN065", "PM1.DI_PumpNotWarning" },
  666. {"EXTIN066", "PM1.DI_PumpNotAlarm" },
  667. {"EXTIN067", "PM1.APC.IsPositionControlMode" },
  668. {"EXTIN068", "PM1.APC.IsCloseControlMode" },
  669. {"EXTIN069", "PM1.APC.IsOpenControlMode" },
  670. {"EXTIN070", "PM1.APC.IsVG1ControlMode" },
  671. {"EXTIN071", "PM1.APC.IsVG2ControlMode" },
  672. {"EXTIN072", "PM1.APC.IsSlowControlMode" },
  673. {"EXTOUT001", "PM1.DO_HeaterPowerONLamp" },
  674. {"EXTOUT002", "PM1.DO_HeaterPowerEN" },
  675. {"EXTOUT003", "PM1.DO_EXTOut1" },
  676. {"EXTOUT004", "PM1.DO_EXTOut2" },
  677. {"EXTOUT005", "PM1.DO_EXTOut3" },
  678. {"EXTOUT006", "PM1.DO_EXTOut4" },
  679. {"EXTOUT007", "PM1.DO_EXTOut5" },
  680. {"EXTOUT008", "PM1.DO_EXTOut6" },
  681. {"EXTOUT009", "PM1.DO_EXTOut7" },
  682. {"EXTOUT010", "PM1.DO_EXTOut8" },
  683. {"EXTOUT011", "PM1.DO_MFCN1ForceOpen" },
  684. {"EXTOUT012", "PM1.DO_MFCN2ForceOpen" },
  685. {"EXTOUT013", "PM1.DO_MFCN3ForceOpen" },
  686. {"EXTOUT014", "PM1.DO_MFCH1ForceOpen" },
  687. {"EXTOUT015", "PM1.DO_MFCJ1ForceOpen" },
  688. {"EXTOUT016", "PM1.DO_MFCXN1ForceOpen" },
  689. {"EXTOUT017", "PM1.DO_MFCN1ForceClose" },
  690. {"EXTOUT018", "PM1.DO_MFCN2ForceClose" },
  691. {"EXTOUT019", "PM1.DO_MFCN3ForceClose" },
  692. {"EXTOUT020", "PM1.DO_MFCH1ForceClose" },
  693. {"EXTOUT021", "PM1.DO_MFCJ1ForceClose" },
  694. {"EXTOUT022", "PM1.DO_MFCXN1ForceClose" },
  695. {"EXTOUT023", "PM1.DO_PumpON" },
  696. {"EXTOUT024", "PM1.DO_CAPSOFTILKOK" },
  697. {"EXTOUT025", "PM1.APC.SetClose1ControlMode" },
  698. {"EXTOUT026", "PM1.APC.SetClose2ControlMode" },
  699. {"EXTOUT027", "PM1.APC.SetClose3ControlMode" },
  700. {"EXTOUT028", "PM1.APC.SetOpenControlMode" },
  701. {"EXTOUT029", "PM1.APC.SetSlowControlMode" },
  702. {"EXTOUT030", "PM1.APC.SetVG1ControlMode" },
  703. {"EXTOUT031", "PM1.APC.SetVG2ControlMode" },
  704. {"ILKALM001", "PM1.SetSoftwareInterlockAlarm001" },
  705. {"ILKALM002", "PM1.SetSoftwareInterlockAlarm002" },
  706. {"ILKALM003", "PM1.SetSoftwareInterlockAlarm003" },
  707. {"MFCN1", "PM1.AI_MFCN1FlowFeedback" },
  708. {"MFCN2", "PM1.AI_MFCN2FlowFeedback" },
  709. {"MFCN3", "PM1.AI_MFCN3FlowFeedback" },
  710. {"MFCH1", "PM1.AI_MFCH1FlowFeedback" },
  711. {"MFCJ1", "PM1.AI_MFCJ1FlowFeedback" },
  712. {"MFCXN1", "PM1.AI_MFCXN1FlowFeedback" },
  713. {"MFMH2", "PM1.AI_MFMH2PRGFlowFeedback" },
  714. {"MFMO2", "PM1.AI_MFMO2PRGFlowFeedback" },
  715. {"VG01", "PM1.APC.Pressure1Feedback" },
  716. {"VG02", "PM1.APC.Pressure2Feedback" },
  717. {"TEMP01", "PM1.HeaterTemp" },
  718. {"TEMP02", "PM1.HeaterTemp" },
  719. {"TEMP03", "PM1.HeaterTemp" },
  720. {"TEMP04", "PM1.HeaterTemp" },
  721. {"TEMP05", "PM1.HeaterTemp" },
  722. {"ALLTEMP", "PM1.HeaterTemp" },
  723. {"VLV001", "PM1.DO_H12ValveOpen" },
  724. {"VLV002", "PM1.DO_J11ValveOpen" },
  725. {"VLV003", "PM1.DO_XN11ValveOpen" },
  726. {"VLV004", "PM1.DO_N32ValveOpen" },
  727. {"VLV005", "PM1.DO_N12ValveOpen" },
  728. {"VLV006", "PM1.DO_N22ValveOpen" },
  729. {"VLV007", "PM1.DO_J12ValveOpen" },
  730. {"VLV008", "PM1.DO_J13ValveOpen" },
  731. {"VLV009", "PM1.DO_J14ValveOpen" },
  732. {"VLV010", "PM1.DO_XN12ValveOpen" },
  733. {"VLV011", "PM1.DO_XN13ValveOpen" },
  734. {"VLV012", "PM1.D0_XN14ValveOpen" },
  735. {"VLV013", "PM1.DO_TS3ValveOpen" },
  736. {"VLV014", "PM1.DO_GD1ValveOpen" },
  737. {"VLV015", "PM1.D0_GD2ValveOpen" },
  738. {"VLV016", "PM1.DO_SVValveOpen" },
  739. {"VLV017", "PM1.DO_IV1ValveOpen" },
  740. {"VLV018", "PM1.DO_VV1ValveOpen" },
  741. {"VLV019", "PM1.DO_TS4ValveOpen" },
  742. };
  743. _editLimitCheckReferenceDic = new Dictionary<string, string>()
  744. {
  745. { ">=", "H" },
  746. { "<", "L" },
  747. };
  748. }
  749. private void InitActionLists()
  750. {
  751. _interlockEditAction = new List<string>();
  752. foreach (var name in _moduleName)
  753. {
  754. GetActionList(name);
  755. }
  756. }
  757. private void InitLimitLists()
  758. {
  759. _interlockEditLimit = new List<string>();
  760. foreach (var name in _moduleName)
  761. {
  762. GetLimitDiList(name);
  763. }
  764. GetLimitAiList(_moduleName[0]);
  765. foreach (var name in _moduleName)
  766. {
  767. GetLimitDoList(name);
  768. }
  769. }
  770. private void GetActionList(string module)
  771. {
  772. List<NotifiableIoItem> notifiableIoItems = new List<NotifiableIoItem>();
  773. notifiableIoItems = QueryDataClient.Instance.Service.GetDoList($"System.{module}");
  774. for (int i = 0; i < notifiableIoItems.Count; i++)
  775. {
  776. _interlockEditAction.Add(notifiableIoItems[i].Name);
  777. }
  778. }
  779. private void GetLimitDiList(string module)
  780. {
  781. List<NotifiableIoItem> notifiableIoItems = new List<NotifiableIoItem>();
  782. notifiableIoItems = QueryDataClient.Instance.Service.GetDiList($"System.{module}");
  783. for (int i = 0; i < notifiableIoItems.Count; i++)
  784. {
  785. _interlockEditLimit.Add(notifiableIoItems[i].Name);
  786. }
  787. }
  788. private void GetLimitAiList(string module)
  789. {
  790. List<NotifiableIoItem> notifiableIoItems = new List<NotifiableIoItem>();
  791. notifiableIoItems = QueryDataClient.Instance.Service.GetAiList($"System.{module}");
  792. for (int i = 0; i < notifiableIoItems.Count; i++)
  793. {
  794. _interlockEditLimit.Add(notifiableIoItems[i].Name);
  795. }
  796. }
  797. private void GetLimitDoList(string module)
  798. {
  799. List<NotifiableIoItem> notifiableIoItems = new List<NotifiableIoItem>();
  800. notifiableIoItems = QueryDataClient.Instance.Service.GetDoList($"System.{module}");
  801. for (int i = 0; i < notifiableIoItems.Count; i++)
  802. {
  803. _interlockEditLimit.Add(notifiableIoItems[i].Name);
  804. }
  805. }
  806. private void InitMFTree(string key)
  807. {
  808. try
  809. {
  810. XmlDocument xmlConfig = new XmlDocument();
  811. xmlConfig.LoadXml(QueryDataClient.Instance.Service.GetInterlockConfigContent());
  812. //<Action do="DO_RF_power_on_off" value="true" tip="" tip.zh-CN="" tip.en-US="">
  813. // <Limit di="DI_RF_hardware_interlock" value="true" tip="" tip.zh-CN="" tip.en-US="" />
  814. // <Limit di="DI_Chamber_door_sw" value="true" tip="" tip.zh-CN="" tip.en-US="" />
  815. //</Action>
  816. XmlNode nodeInterlock = xmlConfig.SelectSingleNode("Interlock");
  817. InterlockTreeMF.Clear();
  818. foreach (XmlNode item in nodeInterlock.ChildNodes)
  819. {
  820. InterlockBase interlock = new InterlockBase();
  821. if (item.NodeType == XmlNodeType.Comment)
  822. continue;
  823. XmlElement actionNode = item as XmlElement;
  824. if (actionNode == null) continue;
  825. if (actionNode.Name != "Action")
  826. {
  827. continue;
  828. }
  829. if (actionNode.GetAttribute("do").Contains("PM1"))
  830. continue;
  831. if (!string.IsNullOrEmpty(key) && !actionNode.GetAttribute("do").Contains(key))
  832. continue;
  833. interlock.Name = actionNode.GetAttribute("tip");
  834. interlock.SetValue = actionNode.GetAttribute("value");
  835. string condition = actionNode.GetAttribute("condition");
  836. condition = string.IsNullOrEmpty(condition) ? "AND" : condition;
  837. interlock.InterlockOKFill = _greenFill;
  838. //string doName = actionNode.GetAttribute("do");
  839. //bool value = Convert.ToBoolean(actionNode.GetAttribute("value"));
  840. //string tip = actionNode.GetAttribute("tip");
  841. foreach (XmlElement limitNode in actionNode.ChildNodes)
  842. {
  843. if (limitNode.Name != "Limit")
  844. {
  845. continue;
  846. }
  847. string action = string.Empty;
  848. if (limitNode.HasAttribute("di"))
  849. {
  850. action = limitNode.GetAttribute("di");
  851. }
  852. if (limitNode.HasAttribute("do"))
  853. {
  854. action = limitNode.GetAttribute("do");
  855. }
  856. interlock.Children.Add(new InterlockBase() { Action = action, Name = limitNode.GetAttribute("tip"), LimitValue = limitNode.GetAttribute("value"), Condition = condition, InterlockOKFill = _greenFill });
  857. }
  858. InterlockTreeMF.Add(interlock);
  859. }
  860. }
  861. catch (Exception ex)
  862. {
  863. }
  864. }
  865. private void InitPMTree(string key)
  866. {
  867. try
  868. {
  869. XmlDocument xmlConfig = new XmlDocument();
  870. xmlConfig.LoadXml(QueryDataClient.Instance.Service.GetInterlockConfigContent());
  871. //<Action do="DO_RF_power_on_off" value="true" tip="" tip.zh-CN="" tip.en-US="">
  872. // <Limit di="DI_RF_hardware_interlock" value="true" tip="" tip.zh-CN="" tip.en-US="" />
  873. // <Limit di="DI_Chamber_door_sw" value="true" tip="" tip.zh-CN="" tip.en-US="" />
  874. //</Action>
  875. XmlNode nodeInterlock = xmlConfig.SelectSingleNode("Interlock");
  876. InterlockTreePM.Clear();
  877. foreach (XmlNode item in nodeInterlock.ChildNodes)
  878. {
  879. InterlockBase interlock = new InterlockBase();
  880. if (item.NodeType == XmlNodeType.Comment)
  881. continue;
  882. XmlElement actionNode = item as XmlElement;
  883. if (actionNode == null) continue;
  884. if (actionNode.Name != "Action")
  885. {
  886. continue;
  887. }
  888. if (!actionNode.GetAttribute("do").Contains("PM1"))
  889. continue;
  890. if (!string.IsNullOrEmpty(key) && !actionNode.GetAttribute("do").Contains(key))
  891. continue;
  892. interlock.Name = actionNode.GetAttribute("tip");
  893. interlock.SetValue = actionNode.GetAttribute("value");
  894. string condition = actionNode.GetAttribute("condition");
  895. condition = string.IsNullOrEmpty(condition) ? "AND" : condition;
  896. interlock.InterlockOKFill = _greenFill;
  897. //string doName = actionNode.GetAttribute("do");
  898. //bool value = Convert.ToBoolean(actionNode.GetAttribute("value"));
  899. //string tip = actionNode.GetAttribute("tip");
  900. foreach (XmlElement limitNode in actionNode.ChildNodes)
  901. {
  902. if (limitNode.Name != "Limit")
  903. {
  904. continue;
  905. }
  906. string action = string.Empty;
  907. if (limitNode.HasAttribute("di"))
  908. {
  909. action = limitNode.GetAttribute("di");
  910. }
  911. if (limitNode.HasAttribute("do"))
  912. {
  913. action = limitNode.GetAttribute("do");
  914. }
  915. interlock.Children.Add(new InterlockBase() { Action = action, Name = limitNode.GetAttribute("tip"), LimitValue = limitNode.GetAttribute("value"), Condition = condition, InterlockOKFill = _greenFill });
  916. }
  917. InterlockTreePM.Add(interlock);
  918. }
  919. }
  920. catch (Exception ex)
  921. {
  922. }
  923. }
  924. private void InitEditTree(string key)
  925. {
  926. try
  927. {
  928. XmlDocument xmlConfig = new XmlDocument();
  929. xmlConfig.LoadXml(QueryDataClient.Instance.Service.GetInterlockUserDefineConfigContent());
  930. XmlNode nodeInterlock = xmlConfig.SelectSingleNode("Interlock");
  931. InterlockTreeEdit.Clear();
  932. foreach (XmlNode item in nodeInterlock.ChildNodes)
  933. {
  934. InterlockBase interlock = new InterlockBase();
  935. if (item.NodeType == XmlNodeType.Comment)
  936. continue;
  937. XmlElement actionNode = item as XmlElement;
  938. if (actionNode == null) continue;
  939. if (actionNode.Name != "Action")
  940. {
  941. continue;
  942. }
  943. if (!string.IsNullOrEmpty(key) && !actionNode.GetAttribute("Name").Contains(key))
  944. continue;
  945. //interlock.Action= actionNode.GetAttribute("Name");
  946. //interlock.Name = actionNode.GetAttribute("Name");
  947. if (actionNode.GetAttribute("Name").Contains("FLAG"))
  948. interlock.Action = actionNode.GetAttribute("Name");
  949. else
  950. interlock.Action = _editInterlockIOReferenceDic.Where(x => x.Value == actionNode.GetAttribute("Name"))?.FirstOrDefault().Key;
  951. interlock.Name = interlock.Action;
  952. interlock.SetValue = actionNode.GetAttribute("Value");
  953. interlock.InterlockOKFill = _greenFill;
  954. //string doName = actionNode.GetAttribute("do");
  955. //bool value = Convert.ToBoolean(actionNode.GetAttribute("value"));
  956. //string tip = actionNode.GetAttribute("tip");
  957. foreach (XmlElement limitNode in actionNode.ChildNodes)
  958. {
  959. if (limitNode.Name != "Limit")
  960. {
  961. continue;
  962. }
  963. string action = string.Empty;
  964. if (limitNode.HasAttribute("Name"))
  965. {
  966. //action = limitNode.GetAttribute("Name");
  967. if (limitNode.GetAttribute("Name").Contains("FLAG"))
  968. action = limitNode.GetAttribute("Name");
  969. else
  970. action = _editInterlockIOReferenceDic.Where(x => x.Value == limitNode.GetAttribute("Name"))?.FirstOrDefault().Key;
  971. }
  972. string condition = limitNode.GetAttribute("Condition");
  973. condition = string.IsNullOrEmpty(condition) ? "AND" : condition;
  974. interlock.Children.Add(new InterlockBase() { Action = action, Name = action, LimitValue = limitNode.GetAttribute("Value"), Condition = condition, InterlockOKFill = _greenFill });
  975. }
  976. InterlockTreeEdit.Add(interlock);
  977. }
  978. }
  979. catch (Exception ex)
  980. {
  981. }
  982. }
  983. protected override void InvokeAfterUpdateProperty(Dictionary<string, object> data)
  984. {
  985. base.InvokeAfterUpdateProperty(data);
  986. try
  987. {
  988. foreach (var key in data.Keys)
  989. {
  990. for (int i = 0; i < InterlockTreeMF.Count; i++)
  991. {
  992. bool setValue = false;
  993. if (InterlockTreeMF[i].Children[0].Condition.ToLower() == "or")
  994. {
  995. setValue = false;
  996. }
  997. else
  998. {
  999. setValue = true;
  1000. }
  1001. for (int j = 0; j < InterlockTreeMF[i].Children.Count; j++)
  1002. {
  1003. if (key.Contains(InterlockTreeMF[i].Children[j].Action))
  1004. {
  1005. InterlockTreeMF[i].Children[j].InterlockOK = data[key].ToString().ToLower() == InterlockTreeMF[i].Children[j].LimitValue.ToLower();
  1006. InterlockTreeMF[i].Children[j].InterlockOKFill = InterlockTreeMF[i].Children[j].InterlockOK ? _greenFill : _redFill;
  1007. }
  1008. if (InterlockTreeMF[i].Children[j].Condition.ToLower() == "or")
  1009. {
  1010. setValue = setValue || InterlockTreeMF[i].Children[j].InterlockOK;
  1011. }
  1012. else
  1013. {
  1014. setValue = setValue && InterlockTreeMF[i].Children[j].InterlockOK;
  1015. }
  1016. }
  1017. InterlockTreeMF[i].InterlockOK = setValue.ToString().ToLower() == InterlockTreeMF[i].SetValue.ToLower();
  1018. InterlockTreeMF[i].InterlockOKFill = InterlockTreeMF[i].InterlockOK ? _greenFill : _redFill;
  1019. }
  1020. for (int i = 0; i < InterlockTreePM.Count; i++)
  1021. {
  1022. bool setValue = false;
  1023. if (InterlockTreePM[i].Children[0].Condition.ToLower() == "or")
  1024. {
  1025. setValue = false;
  1026. }
  1027. else
  1028. {
  1029. setValue = true;
  1030. }
  1031. for (int j = 0; j < InterlockTreePM[i].Children.Count; j++)
  1032. {
  1033. if (key.Contains(InterlockTreePM[i].Children[j].Action))
  1034. {
  1035. InterlockTreePM[i].Children[j].InterlockOK = data[key].ToString().ToLower() == InterlockTreePM[i].Children[j].LimitValue.ToLower();
  1036. InterlockTreePM[i].Children[j].InterlockOKFill = InterlockTreePM[i].Children[j].InterlockOK ? _greenFill : _redFill;
  1037. }
  1038. if (InterlockTreePM[i].Children[j].Condition.ToLower() == "or")
  1039. {
  1040. setValue = setValue || InterlockTreePM[i].Children[j].InterlockOK;
  1041. }
  1042. else
  1043. {
  1044. setValue = setValue && InterlockTreePM[i].Children[j].InterlockOK;
  1045. }
  1046. }
  1047. InterlockTreePM[i].InterlockOK = setValue.ToString().ToLower() == InterlockTreePM[i].SetValue.ToLower(); ;
  1048. InterlockTreePM[i].InterlockOKFill = InterlockTreePM[i].InterlockOK ? _greenFill : _redFill;
  1049. }
  1050. }
  1051. //RefreshInterlockEdit();
  1052. }
  1053. catch (Exception ex)
  1054. {
  1055. }
  1056. }
  1057. private void RefreshInterlockEdit()
  1058. {
  1059. if (InterlockTreeEdit.Count == 0)
  1060. return;
  1061. Dictionary<string, List<NotifiableIoItem>> keyValuePairs = new Dictionary<string, List<NotifiableIoItem>>();
  1062. List<NotifiableIoItem> notifiableIoItems = new List<NotifiableIoItem>();
  1063. foreach (var name in _moduleName)
  1064. {
  1065. notifiableIoItems = QueryDataClient.Instance.Service.GetDiList($"System.{name}");
  1066. keyValuePairs.Add($"{name}.DI_", notifiableIoItems);
  1067. notifiableIoItems = QueryDataClient.Instance.Service.GetDoList($"System.{name}");
  1068. keyValuePairs.Add($"{name}.DO_", notifiableIoItems);
  1069. }
  1070. notifiableIoItems = QueryDataClient.Instance.Service.GetAiList($"System.PM1");
  1071. keyValuePairs.Add($"PM1.AI_", notifiableIoItems);
  1072. for (int i = 0; i < InterlockTreeEdit.Count; i++)
  1073. {
  1074. bool setValue = false;
  1075. if (InterlockTreeEdit[i].Children[0].Condition.ToLower() == "or")
  1076. {
  1077. setValue = false;
  1078. }
  1079. else
  1080. {
  1081. setValue = true;
  1082. }
  1083. for (int j = 0; j < InterlockTreeEdit[i].Children.Count; j++)
  1084. {
  1085. var action = InterlockTreeEdit[i].Children[j].Action;
  1086. var limitValue = InterlockTreeEdit[i].Children[j].LimitValue;
  1087. foreach (var key in keyValuePairs.Keys)
  1088. {
  1089. if (action.Contains(key))
  1090. {
  1091. var values = keyValuePairs[key].Where(x => x.Name == InterlockTreeEdit[i].Children[j].Action).FirstOrDefault();
  1092. if (values != null)
  1093. {
  1094. if (action.Contains("AI_"))
  1095. {
  1096. if (limitValue.Contains(">="))
  1097. {
  1098. limitValue = limitValue.Replace(">=", "");
  1099. InterlockTreeEdit[i].Children[j].InterlockOK = values.ShortValue >= short.Parse(limitValue);
  1100. InterlockTreeEdit[i].Children[j].InterlockOKFill = InterlockTreeEdit[i].Children[j].InterlockOK ? _greenFill : _redFill;
  1101. }
  1102. else
  1103. {
  1104. limitValue = limitValue.Replace("<", "");
  1105. InterlockTreeEdit[i].Children[j].InterlockOK = values.ShortValue < short.Parse(limitValue);
  1106. InterlockTreeEdit[i].Children[j].InterlockOKFill = InterlockTreeEdit[i].Children[j].InterlockOK ? _greenFill : _redFill;
  1107. }
  1108. }
  1109. else
  1110. {
  1111. InterlockTreeEdit[i].Children[j].InterlockOK = values.BoolValue.ToString().ToLower() == InterlockTreeEdit[i].Children[j].LimitValue.ToLower();
  1112. InterlockTreeEdit[i].Children[j].InterlockOKFill = InterlockTreeEdit[i].Children[j].InterlockOK ? _greenFill : _redFill;
  1113. }
  1114. }
  1115. }
  1116. }
  1117. if (InterlockTreeEdit[i].Children[j].Condition.ToLower() == "or")
  1118. {
  1119. setValue = setValue || InterlockTreeEdit[i].Children[j].InterlockOK;
  1120. }
  1121. else
  1122. {
  1123. setValue = setValue && InterlockTreeEdit[i].Children[j].InterlockOK;
  1124. }
  1125. }
  1126. InterlockTreeEdit[i].InterlockOK = setValue.ToString().ToLower() == InterlockTreeEdit[i].SetValue.ToLower();
  1127. InterlockTreeEdit[i].InterlockOKFill = InterlockTreeEdit[i].InterlockOK ? _greenFill : _redFill;
  1128. }
  1129. }
  1130. public void CollapseAll()
  1131. {
  1132. SetExpand(InterlockTreePM, false);
  1133. SetExpand(InterlockTreeMF, false);
  1134. SetExpand(InterlockTreeEdit, false);
  1135. }
  1136. public void ExpandAll()
  1137. {
  1138. SetExpand(InterlockTreePM, true);
  1139. SetExpand(InterlockTreeMF, true);
  1140. SetExpand(InterlockTreeEdit, true);
  1141. }
  1142. public void SetExpand(ObservableCollection<InterlockBase> interlockbase, bool expand)
  1143. {
  1144. if (interlockbase == null)
  1145. return;
  1146. foreach (var interlock in interlockbase)
  1147. {
  1148. interlock.IsExpanded = expand;
  1149. if (interlock.Children != null)
  1150. SetExpand(interlock.Children, expand);
  1151. }
  1152. }
  1153. public void EditTreeSelectChanged(InterlockBase interlock)
  1154. {
  1155. CurrentInterlock = interlock;
  1156. if (CurrentInterlock != null && CurrentInterlock.Children.Count > 0)
  1157. {
  1158. InterlockLimits.Clear();
  1159. foreach (var limit in CurrentInterlock.Children)
  1160. {
  1161. InterlockLimits.Add(new InterlockLimit() { LimitName = limit.Action, LimitValue = limit.LimitValue, LimitCondition = limit.Condition });
  1162. }
  1163. InterlockLimitSelectIndex = 0;
  1164. SelectLimit();
  1165. ActionItem = CurrentInterlock.Action;
  1166. var value = CurrentInterlock.SetValue.Split(';').ToList();
  1167. if (value.Count > 2)
  1168. {
  1169. if (value[0].Contains("KEEP"))
  1170. {
  1171. ActionTimeCheck = "KEEP";
  1172. ActionTimeValue = value[0].Replace("KEEP", "");
  1173. IsEnabledActionTimeValue = true;
  1174. }
  1175. else
  1176. {
  1177. ActionTimeCheck = "DELAY";
  1178. ActionTimeValue = value[0].Replace("DELAY", "");
  1179. IsEnabledActionTimeValue = true;
  1180. }
  1181. ActionCheck = value[1];
  1182. ActionAuto = value[2];
  1183. }
  1184. else if (value.Count == 2)
  1185. {
  1186. if (CurrentInterlock.SetValue.Contains("KEEP") || CurrentInterlock.SetValue.Contains("DELAY"))
  1187. {
  1188. if (value[0].Contains("KEEP"))
  1189. {
  1190. ActionTimeCheck = "KEEP";
  1191. ActionTimeValue = value[0].Replace("KEEP", "");
  1192. IsEnabledActionTimeValue = true;
  1193. }
  1194. else
  1195. {
  1196. ActionTimeCheck = "DELAY";
  1197. ActionTimeValue = value[0].Replace("DELAY", "");
  1198. IsEnabledActionTimeValue = true;
  1199. }
  1200. ActionCheck = value[1];
  1201. }
  1202. else
  1203. {
  1204. ActionCheck = value[0];
  1205. ActionAuto = value[1];
  1206. ActionTimeCheck = "BLANK";
  1207. ActionTimeValue = "0";
  1208. IsEnabledActionTimeValue = false;
  1209. }
  1210. }
  1211. else
  1212. {
  1213. ActionCheck = value[0];
  1214. ActionTimeCheck = "BLANK";
  1215. ActionTimeValue = "0";
  1216. IsEnabledActionTimeValue = false;
  1217. }
  1218. }
  1219. }
  1220. public void InterlockEdit()
  1221. {
  1222. if (!_isInterlockEditSet)
  1223. {
  1224. _isInterlockEditSet = !_isInterlockEditSet;
  1225. IsInterlockEdit = true;
  1226. }
  1227. else
  1228. {
  1229. IsInterlockEdit = false;
  1230. IsInterlockEditCancel = true;
  1231. _isInterlockEditSet = !_isInterlockEditSet;
  1232. }
  1233. }
  1234. public void ActionSelect()
  1235. {
  1236. var temp = InterlockTreeEdit.Where(x => x.Action == InterLockEditActionSelect).FirstOrDefault();
  1237. if (temp == null)
  1238. {
  1239. InterlockLimits.Clear();
  1240. InterlockEditLimitSelectIndex = -1;
  1241. }
  1242. else
  1243. {
  1244. InterlockLimits.Clear();
  1245. foreach (var limit in temp.Children)
  1246. {
  1247. InterlockLimits.Add(new InterlockLimit() { LimitName = limit.Action, LimitValue = limit.LimitValue, LimitCondition = limit.Condition });
  1248. }
  1249. InterlockEditLimitSelectIndex = InterlockEditLimit.IndexOf(InterlockLimits.First().LimitName);
  1250. }
  1251. }
  1252. public void LimitSelect()
  1253. {
  1254. if (string.IsNullOrEmpty(InterLockEditLimitSelect))
  1255. return;
  1256. if (InterLockEditLimitSelect.Contains("AI_"))
  1257. {
  1258. LimitValueTrueName = ">=";
  1259. LimitValueFalseName = "<";
  1260. IsShowLimitValue = Visibility.Visible;
  1261. }
  1262. else
  1263. {
  1264. LimitValueTrueName = "true";
  1265. LimitValueFalseName = "false";
  1266. IsShowLimitValue = Visibility.Hidden;
  1267. }
  1268. }
  1269. public void SelectItem(string itemType)
  1270. {
  1271. var windowManager = IoC.Get<IWindowManager>();
  1272. InterlockSelectItemViewModel interlockSelectItemViewModel = new InterlockSelectItemViewModel(itemType);
  1273. (windowManager as WindowManager)?.ShowDialogWithTitle(interlockSelectItemViewModel, null, "Interlock SelectItem View");
  1274. string selectedItem = interlockSelectItemViewModel.SelectedItem;
  1275. if (!string.IsNullOrEmpty(selectedItem))
  1276. {
  1277. switch (itemType)
  1278. {
  1279. case "Action":
  1280. if (!_editInterlockIOReferenceDic.Keys.Contains(selectedItem) && !selectedItem.Contains("FLAG"))
  1281. {
  1282. DialogBox.ShowWarning($"{selectedItem} item is not exist!");
  1283. return;
  1284. }
  1285. ActionItem = selectedItem;
  1286. break;
  1287. case "Limit":
  1288. if (selectedItem.Contains("FLAG"))
  1289. {
  1290. if (InterlockTreeEdit.Where(x => x.Action == selectedItem).FirstOrDefault() == null)
  1291. {
  1292. DialogBox.ShowWarning($"{selectedItem} item is not exist!");
  1293. return;
  1294. }
  1295. }
  1296. else
  1297. {
  1298. if (!_editInterlockIOReferenceDic.Keys.Contains(selectedItem))
  1299. {
  1300. DialogBox.ShowWarning($"{selectedItem} item is not exist!");
  1301. return;
  1302. }
  1303. }
  1304. LimitItem = selectedItem;
  1305. if (LimitItem.Contains("MFC") || LimitItem.Contains("MFM") || LimitItem.Contains("APC") || LimitItem.Contains("TEMP") || LimitItem.Contains("VG"))
  1306. {
  1307. IsEnabledLimitValue = true;
  1308. if (LimitCheck.Contains("ON") || LimitCheck.Contains("OFF"))
  1309. LimitCheck = "BLANK";
  1310. }
  1311. else
  1312. {
  1313. IsEnabledLimitValue = false;
  1314. LimitValue = "";
  1315. if (LimitCheck.Contains(">=") || LimitCheck.Contains("<"))
  1316. LimitCheck = "BLANK";
  1317. }
  1318. if (LimitItem.Contains("MFC") || LimitItem.Contains("MFM"))
  1319. {
  1320. LimitUnit = "SCCM";
  1321. }
  1322. else if (LimitItem.Contains("APC"))
  1323. {
  1324. LimitUnit = "Torr";
  1325. }
  1326. else if (LimitItem.Contains("TEMP"))
  1327. {
  1328. LimitUnit = "℃";
  1329. }
  1330. else if (LimitItem.Contains("VG"))
  1331. {
  1332. LimitUnit = "Torr";
  1333. }
  1334. else
  1335. {
  1336. LimitUnit = "";
  1337. }
  1338. break;
  1339. }
  1340. }
  1341. }
  1342. public void SelectCheck(string value)
  1343. {
  1344. string itemType = string.Empty;
  1345. switch (value)
  1346. {
  1347. case "Action":
  1348. itemType = ActionItem;
  1349. break;
  1350. case "Limit":
  1351. itemType = LimitItem;
  1352. break;
  1353. case "TIME":
  1354. itemType = value;
  1355. break;
  1356. }
  1357. var windowManager = IoC.Get<IWindowManager>();
  1358. InterlockCheckViewModel interlockCheckViewModel = new InterlockCheckViewModel(itemType);
  1359. if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(interlockCheckViewModel, null, "Interlock Check View"))
  1360. {
  1361. if (value == "Action")
  1362. {
  1363. ActionCheck = interlockCheckViewModel.CheckSelected;
  1364. }
  1365. else if (value == "Limit")
  1366. {
  1367. LimitCheck = interlockCheckViewModel.CheckSelected;
  1368. if (LimitCheck == ">=" || LimitCheck == "<")
  1369. IsEnabledLimitValue = true;
  1370. else
  1371. IsEnabledLimitValue = false;
  1372. }
  1373. else
  1374. {
  1375. ActionTimeCheck = interlockCheckViewModel.CheckSelected;
  1376. if (ActionTimeCheck == "DELAY" || ActionTimeCheck == "KEEP")
  1377. IsEnabledActionTimeValue = true;
  1378. else
  1379. IsEnabledActionTimeValue = false;
  1380. }
  1381. }
  1382. }
  1383. public void SelectAuto()
  1384. {
  1385. var windowManager = IoC.Get<IWindowManager>();
  1386. InterlockActionAutoViewModel interlockActionAutoViewModel = new InterlockActionAutoViewModel();
  1387. if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(interlockActionAutoViewModel, null, "Interlock Auto View"))
  1388. {
  1389. ActionAuto = interlockActionAutoViewModel.AutoSelected;
  1390. }
  1391. }
  1392. public void SelectCondition()
  1393. {
  1394. var windowManager = IoC.Get<IWindowManager>();
  1395. InterlockConditionViewModel interlockConditionViewModel = new InterlockConditionViewModel();
  1396. if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(interlockConditionViewModel, null, "Interlock Condition View"))
  1397. {
  1398. LimitCondition = interlockConditionViewModel.ConditionSelected;
  1399. }
  1400. }
  1401. public void SelectLimit()
  1402. {
  1403. if (InterlockLimitSelectIndex != -1 && InterlockLimits.Count > 0)
  1404. {
  1405. LimitItem = InterlockLimits[InterlockLimitSelectIndex].LimitName;
  1406. LimitCondition = InterlockLimits[InterlockLimitSelectIndex].LimitCondition;
  1407. var value = InterlockLimits[InterlockLimitSelectIndex].LimitValue;
  1408. if (value.Contains("H"))
  1409. {
  1410. LimitCheck = ">=";
  1411. LimitValue = value.Replace("H", "");
  1412. IsEnabledLimitValue = true;
  1413. }
  1414. else if (value.Contains("L"))
  1415. {
  1416. LimitCheck = "<";
  1417. LimitValue = value.Replace("L", "");
  1418. IsEnabledLimitValue = true;
  1419. }
  1420. else
  1421. {
  1422. LimitCheck = value;
  1423. LimitValue = "0";
  1424. IsEnabledLimitValue = false;
  1425. }
  1426. if (LimitItem.Contains("MFC") || LimitItem.Contains("MFM"))
  1427. {
  1428. LimitUnit = "SCCM";
  1429. }
  1430. else if (LimitItem.Contains("APC"))
  1431. {
  1432. LimitUnit = "Torr";
  1433. }
  1434. else if (LimitItem.Contains("TEMP"))
  1435. {
  1436. LimitUnit = "℃";
  1437. }
  1438. else
  1439. {
  1440. LimitUnit = "";
  1441. }
  1442. }
  1443. }
  1444. public void ChangeLimit()
  1445. {
  1446. if (InterlockLimitSelectIndex != -1 && InterlockLimits.Count > 0)
  1447. {
  1448. if (string.IsNullOrEmpty(LimitItem) || LimitItem == "BLANK")
  1449. {
  1450. DialogBox.ShowWarning("Limit item is empty,can not add!");
  1451. return;
  1452. }
  1453. if (string.IsNullOrEmpty(LimitCondition))
  1454. {
  1455. DialogBox.ShowWarning("Limit condition is empty,can not add!");
  1456. return;
  1457. }
  1458. if (string.IsNullOrEmpty(LimitCheck) || LimitCheck == "BLANK")
  1459. {
  1460. DialogBox.ShowWarning("Limit check is empty,can not add!");
  1461. return;
  1462. }
  1463. if (IsEnabledLimitValue && string.IsNullOrEmpty(LimitValue))
  1464. {
  1465. DialogBox.ShowWarning("Limit value is empty,can not add!");
  1466. return;
  1467. }
  1468. //if (InterlockLimits.Any(x => x.LimitCondition == "BLANK") && LimitCondition == "BLANK" && InterlockLimits[InterlockLimitSelectIndex].LimitCondition != "BLANK")
  1469. //{
  1470. // DialogBox.ShowWarning("Alreay have condition is BLANK,can not add!");
  1471. // return;
  1472. //}
  1473. InterlockLimits[InterlockLimitSelectIndex].LimitName = LimitItem;
  1474. InterlockLimits[InterlockLimitSelectIndex].LimitCondition = LimitCondition;
  1475. //InterlockLimits[InterlockLimitSelectIndex].LimitValue = IsEnabledLimitValue ? LimitCheck + LimitValue : LimitCheck;
  1476. InterlockLimits[InterlockLimitSelectIndex].LimitValue = IsEnabledLimitValue ? LimitValue + _editLimitCheckReferenceDic[LimitCheck] : LimitCheck;
  1477. }
  1478. }
  1479. public void AddLimit()
  1480. {
  1481. if (string.IsNullOrEmpty(LimitItem) || LimitItem == "BLANK")
  1482. {
  1483. DialogBox.ShowWarning("Limit item is empty,can not add!");
  1484. return;
  1485. }
  1486. if (string.IsNullOrEmpty(LimitCondition))
  1487. {
  1488. DialogBox.ShowWarning("Limit condition is empty,can not add!");
  1489. return;
  1490. }
  1491. if (string.IsNullOrEmpty(LimitCheck) || LimitCheck == "BLANK")
  1492. {
  1493. DialogBox.ShowWarning("Limit check is empty,can not add!");
  1494. return;
  1495. }
  1496. if (IsEnabledLimitValue && string.IsNullOrEmpty(LimitValue))
  1497. {
  1498. DialogBox.ShowWarning("Limit value is empty,can not add!");
  1499. return;
  1500. }
  1501. //if (InterlockLimits.Any(x => x.LimitCondition == "BLANK") && LimitCondition == "BLANK")
  1502. //{
  1503. // DialogBox.ShowWarning("Alreay have condition is BLANK,can not add!");
  1504. // return;
  1505. //}
  1506. InterlockLimit interlockLimit = new InterlockLimit();
  1507. interlockLimit.LimitName = LimitItem;
  1508. interlockLimit.LimitCondition = LimitCondition;
  1509. //interlockLimit.LimitValue = IsEnabledLimitValue ? LimitCheck + LimitValue : LimitCheck;
  1510. interlockLimit.LimitValue = IsEnabledLimitValue ? LimitValue + _editLimitCheckReferenceDic[LimitCheck] : LimitCheck;
  1511. if (InterlockLimits.Where(x => x.LimitName == LimitItem).FirstOrDefault() != null)
  1512. {
  1513. DialogBox.ShowWarning($"Limit [{LimitItem}] is already existed");
  1514. return;
  1515. }
  1516. else
  1517. {
  1518. InterlockLimits.Add(interlockLimit);
  1519. }
  1520. }
  1521. public void DeleteLimit()
  1522. {
  1523. if (InterlockLimitSelectIndex != -1 && InterlockLimits.Count > 0)
  1524. {
  1525. if (!DialogBox.Confirm($"Are you sure delete limit [{InterlockLimits[InterlockLimitSelectIndex].LimitName}]"))
  1526. return;
  1527. InterlockLimits.RemoveAt(InterlockLimitSelectIndex);
  1528. if (InterlockLimits.Count == 0)
  1529. {
  1530. LimitItem = "BLANK";
  1531. LimitCheck = "BLANK";
  1532. LimitValue = "0";
  1533. LimitUnit = "";
  1534. LimitCondition = "AND";
  1535. IsEnabledLimitValue = false;
  1536. }
  1537. }
  1538. }
  1539. public void Update()
  1540. {
  1541. if (CurrentInterlock == null)
  1542. return;
  1543. if (InterlockLimits.Count == 0)
  1544. {
  1545. DialogBox.ShowWarning("Condition is empty,can not save!");
  1546. return;
  1547. }
  1548. if (string.IsNullOrEmpty(ActionItem) || ActionItem == "BLANK")
  1549. {
  1550. DialogBox.ShowWarning("Action item is empty,can not save!");
  1551. return;
  1552. }
  1553. if (string.IsNullOrEmpty(ActionCheck) || ActionCheck == "BLANK")
  1554. {
  1555. DialogBox.ShowWarning("Action check is empty,can not save!");
  1556. return;
  1557. }
  1558. if (IsEnabledActionTimeValue && string.IsNullOrEmpty(ActionTimeValue))
  1559. {
  1560. DialogBox.ShowWarning("Time value is empty,can not save!");
  1561. return;
  1562. }
  1563. //if (InterlockLimits[InterlockLimits.Count - 1].LimitCondition != "BLANK")
  1564. //{
  1565. // DialogBox.ShowWarning("The last condition must be 'BLANK',can not save!");
  1566. // return;
  1567. //}
  1568. InterlockBase interlock = new InterlockBase();
  1569. interlock.Action = ActionItem;
  1570. interlock.SetValue = IsEnabledActionTimeValue ? $"{ActionTimeCheck}{ActionTimeValue};" : "";
  1571. interlock.SetValue += $"{ActionCheck};{ActionAuto}";
  1572. interlock.InterlockOKFill = _greenFill;
  1573. for (int i = 0; i < InterlockLimits.Count; i++)
  1574. {
  1575. interlock.Children.Add(new InterlockBase() { Action = InterlockLimits[i].LimitName, LimitValue = InterlockLimits[i].LimitValue, Condition = InterlockLimits[i].LimitCondition, InterlockOKFill = _greenFill });
  1576. }
  1577. InterlockTreeEdit.Where(x => x.Action == CurrentInterlock.Action && x.SetValue == CurrentInterlock.SetValue).FirstOrDefault().SetValue = interlock.SetValue;
  1578. InterlockTreeEdit.Where(x => x.Action == CurrentInterlock.Action && x.SetValue == CurrentInterlock.SetValue).FirstOrDefault().InterlockOKFill = interlock.InterlockOKFill;
  1579. InterlockTreeEdit.Where(x => x.Action == CurrentInterlock.Action && x.SetValue == CurrentInterlock.SetValue).FirstOrDefault().Children = interlock.Children;
  1580. QueryDataClient.Instance.Service.SetInterlockConfigContent(GetXmlString());
  1581. InvokeClient.Instance.Service.DoOperation($"System.UpdateUserDefineInterlock", "");
  1582. InterlockLimits.Clear();
  1583. InterlockParamClear();
  1584. }
  1585. public void Save()
  1586. {
  1587. if (InterlockLimits.Count == 0)
  1588. {
  1589. DialogBox.ShowWarning("Condition is empty,can not save!");
  1590. return;
  1591. }
  1592. if (string.IsNullOrEmpty(ActionItem) || ActionItem == "BLANK")
  1593. {
  1594. DialogBox.ShowWarning("Action item is empty,can not save!");
  1595. return;
  1596. }
  1597. if (string.IsNullOrEmpty(ActionCheck) || ActionCheck == "BLANK")
  1598. {
  1599. DialogBox.ShowWarning("Action check is empty,can not save!");
  1600. return;
  1601. }
  1602. if (IsEnabledActionTimeValue && string.IsNullOrEmpty(ActionTimeValue))
  1603. {
  1604. DialogBox.ShowWarning("Time value is empty,can not save!");
  1605. return;
  1606. }
  1607. //if (InterlockLimits[InterlockLimits.Count - 1].LimitCondition != "BLANK")
  1608. //{
  1609. // DialogBox.ShowWarning("The last condition must be 'BLANK',can not save!");
  1610. // return;
  1611. //}
  1612. InterlockBase interlock = new InterlockBase();
  1613. interlock.Action = ActionItem;
  1614. interlock.SetValue = IsEnabledActionTimeValue ? $"{ActionTimeCheck}{ActionTimeValue};" : "";
  1615. interlock.SetValue += $"{ActionCheck};{ActionAuto}";
  1616. interlock.InterlockOKFill = _greenFill;
  1617. for (int i = 0; i < InterlockLimits.Count; i++)
  1618. {
  1619. interlock.Children.Add(new InterlockBase() { Action = InterlockLimits[i].LimitName, LimitValue = InterlockLimits[i].LimitValue, Condition = InterlockLimits[i].LimitCondition, InterlockOKFill = _greenFill });
  1620. }
  1621. if (InterlockTreeEdit.Any(x => x.Action == interlock.Action && x.SetValue == interlock.SetValue))
  1622. {
  1623. DialogBox.ShowWarning($"Action [{interlock.Action}] condition {interlock.SetValue} is already existed");
  1624. return;
  1625. }
  1626. else
  1627. {
  1628. InterlockTreeEdit.Add(interlock);
  1629. }
  1630. QueryDataClient.Instance.Service.SetInterlockConfigContent(GetXmlString());
  1631. InvokeClient.Instance.Service.DoOperation($"System.UpdateUserDefineInterlock", "");
  1632. InterlockLimits.Clear();
  1633. InterlockParamClear();
  1634. }
  1635. private string GetXmlString()
  1636. {
  1637. if (InterlockTreeEdit == null)
  1638. return string.Empty;
  1639. XmlDocument doc = new XmlDocument();
  1640. XmlElement node = doc.CreateElement("Interlock");
  1641. doc.AppendChild(node);
  1642. XmlNode nodeData = doc.SelectSingleNode("Interlock");
  1643. foreach (InterlockBase interlock in InterlockTreeEdit)
  1644. {
  1645. XmlElement actionnode = doc.CreateElement("Action");
  1646. if (interlock.Action.Contains("FLAG"))
  1647. actionnode.SetAttribute("Name", interlock.Action);
  1648. else
  1649. actionnode.SetAttribute("Name", _editInterlockIOReferenceDic[interlock.Action]);
  1650. actionnode.SetAttribute("Value", interlock.SetValue);
  1651. nodeData.AppendChild(actionnode);
  1652. foreach (InterlockBase limit in interlock.Children)
  1653. {
  1654. XmlElement limitnode = doc.CreateElement("Limit");
  1655. if (limit.Action.Contains("FLAG"))
  1656. limitnode.SetAttribute("Name", limit.Action);
  1657. else
  1658. limitnode.SetAttribute("Name", _editInterlockIOReferenceDic[limit.Action]);
  1659. limitnode.SetAttribute("Value", limit.LimitValue);
  1660. limitnode.SetAttribute("Condition", limit.Condition);
  1661. actionnode.AppendChild(limitnode);
  1662. }
  1663. }
  1664. return doc.OuterXml;
  1665. }
  1666. public void Export()
  1667. {
  1668. try
  1669. {
  1670. Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
  1671. dlg.DefaultExt = ".xml"; // Default file extension
  1672. dlg.FileName = $"InterlockUserDefine_{DateTime.Now:yyyyMMdd_HHmmss}";
  1673. dlg.Filter = "xml数据文件(*.xml)|*.xml"; // Filter files by extension
  1674. Nullable<bool> result = dlg.ShowDialog();// Show open file dialog box
  1675. if (result == true) // Process open file dialog box results
  1676. {
  1677. XmlDocument xml = new XmlDocument();
  1678. xml.LoadXml(GetXmlString());
  1679. xml.Save(dlg.FileName);
  1680. MessageBox.Show($"Export succeed, file save as {dlg.FileName}", "Export", MessageBoxButton.OK, MessageBoxImage.Information);
  1681. }
  1682. }
  1683. catch (Exception ex)
  1684. {
  1685. LOG.Write(ex);
  1686. MessageBox.Show("导出自定义Interlock发生错误", "导出失败", MessageBoxButton.OK, MessageBoxImage.Warning);
  1687. }
  1688. }
  1689. public void Import()
  1690. {
  1691. try
  1692. {
  1693. string filepath = "";
  1694. System.Windows.Forms.OpenFileDialog fd = new System.Windows.Forms.OpenFileDialog();
  1695. fd.Multiselect = false;
  1696. fd.Title = "Please Select File";
  1697. fd.Filter = "xml⽂件|*.xml";
  1698. if (fd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  1699. {
  1700. filepath = fd.FileName;
  1701. }
  1702. XmlDocument xmlConfig = new XmlDocument();
  1703. xmlConfig.Load(filepath);
  1704. XmlNode nodeInterlock = xmlConfig.SelectSingleNode("Interlock");
  1705. foreach (XmlNode item in nodeInterlock.ChildNodes)
  1706. {
  1707. InterlockBase interlock = new InterlockBase();
  1708. if (item.NodeType == XmlNodeType.Comment)
  1709. continue;
  1710. XmlElement actionNode = item as XmlElement;
  1711. if (actionNode == null) continue;
  1712. if (actionNode.Name != "Action")
  1713. {
  1714. continue;
  1715. }
  1716. if (IsSameActionName(actionNode.GetAttribute("Name")))
  1717. continue;
  1718. interlock.Action = actionNode.GetAttribute("Name");
  1719. interlock.Name = actionNode.GetAttribute("Name");
  1720. interlock.SetValue = actionNode.GetAttribute("Value");
  1721. interlock.InterlockOKFill = _greenFill;
  1722. //string doName = actionNode.GetAttribute("do");
  1723. //bool value = Convert.ToBoolean(actionNode.GetAttribute("value"));
  1724. //string tip = actionNode.GetAttribute("tip");
  1725. foreach (XmlElement limitNode in actionNode.ChildNodes)
  1726. {
  1727. if (limitNode.Name != "Limit")
  1728. {
  1729. continue;
  1730. }
  1731. string action = string.Empty;
  1732. if (limitNode.HasAttribute("Name"))
  1733. {
  1734. action = limitNode.GetAttribute("Name");
  1735. }
  1736. string condition = limitNode.GetAttribute("Condition");
  1737. condition = string.IsNullOrEmpty(condition) ? "AND" : condition;
  1738. interlock.Children.Add(new InterlockBase() { Action = action, Name = limitNode.GetAttribute("Name"), LimitValue = limitNode.GetAttribute("Value"), Condition = condition, InterlockOKFill = _greenFill });
  1739. }
  1740. InterlockTreeEdit.Add(interlock);
  1741. }
  1742. }
  1743. catch (Exception ex)
  1744. {
  1745. LOG.Write(ex);
  1746. MessageBox.Show("导入自定义Interlock发生错误", "导入失败", MessageBoxButton.OK, MessageBoxImage.Warning);
  1747. }
  1748. }
  1749. private bool IsSameActionName(string actionName)
  1750. {
  1751. bool isSame = false;
  1752. foreach (InterlockBase interlock in InterlockTreeEdit)
  1753. {
  1754. if (interlock.Action == actionName)
  1755. {
  1756. isSame = true;
  1757. break;
  1758. }
  1759. }
  1760. return isSame;
  1761. }
  1762. public void Delete()
  1763. {
  1764. if (CurrentInterlock == null)
  1765. return;
  1766. var interlock = InterlockTreeEdit.Where(x => x.Action == CurrentInterlock.Action).FirstOrDefault();
  1767. if (interlock != null)
  1768. {
  1769. if (!DialogBox.Confirm($"Are you sure delete Interlock [{CurrentInterlock.Action}]"))
  1770. return;
  1771. InterlockTreeEdit.Remove(CurrentInterlock);
  1772. QueryDataClient.Instance.Service.SetInterlockConfigContent(GetXmlString());
  1773. InvokeClient.Instance.Service.DoOperation($"System.UpdateUserDefineInterlock", "");
  1774. InterlockLimits.Clear();
  1775. InterlockParamClear();
  1776. }
  1777. }
  1778. private void InterlockParamClear()
  1779. {
  1780. LimitItem = "BLANK";
  1781. LimitCheck = "BLANK";
  1782. LimitValue = "0";
  1783. LimitUnit = "";
  1784. LimitCondition = "AND";
  1785. ActionTimeCheck = "BLANK";
  1786. ActionTimeValue = "0";
  1787. ActionItem = "BLANK";
  1788. ActionCheck = "BLANK";
  1789. IsEnabledLimitValue = false;
  1790. IsEnabledActionTimeValue = false;
  1791. }
  1792. public void InterlockFind(string findKey)
  1793. {
  1794. if (string.IsNullOrWhiteSpace(findKey) || string.IsNullOrEmpty(findKey))
  1795. {
  1796. if (IsShowInterlockMF)
  1797. {
  1798. InitMFTree("");
  1799. }
  1800. if (IsShowInterlockPM)
  1801. {
  1802. InitPMTree("");
  1803. }
  1804. if (IsShowInterlockEdit || IsShowInterlockEditDetail)
  1805. {
  1806. InitEditTree("");
  1807. }
  1808. }
  1809. else
  1810. {
  1811. if (IsShowInterlockMF)
  1812. {
  1813. InitMFTree(findKey);
  1814. }
  1815. if (IsShowInterlockPM)
  1816. {
  1817. InitPMTree(findKey);
  1818. }
  1819. if (IsShowInterlockEdit || IsShowInterlockEditDetail)
  1820. {
  1821. InitEditTree(findKey);
  1822. }
  1823. }
  1824. }
  1825. }
  1826. public class InterlockLimit : NotifiableItem
  1827. {
  1828. private string _limitName;
  1829. public string LimitName
  1830. {
  1831. get => _limitName;
  1832. set
  1833. {
  1834. _limitName = value;
  1835. InvokePropertyChanged(nameof(LimitName));
  1836. }
  1837. }
  1838. private string _limitCondition;
  1839. public string LimitCondition
  1840. {
  1841. get => _limitCondition;
  1842. set
  1843. {
  1844. _limitCondition = value;
  1845. InvokePropertyChanged(nameof(LimitCondition));
  1846. }
  1847. }
  1848. private string _limitValue;
  1849. public string LimitValue
  1850. {
  1851. get => _limitValue;
  1852. set
  1853. {
  1854. _limitValue = value;
  1855. InvokePropertyChanged(nameof(LimitValue));
  1856. }
  1857. }
  1858. }
  1859. public class InterlockBase : PropertyChangedBase
  1860. {
  1861. private string _name;
  1862. public string Name
  1863. {
  1864. get => _name;
  1865. set
  1866. {
  1867. _name = value;
  1868. NotifyOfPropertyChange(nameof(Name));
  1869. }
  1870. }
  1871. private string _action;
  1872. public string Action
  1873. {
  1874. get => _action;
  1875. set
  1876. {
  1877. _action = value;
  1878. NotifyOfPropertyChange(nameof(Action));
  1879. }
  1880. }
  1881. private string _setValue;
  1882. public string SetValue
  1883. {
  1884. get => _setValue;
  1885. set
  1886. {
  1887. _setValue = value;
  1888. NotifyOfPropertyChange(nameof(SetValue));
  1889. }
  1890. }
  1891. private string _limitValue;
  1892. public string LimitValue
  1893. {
  1894. get => _limitValue;
  1895. set
  1896. {
  1897. _limitValue = value;
  1898. NotifyOfPropertyChange(nameof(LimitValue));
  1899. }
  1900. }
  1901. private bool _interlockOK;
  1902. public bool InterlockOK
  1903. {
  1904. get => _interlockOK;
  1905. set
  1906. {
  1907. _interlockOK = value;
  1908. NotifyOfPropertyChange(nameof(InterlockOK));
  1909. }
  1910. }
  1911. private SolidColorBrush _interlockOKFill;
  1912. public SolidColorBrush InterlockOKFill
  1913. {
  1914. get => _interlockOKFill;
  1915. set
  1916. {
  1917. _interlockOKFill = value;
  1918. NotifyOfPropertyChange(nameof(InterlockOKFill));
  1919. }
  1920. }
  1921. private string _condition;
  1922. public string Condition
  1923. {
  1924. get => _condition;
  1925. set
  1926. {
  1927. _condition = value;
  1928. NotifyOfPropertyChange(nameof(Condition));
  1929. }
  1930. }
  1931. private bool _isExpanded;
  1932. public bool IsExpanded
  1933. {
  1934. get => _isExpanded;
  1935. set
  1936. {
  1937. _isExpanded = value;
  1938. NotifyOfPropertyChange(nameof(IsExpanded));
  1939. }
  1940. }
  1941. private ObservableCollection<InterlockBase> _children;
  1942. public ObservableCollection<InterlockBase> Children
  1943. {
  1944. get => _children;
  1945. set
  1946. {
  1947. _children = value;
  1948. NotifyOfPropertyChange(nameof(Children));
  1949. }
  1950. }
  1951. public InterlockBase()
  1952. {
  1953. Children = new ObservableCollection<InterlockBase>();
  1954. }
  1955. }
  1956. }