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.Weight2.UI.Server { /// /// DRList.xaml 的交互逻辑 /// public partial class WdDRList : Window { ObservableCollection dataToRegsViews = new ObservableCollection(); Modbus.WithThread.ModbusMapper_Client plc; 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, DataArea = dr.dataArea, IsNeedUpdate = dr.isNeedUpdate, PropertyName = dr.propertyName, Description = description, Value = dr.value }); } plc.PropertyChanged += Plc_PropertyChanged; plc.NameDataChanged += Plc_NameDataChanged; dataGrid.ItemsSource = dataToRegsViews; } 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; } } } } /// /// 数据映射的类; /// Data: PC 属性 /// Regs: PLC 对象(寄存器、线圈) /// public class DataToRegsView : INotifyPropertyChanged { public DataToRegs dr; /// /// 对应 PLC寄存器区 coil or register /// public PLCAddressArea DataArea { get; set; } /// /// PLC 首地址 /// public int Addr { get; set; } /// /// object 的 property 名称, 只能是 数字类型都是double, 剩下就是 bool /// public string PropertyName { get; set; } /// /// property 描述 /// public string Description { get; set; } /// /// property 的值, 没有缩小. 只有 double 与 bool /// public object Value { get; set; } /// /// 需要从PLC读取数据更新 /// public bool IsNeedUpdate { get; set; } public event PropertyChangedEventHandler PropertyChanged; /// /// /// /// public override string ToString() { return PropertyName + " [" + ((int)DataArea).ToString() + "](" + Addr + ")"; } } }