IOViewModel.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. using MECF.Framework.Common.DataCenter;
  2. using MECF.Framework.Common.IOCore;
  3. using MECF.Framework.Common.OperationCenter;
  4. using OpenSEMI.ClientBase.IO;
  5. using Prism.Commands;
  6. using Prism.Mvvm;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Collections.ObjectModel;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Windows;
  14. using System.Windows.Threading;
  15. namespace Venus_MainPages.ViewModels
  16. {
  17. public class IOViewModel : BindableBase
  18. {
  19. #region 私有字段
  20. public string ModuleName;
  21. private Dictionary<string, IOItem<bool>> _diMap = new Dictionary<string, IOItem<bool>>();
  22. private Dictionary<string, IOItem<bool>> _doMap = new Dictionary<string, IOItem<bool>>();
  23. private Dictionary<string, IOItem<float>> _aiMap = new Dictionary<string, IOItem<float>>();
  24. private Dictionary<string, AOItem32> _aoMap = new Dictionary<string, AOItem32>();
  25. private ObservableCollection<IOItem<float>> m_AIs = new ObservableCollection<IOItem<float>>();
  26. private ObservableCollection<AOItem32> m_AOs = new ObservableCollection<AOItem32>();
  27. private ObservableCollection<IOItem<bool>> m_DIs = new ObservableCollection<IOItem<bool>>();
  28. private ObservableCollection<IOItem<bool>> m_DOs = new ObservableCollection<IOItem<bool>>();
  29. DispatcherTimer timer;
  30. #endregion
  31. #region 属性
  32. public ObservableCollection<IOItem<float>> AIs
  33. {
  34. get { return m_AIs; }
  35. set { SetProperty(ref m_AIs, value); }
  36. }
  37. public ObservableCollection<AOItem32> AOs
  38. {
  39. get { return m_AOs; }
  40. set { SetProperty(ref m_AOs, value); }
  41. }
  42. public ObservableCollection<IOItem<bool>> DIs
  43. {
  44. get { return m_DIs; }
  45. set { SetProperty(ref m_DIs, value); }
  46. }
  47. public ObservableCollection<IOItem<bool>> DOs
  48. {
  49. get { return m_DOs; }
  50. set { SetProperty(ref m_DOs, value); }
  51. }
  52. #endregion
  53. #region 命令
  54. private DelegateCommand<IOItem<bool>> _SetDOCommand;
  55. public DelegateCommand<IOItem<bool>> SetDOCommand =>
  56. _SetDOCommand ?? (_SetDOCommand = new DelegateCommand<IOItem<bool>>(SetDO));
  57. private DelegateCommand<AOItem32> _SetAOCommand;
  58. public DelegateCommand<AOItem32> SetAOCommand =>
  59. _SetAOCommand ?? (_SetAOCommand = new DelegateCommand<AOItem32>(SetAO));
  60. //private DelegateCommand _SetDOCommand;
  61. //public DelegateCommand SetDOCommand =>
  62. // _SetDOCommand ?? (_SetDOCommand = new DelegateCommand(SetDO));
  63. #endregion
  64. public IOViewModel()
  65. {
  66. timer = new DispatcherTimer();
  67. timer.Interval = TimeSpan.FromSeconds(2);
  68. timer.Tick += timer_Tick;
  69. //timer.Start();
  70. BuildIoSchema();
  71. }
  72. void timer_Tick(object sender, EventArgs e)
  73. {
  74. GetIOs();
  75. }
  76. #region 私有方法
  77. public void SetAO(AOItem32 aoItem)
  78. {
  79. InvokeClient.Instance.Service.DoOperation("System.SetAoValue32", aoItem.Name, aoItem.NewValue);
  80. }
  81. private void SetDO(IOItem<bool> doItem)
  82. {
  83. InvokeClient.Instance.Service.DoOperation("System.SetDoValue", doItem.Name, !doItem.Value);
  84. }
  85. public void BuildIoSchema()
  86. {
  87. if (DIs.Count == 0)
  88. {
  89. var itemList = QueryDataClient.Instance.Service.GetData($"{ModuleName}.PLC.DIItemList");
  90. if (itemList != null)
  91. {
  92. DIs = new ObservableCollection<IOItem<bool>>();
  93. foreach (var item in (List<NotifiableIoItem>)itemList)
  94. {
  95. var io = new IOItem<bool>()
  96. {
  97. Index = item.Index,
  98. Name = item.Name,
  99. Value = item.BoolValue,
  100. Address = item.Address
  101. };
  102. DIs.Add(io);
  103. _diMap.Add($"IO.{item.Name}", io);
  104. }
  105. }
  106. }
  107. if (DOs.Count == 0)
  108. {
  109. var itemList = QueryDataClient.Instance.Service.GetData($"{ModuleName}.PLC.DOItemList");
  110. if (itemList != null)
  111. {
  112. DOs = new ObservableCollection<IOItem<bool>>();
  113. foreach (var item in (List<NotifiableIoItem>)itemList)
  114. {
  115. var io = new IOItem<bool>()
  116. {
  117. Index = item.Index,
  118. Name = item.Name,
  119. Value = item.BoolValue,
  120. Address = item.Address
  121. };
  122. DOs.Add(io);
  123. _doMap.Add($"IO.{item.Name}", io);
  124. }
  125. }
  126. }
  127. if (AIs.Count == 0)
  128. {
  129. var itemList = QueryDataClient.Instance.Service.GetData($"{ModuleName}.PLC.AIItemList");
  130. if (itemList != null)
  131. {
  132. AIs = new ObservableCollection<IOItem<float>>();
  133. foreach (var item in (List<NotifiableIoItem>)itemList)
  134. {
  135. var io = new IOItem<float>()
  136. {
  137. Index = item.Index,
  138. Name = item.Name,
  139. Value = item.ShortValue,
  140. Address = item.Address
  141. };
  142. AIs.Add(io);
  143. _aiMap.Add($"IO32.{item.Name}", io);
  144. }
  145. }
  146. }
  147. if (AOs.Count == 0)
  148. {
  149. var itemList = QueryDataClient.Instance.Service.GetData($"{ModuleName}.PLC.AOItemList");
  150. if (itemList != null)
  151. {
  152. AOs = new ObservableCollection<AOItem32>();
  153. foreach (var item in (List<NotifiableIoItem>)itemList)
  154. {
  155. var io = new AOItem32()
  156. {
  157. Index = item.Index,
  158. Name = item.Name,
  159. Value = item.ShortValue,
  160. Address = item.Address
  161. };
  162. AOs.Add(io);
  163. _aoMap.Add($"IO32.{item.Name}", io);
  164. }
  165. }
  166. }
  167. }
  168. public void GetIOs()
  169. {
  170. var diValues = QueryDataClient.Instance.Service.PollData(_diMap.Keys);
  171. foreach (var item in _diMap)
  172. {
  173. if (diValues.ContainsKey(item.Key))
  174. _diMap[item.Key].Value = (bool)diValues[item.Key];
  175. }
  176. var doValues = QueryDataClient.Instance.Service.PollData(_doMap.Keys);
  177. foreach (var item in _doMap)
  178. {
  179. if (doValues.ContainsKey(item.Key))
  180. _doMap[item.Key].Value = (bool)doValues[item.Key];
  181. }
  182. var aiValues = QueryDataClient.Instance.Service.PollData(_aiMap.Keys);
  183. foreach (var item in _aiMap)
  184. {
  185. if (aiValues.ContainsKey(item.Key))
  186. _aiMap[item.Key].Value = (float)aiValues[item.Key];
  187. }
  188. var aoValues = QueryDataClient.Instance.Service.PollData(_aoMap.Keys);
  189. foreach (var item in _aoMap)
  190. {
  191. if (aoValues.ContainsKey(item.Key))
  192. _aoMap[item.Key].Value = (float)aoValues[item.Key];
  193. }
  194. }
  195. public void EnterExitView(bool isEnter)
  196. {
  197. if (isEnter)
  198. {
  199. timer_Tick(null, null);
  200. timer.Start();
  201. }
  202. else
  203. {
  204. timer.Stop();
  205. }
  206. }
  207. #endregion
  208. }
  209. public class AOItem32 : IOItem<float>
  210. {
  211. public static readonly DependencyProperty NewValueProperty = DependencyProperty.Register(nameof(NewValue), typeof(float), typeof(AOItem32), new PropertyMetadata((object)(float)0));
  212. public static readonly DependencyProperty TextSavedProperty = DependencyProperty.Register(nameof(TextSaved), typeof(bool), typeof(AOItem32), new PropertyMetadata((object)true));
  213. public float NewValue
  214. {
  215. get
  216. {
  217. return (float)this.GetValue(NewValueProperty);
  218. }
  219. set
  220. {
  221. this.SetValue(NewValueProperty, (object)value);
  222. }
  223. }
  224. public bool TextSaved
  225. {
  226. get
  227. {
  228. return (bool)this.GetValue(TextSavedProperty);
  229. }
  230. set
  231. {
  232. this.SetValue(TextSavedProperty, (object)value);
  233. }
  234. }
  235. }
  236. }