TransporterViewModel.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. using MECF.Framework.Common.CommonData.Transporter;
  2. using MECF.Framework.Common.DataCenter;
  3. using MECF.Framework.Common.Equipment;
  4. using MECF.Framework.Common.Layout;
  5. using MECF.Framework.Common.ToolLayout;
  6. using MECF.Framework.Common.Utilities;
  7. using Prism.Mvvm;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Collections.ObjectModel;
  11. using System.ComponentModel;
  12. using System.IO;
  13. using System.Linq;
  14. using System.Reflection;
  15. using System.Text;
  16. using System.Threading.Tasks;
  17. using System.Timers;
  18. using System.Windows;
  19. using System.Windows.Controls;
  20. using System.Windows.Input;
  21. using System.Windows.Threading;
  22. namespace CyberX8_MainPages.ViewModels
  23. {
  24. public class TransporterViewModel : BindableBase
  25. {
  26. #region 常量
  27. private const string TRANSPORTER_DATA = "TransporterData";
  28. private const string IS_SWITCH_ON = "IsSwitchOn";
  29. private const string IS_HOMED = "IsHomed";
  30. private const string IS_MOVING = "IsMoving";
  31. #endregion
  32. #region 内部变量
  33. private ProcessLayout _processLayout;
  34. /// RT查询key集合
  35. /// </summary>
  36. private List<string> _rtDataKeys = new List<string>();
  37. /// <summary>
  38. /// rt查询key数值字典
  39. /// </summary>
  40. private Dictionary<string, object> _rtDataValueDic = new Dictionary<string, object>();
  41. /// <summary>
  42. /// 定时器
  43. /// </summary>
  44. private DispatcherTimer _timer;
  45. #region Loader Transporter
  46. private TransporterData _loaderTransporterData;
  47. private string _loaderbarcodeReaderDeviceName;
  48. private bool _loaderGantryMotorOn;
  49. private bool _loaderElevatorMotorOn;
  50. private bool _loaderGantryHomed;
  51. private bool _loaderElevatorHomed;
  52. private bool _loaderGantryMoving;
  53. private bool _loaderElevatorMoving;
  54. private bool _loaderElevatorInUpPlace;
  55. private string _loaderBarcode;
  56. private List<string> _loaderPositionList;
  57. private string _loaderFromSelectedItem;
  58. private string _loaderToSelectedItem;
  59. /// <summary>
  60. /// 模块Homed状态
  61. /// </summary>
  62. private bool _loaderTransporterIsHomed;
  63. #endregion
  64. #region Process Transporter
  65. private TransporterData _processTransporterData;
  66. private string _processbarcodeReaderDeviceName;
  67. private bool _processGantryMotorOn;
  68. private bool _processElevatorMotorOn;
  69. private bool _processGantryHomed;
  70. private bool _processElevatorHomed;
  71. private bool _processGantryMoving;
  72. private bool _processElevatorMoving;
  73. private bool _processElevatorInUpPlace;
  74. private string _processBarcode;
  75. private List<string> _processPositionList;
  76. private string _processFromSelectedItem;
  77. private string _processToSelectedItem;
  78. private bool _processTransporterIsHomed;
  79. #endregion
  80. #endregion
  81. #region 属性
  82. #region Loader Transporter
  83. public string LoaderBarcodeReaderDeviceName { get { return _loaderbarcodeReaderDeviceName; } set { SetProperty(ref _loaderbarcodeReaderDeviceName, value); } }
  84. public TransporterData LoaderTransporterData { get { return _loaderTransporterData; } set { SetProperty(ref _loaderTransporterData, value); } }
  85. public bool LoaderGantryMotorOn { get { return _loaderGantryMotorOn; } set { SetProperty(ref _loaderGantryMotorOn,value); } }
  86. public bool LoaderElevatorMotorOn { get { return _loaderElevatorMotorOn; } set { SetProperty(ref _loaderElevatorMotorOn,value); } }
  87. public bool LoaderGantryHomed { get { return _loaderGantryHomed; } set { SetProperty(ref _loaderGantryHomed,value); } }
  88. public bool LoaderElevatorHomed { get { return _loaderElevatorHomed; } set { SetProperty(ref _loaderElevatorHomed,value); } }
  89. public bool LoaderGantryMoving { get { return _loaderGantryMoving; } set { SetProperty(ref _loaderGantryMoving, value); } }
  90. public bool LoaderElevatorMoving { get { return _loaderElevatorMoving; } set { SetProperty(ref _loaderElevatorMoving,value); } }
  91. public bool LoaderElevatorIsInUpPlace { get { return _loaderElevatorInUpPlace; } set { SetProperty(ref _loaderElevatorInUpPlace, value); } }
  92. public string LoaderBarcode { get { return _loaderBarcode; } set { SetProperty(ref _loaderBarcode, value); } }
  93. public List<string> LoaderPositionList { get { return _loaderPositionList; } set { SetProperty(ref _loaderPositionList, value); } }
  94. public string LoaderFromSelectedItem { get { return _loaderFromSelectedItem; } set { SetProperty(ref _loaderFromSelectedItem, value); } }
  95. public string LoaderToSelectedItem { get { return _loaderToSelectedItem; } set { SetProperty(ref _loaderToSelectedItem, value); } }
  96. /// <summary>
  97. /// Loader Homed状态
  98. /// </summary>
  99. public bool LoaderTransporterIsHomed { get { return _loaderTransporterIsHomed; } set { SetProperty(ref _loaderTransporterIsHomed, value); } }
  100. #endregion
  101. #region Process Transporter
  102. public string ProcessBarcodeReaderDeviceName { get { return _processbarcodeReaderDeviceName; } set { SetProperty(ref _processbarcodeReaderDeviceName, value); } }
  103. public TransporterData ProcessTransporterData { get { return _processTransporterData; } set { SetProperty(ref _processTransporterData, value); } }
  104. public bool ProcessGantryMotorOn { get { return _processGantryMotorOn; } set { SetProperty(ref _processGantryMotorOn, value); } }
  105. public bool ProcessElevatorMotorOn { get { return _processElevatorMotorOn; } set { SetProperty(ref _processElevatorMotorOn, value); } }
  106. public bool ProcessGantryHomed { get { return _processGantryHomed; } set { SetProperty(ref _processGantryHomed, value); } }
  107. public bool ProcessElevatorHomed { get { return _processElevatorHomed; } set { SetProperty(ref _processElevatorHomed, value); } }
  108. public bool ProcessGantryMoving { get { return _processGantryMoving; } set { SetProperty(ref _processGantryMoving, value); } }
  109. public bool ProcessElevatorIsInUpPlace { get { return _processElevatorInUpPlace; } set { SetProperty(ref _processElevatorInUpPlace, value); } }
  110. public bool ProcessElevatorMoving { get { return _processElevatorMoving; } set { SetProperty(ref _processElevatorMoving, value); } }
  111. public string ProcessBarcode { get { return _processBarcode; } set { SetProperty(ref _processBarcode, value); } }
  112. public List<string> ProcessPositionList { get { return _processPositionList; } set { SetProperty(ref _processPositionList, value); } }
  113. public string ProcessFromSelectedItem { get { return _processFromSelectedItem; } set { SetProperty(ref _processFromSelectedItem, value); } }
  114. public string ProcessToSelectedItem { get { return _processToSelectedItem; } set { SetProperty(ref _processToSelectedItem, value); } }
  115. /// <summary>
  116. /// Process Homed状态
  117. /// </summary>
  118. public bool ProcessTransporterIsHomed { get { return _processTransporterIsHomed; } set { SetProperty(ref _processTransporterIsHomed, value); } }
  119. #endregion
  120. #endregion
  121. #region 指令
  122. #endregion
  123. /// <summary>
  124. /// 构造函数
  125. /// </summary>
  126. public TransporterViewModel()
  127. {
  128. LoaderPositionList = new List<string>();
  129. ProcessPositionList = new List<string>();
  130. }
  131. /// <summary>
  132. /// 加载数据
  133. /// </summary>
  134. public void LoadData(string system)
  135. {
  136. LoadLayout();
  137. LoadLoaderTransferPositionList();
  138. LoadProcessTransferPositionList();
  139. if (_timer == null)
  140. {
  141. _timer = new DispatcherTimer();
  142. _timer.Interval = TimeSpan.FromMilliseconds(200);
  143. _timer.Tick += Timer_Tick; ;
  144. }
  145. InitialKeys();
  146. _timer.Start();
  147. }
  148. private void Timer_Tick(object sender, EventArgs e)
  149. {
  150. if (_rtDataKeys.Count != 0)
  151. {
  152. _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
  153. if (_rtDataValueDic != null)
  154. {
  155. LoaderTransporterData = CommonFunction.GetValue<TransporterData>(_rtDataValueDic, $"{ModuleName.Transporter2}.{TRANSPORTER_DATA}");
  156. LoaderGantryMotorOn = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter2}.Gantry.{IS_SWITCH_ON}");
  157. LoaderGantryHomed = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter2}.Gantry.{IS_HOMED}");
  158. LoaderElevatorMotorOn = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter2}.Elevator.{IS_SWITCH_ON}");
  159. LoaderElevatorHomed = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter2}.Elevator.{IS_HOMED}");
  160. LoaderGantryMoving = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter2}.Gantry.{IS_MOVING}");
  161. LoaderElevatorMoving = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter2}.Elevator.{IS_MOVING}");
  162. LoaderTransporterIsHomed = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter2}.{IS_HOMED}");
  163. LoaderBarcode = CommonFunction.GetValue<string>(_rtDataValueDic, $"{LoaderBarcodeReaderDeviceName}.BarcodeValue");
  164. ProcessTransporterData = CommonFunction.GetValue<TransporterData>(_rtDataValueDic, $"{ModuleName.Transporter1}.{TRANSPORTER_DATA}");
  165. ProcessGantryMotorOn = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter1}.Gantry.{IS_SWITCH_ON}");
  166. ProcessGantryHomed = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter1}.Gantry.{IS_HOMED}");
  167. ProcessElevatorMotorOn = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter1}.Elevator.{IS_SWITCH_ON}");
  168. ProcessElevatorHomed = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter1}.Elevator.{IS_HOMED}");
  169. ProcessGantryMoving = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter1}.Gantry.{IS_MOVING}");
  170. ProcessElevatorMoving = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter1}.Elevator.{IS_MOVING}");
  171. ProcessTransporterIsHomed = CommonFunction.GetValue<bool>(_rtDataValueDic, $"{ModuleName.Transporter1}.{IS_HOMED}");
  172. ProcessBarcode = CommonFunction.GetValue<string>(_rtDataValueDic, $"{ProcessBarcodeReaderDeviceName}.BarcodeValue");
  173. string loaderElevatorStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue<string>(_rtDataValueDic, $"{ModuleName.Transporter2}.Elevator.CurrentStation"), $"{ModuleName.Transporter2}.Elevator");
  174. LoaderElevatorIsInUpPlace = "UP".Equals(loaderElevatorStation) ? true : false;
  175. string processElevatorStation = CommonFunction.GetCurrentStationLastContent(CommonFunction.GetValue<string>(_rtDataValueDic, $"{ModuleName.Transporter1}.Elevator.CurrentStation"), $"{ModuleName.Transporter1}.Elevator");
  176. ProcessElevatorIsInUpPlace = "UP".Equals(processElevatorStation) ? true : false;
  177. }
  178. }
  179. }
  180. /// <summary>
  181. /// 隐藏
  182. /// </summary>
  183. public void Hide()
  184. {
  185. if (_timer != null)
  186. {
  187. _timer.Stop();
  188. }
  189. }
  190. /// <summary>
  191. /// 加载Layout
  192. /// </summary>
  193. private void LoadLayout()
  194. {
  195. _rtDataKeys.Clear();
  196. _rtDataKeys.Add("System.Layout");
  197. _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
  198. if (_rtDataValueDic != null)
  199. {
  200. _processLayout = CommonFunction.GetValue<ProcessLayout>(_rtDataValueDic, "System.Layout");
  201. }
  202. }
  203. /// <summary>
  204. /// 加载Loader Transfer位置集合
  205. /// </summary>
  206. private void LoadLoaderTransferPositionList()
  207. {
  208. int startCellId = (int)QueryDataClient.Instance.Service.GetConfig($"Transporter.{ModuleName.Transporter2}.StartCellId");
  209. int endCellId = (int)QueryDataClient.Instance.Service.GetConfig($"Transporter.{ModuleName.Transporter2}.EndCellId");
  210. if (_processLayout != null && LoaderPositionList.Count == 0)
  211. {
  212. List<string> lst=GetCellItemsByRange(startCellId, endCellId,_processLayout.Items);
  213. LoaderPositionList.AddRange(lst);
  214. }
  215. }
  216. /// <summary>
  217. /// 加载Process Transfer位置集合
  218. /// </summary>
  219. private void LoadProcessTransferPositionList()
  220. {
  221. int startCellId = (int)QueryDataClient.Instance.Service.GetConfig($"Transporter.{ModuleName.Transporter1}.StartCellId");
  222. int endCellId = (int)QueryDataClient.Instance.Service.GetConfig($"Transporter.{ModuleName.Transporter1}.EndCellId");
  223. if (_processLayout != null && ProcessPositionList.Count == 0)
  224. {
  225. List<string> lst = GetCellItemsByRange(startCellId, endCellId, _processLayout.Items);
  226. ProcessPositionList.AddRange(lst);
  227. }
  228. }
  229. /// <summary>
  230. /// 获取指定范围的单元项集合
  231. /// </summary>
  232. /// <param name="startCellId"></param>
  233. /// <param name="endCellId"></param>
  234. /// <param name="items"></param>
  235. /// <returns></returns>
  236. private List<string> GetCellItemsByRange(int startCellId,int endCellId,List<ProcessLayoutCellItem> items)
  237. {
  238. List<string> lst = new List<string>();
  239. foreach(ProcessLayoutCellItem item in items)
  240. {
  241. if(item.CellId>=startCellId&&item.CellId<=endCellId)
  242. {
  243. if (!string.IsNullOrEmpty(item.ModuleName))
  244. {
  245. lst.Add(item.ModuleName);
  246. }
  247. }
  248. }
  249. return lst;
  250. }
  251. /// <summary>
  252. /// 初始化Keys
  253. /// </summary>
  254. private void InitialKeys()
  255. {
  256. _rtDataKeys.Clear();
  257. List<string> lst = new List<string>();
  258. lst.Add($"{ModuleName.Transporter1}.BarcodeReader");
  259. lst.Add($"{ModuleName.Transporter2}.BarcodeReader");
  260. _rtDataValueDic = QueryDataClient.Instance.Service.PollData(lst);
  261. if (_rtDataValueDic != null)
  262. {
  263. LoaderBarcodeReaderDeviceName = CommonFunction.GetValue<string>(_rtDataValueDic, $"{ModuleName.Transporter2}.BarcodeReader");
  264. ProcessBarcodeReaderDeviceName = CommonFunction.GetValue<string>(_rtDataValueDic, $"{ModuleName.Transporter1}.BarcodeReader");
  265. if (!string.IsNullOrEmpty(LoaderBarcodeReaderDeviceName))
  266. {
  267. _rtDataKeys.Add($"{LoaderBarcodeReaderDeviceName}.BarcodeValue");
  268. }
  269. if (!string.IsNullOrEmpty(ProcessBarcodeReaderDeviceName))
  270. {
  271. _rtDataKeys.Add($"{ProcessBarcodeReaderDeviceName}.BarcodeValue");
  272. }
  273. }
  274. _rtDataKeys.Add($"{ModuleName.Transporter1}.{TRANSPORTER_DATA}");
  275. _rtDataKeys.Add($"{ModuleName.Transporter1}.{IS_HOMED}");
  276. _rtDataKeys.Add($"{ModuleName.Transporter1}.Gantry.{IS_HOMED}");
  277. _rtDataKeys.Add($"{ModuleName.Transporter1}.Elevator.{IS_HOMED}");
  278. _rtDataKeys.Add($"{ModuleName.Transporter1}.Elevator.CurrentStation");
  279. _rtDataKeys.Add($"{ModuleName.Transporter1}.Gantry.{IS_SWITCH_ON}");
  280. _rtDataKeys.Add($"{ModuleName.Transporter1}.Elevator.{IS_SWITCH_ON}");
  281. _rtDataKeys.Add($"{ModuleName.Transporter1}.Gantry.{IS_MOVING}");
  282. _rtDataKeys.Add($"{ModuleName.Transporter1}.Elevator.{IS_MOVING}");
  283. _rtDataKeys.Add($"{ModuleName.Transporter2}.{TRANSPORTER_DATA}");
  284. _rtDataKeys.Add($"{ModuleName.Transporter2}.{IS_HOMED}");
  285. _rtDataKeys.Add($"{ModuleName.Transporter2}.Gantry.{IS_HOMED}");
  286. _rtDataKeys.Add($"{ModuleName.Transporter2}.Elevator.{IS_HOMED}");
  287. _rtDataKeys.Add($"{ModuleName.Transporter2}.Gantry.{IS_SWITCH_ON}");
  288. _rtDataKeys.Add($"{ModuleName.Transporter2}.Elevator.{IS_SWITCH_ON}");
  289. _rtDataKeys.Add($"{ModuleName.Transporter2}.Elevator.CurrentStation");
  290. _rtDataKeys.Add($"{ModuleName.Transporter2}.Gantry.{IS_MOVING}");
  291. _rtDataKeys.Add($"{ModuleName.Transporter2}.Elevator.{IS_MOVING}");
  292. }
  293. }
  294. }