using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Reflection; using System.Diagnostics; using System.Windows.Media; using FLY.OBJComponents.IService; using Misc; namespace FLY.Weight.Common { public class WeighterC:INotifyPropertyChanged,IPropertyOpt { public WeighterC(string number, int binCnt) { Number = number; BinCnt = binCnt; BinsBinding(); } public event PropertyChangedEventHandler PropertyChanged; #region IWeighterC实现 /// <summary> /// 名称:A,B,C,D,E /// </summary> public string Number { get; set; } /// <summary> /// 颜色 /// </summary> public Brush Color { get; set; } /// <summary> /// 料仓数 /// </summary> public int BinCnt { get; protected set; } #endregion #region 辅助代码生成 /// <summary> /// 报警开关 /// </summary> [Description("报警开关")] public bool AlarmIsOn{ get; set; } /// <summary> /// 报警复位 /// </summary> [Description("报警复位")] public bool IsAlarmReseted{ get; set; } /// <summary> /// 累计产量 /// </summary> [Description("累计产量")] public float CumulativeProduction{ get; set; } /// <summary> /// 配料斗重量显示 /// </summary> [Description("配料斗重量显示")] public float MixBucketWeight{ get; set; } /// <summary> /// 配料斗阀门 /// </summary> [Description("配料斗阀门")] public bool BucketValveIsOpen{ get; set; } /// <summary> /// 配料操作 /// </summary> [Description("配料操作")] public bool MixIsOn{ get; set; } /// <summary> /// 失重仓重量 /// </summary> [Description("失重仓重量")] public float BinWeight{ get; set; } /// <summary> /// 当前产量 /// </summary> [Description("当前产量")] public float CurrentFlow{ get; set; } /// <summary> /// 设定产量 /// </summary> [Description("设定产量")] public float FlowSetting{ get; set; } /// <summary> /// 运行比例 /// </summary> [Description("运行比例")] public float ScrewPDisp{ get; set; } /// <summary> /// 设定比例 /// </summary> [Description("设定比例")] public float ScrewPSet{ get; set; } /// <summary> /// 运行频率 /// </summary> [Description("运行频率")] public float ScrewMotorFreq{ get; set; } /// <summary> /// 设定频率 /// </summary> [Description("设定频率")] public float ScrewManualFreq{ get; set; } /// <summary> /// 设定频率确定 /// </summary> [Description("设定频率确定")] public bool ScrewManualFreqIsSet{ get; set; } /// <summary> /// 螺杆模式 /// </summary> [Description("螺杆模式")] public bool ScrewIsAutoMode{ get; set; } /// <summary> /// 螺杆操作 /// </summary> [Description("螺杆操作")] public bool ScrewMotorIsOn{ get; set; } /// <summary> /// 配料数据保存 /// </summary> [Description("配料数据保存")] public bool IsMixSave{ get; set; } /// <summary> /// 1#比例设定 /// </summary> [Description("1#比例设定")] public float MixPSet_1{ get; set; } /// <summary> /// 2#比例设定 /// </summary> [Description("2#比例设定")] public float MixPSet_2{ get; set; } /// <summary> /// 3#比例设定 /// </summary> [Description("3#比例设定")] public float MixPSet_3{ get; set; } /// <summary> /// 4#比例设定 /// </summary> [Description("4#比例设定")] public float MixPSet_4{ get; set; } /// <summary> /// 5#比例设定 /// </summary> [Description("5#比例设定")] public float MixPSet_5{ get; set; } /// <summary> /// 6#比例设定 /// </summary> [Description("6#比例设定")] public float MixPSet_6{ get; set; } /// <summary> /// 1#比例显示 /// </summary> [Description("1#比例显示")] public float MixPDisp_1{ get; set; } /// <summary> /// 2#比例显示 /// </summary> [Description("2#比例显示")] public float MixPDisp_2{ get; set; } /// <summary> /// 3#比例显示 /// </summary> [Description("3#比例显示")] public float MixPDisp_3{ get; set; } /// <summary> /// 4#比例显示 /// </summary> [Description("4#比例显示")] public float MixPDisp_4{ get; set; } /// <summary> /// 5#比例显示 /// </summary> [Description("5#比例显示")] public float MixPDisp_5{ get; set; } /// <summary> /// 6#比例显示 /// </summary> [Description("6#比例显示")] public float MixPDisp_6{ get; set; } /// <summary> /// 1#重量设定 /// </summary> [Description("1#重量设定")] public float MixSet_1{ get; set; } /// <summary> /// 2#重量设定 /// </summary> [Description("2#重量设定")] public float MixSet_2{ get; set; } /// <summary> /// 3#重量设定 /// </summary> [Description("3#重量设定")] public float MixSet_3{ get; set; } /// <summary> /// 4#重量设定 /// </summary> [Description("4#重量设定")] public float MixSet_4{ get; set; } /// <summary> /// 5#重量设定 /// </summary> [Description("5#重量设定")] public float MixSet_5{ get; set; } /// <summary> /// 6#重量设定 /// </summary> [Description("6#重量设定")] public float MixSet_6{ get; set; } /// <summary> /// 1#重量显示 /// </summary> [Description("1#重量显示")] public float MixDisp_1{ get; set; } /// <summary> /// 2#重量显示 /// </summary> [Description("2#重量显示")] public float MixDisp_2{ get; set; } /// <summary> /// 3#重量显示 /// </summary> [Description("3#重量显示")] public float MixDisp_3{ get; set; } /// <summary> /// 4#重量显示 /// </summary> [Description("4#重量显示")] public float MixDisp_4{ get; set; } /// <summary> /// 5#重量显示 /// </summary> [Description("5#重量显示")] public float MixDisp_5{ get; set; } /// <summary> /// 6#重量显示 /// </summary> [Description("6#重量显示")] public float MixDisp_6{ get; set; } /// <summary> /// 1#放料 /// </summary> [Description("1#放料")] public bool MixLight_1{ get; set; } /// <summary> /// 2#放料 /// </summary> [Description("2#放料")] public bool MixLight_2{ get; set; } /// <summary> /// 3#放料 /// </summary> [Description("3#放料")] public bool MixLight_3{ get; set; } /// <summary> /// 4#放料 /// </summary> [Description("4#放料")] public bool MixLight_4{ get; set; } /// <summary> /// 5#放料 /// </summary> [Description("5#放料")] public bool MixLight_5{ get; set; } /// <summary> /// 6#放料 /// </summary> [Description("6#放料")] public bool MixLight_6{ get; set; } /// <summary> /// 配料斗卸载 /// </summary> [Description("配料斗卸载")] public bool MixUnload{ get; set; } /// <summary> /// 配料斗重量设置 /// </summary> [Description("配料斗重量设置")] public float MixSet{ get; set; } /// <summary> /// 配料斗重量显示 /// </summary> [Description("配料斗重量显示")] public float MixDisp{ get; set; } /// <summary> /// 1#累计重量 /// </summary> [Description("1#累计重量")] public float MixCum_1{ get; set; } /// <summary> /// 2#累计重量 /// </summary> [Description("2#累计重量")] public float MixCum_2{ get; set; } /// <summary> /// 3#累计重量 /// </summary> [Description("3#累计重量")] public float MixCum_3{ get; set; } /// <summary> /// 4#累计重量 /// </summary> [Description("4#累计重量")] public float MixCum_4{ get; set; } /// <summary> /// 5#累计重量 /// </summary> [Description("5#累计重量")] public float MixCum_5{ get; set; } /// <summary> /// 6#累计重量 /// </summary> [Description("6#累计重量")] public float MixCum_6{ get; set; } /// <summary> /// 1#累计百分比 /// </summary> [Description("1#累计百分比")] public float MixCumPercent_1{ get; set; } /// <summary> /// 2#累计百分比 /// </summary> [Description("2#累计百分比")] public float MixCumPercent_2{ get; set; } /// <summary> /// 3#累计百分比 /// </summary> [Description("3#累计百分比")] public float MixCumPercent_3{ get; set; } /// <summary> /// 4#累计百分比 /// </summary> [Description("4#累计百分比")] public float MixCumPercent_4{ get; set; } /// <summary> /// 5#累计百分比 /// </summary> [Description("5#累计百分比")] public float MixCumPercent_5{ get; set; } /// <summary> /// 6#累计百分比 /// </summary> [Description("6#累计百分比")] public float MixCumPercent_6{ get; set; } /// <summary> /// 产量清零 /// </summary> [Description("产量清零")] public bool ClearProduction{ get; set; } /// <summary> /// 流量方式 /// </summary> [Description("流量方式")] public bool FlowCalMethodIsA{ get; set; } /// <summary> /// 流量反馈 /// </summary> [Description("流量反馈")] public float FlowDisp{ get; set; } /// <summary> /// 滤波系数设定 /// </summary> [Description("滤波系数设定")] public float FilterParam{ get; set; } /// <summary> /// 切换级别设定 /// </summary> [Description("切换级别设定")] public float SwitchLv{ get; set; } /// <summary> /// 升降增益设定 /// </summary> [Description("升降增益设定")] public float UpDownGain{ get; set; } /// <summary> /// 比例增益设定 /// </summary> [Description("比例增益设定")] public float PGain{ get; set; } /// <summary> /// 积分时间设定 /// </summary> [Description("积分时间设定")] public float ITime{ get; set; } /// <summary> /// 调节系数设定 /// </summary> [Description("调节系数设定")] public float AdjustFactor{ get; set; } /// <summary> /// 调节上限设定 /// </summary> [Description("调节上限设定")] public float AdjustUpper{ get; set; } /// <summary> /// 调节下限设定 /// </summary> [Description("调节下限设定")] public float AdjustLower{ get; set; } /// <summary> /// 稳定级别切换 /// </summary> [Description("稳定级别切换")] public float StableLvSwitch{ get; set; } /// <summary> /// PID调节限幅 /// </summary> [Description("PID调节限幅")] public float PIDLimit{ get; set; } /// <summary> /// 采样时间 /// </summary> [Description("采样时间")] public float SampleTime{ get; set; } /// <summary> /// PID结果 /// </summary> [Description("PID结果")] public float PIDResult{ get; set; } /// <summary> /// PID调节 /// </summary> [Description("PID调节")] public float PIDAdjust{ get; set; } /// <summary> /// 实际速度 /// </summary> [Description("实际速度")] public float ScrewCurrentSpeed{ get; set; } /// <summary> /// 比例增益 /// </summary> [Description("比例增益")] public float PGainDisp{ get; set; } /// <summary> /// 卸料时间 /// </summary> [Description("卸料时间")] public float UnloadingTime{ get; set; } /// <summary> /// 零位稳定时间 /// </summary> [Description("零位稳定时间")] public float ZeroStableTime{ get; set; } /// <summary> /// 流量切换允许 /// </summary> [Description("流量切换允许")] public float FlowSwitchEnable{ get; set; } /// <summary> /// 取样时间设定(s) /// </summary> [Description("取样时间设定(s)")] public float SampleTimeSet{ get; set; } /// <summary> /// 额定频率(Hz) /// </summary> [Description("额定频率(Hz)")] public float ScrewMotorRatedFreq{ get; set; } /// <summary> /// 重量稳定时间(s) /// </summary> [Description("重量稳定时间(s)")] public float WeightStableTime{ get; set; } /// <summary> /// 料位下限设定(kg) /// </summary> [Description("料位下限设定(kg)")] public float MaterialLowLimitSet{ get; set; } /// <summary> /// 报警偏差设定(%) /// </summary> [Description("报警偏差设定(%)")] public float AlarmDeviationSet{ get; set; } /// <summary> /// 重量校正系数 /// </summary> [Description("重量校正系数")] public float WeightCorrectFactor{ get; set; } /// <summary> /// 缺料报警设定(kg) /// </summary> [Description("缺料报警设定(kg)")] public float LackErrorSet{ get; set; } /// <summary> /// 搅拌时间设定(s) /// </summary> [Description("搅拌时间设定(s)")] public float MixingTimeSet{ get; set; } /// <summary> /// 1次补料偏差 /// </summary> [Description("1次补料偏差")] public float FeedingDeviation_1{ get; set; } /// <summary> /// 2次补料偏差 /// </summary> [Description("2次补料偏差")] public float FeedingDeviation_2{ get; set; } /// <summary> /// 3次补料偏差 /// </summary> [Description("3次补料偏差")] public float FeedingDeviation_3{ get; set; } /// <summary> /// 4次补料偏差 /// </summary> [Description("4次补料偏差")] public float FeedingDeviation_4{ get; set; } /// <summary> /// 5次补料偏差 /// </summary> [Description("5次补料偏差")] public float FeedingDeviation_5{ get; set; } /// <summary> /// 6次补料偏差 /// </summary> [Description("6次补料偏差")] public float FeedingDeviation_6{ get; set; } /// <summary> /// 1次加料设定 /// </summary> [Description("1次加料设定")] public float FeedSet_1{ get; set; } /// <summary> /// 2次加料设定 /// </summary> [Description("2次加料设定")] public float FeedSet_2{ get; set; } /// <summary> /// 3次加料设定 /// </summary> [Description("3次加料设定")] public float FeedSet_3{ get; set; } /// <summary> /// 4次加料设定 /// </summary> [Description("4次加料设定")] public float FeedSet_4{ get; set; } /// <summary> /// 5次加料设定 /// </summary> [Description("5次加料设定")] public float FeedSet_5{ get; set; } /// <summary> /// 6次加料设定 /// </summary> [Description("6次加料设定")] public float FeedSet_6{ get; set; } /// <summary> /// 1#初始时间 /// </summary> [Description("1#初始时间")] public float InitTime_1{ get; set; } /// <summary> /// 2#初始时间 /// </summary> [Description("2#初始时间")] public float InitTime_2{ get; set; } /// <summary> /// 3#初始时间 /// </summary> [Description("3#初始时间")] public float InitTime_3{ get; set; } /// <summary> /// 4#初始时间 /// </summary> [Description("4#初始时间")] public float InitTime_4{ get; set; } /// <summary> /// 5#初始时间 /// </summary> [Description("5#初始时间")] public float InitTime_5{ get; set; } /// <summary> /// 6#初始时间 /// </summary> [Description("6#初始时间")] public float InitTime_6{ get; set; } /// <summary> /// 1#最小时间 /// </summary> [Description("1#最小时间")] public float MinTime_1{ get; set; } /// <summary> /// 2#最小时间 /// </summary> [Description("2#最小时间")] public float MinTime_2{ get; set; } /// <summary> /// 3#最小时间 /// </summary> [Description("3#最小时间")] public float MinTime_3{ get; set; } /// <summary> /// 4#最小时间 /// </summary> [Description("4#最小时间")] public float MinTime_4{ get; set; } /// <summary> /// 5#最小时间 /// </summary> [Description("5#最小时间")] public float MinTime_5{ get; set; } /// <summary> /// 6#最小时间 /// </summary> [Description("6#最小时间")] public float MinTime_6{ get; set; } /// <summary> /// 1#稳重时间 /// </summary> [Description("1#稳重时间")] public float StableTime_1{ get; set; } /// <summary> /// 2#稳重时间 /// </summary> [Description("2#稳重时间")] public float StableTime_2{ get; set; } /// <summary> /// 3#稳重时间 /// </summary> [Description("3#稳重时间")] public float StableTime_3{ get; set; } /// <summary> /// 4#稳重时间 /// </summary> [Description("4#稳重时间")] public float StableTime_4{ get; set; } /// <summary> /// 5#稳重时间 /// </summary> [Description("5#稳重时间")] public float StableTime_5{ get; set; } /// <summary> /// 6#稳重时间 /// </summary> [Description("6#稳重时间")] public float StableTime_6{ get; set; } /// <summary> /// 1次料仓报警设定 /// </summary> [Description("1次料仓报警设定")] public float BinAlarmSet_1{ get; set; } /// <summary> /// 2次料仓报警设定 /// </summary> [Description("2次料仓报警设定")] public float BinAlarmSet_2{ get; set; } /// <summary> /// 3次料仓报警设定 /// </summary> [Description("3次料仓报警设定")] public float BinAlarmSet_3{ get; set; } /// <summary> /// 4次料仓报警设定 /// </summary> [Description("4次料仓报警设定")] public float BinAlarmSet_4{ get; set; } /// <summary> /// 5次料仓报警设定 /// </summary> [Description("5次料仓报警设定")] public float BinAlarmSet_5{ get; set; } /// <summary> /// 6次料仓报警设定 /// </summary> [Description("6次料仓报警设定")] public float BinAlarmSet_6{ get; set; } /// <summary> /// No.1料仓缺料报警 /// </summary> [Description("No.1料仓缺料报警")] [IsError()] public bool IsErrorOfLack_1{ get; set; } /// <summary> /// No.2料仓缺料报警 /// </summary> [Description("No.2料仓缺料报警")] [IsError()] public bool IsErrorOfLack_2{ get; set; } /// <summary> /// No.3料仓缺料报警 /// </summary> [Description("No.3料仓缺料报警")] [IsError()] public bool IsErrorOfLack_3{ get; set; } /// <summary> /// No.4料仓缺料报警 /// </summary> [Description("No.4料仓缺料报警")] [IsError()] public bool IsErrorOfLack_4{ get; set; } /// <summary> /// No.5料仓缺料报警 /// </summary> [Description("No.5料仓缺料报警")] [IsError()] public bool IsErrorOfLack_5{ get; set; } /// <summary> /// No.6料仓缺料报警 /// </summary> [Description("No.6料仓缺料报警")] [IsError()] public bool IsErrorOfLack_6{ get; set; } /// <summary> /// No.1料斗加料异常 /// </summary> [Description("No.1料斗加料异常")] [IsError()] public bool IsErrorOfAdd_1{ get; set; } /// <summary> /// No.2料斗加料异常 /// </summary> [Description("No.2料斗加料异常")] [IsError()] public bool IsErrorOfAdd_2{ get; set; } /// <summary> /// No.3料斗加料异常 /// </summary> [Description("No.3料斗加料异常")] [IsError()] public bool IsErrorOfAdd_3{ get; set; } /// <summary> /// No.4料斗加料异常 /// </summary> [Description("No.4料斗加料异常")] [IsError()] public bool IsErrorOfAdd_4{ get; set; } /// <summary> /// No.5料斗加料异常 /// </summary> [Description("No.5料斗加料异常")] [IsError()] public bool IsErrorOfAdd_5{ get; set; } /// <summary> /// No.6料斗加料异常 /// </summary> [Description("No.6料斗加料异常")] [IsError()] public bool IsErrorOfAdd_6{ get; set; } /// <summary> /// 螺杆缺料报警 /// </summary> [Description("螺杆缺料报警")] [IsError()] public bool IsErrorOfScrewLack{ get; set; } /// <summary> /// 螺杆流量超偏差报警 /// </summary> [Description("螺杆流量超偏差报警")] [IsError()] public bool IsErrorOfScrewFlow{ get; set; } /// <summary> /// 搅拌电机故障 /// </summary> [Description("搅拌电机故障")] [IsError()] public bool IsErrorOfBlender{ get; set; } /// <summary> /// 急停开启 /// </summary> [Description("急停开启")] [IsError()] public bool IsErrorOfScram{ get; set; } /// <summary> /// 搅拌电机急停开启 /// </summary> [Description("搅拌电机急停开启")] [IsError()] public bool IsErrorOfBlender2{ get; set; } /// <summary> /// 搅拌电机未启动 /// </summary> [Description("搅拌电机未启动")] [IsError()] public bool IsErrorOfBlender3{ get; set; } #endregion public void BinsReBinding(int bincnt) { BinCnt = bincnt; BinsBinding(); } /// <summary> /// 料仓,混料参数 绑定到 对应的队列 /// </summary> void BinsBinding() { Ingredients.Clear(); for (int i = 0; i < BinCnt; i++) { int no = i + 1; IngredientCell ingredient = new IngredientCell(); ingredient.Number = no.ToString(); Misc.BindingOperations.SetBinding(this, $"MixLight_{no}", ingredient, "MixLight"); Misc.BindingOperations.SetBinding(this, $"MixPSet_{no}", ingredient, "MixPSet", Misc.BindingOperations.BindingMode.TwoWay); Misc.BindingOperations.SetBinding(this, $"MixPDisp_{no}", ingredient, "MixPDisp", Misc.BindingOperations.BindingMode.TwoWay); Misc.BindingOperations.SetBinding(this, $"MixCumPercent_{no}", ingredient, "MixCumPercent", Misc.BindingOperations.BindingMode.TwoWay); Misc.BindingOperations.SetBinding(this, $"MixSet_{no}", ingredient, "MixSet", Misc.BindingOperations.BindingMode.TwoWay); Misc.BindingOperations.SetBinding(this, $"MixDisp_{no}", ingredient, "MixDisp", Misc.BindingOperations.BindingMode.TwoWay); Misc.BindingOperations.SetBinding(this, $"MixCum_{no}", ingredient, "MixCum", Misc.BindingOperations.BindingMode.TwoWay); Ingredients.Add(ingredient); } IngredientParams.Clear(); for (int i = 0; i < BinCnt; i++) { int no = i + 1; IngredientParamCell ingredientParam = new IngredientParamCell(); ingredientParam.Number = no.ToString(); Misc.BindingOperations.SetBinding(this, $"FeedingDeviation_{no}", ingredientParam, "FeedingDeviation", Misc.BindingOperations.BindingMode.TwoWay); Misc.BindingOperations.SetBinding(this, $"FeedSet_{no}", ingredientParam, "FeedSet", Misc.BindingOperations.BindingMode.TwoWay); Misc.BindingOperations.SetBinding(this, $"InitTime_{no}", ingredientParam, "InitTime", Misc.BindingOperations.BindingMode.TwoWay); Misc.BindingOperations.SetBinding(this, $"MinTime_{no}", ingredientParam, "MinTime", Misc.BindingOperations.BindingMode.TwoWay); Misc.BindingOperations.SetBinding(this, $"StableTime_{no}", ingredientParam, "StableTime", Misc.BindingOperations.BindingMode.TwoWay); Misc.BindingOperations.SetBinding(this, $"BinAlarmSet_{no}", ingredientParam, "BinAlarmSet", Misc.BindingOperations.BindingMode.TwoWay); IngredientParams.Add(ingredientParam); } } public string[] GetSyncPropNames() { return null; } public string[] GetNoSyncPropNames() { return new string[] { "Number", "Color", "BinCnt", "Ingredients", "IngredientParams" }; } #region 混料料仓队列 public List<IngredientCell> Ingredients { get; } = new List<IngredientCell>(); #endregion #region 混料参数队列 public List<IngredientParamCell> IngredientParams { get; } = new List<IngredientParamCell>(); #endregion } public class IngredientCell : INotifyPropertyChanged { /// <summary> /// 颜色 /// </summary> public Brush Color { get; set; } /// <summary> /// 序号 /// </summary> public string Number { get; set; } /// <summary> /// 混料 进行中 /// </summary> public bool MixLight { get; set; } /// <summary> /// 比例设定 /// </summary> public float MixPSet { get; set; } /// <summary> /// 比例显示 /// </summary> public float MixPDisp { get; set; } /// <summary> /// 累计重量比例 /// </summary> public float MixCumPercent { get; set; } /// <summary> /// 重量设定 /// </summary> public float MixSet { get; set; } /// <summary> /// 重量显示 /// </summary> public float MixDisp { get; set; } /// <summary> /// 累计重量 /// </summary> public float MixCum { get; set; } public IngredientCell() { } public event PropertyChangedEventHandler PropertyChanged; } public class IngredientParamCell : INotifyPropertyChanged { /// <summary> /// 序号 /// </summary> public string Number { get; set; } /// <summary> /// 补料偏差 /// </summary> public float FeedingDeviation { get; set; } /// <summary> /// 加料设定 /// </summary> public float FeedSet { get; set; } /// <summary> /// 初始时间 /// </summary> public float InitTime { get; set; } /// <summary> /// 最小时间 /// </summary> public float MinTime { get; set; } /// <summary> /// 稳重时间 /// </summary> public float StableTime { get; set; } /// <summary> /// 料仓报警设定 /// </summary> public float BinAlarmSet { get; set; } public IngredientParamCell() { } public event PropertyChangedEventHandler PropertyChanged; } }