IOViewModel.cs 8.9 KB

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