MetalCellDevice.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Log;
  4. using Aitex.Core.Util;
  5. using MECF.Framework.Common.Persistent.Reservoirs;
  6. using MECF.Framework.Common.ToolLayout;
  7. using CyberX8_Core;
  8. using CyberX8_RT.Devices.LinMot;
  9. using CyberX8_RT.Devices.PowerSupplier;
  10. using Aitex.Core.RT.OperationCenter;
  11. using CyberX8_RT.Modules.Reservoir;
  12. using CyberX8_RT.Modules;
  13. using CyberX8_RT.Modules.Metal;
  14. using CyberX8_RT.Modules.Dryer;
  15. using MECF.Framework.Common.Persistent.Dryer;
  16. namespace CyberX8_RT.Devices.Metal
  17. {
  18. public class MetalCellDevice : BaseDevice, IDevice
  19. {
  20. #region 常量
  21. private const string PERSISTENT_VALUE = "PersistentValue";
  22. private const string AUTO = "Auto";
  23. private const string MANUAL = "Manual";
  24. private const string STRATUS = "Stratus";
  25. private const string DISABLED = "Disabled";
  26. #endregion
  27. #region 内部变量
  28. /// <summary>
  29. /// 操作当前状态
  30. /// </summary>
  31. protected RState _status;
  32. /// <summary>
  33. /// 持久化数据
  34. /// </summary>
  35. protected MetalPersistentValue _persistentValue;
  36. /// <summary>
  37. /// A面PowerSupplier
  38. /// </summary>
  39. protected CellPowerSupplier _sideAPowerSupplier;
  40. /// <summary>
  41. /// B面PowerSupplier
  42. /// </summary>
  43. protected CellPowerSupplier _sideBPowerSupplier;
  44. /// <summary>
  45. /// Linmot
  46. /// </summary>
  47. protected LinMotAxis _linmotAxis;
  48. /// <summary>
  49. /// Metal项
  50. /// </summary>
  51. private MetalItem _metalItem;
  52. #endregion
  53. #region 属性
  54. /// <summary>
  55. /// 状态
  56. /// </summary>
  57. public RState Status { get { return _status; } }
  58. /// <summary>
  59. /// 是否禁用
  60. /// </summary>
  61. public bool IsDisable { get { return _persistentValue == null || _persistentValue.OperatingMode == DISABLED; } }
  62. /// <summary>
  63. /// clamp off状态
  64. /// </summary>
  65. public bool ClampOff
  66. {
  67. get
  68. {
  69. if (_metalItem.SubType == STRATUS)
  70. {
  71. StandardHotMetalDevice metalDevice = DEVICE.GetDevice<StandardHotMetalDevice>(Module.ToString());
  72. return !metalDevice.MetalDeviceData.WaferHolderClamp;
  73. }
  74. else
  75. {
  76. CompactMembranMetalDevice metalDevice = DEVICE.GetDevice<CompactMembranMetalDevice>(Module.ToString());
  77. return !metalDevice.MetalDeviceData.WHClamp && metalDevice.MetalDeviceData.WHUnclamp;
  78. }
  79. }
  80. }
  81. /// <summary>
  82. /// 操作模式
  83. /// </summary>
  84. public string OperationMode { get { return _persistentValue.OperatingMode; } }
  85. /// <summary>
  86. /// 工程模式
  87. /// </summary>
  88. public string EngineerMode { get { return _persistentValue.RecipeOperatingMode; } }
  89. /// <summary>
  90. /// A面PowerSupplier
  91. /// </summary>
  92. public CellPowerSupplier SideAPowerSupplier { get { return _sideAPowerSupplier; } }
  93. /// <summary>
  94. /// B面PowerSupplier
  95. /// </summary>
  96. public CellPowerSupplier SideBPowerSupplier { get { return _sideBPowerSupplier; } }
  97. /// <summary>
  98. /// 是否为Auto
  99. /// </summary>
  100. public bool IsAuto { get { return _persistentValue != null ? _persistentValue.OperatingMode == AUTO : false; } }
  101. /// <summary>
  102. /// 是否为Auto
  103. /// </summary>
  104. public bool IsManual { get { return _persistentValue != null ? _persistentValue.OperatingMode == MANUAL : false; } }
  105. /// <summary>
  106. /// linmot motor on
  107. /// </summary>
  108. public bool IsLinmotMotorOn { get { return _linmotAxis != null ? _linmotAxis.IsMotorOn : false; } }
  109. #endregion
  110. /// <summary>
  111. /// 构造函数
  112. /// </summary>
  113. /// <param name="moduleName"></param>
  114. public MetalCellDevice(string moduleName) : base(moduleName, moduleName, moduleName, moduleName)
  115. {
  116. }
  117. /// <summary>
  118. /// 初始化
  119. /// </summary>
  120. /// <returns></returns>
  121. public virtual bool Initialize()
  122. {
  123. InitializeParameter();
  124. SubscribeData();
  125. InitializeOperation();
  126. return true;
  127. }
  128. /// <summary>
  129. /// 定时器执行
  130. /// </summary>
  131. public virtual bool OnTimer(int interval)
  132. {
  133. return true;
  134. }
  135. /// <summary>
  136. /// 初始化参数
  137. /// </summary>
  138. private void InitializeParameter()
  139. {
  140. _persistentValue = MetalPersistentManager.Instance.GetMetalPersistentValue(Module);
  141. if (_persistentValue == null)
  142. {
  143. LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, "Persistent Value Object is not exist");
  144. }
  145. _metalItem=MetalItemManager.Instance.GetMetalItem(Module);
  146. if(_metalItem!=null)
  147. {
  148. _sideAPowerSupplier = DEVICE.GetDevice<CellPowerSupplier>(_metalItem.PlatingPowerSupplyAID);
  149. _sideBPowerSupplier = DEVICE.GetDevice<CellPowerSupplier>(_metalItem.PlatingPowerSupplyBID);
  150. _linmotAxis = DEVICE.GetDevice<LinMotAxis>(_metalItem.LinmotID);
  151. }
  152. }
  153. /// <summary>
  154. /// 订阅数据
  155. /// </summary>
  156. private void SubscribeData()
  157. {
  158. DATA.Subscribe($"{Module}.{PERSISTENT_VALUE}", () => _persistentValue, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  159. DATA.Subscribe($"{Module}.SideAPowerSupplierData", () => _sideAPowerSupplier.PowerSupplierData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  160. DATA.Subscribe($"{Module}.SideBPowerSupplierData", () => _sideBPowerSupplier.PowerSupplierData, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  161. DATA.Subscribe($"{Module}.SideAPowerSupplier.ID", () => _sideAPowerSupplier.Module, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  162. DATA.Subscribe($"{Module}.SideAPowerSupplier.IsConnected", ()=>_sideAPowerSupplier.IsConnected, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  163. DATA.Subscribe($"{Module}.SideAPowerSupplier.Voltage", () => _sideAPowerSupplier.PowerSupplierData.Voltage, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  164. DATA.Subscribe($"{Module}.SideAPowerSupplier.Current", () => _sideAPowerSupplier.PowerSupplierData.Current, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  165. DATA.Subscribe($"{Module}.SideAPowerSupplier.SetPoint", () => _sideAPowerSupplier.PowerSupplierData.SetPoint, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  166. DATA.Subscribe($"{Module}.SideAPowerSupplier.RunModel", () => _sideAPowerSupplier.PowerSupplierData.PowerRunModelContent, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  167. DATA.Subscribe($"{Module}.SideAPowerSupplier.PowerControl", () => _sideAPowerSupplier.PowerSupplierData.PowerControlContent, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  168. DATA.Subscribe($"{Module}.SideAPowerSupplier.PowerStatus", () => _sideAPowerSupplier.PowerSupplierData.PowerStatusContent, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  169. DATA.Subscribe($"{Module}.SideAPowerSupplier.Enable", () => _sideBPowerSupplier.PowerSupplierData.Enabled, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  170. DATA.Subscribe($"{Module}.SideBPowerSupplier.ID", () => _sideBPowerSupplier.Module, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  171. DATA.Subscribe($"{Module}.SideBPowerSupplier.IsConnected", () => _sideAPowerSupplier.IsConnected, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  172. DATA.Subscribe($"{Module}.SideBPowerSupplier.Voltage", () => _sideBPowerSupplier.PowerSupplierData.Voltage, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  173. DATA.Subscribe($"{Module}.SideBPowerSupplier.Current", () => _sideBPowerSupplier.PowerSupplierData.Current, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  174. DATA.Subscribe($"{Module}.SideBPowerSupplier.SetPoint", () => _sideBPowerSupplier.PowerSupplierData.SetPoint, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  175. DATA.Subscribe($"{Module}.SideBPowerSupplier.RunModel", () => _sideBPowerSupplier.PowerSupplierData.PowerRunModelContent, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  176. DATA.Subscribe($"{Module}.SideBPowerSupplier.PowerControl", () => _sideBPowerSupplier.PowerSupplierData.PowerControlContent, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  177. DATA.Subscribe($"{Module}.SideBPowerSupplier.PowerStatus", () => _sideBPowerSupplier.PowerSupplierData.PowerStatusContent, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  178. DATA.Subscribe($"{Module}.SideBPowerSupplier.Enable", () => _sideBPowerSupplier.PowerSupplierData.Enabled, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  179. DATA.Subscribe($"{Module}.Linmot.ID", () => _linmotAxis.Module, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  180. DATA.Subscribe($"{Module}.Linmot.IsMotorOn", () => _linmotAxis.IsMotorOn, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  181. DATA.Subscribe($"{Module}.Linmot.IsError", ()=>_linmotAxis.IsError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  182. DATA.Subscribe($"{Module}.Linmot.IsSwitchOn", () => _linmotAxis.IsSwitchOn, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  183. DATA.Subscribe($"{Module}.Linmot.CurveSpeed", () => _linmotAxis.CurveSpeed, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  184. DATA.Subscribe($"{Module}.Linmot.ErrorCode", () => _linmotAxis.ErrorCode, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  185. DATA.Subscribe($"{Module}.Linmot.CurrentPosition", () => _linmotAxis.CurrentPosition, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  186. }
  187. /// <summary>
  188. /// 初始化操作
  189. /// </summary>
  190. protected virtual void InitializeOperation()
  191. {
  192. OP.Subscribe($"{Module}.DisabledAction", DisabledOperation);
  193. OP.Subscribe($"{Module}.ManualAction", ManualOperation);
  194. OP.Subscribe($"{Module}.AutoAction", AutoOperation);
  195. OP.Subscribe($"{Module}.EngineeringModeAction", EngineeringModeOperation);
  196. OP.Subscribe($"{Module}.ProductionModeAction", ProductionModeOperation);
  197. OP.Subscribe($"{Module}.SetMetalWaferSize", (cmd, args) => { return SetMetalWaferSize(cmd, args); });
  198. }
  199. /// <summary>
  200. /// 开始Curve
  201. /// </summary>
  202. /// <param name="speed"></param>
  203. /// <returns></returns>
  204. public bool StartCurveMotion(int speed)
  205. {
  206. if (_linmotAxis != null)
  207. {
  208. return _linmotAxis.StartCurve(speed);
  209. }
  210. else
  211. {
  212. LOG.WriteLog(eEvent.ERR_METAL, Module, "linmot is null");
  213. return false;
  214. }
  215. }
  216. /// <summary>
  217. /// 开始Curve
  218. /// </summary>
  219. /// <param name="speed"></param>
  220. /// <returns></returns>
  221. public bool ChangeCurveSpeedMotion(int speed)
  222. {
  223. if (_linmotAxis != null)
  224. {
  225. return _linmotAxis.ChangeCurveSpeed(speed);
  226. }
  227. else
  228. {
  229. LOG.WriteLog(eEvent.ERR_METAL, Module, "linmot is null");
  230. return false;
  231. }
  232. }
  233. /// <summary>
  234. /// ResetLinmot
  235. /// </summary>
  236. /// <returns></returns>
  237. public bool ResetLinmot()
  238. {
  239. if (_linmotAxis != null)
  240. {
  241. return _linmotAxis.ResetOperation("",false);
  242. }
  243. else
  244. {
  245. LOG.WriteLog(eEvent.ERR_METAL, Module, "linmot is null");
  246. return false;
  247. }
  248. }
  249. /// <summary>
  250. /// 检验Linmot Routine状态是否为结束状态
  251. /// </summary>
  252. /// <returns></returns>
  253. public bool CheckLinmotRoutineEnd()
  254. {
  255. if (_linmotAxis != null)
  256. {
  257. return _linmotAxis.Status==RState.End;
  258. }
  259. else
  260. {
  261. LOG.WriteLog(eEvent.ERR_METAL, Module, "linmot is null");
  262. return false;
  263. }
  264. }
  265. /// <summary>
  266. /// 检验Linmot Routine状态是否为错误状态
  267. /// </summary>
  268. /// <returns></returns>
  269. public bool CheckLinmotRoutineError()
  270. {
  271. if (_linmotAxis != null)
  272. {
  273. return _linmotAxis.Status == RState.Failed||_linmotAxis.Status==RState.Timeout;
  274. }
  275. else
  276. {
  277. return false;
  278. }
  279. }
  280. /// <summary>
  281. /// 停止Linmot
  282. /// </summary>
  283. /// <returns></returns>
  284. public bool StopLinmot()
  285. {
  286. if(_linmotAxis != null)
  287. {
  288. return _linmotAxis.StopOperation("", null);
  289. }
  290. else
  291. {
  292. LOG.WriteLog(eEvent.ERR_METAL, Module, "linmot is null");
  293. return false;
  294. }
  295. }
  296. #region Operation
  297. /// <summary>
  298. /// DisabledAction
  299. /// </summary>
  300. /// <param name="cmd"></param>
  301. /// <param name="param"></param>
  302. /// <returns></returns>
  303. public bool DisabledOperation(string cmd, object[] args)
  304. {
  305. string currentOperation = "Disabled";
  306. MetalEntity metalEntity = Singleton<RouteManager>.Instance.GetModule<MetalEntity>(Module);
  307. if (metalEntity == null || _persistentValue == null) return false;
  308. if (_persistentValue.OperatingMode != "Disabled") metalEntity.EnterInit();
  309. _persistentValue.OperatingMode = currentOperation;
  310. MetalPersistentManager.Instance.UpdatePersistentValue(Module);
  311. return true;
  312. }
  313. /// <summary>
  314. /// ManualAction
  315. /// </summary>
  316. /// <param name="cmd"></param>
  317. /// <param name="param"></param>
  318. /// <returns></returns>
  319. public bool ManualOperation(string cmd, object[] args)
  320. {
  321. string currentOperation = "Manual";
  322. MetalEntity metalEntity = Singleton<RouteManager>.Instance.GetModule<MetalEntity>(Module);
  323. if (metalEntity == null || _persistentValue == null) return false;
  324. if (_persistentValue.OperatingMode == "Auto" && metalEntity.IsBusy)
  325. {
  326. LOG.WriteLog(eEvent.ERR_METAL, Module, $"{Module} is Busy, can't change to manual mode");
  327. return false;
  328. }
  329. if (_persistentValue.OperatingMode != "Manual") metalEntity.EnterInit();
  330. _persistentValue.OperatingMode = currentOperation;
  331. MetalPersistentManager.Instance.UpdatePersistentValue(Module);
  332. return true;
  333. }
  334. /// <summary>
  335. /// AutoAction
  336. /// </summary>
  337. /// <param name="cmd"></param>
  338. /// <param name="param"></param>
  339. /// <returns></returns>
  340. public bool AutoOperation(string cmd, object[] args)
  341. {
  342. string currentOperation = "Auto";
  343. MetalEntity metalEntity = Singleton<RouteManager>.Instance.GetModule<MetalEntity>(Module);
  344. if(metalEntity == null || _persistentValue == null) return false;
  345. if (_persistentValue.OperatingMode != "Auto") metalEntity.EnterInit();
  346. _persistentValue.OperatingMode = currentOperation;
  347. MetalPersistentManager.Instance.UpdatePersistentValue(Module);
  348. return true;
  349. }
  350. /// <summary>
  351. /// EngineeringModeAction
  352. /// </summary>
  353. /// <param name="cmd"></param>
  354. /// <param name="param"></param>
  355. /// <returns></returns>
  356. private bool EngineeringModeOperation(string cmd, object[] args)
  357. {
  358. string currentRecipeOperation = "Engineering";
  359. if (_persistentValue != null)
  360. {
  361. _persistentValue.RecipeOperatingMode = currentRecipeOperation;
  362. }
  363. MetalPersistentManager.Instance.UpdatePersistentValue(Module);
  364. return true;
  365. }
  366. /// <summary>
  367. /// ProductionAction
  368. /// </summary>
  369. /// <param name="cmd"></param>
  370. /// <param name="param"></param>
  371. /// <returns></returns>
  372. private bool ProductionModeOperation(string cmd, object[] args)
  373. {
  374. string currentRecipeOperation = "Production";
  375. if (_persistentValue != null)
  376. {
  377. _persistentValue.RecipeOperatingMode = currentRecipeOperation;
  378. }
  379. MetalPersistentManager.Instance.UpdatePersistentValue(Module);
  380. return true;
  381. }
  382. private bool SetMetalWaferSize(string cmd, object[] args)
  383. {
  384. string metalWaferSize = args[0] as string;
  385. if (_persistentValue != null)
  386. {
  387. _persistentValue.MetalWaferSize = int.Parse(metalWaferSize);
  388. }
  389. MetalPersistentManager.Instance.UpdatePersistentValue(Module);
  390. return true;
  391. }
  392. #endregion
  393. #region Clamp
  394. /// <summary>
  395. /// Clamp Off
  396. /// </summary>
  397. /// <returns></returns>
  398. public bool WaferHolderClampOff()
  399. {
  400. if (_metalItem.SubType == STRATUS)
  401. {
  402. StandardHotMetalDevice metalDevice = DEVICE.GetDevice<StandardHotMetalDevice>(Module.ToString());
  403. return metalDevice.WaferHolderClampOff("", null);
  404. }
  405. else
  406. {
  407. CompactMembranMetalDevice metalDevice = DEVICE.GetDevice<CompactMembranMetalDevice>(Module.ToString());
  408. return metalDevice.WaferHolderUnclampOn("", null);
  409. }
  410. }
  411. #endregion
  412. public virtual void Monitor()
  413. {
  414. }
  415. public virtual void Reset()
  416. {
  417. }
  418. public virtual void Terminate()
  419. {
  420. }
  421. }
  422. }