OperationOverViewModel.cs 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738
  1. using MECF.Framework.Common.CommonData;
  2. using MECF.Framework.Common.DataCenter;
  3. using MECF.Framework.Common.Equipment;
  4. using MECF.Framework.Common.OperationCenter;
  5. using OpenSEMI.ClientBase;
  6. using Prism.Commands;
  7. using Prism.Mvvm;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Windows;
  14. using System.Windows.Threading;
  15. using CyberX8_Core;
  16. using CyberX8_MainPages.Unity;
  17. using CyberX8_MainPages.Views;
  18. using CyberX8_Themes.CustomControls;
  19. using CyberX8_Themes.Unity;
  20. using CyberX8_Themes.UserControls;
  21. using Aitex.Core.RT.Log;
  22. using MECF.Framework.Common.Reservior;
  23. using MECF.Framework.Common.ProcessCell;
  24. using MECF.Framework.Common.Utilities;
  25. using Aitex.Sorter.Common;
  26. using MECF.Framework.Common.Schedulers;
  27. using MECF.Framework.Common.Beckhoff.Station;
  28. using MECF.Framework.Common.Layout;
  29. using Aitex.Core.RT.Routine;
  30. using Aitex.Core.RT.Device;
  31. using System.Reflection;
  32. using MECF.Framework.Common.Beckhoff.IOAxis;
  33. using MECF.Framework.Common.TwinCat;
  34. using LiveCharts.Wpf;
  35. using MECF.Framework.Common.CommonData.PUF;
  36. using MECF.Framework.Common.Beckhoff.AxisProvider;
  37. using QiHe.CodeLib;
  38. using MECF.Framework.Common.Jobs;
  39. namespace CyberX8_MainPages.ViewModels
  40. {
  41. public class OperationOverViewModel : BindableBase
  42. {
  43. #region 常量
  44. private const string CURRENT_STATION = "CurrentStation";
  45. private const string MOTOR_POSITION = "MotorPosition";
  46. private const string MOTION_DATA = "MotionData";
  47. private const double LOADER_ROTATION_DIFFER = 90;
  48. private const double PUF_FLIP_DIFFER = 180;
  49. #endregion
  50. #region 私有字段
  51. private bool _isLp1Unable;
  52. private bool _isLp2Unable;
  53. private bool _isLp3Unable;
  54. private ModuleInfo _LP1ModuleInfo;
  55. private ModuleInfo _LP2ModuleInfo;
  56. private ModuleInfo _LP3ModuleInfo;
  57. private ModuleInfo _EFEMModuleInfo;
  58. private ModuleInfo _srd1ModuleInfo;
  59. private ModuleInfo _srd2ModuleInfo;
  60. private ModuleInfo _puf1ModuleInfo;
  61. private ModuleInfo _puf2ModuleInfo;
  62. private ModuleInfo _dummy1ModuleInfo;
  63. private ModuleInfo _dummy2ModuleInfo;
  64. private ModuleInfo _loaderModuleInfo;
  65. private WaferRobotTAction m_Robot1TAction;
  66. private WaferRobotXAction m_Robot1XAction;
  67. private WaferRobotTAction m_Robot2TAction;
  68. private WaferRobotXAction m_Robot2XAction;
  69. private WaferRobotTAction m_Robot3TAction;
  70. private WaferRobotXAction m_Robot3XAction;
  71. private WaferRobotTAction m_Robot4TAction;
  72. private WaferRobotXAction m_Robot4XAction;
  73. private RobotMoveInfo m_robotMoveInfo;
  74. private WaferInfo m_srd1Wafer;
  75. private WaferInfo m_srd2Wafer;
  76. private WaferInfo m_puf1WaferA;
  77. private WaferInfo m_puf1WaferB;
  78. private WaferInfo m_puf2WaferA;
  79. private WaferInfo m_puf2WaferB;
  80. private WaferInfo m_loaderWaferA;
  81. private WaferInfo m_loaderWaferB;
  82. private List<string> m_RtDataKeys = new List<string>();
  83. private Dictionary<string, object> m_RtDataValues;
  84. private bool m_EFEMIsInstalled;
  85. private bool m_loaderInstalled;
  86. private bool m_puf1IsInRobotStation;
  87. private bool m_puf2IsInRobotStation;
  88. //private bool m_IsPUFChange;
  89. private WaferInfo m_EFEMBladeAWafer;
  90. private WaferInfo m_EFEMBladeBWafer;
  91. private WaferInfo m_Aligner1Wafer;
  92. private int m_LP1WaferCount;
  93. private int m_LP2WaferCount;
  94. private int m_LP3WaferCount;
  95. private int m_dummy1WaferCount;
  96. private int m_dummy2WaferCount;
  97. private int m_CycledWafer;
  98. private int m_CycleCountDisplay;
  99. private EFEM.RobotPosition m_CurrentRobotPosition;
  100. private PufControl.LoaderXLocation m_loaderAXLoaction = PufControl.LoaderXLocation.Parker;
  101. private PufControl.LoaderXLocation m_loaderBXLoaction = PufControl.LoaderXLocation.Parker;
  102. /// <summary>
  103. /// Loader的sideA开启状态
  104. /// </summary>
  105. private bool m_loaderWaferVisibleA = false;
  106. /// <summary>
  107. /// Loader的sideB开启状态
  108. /// </summary>
  109. private bool m_loaderWaferVisibleB = false;
  110. private WaferInfo m_BladeAWafer;
  111. private WaferInfo m_BladeBWafer;
  112. private string m_ATMModeIsOn;
  113. private string m_RouteState;
  114. /// <summary>
  115. /// puf1 Rotation ui 水平比例
  116. /// </summary>
  117. private double _puf1RotationRatio;
  118. /// <summary>
  119. /// puf2 Rotation ui 水平比例
  120. /// </summary>
  121. private double _puf2RotationRatio;
  122. ///// <summary>
  123. ///// puf1 Flip最大角度
  124. ///// </summary>
  125. //private double _puf1FlipMax;
  126. ///// <summary>
  127. ///// puf1 Flip最小角度
  128. ///// </summary>
  129. //private double _puf1FlipMin;
  130. ///// <summary>
  131. ///// puf2 Flip最大角度
  132. ///// </summary>
  133. //private double _puf2FlipMax;
  134. ///// <summary>
  135. ///// puf2 Flip最小角度
  136. ///// </summary>
  137. //private double _puf2FlipMin;
  138. /// <summary>
  139. /// 定时器
  140. /// </summary>
  141. private DispatcherTimer _timer;
  142. /// <summary>
  143. /// 定时器1
  144. /// </summary>
  145. private DispatcherTimer _timer1;
  146. /// <summary>
  147. /// puf Rotation UI水平距离
  148. /// </summary>
  149. private int _pufLayoutRotationDistance;
  150. /// <summary>
  151. /// Efem robot UI位置
  152. /// </summary>
  153. private int _robotLayoutPosition;
  154. /// <summary>
  155. /// Puf1 Rotation实际位置数据
  156. /// </summary>
  157. private double _puf1RotationMotorPosition;
  158. /// <summary>
  159. /// Puf2 Rotation实际位置数据
  160. /// </summary>
  161. private double _puf2RotationMotorPosition;
  162. /// <summary>
  163. /// Puf1 Flip实际位置数据
  164. /// </summary>
  165. private double _puf1FlipMotorPosition;
  166. /// <summary>
  167. /// Puf2 Flip实际位置数据
  168. /// </summary>
  169. private double _puf2FlipMotorPosition;
  170. /// <summary>
  171. /// Puf1 Flip UI位置
  172. /// </summary>
  173. private double _puf1FlipPosition;
  174. /// <summary>
  175. /// Puf2 Flip UI位置
  176. /// </summary>
  177. private double _puf2FlipPosition;
  178. /// <summary>
  179. /// Puf1 Rotation最左侧的位置
  180. /// </summary>
  181. private double _puf1RotationMotorPositionMax;
  182. /// <summary>
  183. /// Puf2 Rotation最左侧的位置
  184. /// </summary>
  185. private double _puf2RotationMotorPositionMin;
  186. /// <summary>
  187. /// Puf1 Rotation UI对应位置
  188. /// </summary>
  189. private double _puf1RotationPosition;
  190. /// <summary>
  191. /// Puf2 Rotation UI对应位置
  192. /// </summary>
  193. private double _puf2RotationPosition;
  194. /// <summary>
  195. /// Loader1 Rotation UI对应位置
  196. /// </summary>
  197. private double _loader1RotationPosition;
  198. /// <summary>
  199. /// Puf1 Rotation Axis
  200. /// </summary>
  201. private BeckhoffStationAxis _puf1RotationAxis;
  202. /// <summary>
  203. /// Puf2 Rotation Axis
  204. /// </summary>
  205. private BeckhoffStationAxis _puf2RotationAxis;
  206. /// <summary>
  207. /// Puf1 Flip Axis
  208. /// </summary>
  209. private BeckhoffStationAxis _puf1FlipAxis;
  210. /// <summary>
  211. /// Puf2 Flip Axis
  212. /// </summary>
  213. private BeckhoffStationAxis _puf2FlipAxis;
  214. /// <summary>
  215. /// Loader1 Rotation Axis
  216. /// </summary>
  217. private BeckhoffStationAxis _loader1RotationAxis;
  218. /// <summary>
  219. /// Loader1 TlitA Axis
  220. /// </summary>
  221. private BeckhoffStationAxis _loader1TiltAAxis;
  222. /// <summary>
  223. /// Loader1 TlitB Axis
  224. /// </summary>
  225. private BeckhoffStationAxis _loader1TiltBAxis;
  226. /// <summary>
  227. /// Loader1 Rotation实际位置数据
  228. /// </summary>
  229. private double _loader1RotationMotorPosition;
  230. /// <summary>
  231. /// Loader1 TiltA实际位置数据
  232. /// </summary>
  233. private double _loader1TiltAMotorPosition;
  234. /// <summary>
  235. /// Loader1 TiltB实际位置数据
  236. /// </summary>
  237. private double _loader1TiltBMotorPosition;
  238. /// <summary>
  239. /// Loader Rotation位置
  240. /// </summary>
  241. private LoaderControl.LoaderRotation m_currentLoaderRotation = LoaderControl.LoaderRotation.Load;
  242. /// <summary>
  243. /// Puf1 Flip当前station
  244. /// </summary>
  245. private string _puf1FlipCurrentStation;
  246. /// <summary>
  247. /// Puf2 Flip当前station
  248. /// </summary>
  249. private string _puf2FlipCurrentStation;
  250. /// <summary>
  251. /// Loader1 TiltA当前station
  252. /// </summary>
  253. private string _loaderTiltACurrentStation;
  254. /// <summary>
  255. /// Loader1 TiltB当前station
  256. /// </summary>
  257. private string _loaderTiltBCurrentStation;
  258. /// <summary>
  259. /// 是否存在Job
  260. /// </summary>
  261. private bool _isLp1HasNoJob;
  262. private bool _isLp2HasNoJob;
  263. private bool _isLp3HasNoJob;
  264. #endregion
  265. #region 属性
  266. public bool IsLP1Unable
  267. {
  268. get { return _isLp1Unable; }
  269. set { SetProperty(ref _isLp1Unable, value); }
  270. }
  271. public bool IsLP2Unable
  272. {
  273. get { return _isLp2Unable; }
  274. set { SetProperty(ref _isLp2Unable, value); }
  275. }
  276. public bool IsLP3Unable
  277. {
  278. get { return _isLp3Unable; }
  279. set { SetProperty(ref _isLp3Unable, value); }
  280. }
  281. public ModuleInfo LP1ModuleInfo
  282. {
  283. get { return _LP1ModuleInfo; }
  284. set { SetProperty(ref _LP1ModuleInfo, value); }
  285. }
  286. public ModuleInfo EFEMModuleInfo
  287. {
  288. get { return _EFEMModuleInfo; }
  289. set { SetProperty(ref _EFEMModuleInfo, value); }
  290. }
  291. public ModuleInfo LP2ModuleInfo
  292. {
  293. get { return _LP2ModuleInfo; }
  294. set { SetProperty(ref _LP2ModuleInfo, value); }
  295. }
  296. public ModuleInfo LP3ModuleInfo
  297. {
  298. get { return _LP3ModuleInfo; }
  299. set { SetProperty(ref _LP3ModuleInfo, value); }
  300. }
  301. public ModuleInfo SRD1ModuleInfo
  302. {
  303. get { return _srd1ModuleInfo; }
  304. set { SetProperty(ref _srd1ModuleInfo, value); }
  305. }
  306. public ModuleInfo SRD2ModuleInfo
  307. {
  308. get { return _srd2ModuleInfo; }
  309. set { SetProperty(ref _srd2ModuleInfo, value); }
  310. }
  311. public ModuleInfo PUF1ModuleInfo
  312. {
  313. get { return _puf1ModuleInfo; }
  314. set { SetProperty(ref _puf1ModuleInfo, value); }
  315. }
  316. public ModuleInfo PUF2ModuleInfo
  317. {
  318. get { return _puf2ModuleInfo; }
  319. set { SetProperty(ref _puf2ModuleInfo, value); }
  320. }
  321. public ModuleInfo Dummy1ModuleInfo
  322. {
  323. get { return _dummy1ModuleInfo; }
  324. set { SetProperty(ref _dummy1ModuleInfo, value); }
  325. }
  326. public ModuleInfo Dummy2ModuleInfo
  327. {
  328. get { return _dummy2ModuleInfo; }
  329. set { SetProperty(ref _dummy2ModuleInfo, value); }
  330. }
  331. public ModuleInfo LoaderModuleInfo
  332. {
  333. get { return _loaderModuleInfo; }
  334. set { SetProperty(ref _loaderModuleInfo, value); }
  335. }
  336. public WaferRobotTAction Robot1TAction
  337. {
  338. get { return m_Robot1TAction; }
  339. set { SetProperty(ref m_Robot1TAction, value); }
  340. }
  341. public WaferRobotXAction Robot1XAction
  342. {
  343. get { return m_Robot1XAction; }
  344. set { SetProperty(ref m_Robot1XAction, value); }
  345. }
  346. public WaferRobotTAction Robot2TAction
  347. {
  348. get { return m_Robot2TAction; }
  349. set { SetProperty(ref m_Robot2TAction, value); }
  350. }
  351. public WaferRobotXAction Robot2XAction
  352. {
  353. get { return m_Robot2XAction; }
  354. set { SetProperty(ref m_Robot2XAction, value); }
  355. }
  356. public WaferRobotTAction Robot3TAction
  357. {
  358. get { return m_Robot3TAction; }
  359. set { SetProperty(ref m_Robot3TAction, value); }
  360. }
  361. public WaferRobotXAction Robot3XAction
  362. {
  363. get { return m_Robot3XAction; }
  364. set { SetProperty(ref m_Robot3XAction, value); }
  365. }
  366. public WaferRobotTAction Robot4TAction
  367. {
  368. get { return m_Robot4TAction; }
  369. set { SetProperty(ref m_Robot4TAction, value); }
  370. }
  371. public WaferRobotXAction Robot4XAction
  372. {
  373. get { return m_Robot4XAction; }
  374. set { SetProperty(ref m_Robot4XAction, value); }
  375. }
  376. public RobotMoveInfo RobotMoveInfo
  377. {
  378. get { return m_robotMoveInfo; }
  379. set
  380. {
  381. RobotMoveInfoChanged(m_robotMoveInfo, value);
  382. //m_robotMoveInfo = value;
  383. SetProperty(ref m_robotMoveInfo, value);
  384. }
  385. }
  386. public Dictionary<string, object> RtDataValues
  387. {
  388. get { return m_RtDataValues; }
  389. set { SetProperty(ref m_RtDataValues, value); }
  390. }
  391. public bool EFEMIsInstalled
  392. {
  393. get { return m_EFEMIsInstalled; }
  394. set { SetProperty(ref m_EFEMIsInstalled, value); }
  395. }
  396. public WaferInfo EFEMBladeAWafer
  397. {
  398. get { return m_EFEMBladeAWafer; }
  399. set { SetProperty(ref m_EFEMBladeAWafer, value); }
  400. }
  401. public WaferInfo EFEMBladeBWafer
  402. {
  403. get { return m_EFEMBladeBWafer; }
  404. set { SetProperty(ref m_EFEMBladeBWafer, value); }
  405. }
  406. public bool LoaderIsInstalled
  407. {
  408. get { return m_loaderInstalled; }
  409. set { SetProperty(ref m_loaderInstalled, value); }
  410. }
  411. public WaferInfo Aligner1Wafer
  412. {
  413. get { return m_Aligner1Wafer; }
  414. set { SetProperty(ref m_Aligner1Wafer, value); }
  415. }
  416. public WaferInfo SRD1Wafer
  417. {
  418. get { return m_srd1Wafer; }
  419. set { SetProperty(ref m_srd1Wafer, value); }
  420. }
  421. public WaferInfo SRD2Wafer
  422. {
  423. get { return m_srd2Wafer; }
  424. set { SetProperty(ref m_srd2Wafer, value); }
  425. }
  426. public WaferInfo PUF1WaferA
  427. {
  428. get { return m_puf1WaferA; }
  429. set { SetProperty(ref m_puf1WaferA, value); }
  430. }
  431. public WaferInfo PUF1WaferB
  432. {
  433. get { return m_puf1WaferB; }
  434. set { SetProperty(ref m_puf1WaferB, value); }
  435. }
  436. public WaferInfo PUF2WaferA
  437. {
  438. get { return m_puf2WaferA; }
  439. set { SetProperty(ref m_puf2WaferA, value); }
  440. }
  441. public WaferInfo PUF2WaferB
  442. {
  443. get { return m_puf2WaferB; }
  444. set { SetProperty(ref m_puf2WaferB, value); }
  445. }
  446. public WaferInfo LoaderWaferA
  447. {
  448. get { return m_loaderWaferA; }
  449. set { SetProperty(ref m_loaderWaferA, value); }
  450. }
  451. public WaferInfo LoaderWaferB
  452. {
  453. get { return m_loaderWaferB; }
  454. set { SetProperty(ref m_loaderWaferB, value); }
  455. }
  456. public int LP1WaferCount
  457. {
  458. get { return m_LP1WaferCount; }
  459. set { SetProperty(ref m_LP1WaferCount, value); }
  460. }
  461. public int LP2WaferCount
  462. {
  463. get { return m_LP2WaferCount; }
  464. set { SetProperty(ref m_LP2WaferCount, value); }
  465. }
  466. public int LP3WaferCount
  467. {
  468. get { return m_LP3WaferCount; }
  469. set { SetProperty(ref m_LP3WaferCount, value); }
  470. }
  471. public int Dummy1WaferCount
  472. {
  473. get { return m_dummy1WaferCount; }
  474. set { SetProperty(ref m_dummy1WaferCount, value); }
  475. }
  476. public int Dummy2WaferCount
  477. {
  478. get { return m_dummy2WaferCount; }
  479. set { SetProperty(ref m_dummy2WaferCount, value); }
  480. }
  481. public int CycledWafer
  482. {
  483. get { return m_CycledWafer; }
  484. set { SetProperty(ref m_CycledWafer, value); }
  485. }
  486. public int CycleCountDisplay
  487. {
  488. get { return m_CycleCountDisplay; }
  489. set { SetProperty(ref m_CycleCountDisplay, value); }
  490. }
  491. public RobotMoveInfo m_EfemRobotMoveInfo;
  492. public RobotMoveInfo EfemRobotMoveInfo
  493. {
  494. get { return m_EfemRobotMoveInfo; }
  495. set
  496. {
  497. EFEMRobotMoveInfoChanged(m_EfemRobotMoveInfo, value);
  498. //m_EfemRobotMoveInfo = value;
  499. SetProperty(ref m_EfemRobotMoveInfo, value);
  500. }
  501. }
  502. public EFEM.RobotPosition CurrentRobotPosition
  503. {
  504. get { return m_CurrentRobotPosition; }
  505. set { SetProperty(ref m_CurrentRobotPosition, value); }
  506. }
  507. public PufControl.LoaderXLocation LoaderAXLocation
  508. {
  509. get { return m_loaderAXLoaction; }
  510. set { SetProperty(ref m_loaderAXLoaction, value); }
  511. }
  512. public PufControl.LoaderXLocation LoaderBXLocation
  513. {
  514. get { return m_loaderBXLoaction; }
  515. set { SetProperty(ref m_loaderBXLoaction, value); }
  516. }
  517. public WaferInfo BladeAWafer
  518. {
  519. get { return m_BladeAWafer; }
  520. set { SetProperty(ref m_BladeAWafer, value); }
  521. }
  522. public WaferInfo BladeBWafer
  523. {
  524. get { return m_BladeBWafer; }
  525. set { SetProperty(ref m_BladeBWafer, value); }
  526. }
  527. public string ATMModeIsOn
  528. {
  529. get { return m_ATMModeIsOn; }
  530. set { SetProperty(ref m_ATMModeIsOn, value); }
  531. }
  532. public string RouteState
  533. {
  534. get { return m_RouteState; }
  535. set { SetProperty(ref m_RouteState, value); }
  536. }
  537. /// <summary>
  538. /// Loader的sideA开启状态
  539. /// </summary>
  540. public bool LoaderWaferVisibleA
  541. {
  542. get { return m_loaderWaferVisibleA; }
  543. set { SetProperty(ref m_loaderWaferVisibleA, value); }
  544. }
  545. /// <summary>
  546. /// Loader的sideB开启状态
  547. /// </summary>
  548. public bool LoaderWaferVisibleB
  549. {
  550. get { return m_loaderWaferVisibleB; }
  551. set { SetProperty(ref m_loaderWaferVisibleB, value); }
  552. }
  553. public bool Puf1IsInRobotStation
  554. {
  555. get { return m_puf1IsInRobotStation; }
  556. set { SetProperty(ref m_puf1IsInRobotStation, value); }
  557. }
  558. public bool Puf2IsInRobotStation
  559. {
  560. get { return m_puf2IsInRobotStation; }
  561. set { SetProperty(ref m_puf2IsInRobotStation, value); }
  562. }
  563. /// <summary>
  564. /// Puf1 Rotation实际位置数据
  565. /// </summary>
  566. public double Puf1RotationMotorPosition
  567. {
  568. get { return _puf1RotationMotorPosition; }
  569. set { SetProperty(ref _puf1RotationMotorPosition, value); }
  570. }
  571. /// <summary>
  572. /// Puf2 Rotation实际位置数据
  573. /// </summary>
  574. public double Puf2RotationMotorPosition
  575. {
  576. get { return _puf2RotationMotorPosition; }
  577. set { SetProperty(ref _puf2RotationMotorPosition, value); }
  578. }
  579. /// <summary>
  580. /// Puf1 Flip实际位置数据
  581. /// </summary>
  582. public double Puf1FlipMotorPosition
  583. {
  584. get { return _puf1FlipMotorPosition; }
  585. set { SetProperty(ref _puf1FlipMotorPosition, value); }
  586. }
  587. /// <summary>
  588. /// Puf2 Flip实际位置数据
  589. /// </summary>
  590. public double Puf2FlipMotorPosition
  591. {
  592. get { return _puf2FlipMotorPosition; }
  593. set { SetProperty(ref _puf2FlipMotorPosition, value); }
  594. }
  595. /// <summary>
  596. /// Puf1 Flip UI位置
  597. /// </summary>
  598. public double Puf1FlipPosition
  599. {
  600. get { return _puf1FlipPosition; }
  601. set { SetProperty(ref _puf1FlipPosition, value); }
  602. }
  603. /// <summary>
  604. /// Puf2 Flip UI位置
  605. /// </summary>
  606. public double Puf2FlipPosition
  607. {
  608. get { return _puf2FlipPosition; }
  609. set { SetProperty(ref _puf2FlipPosition, value); }
  610. }
  611. /// <summary>
  612. /// Puf1 Rotation UI对应位置
  613. /// </summary>
  614. public double Puf1RotationPosition
  615. {
  616. get { return _puf1RotationPosition; }
  617. set { SetProperty(ref _puf1RotationPosition, value); }
  618. }
  619. /// <summary>
  620. /// Puf2 Rotation UI对应位置
  621. /// </summary>
  622. public double Puf2RotationPosition
  623. {
  624. get { return _puf2RotationPosition; }
  625. set { SetProperty(ref _puf2RotationPosition, value); }
  626. }
  627. /// <summary>
  628. /// Loader1 Rotation UI对应位置
  629. /// </summary>
  630. public double Loader1RotationPosition
  631. {
  632. get { return _loader1RotationPosition; }
  633. set { SetProperty(ref _loader1RotationPosition, value); }
  634. }
  635. /// <summary>
  636. /// Puf1 Rotation Axis
  637. /// </summary>
  638. public BeckhoffStationAxis Puf1RotationAxis
  639. {
  640. get { return _puf1RotationAxis; }
  641. set { SetProperty(ref _puf1RotationAxis, value); }
  642. }
  643. /// <summary>
  644. /// Puf1 Rotation Axis
  645. /// </summary>
  646. public BeckhoffStationAxis Puf2RotationAxis
  647. {
  648. get { return _puf2RotationAxis; }
  649. set { SetProperty(ref _puf2RotationAxis, value); }
  650. }
  651. /// <summary>
  652. /// Puf1 Flip Axis
  653. /// </summary>
  654. public BeckhoffStationAxis Puf1FlipAxis
  655. {
  656. get { return _puf1FlipAxis; }
  657. set { SetProperty(ref _puf1FlipAxis, value); }
  658. }
  659. /// <summary>
  660. /// Puf2 Flip Axis
  661. /// </summary>
  662. public BeckhoffStationAxis Puf2FlipAxis
  663. {
  664. get { return _puf2FlipAxis; }
  665. set { SetProperty(ref _puf2FlipAxis, value); }
  666. }
  667. /// <summary>
  668. /// Loader1 Rotation Axis
  669. /// </summary>
  670. public BeckhoffStationAxis Loader1RotationAxis
  671. {
  672. get { return _loader1RotationAxis; }
  673. set { SetProperty(ref _loader1RotationAxis, value); }
  674. }
  675. /// <summary>
  676. /// Loader1 TiltA Axis
  677. /// </summary>
  678. public BeckhoffStationAxis Loader1TiltAAxis
  679. {
  680. get { return _loader1TiltAAxis; }
  681. set { SetProperty(ref _loader1TiltAAxis, value); }
  682. }
  683. /// <summary>
  684. /// Loader1 TiltB Axis
  685. /// </summary>
  686. public BeckhoffStationAxis Loader1TiltBAxis
  687. {
  688. get { return _loader1TiltBAxis; }
  689. set { SetProperty(ref _loader1TiltBAxis, value); }
  690. }
  691. /// <summary>
  692. /// Loader1 Rotation实际位置数据
  693. /// </summary>
  694. public double Loader1RotationMotorPosition
  695. {
  696. get { return _loader1RotationMotorPosition; }
  697. set { SetProperty(ref _loader1RotationMotorPosition, value); }
  698. }
  699. /// <summary>
  700. /// Loader1 TiltA实际位置数据
  701. /// </summary>
  702. public double Loader1TiltAMotorPosition
  703. {
  704. get { return _loader1TiltAMotorPosition; }
  705. set { SetProperty(ref _loader1TiltAMotorPosition, value); }
  706. }
  707. /// <summary>
  708. /// Loader1 TiltB实际位置数据
  709. /// </summary>
  710. public double Loader1TiltBMotorPosition
  711. {
  712. get { return _loader1TiltBMotorPosition; }
  713. set { SetProperty(ref _loader1TiltBMotorPosition, value); }
  714. }
  715. /// <summary>
  716. /// Loader Rotation位置
  717. /// </summary>
  718. public LoaderControl.LoaderRotation CurrentLoaderRotation
  719. {
  720. get { return m_currentLoaderRotation; }
  721. set { SetProperty(ref m_currentLoaderRotation, value); }
  722. }
  723. public string LoaderTiltACurrentStation
  724. {
  725. get { return _loaderTiltACurrentStation; }
  726. set { SetProperty(ref _loaderTiltACurrentStation, value); }
  727. }
  728. /// <summary>
  729. /// Loader TiltB当前station
  730. /// </summary>
  731. public string LoaderTiltBCurrentStation
  732. {
  733. get { return _loaderTiltBCurrentStation; }
  734. set { SetProperty(ref _loaderTiltBCurrentStation, value); }
  735. }
  736. public bool IsLP1HasNoJob
  737. {
  738. get { return _isLp1HasNoJob; }
  739. set { SetProperty(ref _isLp1HasNoJob, value); }
  740. }
  741. public bool IsLP2HasNoJob
  742. {
  743. get { return _isLp2HasNoJob; }
  744. set { SetProperty(ref _isLp2HasNoJob, value); }
  745. }
  746. public bool IsLP3HasNoJob
  747. {
  748. get { return _isLp3HasNoJob; }
  749. set { SetProperty(ref _isLp3HasNoJob, value); }
  750. }
  751. #endregion
  752. #region 命令
  753. private DelegateCommand<object> _LoadWaferCommand;
  754. public DelegateCommand<object> LoadWaferCommand =>
  755. _LoadWaferCommand ?? (_LoadWaferCommand = new DelegateCommand<object>(OnLoadWafer));
  756. private DelegateCommand<object> _UnLoadWaferCommand;
  757. public DelegateCommand<object> UnLoadWaferCommand =>
  758. _UnLoadWaferCommand ?? (_UnLoadWaferCommand = new DelegateCommand<object>(OnUnLoadWafer));
  759. private DelegateCommand<object> _StartCommand;
  760. public DelegateCommand<object> StartCommand =>
  761. _StartCommand ?? (_StartCommand = new DelegateCommand<object>(OnStart));
  762. private DelegateCommand<object> _StopCommand;
  763. public DelegateCommand<object> StopCommand =>
  764. _StopCommand ?? (_StopCommand = new DelegateCommand<object>(OnStop));
  765. private DelegateCommand<object> _AbortCommand;
  766. public DelegateCommand<object> AbortCommand =>
  767. _AbortCommand ?? (_AbortCommand = new DelegateCommand<object>(OnAbort));
  768. private DelegateCommand _HomeAllCommand;
  769. public DelegateCommand HomeAllCommand =>
  770. _HomeAllCommand ?? (_HomeAllCommand = new DelegateCommand(OnHomeAll));
  771. private DelegateCommand _ResumeAllJobCommand;
  772. public DelegateCommand ResumeAllJobCommand =>
  773. _ResumeAllJobCommand ?? (_ResumeAllJobCommand = new DelegateCommand(OnResumeAllJob));
  774. private DelegateCommand _AbortAllCommand;
  775. public DelegateCommand AbortAllCommand =>
  776. _AbortAllCommand ?? (_AbortAllCommand = new DelegateCommand(OnAbortAll));
  777. private DelegateCommand _ReturnAllWaferCommand;
  778. public DelegateCommand ReturnAllWaferCommand =>
  779. _ReturnAllWaferCommand ?? (_ReturnAllWaferCommand = new DelegateCommand(OnReturnAllWafer));
  780. private DelegateCommand<object> _SetSequenceCommand;
  781. public DelegateCommand<object> SetSequenceCommand =>
  782. _SetSequenceCommand ?? (_SetSequenceCommand = new DelegateCommand<object>(OnSetSequence));
  783. private DelegateCommand _EnableAutoCommand;
  784. public DelegateCommand EnableAutoCommand =>
  785. _EnableAutoCommand ?? (_EnableAutoCommand = new DelegateCommand(OnEnableAuto));
  786. private DelegateCommand _EnableManualCommand;
  787. public DelegateCommand EnableManualCommand =>
  788. _EnableManualCommand ?? (_EnableManualCommand = new DelegateCommand(OnEnableManual));
  789. private DelegateCommand<object> _GotoSrdViewCommond;
  790. public DelegateCommand<object> GotoSrdViewCommond =>
  791. _GotoSrdViewCommond ?? (_GotoSrdViewCommond = new DelegateCommand<object>(GotoSrdViewAction));
  792. public bool SwitchFlag;
  793. #endregion
  794. #region 构造函数
  795. public OperationOverViewModel()
  796. {
  797. addDataKeys();
  798. ATMModeIsOn = Convert.ToBoolean(QueryDataClient.Instance.Service.GetConfig("System.IsATMMode")) == true ? "ATM Mode On" : "ATM Mode Off";
  799. }
  800. #endregion
  801. #region 命令方法
  802. /// <summary>
  803. /// 加载数据
  804. /// </summary>
  805. public void LoadData(string systemName)
  806. {
  807. Dictionary<string, object> allModulesDictionary = QueryDataClient.Instance.Service.PollData(new List<string>() { "System.InstalledModules" });
  808. if (allModulesDictionary != null)
  809. {
  810. List<string> allModules = CommonFunction.GetValue<List<string>>(allModulesDictionary, "System.InstalledModules");
  811. EFEMIsInstalled = allModules.Contains("EFEM");
  812. LoaderIsInstalled = allModules.Contains(ModuleName.Loader1.ToString());
  813. }
  814. if (_timer == null)
  815. {
  816. _timer = new DispatcherTimer();
  817. _timer.Interval = TimeSpan.FromMilliseconds(100);
  818. _timer.Tick += Timer_Tick;
  819. }
  820. _timer.Start();
  821. if (_timer1 == null)
  822. {
  823. _timer1 = new DispatcherTimer();
  824. _timer1.Interval = TimeSpan.FromMilliseconds(50);
  825. _timer1.Tick += Timer1_Tick;
  826. }
  827. _timer1.Start();
  828. _pufLayoutRotationDistance = (int)QueryDataClient.Instance.Service.GetConfig("DualPUF.PufLayoutRotationDistance");
  829. _robotLayoutPosition = (int)QueryDataClient.Instance.Service.GetConfig("DualPUF.RobotLayoutPosition");
  830. if (!m_RtDataKeys.Contains($"Station.PUF1.Roation"))
  831. {
  832. addStationDataKeys();
  833. }
  834. RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
  835. if (RtDataValues != null)
  836. {
  837. //目标位置数据获取
  838. Puf1RotationAxis = CommonFunction.GetValue<BeckhoffStationAxis>(RtDataValues, $"Station.PUF1.Rotation");
  839. Puf2RotationAxis = CommonFunction.GetValue<BeckhoffStationAxis>(RtDataValues, $"Station.PUF2.Rotation");
  840. //Puf1FlipAxis = CommonFunction.GetValue<BeckhoffStationAxis>(RtDataValues, $"Station.PUF1.Flip.{_waferSize}");
  841. //Puf2FlipAxis = CommonFunction.GetValue<BeckhoffStationAxis>(RtDataValues, $"Station.PUF2.Flip.{_waferSize}");
  842. //Loader1RotationAxis = CommonFunction.GetValue<BeckhoffStationAxis>(RtDataValues, $"Station.Loader1.Rotation.{_waferSize}");
  843. //Loader1TiltAAxis = CommonFunction.GetValue<BeckhoffStationAxis>(RtDataValues, $"Station.Loader1.TiltA.{_waferSize}");
  844. //Loader1TiltBAxis = CommonFunction.GetValue<BeckhoffStationAxis>(RtDataValues, $"Station.Loader1.TiltB.{_waferSize}");
  845. //Puf1Rotation比例尺计算
  846. var resultRotation = Puf1RotationAxis != null ? CalculateMaxMin(Puf1RotationAxis) : (0, 0);
  847. double distance = resultRotation.max - resultRotation.min;
  848. _puf1RotationRatio = distance / _pufLayoutRotationDistance;
  849. _puf1RotationMotorPositionMax = resultRotation.max;
  850. //Puf2Rotation比例尺计算
  851. resultRotation = Puf2RotationAxis != null ? CalculateMaxMin(Puf2RotationAxis) : (0, 0);
  852. distance = resultRotation.max - resultRotation.min;
  853. _puf2RotationRatio = distance / _pufLayoutRotationDistance;
  854. _puf2RotationMotorPositionMin = resultRotation.min;
  855. }
  856. }
  857. /// <summary>
  858. /// 隐藏
  859. /// </summary>
  860. public void Hide()
  861. {
  862. if (_timer != null)
  863. {
  864. _timer.Stop();
  865. }
  866. if (_timer1 != null)
  867. {
  868. _timer1.Stop();
  869. }
  870. }
  871. private void OnLoadWafer(object obj)
  872. {
  873. InvokeClient.Instance.Service.DoOperation($"{obj.ToString()}.Load", ModuleManager.ModuleInfos[obj.ToString()].ModuleID);
  874. }
  875. private void OnUnLoadWafer(object obj)
  876. {
  877. InvokeClient.Instance.Service.DoOperation($"{obj.ToString()}.Unload", ModuleManager.ModuleInfos[obj.ToString()].ModuleID);
  878. }
  879. private void OnStart(object obj)
  880. {
  881. var info = obj as WaferAssociationInfo;
  882. InvokeClient.Instance.Service.DoOperation("System.StartJob", info.LotId);
  883. }
  884. private void OnStop(object obj)
  885. {
  886. var info = obj as WaferAssociationInfo;
  887. InvokeClient.Instance.Service.DoOperation("System.PauseJob", info.JobID);
  888. }
  889. private void OnAbort(object obj)
  890. {
  891. var info = obj as WaferAssociationInfo;
  892. InvokeClient.Instance.Service.DoOperation("System.ResumeJob", info.JobID);
  893. }
  894. private void OnHomeAll()
  895. {
  896. InvokeClient.Instance.Service.DoOperation("System.HomeAll");
  897. }
  898. private void OnResumeAllJob()
  899. {
  900. if (CommonFunction.GetValue<int>(RtDataValues, "EquipmentStatus") == 4)
  901. {
  902. InvokeClient.Instance.Service.DoOperation("System.ResumeAllJob");
  903. }
  904. else
  905. {
  906. InvokeClient.Instance.Service.DoOperation("System.PauseAllJob");
  907. }
  908. }
  909. private void OnAbortAll()
  910. {
  911. InvokeClient.Instance.Service.DoOperation("System.Abort");
  912. }
  913. private void OnReturnAllWafer()
  914. {
  915. //Dialog
  916. WaferDialogView dialog = new WaferDialogView()
  917. {
  918. Owner = Application.Current.MainWindow,
  919. };
  920. dialog.Height = 300;
  921. dialog.Width = 400;
  922. double angel = 0;
  923. double coolingtime = 0;
  924. string message = "Please Confirm Return Wafer";
  925. WaferDialogViewModel vm = new WaferDialogViewModel();
  926. vm.ConfirmText = message;
  927. dialog.DataContext = vm;
  928. if (dialog.ShowDialog() == true)
  929. {
  930. if ((bool)dialog.AlignFlag == true && !string.IsNullOrEmpty(dialog.Angle))
  931. {
  932. angel = Convert.ToDouble(dialog.Angle);
  933. }
  934. if ((bool)dialog.CoolingFlag == true && !string.IsNullOrEmpty(dialog.CoolingTime))
  935. {
  936. coolingtime = Convert.ToDouble(dialog.CoolingTime);
  937. }
  938. InvokeClient.Instance.Service.DoOperation("System.ReturnAllWafer", dialog.CoolingFlag, coolingtime, dialog.AlignFlag, angel);
  939. }
  940. }
  941. private void OnSetSequence(object obj)
  942. {
  943. var info = obj as WaferInfo;
  944. bool flag = info.SequenceName != "" ? false : true;
  945. }
  946. private void OnEnableAuto()
  947. {
  948. InvokeClient.Instance.Service.DoOperation("System.SetAutoMode");
  949. }
  950. private void OnEnableManual()
  951. {
  952. InvokeClient.Instance.Service.DoOperation("System.SetManualMode");
  953. }
  954. private void GotoSrdViewAction(object obj)
  955. {
  956. CyberX8_Core.GlobalEvents.OnSwitchFixedTabItem("HardWare", "SRD", $"{obj.ToString()}");
  957. }
  958. #endregion
  959. #region 私有方法
  960. /// <summary>
  961. /// 定时器
  962. /// </summary>
  963. /// <param name="sender"></param>
  964. /// <param name="e"></param>
  965. private void Timer_Tick(object sender, EventArgs e)
  966. {
  967. LP1ModuleInfo = ModuleManager.ModuleInfos["LP1"];
  968. LP2ModuleInfo = ModuleManager.ModuleInfos["LP2"];
  969. LP3ModuleInfo = ModuleManager.ModuleInfos["LP3"];
  970. EFEMModuleInfo = ModuleManager.ModuleInfos["EfemRobot"];
  971. SRD1ModuleInfo = ModuleManager.ModuleInfos["SRD1"];
  972. SRD2ModuleInfo = ModuleManager.ModuleInfos["SRD2"];
  973. PUF1ModuleInfo = ModuleManager.ModuleInfos["PUF1"];
  974. PUF2ModuleInfo = ModuleManager.ModuleInfos["PUF2"];
  975. Dummy1ModuleInfo = ModuleManager.ModuleInfos["Dummy1"];
  976. Dummy2ModuleInfo = ModuleManager.ModuleInfos["Dummy2"];
  977. LoaderModuleInfo = ModuleManager.ModuleInfos["Loader1"];
  978. if (ModuleManager.ModuleInfos["EfemRobot"].WaferManager.Wafers.Count != 0)
  979. {
  980. BladeAWafer = ModuleManager.ModuleInfos["EfemRobot"].WaferManager.Wafers[0];
  981. }
  982. if (EFEMIsInstalled == true)
  983. {
  984. if (ModuleManager.ModuleInfos["EfemRobot"].WaferManager.Wafers.Count != 0)
  985. {
  986. EFEMBladeAWafer = ModuleManager.ModuleInfos["EfemRobot"].WaferManager.Wafers[0];
  987. }
  988. if (ModuleManager.ModuleInfos["Aligner1"].WaferManager.Wafers.Count != 0)
  989. {
  990. Aligner1Wafer = ModuleManager.ModuleInfos["Aligner1"].WaferManager.Wafers[0];
  991. }
  992. }
  993. if (SRD1ModuleInfo != null&& SRD1ModuleInfo.WaferManager.Wafers.Count!=0)
  994. {
  995. SRD1Wafer = SRD1ModuleInfo.WaferManager.Wafers[0];
  996. }
  997. if (SRD2ModuleInfo != null&& SRD2ModuleInfo.WaferManager.Wafers.Count!=0)
  998. {
  999. SRD2Wafer = SRD2ModuleInfo.WaferManager.Wafers[0];
  1000. }
  1001. if(PUF1ModuleInfo!=null)
  1002. {
  1003. if (PUF1ModuleInfo.WaferManager.Wafers.Count != 0)
  1004. {
  1005. PUF1WaferA = PUF1ModuleInfo.WaferManager.Wafers[0];
  1006. }
  1007. if (PUF1ModuleInfo.WaferManager.Wafers.Count != 0)
  1008. {
  1009. PUF1WaferB = PUF1ModuleInfo.WaferManager.Wafers[1];
  1010. }
  1011. }
  1012. if (PUF2ModuleInfo != null)
  1013. {
  1014. if (PUF2ModuleInfo.WaferManager.Wafers.Count != 0)
  1015. {
  1016. PUF2WaferA = PUF2ModuleInfo.WaferManager.Wafers[0];
  1017. }
  1018. if (PUF2ModuleInfo.WaferManager.Wafers.Count != 0)
  1019. {
  1020. PUF2WaferB = PUF2ModuleInfo.WaferManager.Wafers[1];
  1021. }
  1022. }
  1023. if(LoaderIsInstalled&&LoaderModuleInfo!=null)
  1024. {
  1025. if (LoaderModuleInfo.WaferManager.Wafers.Count != 0)
  1026. {
  1027. LoaderWaferA = LoaderModuleInfo.WaferManager.Wafers[0];
  1028. }
  1029. if (LoaderModuleInfo.WaferManager.Wafers.Count != 0)
  1030. {
  1031. LoaderWaferB = LoaderModuleInfo.WaferManager.Wafers[1];
  1032. }
  1033. }
  1034. RobotMoveInfo = (RobotMoveInfo)QueryDataClient.Instance.Service.GetData("TM.RobotMoveAction");
  1035. EfemRobotMoveInfo = (RobotMoveInfo)QueryDataClient.Instance.Service.GetData("EFEM.RobotMoveAction");
  1036. LP1WaferCount = LP1ModuleInfo.WaferManager.Wafers.Where(x => x.WaferStatus != 0).Count();
  1037. LP2WaferCount = LP2ModuleInfo.WaferManager.Wafers.Where(x => x.WaferStatus != 0).Count();
  1038. LP3WaferCount = LP3ModuleInfo.WaferManager.Wafers.Where(x => x.WaferStatus != 0).Count();
  1039. //Dummy1WaferCount = 15;
  1040. Dummy1WaferCount = Dummy1ModuleInfo.WaferManager.Wafers.Where(x => x.WaferStatus != 0).Count();
  1041. Dummy2WaferCount = Dummy2ModuleInfo.WaferManager.Wafers.Where(x => x.WaferStatus != 0).Count();
  1042. RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
  1043. IsLP1Unable = (bool)QueryDataClient.Instance.Service.GetConfig("EFEM.IsLoadPort1Unable");
  1044. IsLP2Unable = (bool)QueryDataClient.Instance.Service.GetConfig("EFEM.IsLoadPort2Unable");
  1045. IsLP3Unable = (bool)QueryDataClient.Instance.Service.GetConfig("EFEM.IsLoadPort3Unable");
  1046. if (RtDataValues != null)
  1047. {
  1048. Puf1IsInRobotStation = CommonFunction.GetValue<bool>(RtDataValues, "PUF1.IsInRobotStation");
  1049. Puf2IsInRobotStation = CommonFunction.GetValue<bool>(RtDataValues, "PUF2.IsInRobotStation");
  1050. if (CommonFunction.GetValue<int>(RtDataValues, "EquipmentStatus") == 4)
  1051. {
  1052. RouteState = "Resume";
  1053. }
  1054. else
  1055. {
  1056. RouteState = "Pause";
  1057. }
  1058. ControlJobInfo lp1Cj = CommonFunction.GetValue<ControlJobInfo>(RtDataValues, "LP1.CurrentControlJob");
  1059. IsLP1HasNoJob = lp1Cj == null ? true : false;
  1060. ControlJobInfo lp2Cj = CommonFunction.GetValue<ControlJobInfo>(RtDataValues, "LP2.CurrentControlJob");
  1061. IsLP2HasNoJob = lp2Cj == null ? true : false;
  1062. ControlJobInfo lp3Cj = CommonFunction.GetValue<ControlJobInfo>(RtDataValues, "LP3.CurrentControlJob");
  1063. IsLP3HasNoJob = lp3Cj == null ? true : false;
  1064. }
  1065. }
  1066. int count = 0;
  1067. /// <summary>
  1068. /// 定时器1
  1069. /// </summary>
  1070. /// <param name="sender"></param>
  1071. /// <param name="e"></param>
  1072. private void Timer1_Tick(object sender, EventArgs e)
  1073. {
  1074. if (m_RtDataKeys.Count != 0)
  1075. {
  1076. RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
  1077. if (RtDataValues != null)
  1078. {
  1079. Puf1RotationMotorPosition = CommonFunction.GetValue<double>(RtDataValues, $"PUF1.Rotation.{MOTOR_POSITION}");
  1080. Puf2RotationMotorPosition = CommonFunction.GetValue<double>(RtDataValues, $"PUF2.Rotation.{MOTOR_POSITION}");
  1081. Loader1TiltAMotorPosition = CommonFunction.GetValue<double>(RtDataValues, $"Loader1.TiltA.{MOTOR_POSITION}");
  1082. Loader1TiltBMotorPosition = CommonFunction.GetValue<double>(RtDataValues, $"Loader1.TiltB.{MOTOR_POSITION}");
  1083. Loader1RotationMotorPosition = CommonFunction.GetValue<double>(RtDataValues, $"Loader1.Rotation.{MOTOR_POSITION}");
  1084. Puf1FlipMotorPosition = CommonFunction.GetValue<double>(RtDataValues, $"PUF1.Flip.{MOTOR_POSITION}");
  1085. Puf2FlipMotorPosition = CommonFunction.GetValue<double>(RtDataValues, $"PUF2.Flip.{MOTOR_POSITION}");
  1086. //计算Puf1和Puf2 Rotation UI位置
  1087. Puf1RotationPosition = _robotLayoutPosition + (_puf1RotationMotorPositionMax - Puf1RotationMotorPosition) / _puf1RotationRatio;
  1088. Puf2RotationPosition = _robotLayoutPosition + (Puf2RotationMotorPosition - _puf2RotationMotorPositionMin) / _puf2RotationRatio;
  1089. //计Loader Rotation UI位置
  1090. Loader1RotationPosition = -Loader1RotationMotorPosition - LOADER_ROTATION_DIFFER;
  1091. //计算Puf1和Puf2 Flip UI位置
  1092. Puf1FlipPosition = Puf1FlipMotorPosition - PUF_FLIP_DIFFER;
  1093. Puf2FlipPosition = Puf2FlipMotorPosition - PUF_FLIP_DIFFER;
  1094. //判断Loader1的TiltA水平状态
  1095. LoaderTiltACurrentStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue<string>(RtDataValues, $"Loader1.TiltA.{CURRENT_STATION}"), "Loader1.TiltA");
  1096. if (LoaderTiltACurrentStation == "HORI")
  1097. {
  1098. LoaderWaferVisibleA = true;
  1099. }
  1100. else if(LoaderTiltACurrentStation == "VERT")
  1101. {
  1102. LoaderWaferVisibleA = false;
  1103. }
  1104. //判断Loader1的TiltB水平状态
  1105. LoaderTiltBCurrentStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue<string>(RtDataValues, $"Loader1.TiltB.{CURRENT_STATION}"), "Loader1.TiltB");
  1106. if (LoaderTiltBCurrentStation == "HORI")
  1107. {
  1108. LoaderWaferVisibleB = true;
  1109. }
  1110. else if (LoaderTiltBCurrentStation == "VERT")
  1111. {
  1112. LoaderWaferVisibleB = false;
  1113. }
  1114. }
  1115. }
  1116. }
  1117. private async void RobotMoveInfoChanged(RobotMoveInfo oldValue, RobotMoveInfo newValue)
  1118. {
  1119. string RobotTarget;
  1120. if (oldValue == null || newValue == null)
  1121. {
  1122. return;
  1123. }
  1124. #region Rotating
  1125. if ((oldValue.Action == RobotAction.None || oldValue.ArmTarget != newValue.ArmTarget) && (newValue.Action == RobotAction.Rotating))
  1126. {
  1127. var TMRobotMoveActionBladeTarget = newValue.BladeTarget;
  1128. if (TMRobotMoveActionBladeTarget != null)
  1129. {
  1130. RobotTarget = TMRobotMoveActionBladeTarget.ToString();
  1131. }
  1132. else
  1133. {
  1134. return;
  1135. }
  1136. var values = RobotTarget.Split('.');
  1137. var arm = values[0];
  1138. var module = values[1];
  1139. if (arm == "ArmA")
  1140. {
  1141. Robot1TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true);
  1142. }
  1143. else if (arm == "ArmB")
  1144. {
  1145. Robot2TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true);
  1146. }
  1147. }
  1148. #endregion
  1149. #region pick 和 place LL
  1150. else if ((oldValue.Action == RobotAction.None || oldValue.ArmTarget != newValue.ArmTarget) && (newValue.Action == RobotAction.Placing || newValue.Action == RobotAction.Picking))
  1151. {
  1152. var TMRobotMoveActionBladeTarget = newValue.BladeTarget;
  1153. if (TMRobotMoveActionBladeTarget != null)
  1154. {
  1155. RobotTarget = TMRobotMoveActionBladeTarget.ToString();
  1156. }
  1157. else
  1158. {
  1159. return;
  1160. }
  1161. var values = RobotTarget.Split('.');
  1162. var arm = values[0];
  1163. var module = values[1];
  1164. if (arm == "ArmA")
  1165. {
  1166. var waferRobotTAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true);
  1167. if (waferRobotTAction != Robot1TAction)
  1168. {
  1169. Robot1TAction = waferRobotTAction;
  1170. }
  1171. else
  1172. {
  1173. //await Task.Delay(100);
  1174. }
  1175. await Task.Delay(600);
  1176. //Robot1TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true);
  1177. //await Task.Delay(600);
  1178. Robot1XAction = WaferRobotXAction.Extend;
  1179. while ((newValue.Action == RobotAction.Placing && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[0].WaferStatus != 0) || (newValue.Action == RobotAction.Picking && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[0].WaferStatus == 0))
  1180. {
  1181. await Task.Delay(100);
  1182. }
  1183. Robot1XAction = WaferRobotXAction.Retract;
  1184. }
  1185. else if (arm == "ArmB")
  1186. {
  1187. var waferRobotTAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true);
  1188. if (waferRobotTAction != Robot2TAction)
  1189. {
  1190. Robot2TAction = waferRobotTAction;
  1191. }
  1192. else
  1193. {
  1194. //await Task.Delay(100);
  1195. }
  1196. await Task.Delay(600);
  1197. //Robot2TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true);
  1198. //await Task.Delay(600);
  1199. Robot2XAction = WaferRobotXAction.Extend;
  1200. while ((newValue.Action == RobotAction.Placing && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[1].WaferStatus != 0) || (newValue.Action == RobotAction.Picking && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[1].WaferStatus == 0))
  1201. {
  1202. await Task.Delay(100);
  1203. }
  1204. Robot2XAction = WaferRobotXAction.Retract;
  1205. }
  1206. }
  1207. #endregion
  1208. #region pick 和 place pm
  1209. else if ((oldValue.Action == RobotAction.None || oldValue.ArmTarget != newValue.ArmTarget) && newValue.Action == RobotAction.Extending)
  1210. {
  1211. var TMRobotMoveActionBladeTarget = newValue.BladeTarget;
  1212. if (TMRobotMoveActionBladeTarget != null)
  1213. {
  1214. RobotTarget = TMRobotMoveActionBladeTarget.ToString();
  1215. }
  1216. else
  1217. {
  1218. return;
  1219. }
  1220. var values = RobotTarget.Split('.');
  1221. var arm = values[0];
  1222. var module = values[1];
  1223. if (arm == "ArmA")
  1224. {
  1225. var waferRobotTAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true);
  1226. if (waferRobotTAction != Robot1TAction)
  1227. {
  1228. Robot1TAction = waferRobotTAction;
  1229. }
  1230. else
  1231. {
  1232. // await Task.Delay(100);
  1233. }
  1234. await Task.Delay(600);
  1235. Robot1XAction = WaferRobotXAction.Extend;
  1236. }
  1237. else if (arm == "ArmB")
  1238. {
  1239. var waferRobotTAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true);
  1240. if (waferRobotTAction != Robot2TAction)
  1241. {
  1242. Robot2TAction = waferRobotTAction;
  1243. }
  1244. else
  1245. {
  1246. // await Task.Delay(100);
  1247. }
  1248. await Task.Delay(600);
  1249. Robot2XAction = WaferRobotXAction.Extend;
  1250. }
  1251. }
  1252. else if ((oldValue.Action == RobotAction.None || oldValue.ArmTarget != newValue.ArmTarget) && newValue.Action == RobotAction.Retracting)
  1253. {
  1254. var TMRobotMoveActionBladeTarget = newValue.BladeTarget;
  1255. if (TMRobotMoveActionBladeTarget != null)
  1256. {
  1257. RobotTarget = TMRobotMoveActionBladeTarget.ToString();
  1258. }
  1259. else
  1260. {
  1261. return;
  1262. }
  1263. var values = RobotTarget.Split('.');
  1264. var arm = values[0];
  1265. if (arm == "ArmA")
  1266. {
  1267. Robot1XAction = WaferRobotXAction.Retract;
  1268. }
  1269. else if (arm == "ArmB")
  1270. {
  1271. Robot2XAction = WaferRobotXAction.Retract;
  1272. }
  1273. }
  1274. #endregion
  1275. #region Home
  1276. else if (oldValue.Action == RobotAction.None && newValue.Action == RobotAction.Homing)
  1277. {
  1278. if (Robot1XAction == WaferRobotXAction.Extend)
  1279. {
  1280. Robot1XAction = WaferRobotXAction.Retract;
  1281. }
  1282. if (Robot2XAction == WaferRobotXAction.Extend)
  1283. {
  1284. Robot2XAction = WaferRobotXAction.Retract;
  1285. }
  1286. await Task.Delay(2000);
  1287. if (Robot1TAction != WaferRobotTAction.T_Origin)
  1288. {
  1289. Robot1TAction = WaferRobotTAction.T_Origin;
  1290. }
  1291. if (Robot2TAction != WaferRobotTAction.T_Origin)
  1292. {
  1293. Robot2TAction = WaferRobotTAction.T_Origin;
  1294. }
  1295. }
  1296. #endregion
  1297. }
  1298. private async void EFEMRobotMoveInfoChanged(RobotMoveInfo oldValue, RobotMoveInfo newValue)
  1299. {
  1300. string RobotTarget;
  1301. if (oldValue == null || newValue == null)
  1302. {
  1303. return;
  1304. }
  1305. #region pick 和 place LL
  1306. if ((oldValue.Action == RobotAction.None || oldValue.ArmTarget != newValue.ArmTarget) && (newValue.Action == RobotAction.Placing || newValue.Action == RobotAction.Picking))
  1307. {
  1308. var TMRobotMoveActionBladeTarget = newValue.BladeTarget;
  1309. if (TMRobotMoveActionBladeTarget != null)
  1310. {
  1311. RobotTarget = TMRobotMoveActionBladeTarget.ToString();
  1312. }
  1313. else
  1314. {
  1315. return;
  1316. }
  1317. var values = RobotTarget.Split('.');
  1318. var arm = values[0];
  1319. var module = values[1];
  1320. if (arm == "ArmA")
  1321. {
  1322. var robot3Robot3TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true);
  1323. //await Task.Delay(1000);
  1324. await ChangePosition(robot3Robot3TAction, newValue.Action);
  1325. if (Robot3TAction != robot3Robot3TAction)
  1326. {
  1327. Robot3TAction = robot3Robot3TAction;
  1328. await Task.Delay(600);
  1329. }
  1330. Robot3XAction = WaferRobotXAction.Extend;
  1331. while ((newValue.Action == RobotAction.Placing && ModuleManager.ModuleInfos["EfemRobot"].WaferManager.Wafers[0].WaferStatus != 0) || (newValue.Action == RobotAction.Picking && ModuleManager.ModuleInfos["EfemRobot"].WaferManager.Wafers[0].WaferStatus == 0))
  1332. {
  1333. await Task.Delay(100);
  1334. }
  1335. Robot3XAction = WaferRobotXAction.Retract;
  1336. if(newValue.Action == RobotAction.Placing)
  1337. {
  1338. await ChangePosition(WaferRobotTAction.T_Origin, newValue.Action);
  1339. }
  1340. }
  1341. }
  1342. #endregion
  1343. #region pick 和 place pm
  1344. if (oldValue.Action == RobotAction.None && newValue.Action == RobotAction.Extending)
  1345. {
  1346. var TMRobotMoveActionBladeTarget = newValue.BladeTarget;
  1347. if (TMRobotMoveActionBladeTarget != null)
  1348. {
  1349. RobotTarget = TMRobotMoveActionBladeTarget.ToString();
  1350. }
  1351. else
  1352. {
  1353. return;
  1354. }
  1355. var values = RobotTarget.Split('.');
  1356. var arm = values[0];
  1357. var module = values[1];
  1358. if (arm == "ArmA")
  1359. {
  1360. Robot3TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true);
  1361. await Task.Delay(1500);
  1362. //ChangePosition(Robot3TAction);
  1363. //await Task.Delay(2000);
  1364. Robot3XAction = WaferRobotXAction.Extend;
  1365. }
  1366. else if (arm == "ArmB")
  1367. {
  1368. Robot4TAction = (WaferRobotTAction)Enum.Parse(typeof(WaferRobotTAction), module, true);
  1369. await Task.Delay(1500);
  1370. //ChangePosition(Robot4TAction);
  1371. //await Task.Delay(2000);
  1372. Robot4XAction = WaferRobotXAction.Extend;
  1373. }
  1374. }
  1375. if (oldValue.Action == RobotAction.None && newValue.Action == RobotAction.Retracting)
  1376. {
  1377. var TMRobotMoveActionBladeTarget = newValue.BladeTarget;
  1378. if (TMRobotMoveActionBladeTarget != null)
  1379. {
  1380. RobotTarget = TMRobotMoveActionBladeTarget.ToString();
  1381. }
  1382. else
  1383. {
  1384. return;
  1385. }
  1386. var values = RobotTarget.Split('.');
  1387. var arm = values[0];
  1388. if (arm == "ArmA")
  1389. {
  1390. Robot3XAction = WaferRobotXAction.Retract;
  1391. await Task.Delay(3000);
  1392. //ChangePosition(Robot3TAction);
  1393. //await Task.Delay(2000);
  1394. }
  1395. else if (arm == "ArmB")
  1396. {
  1397. Robot4XAction = WaferRobotXAction.Retract;
  1398. await Task.Delay(3000);
  1399. //ChangePosition(Robot3TAction);
  1400. //await Task.Delay(2000);
  1401. }
  1402. }
  1403. #endregion
  1404. #region Home
  1405. else if (oldValue.Action == RobotAction.None && newValue.Action == RobotAction.Homing)
  1406. {
  1407. if (Robot3XAction == WaferRobotXAction.Extend)
  1408. {
  1409. Robot3XAction = WaferRobotXAction.Retract;
  1410. }
  1411. if (Robot4XAction == WaferRobotXAction.Extend)
  1412. {
  1413. Robot4XAction = WaferRobotXAction.Retract;
  1414. }
  1415. if (Robot3TAction != WaferRobotTAction.T_Origin)
  1416. {
  1417. Robot3TAction = WaferRobotTAction.T_Origin;
  1418. }
  1419. if (Robot4TAction != WaferRobotTAction.T_Origin)
  1420. {
  1421. Robot4TAction = WaferRobotTAction.T_Origin;
  1422. }
  1423. await Task.Delay(1000);
  1424. await ChangePosition(WaferRobotTAction.T_Origin, newValue.Action);
  1425. }
  1426. #endregion
  1427. }
  1428. private void addDataKeys()
  1429. {
  1430. m_RtDataKeys.Add("LP1.IsLoaded");
  1431. m_RtDataKeys.Add("LP2.IsLoaded");
  1432. m_RtDataKeys.Add("LP3.IsLoaded");
  1433. m_RtDataKeys.Add("LP1.CassettePlaced");
  1434. m_RtDataKeys.Add("LP2.CassettePlaced");
  1435. m_RtDataKeys.Add("LP3.CassettePlaced");
  1436. m_RtDataKeys.Add("LP1.CurrentControlJob");
  1437. m_RtDataKeys.Add("LP2.CurrentControlJob");
  1438. m_RtDataKeys.Add("LP3.CurrentControlJob");
  1439. m_RtDataKeys.Add("System.IsAutoMode");
  1440. m_RtDataKeys.Add("System.IsBusy");
  1441. m_RtDataKeys.Add("Scheduler.CycledCount");
  1442. m_RtDataKeys.Add("Scheduler.CycledWafer");
  1443. m_RtDataKeys.Add("Scheduler.CycleSetPoint");
  1444. m_RtDataKeys.Add("Scheduler.Throughput");
  1445. m_RtDataKeys.Add("EquipmentStatus");
  1446. m_RtDataKeys.Add("Scheduler.PjNameList");
  1447. m_RtDataKeys.Add("PUF1.IsInRobotStation");
  1448. m_RtDataKeys.Add("PUF2.IsInRobotStation");
  1449. m_RtDataKeys.Add("Scheduler.CjNameList");
  1450. }
  1451. private void addStationDataKeys()
  1452. {
  1453. m_RtDataKeys.Add($"Station.PUF1.Rotation");
  1454. m_RtDataKeys.Add($"Station.PUF2.Rotation");
  1455. m_RtDataKeys.Add($"Station.PUF1.Flip");
  1456. m_RtDataKeys.Add($"Station.PUF2.Flip");
  1457. m_RtDataKeys.Add($"Station.PUF1.Vertical");
  1458. m_RtDataKeys.Add($"Station.PUF2.Vertical");
  1459. m_RtDataKeys.Add($"Station.Loader1.Rotation");
  1460. m_RtDataKeys.Add($"Station.Loader1.TiltA");
  1461. m_RtDataKeys.Add($"Station.Loader1.TiltB");
  1462. m_RtDataKeys.Add($"PUF1.Rotation.{MOTOR_POSITION}");
  1463. m_RtDataKeys.Add($"PUF2.Rotation.{MOTOR_POSITION}");
  1464. m_RtDataKeys.Add($"PUF1.Flip.{MOTOR_POSITION}");
  1465. m_RtDataKeys.Add($"PUF2.Flip.{MOTOR_POSITION}");
  1466. m_RtDataKeys.Add($"Loader1.Rotation.{MOTOR_POSITION}");
  1467. m_RtDataKeys.Add($"Loader1.TiltA.{MOTOR_POSITION}");
  1468. m_RtDataKeys.Add($"Loader1.TiltB.{MOTOR_POSITION}");
  1469. m_RtDataKeys.Add($"PUF1.Flip.{CURRENT_STATION}");
  1470. m_RtDataKeys.Add($"PUF2.Flip.{CURRENT_STATION}");
  1471. m_RtDataKeys.Add($"Loader1.TiltA.{CURRENT_STATION}");
  1472. m_RtDataKeys.Add($"Loader1.TiltB.{CURRENT_STATION}");
  1473. m_RtDataKeys.Add($"PUF1.Rotation.{MOTION_DATA}");
  1474. m_RtDataKeys.Add($"PUF2.Rotation.{MOTION_DATA}");
  1475. }
  1476. private bool HasWaferOnSlot(List<WaferInfo> wafers, int index)
  1477. {
  1478. if (wafers[index].WaferStatus == 0)
  1479. return false;
  1480. return true;
  1481. }
  1482. private async Task ChangePosition(WaferRobotTAction waferRobotTAction, RobotAction robotAction)
  1483. {
  1484. await Task.Delay(500);
  1485. int delay = 500;
  1486. if (robotAction == RobotAction.Placing)
  1487. {
  1488. if (waferRobotTAction == WaferRobotTAction.LP1 || waferRobotTAction == WaferRobotTAction.PUF1)
  1489. {
  1490. CurrentRobotPosition = EFEM.RobotPosition.Left_Place;
  1491. await Task.Delay(delay);
  1492. }
  1493. else if (waferRobotTAction == WaferRobotTAction.LP3)
  1494. {
  1495. CurrentRobotPosition = EFEM.RobotPosition.Right_Place;
  1496. await Task.Delay(delay);
  1497. }
  1498. else if (waferRobotTAction == WaferRobotTAction.LP2 || waferRobotTAction == WaferRobotTAction.PUF2)
  1499. {
  1500. CurrentRobotPosition = EFEM.RobotPosition.Middle_Place;
  1501. await Task.Delay(delay);
  1502. }
  1503. else if (waferRobotTAction == WaferRobotTAction.Aligner1)
  1504. {
  1505. CurrentRobotPosition = EFEM.RobotPosition.Aligner_Place;
  1506. await Task.Delay(delay);
  1507. }
  1508. else if (waferRobotTAction == WaferRobotTAction.SRD1 || waferRobotTAction == WaferRobotTAction.SRD2)
  1509. {
  1510. CurrentRobotPosition = EFEM.RobotPosition.SRD_Place;
  1511. }
  1512. else if (waferRobotTAction == WaferRobotTAction.Dummy1 || waferRobotTAction == WaferRobotTAction.Dummy2)
  1513. {
  1514. CurrentRobotPosition = EFEM.RobotPosition.Dummy_Place;
  1515. }
  1516. else
  1517. {
  1518. CurrentRobotPosition = EFEM.RobotPosition.Origin;
  1519. await Task.Delay(delay);
  1520. }
  1521. }
  1522. else
  1523. {
  1524. if (waferRobotTAction == WaferRobotTAction.LP1 || waferRobotTAction == WaferRobotTAction.PUF1)
  1525. {
  1526. CurrentRobotPosition = EFEM.RobotPosition.Left;
  1527. await Task.Delay(delay);
  1528. }
  1529. else if (waferRobotTAction == WaferRobotTAction.LP3)
  1530. {
  1531. CurrentRobotPosition = EFEM.RobotPosition.Right;
  1532. await Task.Delay(delay);
  1533. }
  1534. else if (waferRobotTAction == WaferRobotTAction.LP2 || waferRobotTAction == WaferRobotTAction.PUF2)
  1535. {
  1536. CurrentRobotPosition = EFEM.RobotPosition.Middle;
  1537. await Task.Delay(delay);
  1538. }
  1539. else if (waferRobotTAction == WaferRobotTAction.Aligner1)
  1540. {
  1541. CurrentRobotPosition = EFEM.RobotPosition.Aligner;
  1542. await Task.Delay(delay);
  1543. }
  1544. else if (waferRobotTAction == WaferRobotTAction.SRD1 || waferRobotTAction == WaferRobotTAction.SRD2)
  1545. {
  1546. CurrentRobotPosition = EFEM.RobotPosition.SRD;
  1547. }
  1548. else if (waferRobotTAction == WaferRobotTAction.Dummy1 || waferRobotTAction == WaferRobotTAction.Dummy2)
  1549. {
  1550. CurrentRobotPosition = EFEM.RobotPosition.Dummy;
  1551. }
  1552. else
  1553. {
  1554. CurrentRobotPosition = EFEM.RobotPosition.Origin;
  1555. await Task.Delay(delay);
  1556. }
  1557. }
  1558. }
  1559. /// <summary>
  1560. /// 计算最大值最小值
  1561. /// </summary>
  1562. /// <param name="Puf1RotationAxis"></param>
  1563. /// <returns></returns>
  1564. private (double max, double min) CalculateMaxMin(BeckhoffStationAxis pufAxis)
  1565. {
  1566. double max = 0;
  1567. double min = 0;
  1568. foreach (Station item in pufAxis.Stations)
  1569. {
  1570. double position = double.Parse(item.Position);
  1571. if (position > max)
  1572. {
  1573. max = position;
  1574. }
  1575. if (position < min)
  1576. {
  1577. min = position;
  1578. }
  1579. }
  1580. foreach (Station item in pufAxis.Stations)
  1581. {
  1582. double position = double.Parse(item.Position);
  1583. if (position > max)
  1584. {
  1585. max = position;
  1586. }
  1587. if (position < min)
  1588. {
  1589. min = position;
  1590. }
  1591. }
  1592. return (max, min);
  1593. }
  1594. /// <summary>
  1595. /// 判定是否在station位置
  1596. /// </summary>
  1597. private bool JudgeAtStation(double targetPosition, double currentPosition, double tolerance)
  1598. {
  1599. if (Math.Abs(currentPosition - targetPosition) <= tolerance)
  1600. {
  1601. return true;
  1602. }
  1603. else
  1604. {
  1605. return false;
  1606. }
  1607. }
  1608. #endregion
  1609. }
  1610. }