using FLY.Modbus; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace FLY.Winder.UI.Server { /// <summary> /// DRList.xaml 的交互逻辑 /// </summary> public partial class WdDRList : Window, INotifyPropertyChanged { ObservableCollection<DataToRegsView> dataToRegsViews = new ObservableCollection<DataToRegsView>(); Modbus.WithThread.ModbusMapper_Client plc; public event PropertyChangedEventHandler PropertyChanged; public WdDRList() { InitializeComponent(); } public void Init(Modbus.WithThread.ModbusMapper_Client plc) { this.plc = plc; for (int i = 0; i < plc.DRmap.Count(); i++) { var dr = plc.DRmap[i]; //获取描述 var type = dr.owner.GetType(); var propertyInfo = type.GetProperty(dr.propertyName); var attributes = propertyInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); string description = ""; if (attributes.Length > 0) { description = (attributes.First() as DescriptionAttribute).Description; } dataToRegsViews.Add(new DataToRegsView() { dr = dr, Addr = dr.addr, RegAddr = dr.regAddr, DataArea = dr.dataArea, OwnerName = dr.ownerName, IsNeedUpdate = dr.isNeedUpdate, PropertyName = dr.propertyName, Description = description, Value = dr.value }); } plc.PropertyChanged += Plc_PropertyChanged; plc.NameDataChanged += Plc_NameDataChanged; dataGrid.ItemsSource = dataToRegsViews; this.DataContext = this; } private void Plc_NameDataChanged(object sender, DataToRegs dr) { var drViews = from _drView in dataToRegsViews where _drView.dr == dr select _drView; if (drViews.Count() == 0) return; var drView = drViews.First(); drView.Value = dr.value; } private void Plc_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(plc.PlanUpdateTime)) { for (int i = 0; i < plc.DRmap.Count(); i++) { var dr = plc.DRmap[i]; dataToRegsViews[i].IsNeedUpdate = dr.isNeedUpdate; } } } public int SearchIndex { get; private set; } = -1; public string SearchText { get; set; } private void btnSearchDownClick(object sender, RoutedEventArgs e) { if (string.IsNullOrEmpty(SearchText)) { MessageBox.Show("输入为空", "异常", MessageBoxButton.OK, MessageBoxImage.Hand); return; } int newSearchIndex = -1; for (int i = SearchIndex + 1; i < dataToRegsViews.Count(); i++) { if (dataToRegsViews[i].OwnerName.Contains(SearchText)) { //找到了 newSearchIndex = i; break; } if (dataToRegsViews[i].PropertyName.Contains(SearchText)) { //找到了 newSearchIndex = i; break; } if (dataToRegsViews[i].Description.Contains(SearchText)) { //找到了 newSearchIndex = i; break; } if (dataToRegsViews[i].RegAddr.Contains(SearchText)) { //找到了 newSearchIndex = i; break; } } if (newSearchIndex != -1) { SearchIndex = newSearchIndex; dataGrid.SelectedItem = dataToRegsViews[newSearchIndex]; dataGrid.ScrollIntoView(dataGrid.SelectedItem); return; } else { SearchIndex = -1; MessageBox.Show("不能找到更多", "异常", MessageBoxButton.OK, MessageBoxImage.Hand); return; } } private void btnSearchUpClick(object sender, RoutedEventArgs e) { if (string.IsNullOrEmpty(SearchText)) { MessageBox.Show("输入为空", "异常", MessageBoxButton.OK, MessageBoxImage.Hand); return; } int newSearchIndex = -1; for (int i = SearchIndex - 1; i >= 0 && i < dataToRegsViews.Count(); i--) { if (dataToRegsViews[i].OwnerName.Contains(SearchText)) { //找到了 newSearchIndex = i; break; } if (dataToRegsViews[i].PropertyName.Contains(SearchText)) { //找到了 newSearchIndex = i; break; } if (dataToRegsViews[i].Description.Contains(SearchText)) { //找到了 newSearchIndex = i; break; } if (dataToRegsViews[i].RegAddr.Contains(SearchText)) { //找到了 newSearchIndex = i; break; } } if (newSearchIndex != -1) { SearchIndex = newSearchIndex; dataGrid.SelectedItem = dataToRegsViews[newSearchIndex]; return; } else { SearchIndex = -1; MessageBox.Show("不能找到更多", "异常", MessageBoxButton.OK, MessageBoxImage.Hand); return; } } } /// <summary> /// 数据映射的类; /// Data: PC 属性 /// Regs: PLC 对象(寄存器、线圈) /// </summary> public class DataToRegsView : INotifyPropertyChanged { public DataToRegs dr; /// <summary> /// 对应 PLC寄存器区 coil or register /// </summary> public PLCAddressArea DataArea { get; set; } /// <summary> /// PLC寄存器 首地址 /// </summary> public int Addr { get; set; } /// <summary> /// 寄存器 原始地址字符串 /// </summary> public string RegAddr { get; set; } public string OwnerName { get; set; } /// <summary> /// object 的 property 名称, 只能是 数字类型都是double, 剩下就是 bool /// </summary> public string PropertyName { get; set; } /// <summary> /// property 描述 /// </summary> public string Description { get; set; } /// <summary> /// property 的值, 没有缩小. 只有 double 与 bool /// </summary> public object Value { get; set; } /// <summary> /// 需要从PLC读取数据更新 /// </summary> public bool IsNeedUpdate { get; set; } public event PropertyChangedEventHandler PropertyChanged; /// <summary> /// /// </summary> /// <returns></returns> public override string ToString() { return PropertyName + " [" + ((int)DataArea).ToString() + "](" + Addr + ")"; } } }