using MECF.Framework.Common.DataCenter; using MECF.Framework.Common.IOCore; using MECF.Framework.Common.OperationCenter; using OpenSEMI.ClientBase.IO; using Prism.Commands; using Prism.Mvvm; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Threading; namespace CyberX8_MainPages.ViewModels { public class IOViewModel : BindableBase { #region 私有属性 public string ModuleName; private Dictionary> _diMap = new Dictionary>(); private Dictionary> _doMap = new Dictionary>(); private Dictionary> _aiMap = new Dictionary>(); private Dictionary _aoMap = new Dictionary(); private ObservableCollection> m_AIs = new ObservableCollection>(); private ObservableCollection m_AOs = new ObservableCollection(); private ObservableCollection> m_DIs = new ObservableCollection>(); private ObservableCollection> m_DOs = new ObservableCollection>(); #endregion #region 属性 public ObservableCollection> AIs { get { return m_AIs; } set { SetProperty(ref m_AIs, value); } } public ObservableCollection AOs { get { return m_AOs; } set { SetProperty(ref m_AOs, value); } } public ObservableCollection> DIs { get { return m_DIs; } set { SetProperty(ref m_DIs, value); } } public ObservableCollection> DOs { get { return m_DOs; } set { SetProperty(ref m_DOs, value); } } #endregion #region 命令 private DelegateCommand> _SetDOCommand; public DelegateCommand> SetDOCommand => _SetDOCommand ?? (_SetDOCommand = new DelegateCommand>(SetDO)); private DelegateCommand _SetAOCommand; public DelegateCommand SetAOCommand => _SetAOCommand ?? (_SetAOCommand = new DelegateCommand(SetAO)); //private DelegateCommand _SetDOCommand; //public DelegateCommand SetDOCommand => // _SetDOCommand ?? (_SetDOCommand = new DelegateCommand(SetDO)); #endregion public IOViewModel() { DispatcherTimer timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromSeconds(2); timer.Tick += timer_Tick; timer.Start(); BuildIoSchema(); } void timer_Tick(object sender, EventArgs e) { GetIOs(); } #region 私有方法 public void SetAO(AOItem32 aoItem) { InvokeClient.Instance.Service.DoOperation("System.SetAoValue32", aoItem.Name, aoItem.NewValue); } private void SetDO(IOItem doItem) { InvokeClient.Instance.Service.DoOperation("System.SetDoValue", doItem.Name, !doItem.Value); } public void BuildIoSchema() { if (DIs.Count == 0) { var itemList = QueryDataClient.Instance.Service.GetData($"{ModuleName}.PLC.DIItemList"); if (itemList != null) { DIs = new ObservableCollection>(); foreach (var item in (List)itemList) { var io = new IOItem() { Index = item.Index, Name = item.Name, Value = item.BoolValue, Address = item.Address }; DIs.Add(io); _diMap.Add($"IO.{item.Name}", io); } } } if (DOs.Count == 0) { var itemList = QueryDataClient.Instance.Service.GetData($"{ModuleName}.PLC.DOItemList"); if (itemList != null) { DOs = new ObservableCollection>(); foreach (var item in (List)itemList) { var io = new IOItem() { Index = item.Index, Name = item.Name, Value = item.BoolValue, Address = item.Address }; DOs.Add(io); _doMap.Add($"IO.{item.Name}", io); } } } if (AIs.Count == 0) { var itemList = QueryDataClient.Instance.Service.GetData($"{ModuleName}.PLC.AIItemList"); if (itemList != null) { AIs = new ObservableCollection>(); foreach (var item in (List)itemList) { var io = new IOItem() { Index = item.Index, Name = item.Name, Value = item.ShortValue, Address = item.Address }; AIs.Add(io); _aiMap.Add($"IO32.{item.Name}", io); } } } if (AOs.Count == 0) { var itemList = QueryDataClient.Instance.Service.GetData($"{ModuleName}.PLC.AOItemList"); if (itemList != null) { AOs = new ObservableCollection(); foreach (var item in (List)itemList) { var io = new AOItem32() { Index = item.Index, Name = item.Name, Value = item.ShortValue, Address = item.Address }; AOs.Add(io); _aoMap.Add($"IO32.{item.Name}", io); } } } } public void GetIOs() { var diValues = QueryDataClient.Instance.Service.PollData(_diMap.Keys); foreach (var item in _diMap) { if (diValues.ContainsKey(item.Key)) _diMap[item.Key].Value = (bool)diValues[item.Key]; } var doValues = QueryDataClient.Instance.Service.PollData(_doMap.Keys); foreach (var item in _doMap) { if (doValues.ContainsKey(item.Key)) _doMap[item.Key].Value = (bool)doValues[item.Key]; } var aiValues = QueryDataClient.Instance.Service.PollData(_aiMap.Keys); foreach (var item in _aiMap) { if (aiValues.ContainsKey(item.Key)) _aiMap[item.Key].Value = (float)aiValues[item.Key]; } var aoValues = QueryDataClient.Instance.Service.PollData(_aoMap.Keys); foreach (var item in _aoMap) { if (aoValues.ContainsKey(item.Key)) _aoMap[item.Key].Value = (float)aoValues[item.Key]; } } #endregion } public class AOItem32 : IOItem { public static readonly DependencyProperty NewValueProperty = DependencyProperty.Register(nameof(NewValue), typeof(double), typeof(AOItem32), new PropertyMetadata((double)0)); public static readonly DependencyProperty TextSavedProperty = DependencyProperty.Register(nameof(TextSaved), typeof(bool), typeof(AOItem32), new PropertyMetadata(true)); public double NewValue { get { return (double)this.GetValue(NewValueProperty); } set { this.SetValue(NewValueProperty, (object)value); } } public bool TextSaved { get { return (bool)this.GetValue(TextSavedProperty); } set { this.SetValue(TextSavedProperty, (object)value); } } } }