using SWRIS.Dtos; using SWRIS.Enums; using SWRIS.Extensions; using System; using System.Collections.Generic; using System.ComponentModel; namespace SWRIS.Models.ViewModel { public class EquipmentSettingViewModel : INotifyPropertyChanged { private int ropeNumber; private string ropeName; private int trolleyId; private string ipAddress; private string serialNo; private string supplier; private int ropeCoreType; private int wireMaterialType; private int wireSurfaceType; private int layType; private bool disableAlarm; private int[] inUseSensor = new int[] { 1, 2, 3, 4 }; private double liftHightRatio = 1; private RiskLevel soundRiskLevel = RiskLevel.Moderate; private ParameterData parameter; private bool isConnected; private RunningStatus runningStatus = RunningStatus.SpatialNormal; private double hoistDrumDiameter = 750; private double encoderResolution = 1000; private double ratedHeight; /// /// 绳号 /// public int RopeNumber { get { return ropeNumber; } set { ropeNumber = value; OnPropertyChanged(nameof(RopeNumber)); } } /// /// 钢丝绳名称 /// public string RopeName { get { return ropeName; } set { ropeName = value; OnPropertyChanged(nameof(RopeName)); } } public int TrolleyId { get { return trolleyId; } set { trolleyId = value; OnPropertyChanged(nameof(TrolleyId)); } } /// /// Ip地址 /// public string IpAddress { get { return ipAddress; } set { ipAddress = value; OnPropertyChanged(nameof(IpAddress)); } } /// /// 序列号 /// public string SerialNo { get { return serialNo; } set { serialNo = value; OnPropertyChanged(nameof(SerialNo)); } } /// /// 供应商 /// public string Supplier { get { return supplier; } set { supplier = value; OnPropertyChanged(nameof(Supplier)); } } /// /// 绳芯类型 1 钢芯 2 纤维芯 /// public int RopeCoreType { get { return ropeCoreType; } set { ropeCoreType = value; OnPropertyChanged(nameof(RopeCoreType)); } } /// /// 钢丝材质 1 碳钢 2 不锈钢 /// public int WireMaterialType { get { return wireMaterialType; } set { wireMaterialType = value; OnPropertyChanged(nameof(WireMaterialType)); } } /// /// 表面状态 1 光面 2 A级镀锌 3 B级镀锌 /// public int WireSurfaceType { get { return wireSurfaceType; } set { wireSurfaceType = value; OnPropertyChanged(nameof(WireSurfaceType)); } } /// /// 捻向 1 右交互捻 2 左交互捻 3 右同向捻 4 左同向捻 /// public int LayType { get { return layType; } set { layType = value; OnPropertyChanged(nameof(LayType)); } } /// /// 绳长/高度倍率 /// public double LiftHightRatio { get { return liftHightRatio; } set { // 倍率最小为 1 liftHightRatio = value < 1 ? 1 : value; OnPropertyChanged(nameof(LiftHightRatio)); // 倍率变化时按 钢丝绳长度 = 额定高度 × 倍率 重新计算 UpdateWireRopeLength(); } } public RiskLevel SoundRiskLevel { get { return soundRiskLevel; } set { soundRiskLevel = value; OnPropertyChanged(nameof(SoundRiskLevel)); } } public ParameterData Parameter { get { return parameter; } set { if (parameter != null) { parameter.PropertyChanged -= OnParameterPropertyChanged; } parameter = value; OnPropertyChanged(nameof(Parameter)); if (parameter != null) { // 分频系数变化时联动重算采样步长 parameter.PropertyChanged += OnParameterPropertyChanged; } // 参数加载后按当前卷筒直径/编码器分辨率重新计算采样步长 UpdateSamplingStep(); } } public bool IsConnected { get { return isConnected; } set { isConnected = value; OnPropertyChanged(nameof(IsConnected)); } } public bool DisableAlarm { get { return disableAlarm; } set { disableAlarm = value; OnPropertyChanged(nameof(DisableAlarm)); } } public int[] InUseSensor { get { return inUseSensor; } set { inUseSensor = value; OnPropertyChanged(nameof(InUseSensor)); } } public RunningStatus RunningStatus { get { return runningStatus; } set { runningStatus = value; OnPropertyChanged(nameof(RunningStatus)); } } /// /// 卷筒/米轮直径 mm /// public double HoistDrumDiameter { get => hoistDrumDiameter; set { hoistDrumDiameter = value; OnPropertyChanged(nameof(HoistDrumDiameter)); // 卷筒直径变化时重新计算采样步长 UpdateSamplingStep(); } } /// /// 编码器分辨率 /// public double EncoderResolution { get => encoderResolution; set { encoderResolution = value; OnPropertyChanged(nameof(EncoderResolution)); // 编码器分辨率变化时重新计算采样步长 UpdateSamplingStep(); } } /// /// 额定高度(起升高度)m /// public double RatedHeight { get { return ratedHeight; } set { ratedHeight = value; OnPropertyChanged(nameof(RatedHeight)); // 额定高度变化时按 钢丝绳长度 = 额定高度 × 倍率 重新计算 UpdateWireRopeLength(); } } /// /// 根据额定高度与滑轮组倍率计算钢丝绳长度并赋值(钢丝绳长度 = 额定高度 × 倍率),单位 m。 /// private void UpdateWireRopeLength() { if (parameter == null || ratedHeight <= 0 || liftHightRatio <= 0) { return; } parameter.WireRopeLength = (float)(ratedHeight * liftHightRatio); } /// /// 通过卷筒/米轮直径、编码器分辨率与分频系数计算采样步长(mm/点)并同步到设备参数。 /// 设备每 分频系数 个编码器脉冲采样一个点,故: /// 采样步长 = 每脉冲位移 × 分频系数 = π × 直径 × 分频系数 / 分辨率 /// private void UpdateSamplingStep() { if (parameter == null || encoderResolution <= 0 || hoistDrumDiameter <= 0 || parameter.FrequencyDivisionFactor <= 0) { return; } parameter.SamplingStep = (float)(Math.PI * hoistDrumDiameter * parameter.FrequencyDivisionFactor / encoderResolution); } /// /// 参数属性变化时联动重算采样步长(分频系数变化场景) /// private void OnParameterPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(ParameterData.FrequencyDivisionFactor)) { UpdateSamplingStep(); } } public List RopeCoreTypes => TypeExtension.ToKeyAndDescriptionList(typeof(RopeCoreType)); public List WireMaterialTypes => TypeExtension.ToKeyAndDescriptionList(typeof(WireMaterialType)); public List LayTypes => TypeExtension.ToKeyAndDescriptionList(typeof(LayType)); public List WireSurfaceTypes => TypeExtension.ToKeyAndDescriptionList(typeof(WireSurfaceType)); public List RiskLevels => TypeExtension.ToKeyAndDescriptionList(typeof(RiskLevel)); public event PropertyChangedEventHandler PropertyChanged; protected internal virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public class ParameterData : INotifyPropertyChanged { private string mainBoardSoftwareVersion; private short sensorCount; private float samplingStep; private short frequencyDivisionFactor; private short damageInterval; private short damageThreshold; private short scrapUpperLimit; private short frontMagnetLength; private short backMagnetLength; private float valueCoefficient; private float effectiveStrokeLength; private short zeroPositionCorrectionDuration; private short zeroPositionCorrectionOffset; private float warningValue; private float alarmValue; private short soundLightAlarmAutoResetMode; private short wireRopeType; private short wireRopeCount; private float wireRopeLength; private float wireRopeDiameter; private short wireRopeStrandCount; private short wireRopeStrandWireCount; private EncoderDirection encoderDirection; private DateTime? systemTime; private float twistFactor; private float firstCalibrationPositiont; private float secondCalibrationPositiont; /// /// 主板软件版本号 /// public string MainBoardSoftwareVersion { get => mainBoardSoftwareVersion; set { mainBoardSoftwareVersion = value; OnPropertyChanged(nameof(MainBoardSoftwareVersion)); } } /// /// 传感器数量 /// public short SensorCount { get => sensorCount; set { sensorCount = value; OnPropertyChanged(nameof(SensorCount)); } } /// /// 采样步长 单位:mm/点 4字节浮点数 /// public float SamplingStep { get => samplingStep; set { samplingStep = value; OnPropertyChanged(nameof(SamplingStep)); } } /// /// 分频系数 /// public short FrequencyDivisionFactor { get => frequencyDivisionFactor; set { frequencyDivisionFactor = value; OnPropertyChanged(nameof(FrequencyDivisionFactor)); } } /// /// 判伤间隔 2字节整型 /// public short DamageInterval { get => damageInterval; set { damageInterval = value; OnPropertyChanged(nameof(DamageInterval)); } } /// /// 损伤门限 2字节整型 /// public short DamageThreshold { get => damageThreshold; set { damageThreshold = value; OnPropertyChanged(nameof(DamageThreshold)); } } /// /// 报废上限 /// public short ScrapUpperLimit { get => scrapUpperLimit; set { scrapUpperLimit = value; OnPropertyChanged(nameof(ScrapUpperLimit)); } } /// /// 前磁极长度 单位:mm 2字节整型 /// public short FrontMagnetLength { get => frontMagnetLength; set { frontMagnetLength = value; OnPropertyChanged(nameof(FrontMagnetLength)); } } /// /// 后磁极长度 单位:mm 2字节整型 /// public short BackMagnetLength { get => backMagnetLength; set { backMagnetLength = value; OnPropertyChanged(nameof(BackMagnetLength)); } } /// /// 量值系数 4字节浮点数 /// public float ValueCoefficient { get => valueCoefficient; set { valueCoefficient = value; OnPropertyChanged(nameof(ValueCoefficient)); } } /// /// 零位有效行程长度,单位:m 4字节浮点数 /// public float EffectiveStrokeLength { get => effectiveStrokeLength; set { effectiveStrokeLength = value; OnPropertyChanged(nameof(EffectiveStrokeLength)); } } /// /// 零位矫正静止时长,单位:秒 2字节整型 /// public short ZeroPositionCorrectionDuration { get => zeroPositionCorrectionDuration; set { zeroPositionCorrectionDuration = value; OnPropertyChanged(nameof(ZeroPositionCorrectionDuration)); } } /// /// 零位矫正允许偏移量,单位:mm 2字节整型 /// public short ZeroPositionCorrectionOffset { get => zeroPositionCorrectionOffset; set { zeroPositionCorrectionOffset = value; OnPropertyChanged(nameof(ZeroPositionCorrectionOffset)); } } /// /// 预警(黄色报警)量值 4字节浮点数 /// public float WarningValue { get => warningValue; set { warningValue = value; OnPropertyChanged(nameof(WarningValue)); } } /// /// 报警(红色报警)量值 4字节浮点数 /// public float AlarmValue { get => alarmValue; set { alarmValue = value; OnPropertyChanged(nameof(AlarmValue)); } } /// /// 声光报警自动重置方式,0=不自动重置,>0=延时自动重置,-1=开始新一次检测时重置 /// public short SoundLightAlarmAutoResetMode { get => soundLightAlarmAutoResetMode; set { soundLightAlarmAutoResetMode = value; OnPropertyChanged(nameof(SoundLightAlarmAutoResetMode)); } } /// /// 钢丝绳类型 0=塔吊单绳,1=电梯排绳 /// public short WireRopeType { get => wireRopeType; set { wireRopeType = value; OnPropertyChanged(nameof(WireRopeType)); } } /// ///钢丝绳数量 1字节 /// public short WireRopeCount { get => wireRopeCount; set { wireRopeCount = value; OnPropertyChanged(nameof(WireRopeCount)); } } /// /// 钢丝绳长度,单位:m 4字节浮点数(供协议打包/持久化使用) /// public float WireRopeLength { get => wireRopeLength; set { // 统一保留 2 位小数,避免浮点运算产生冗长小数位 wireRopeLength = (float)Math.Round(value, 2, MidpointRounding.AwayFromZero); OnPropertyChanged(nameof(WireRopeLength)); OnPropertyChanged(nameof(WireRopeLengthValue)); } } /// /// 钢丝绳长度(double 显示值,供输入框绑定)。 /// float 转 double 会产生二进制噪声(如 41.2f → 41.200000762939453), /// 故暴露 double 值并四舍五入到 2 位小数后再绑定。 /// public double WireRopeLengthValue { get => Math.Round(wireRopeLength, 2); set { wireRopeLength = (float)Math.Round(value, 2, MidpointRounding.AwayFromZero); OnPropertyChanged(nameof(WireRopeLength)); OnPropertyChanged(nameof(WireRopeLengthValue)); } } /// /// 钢丝绳直径,单位:mm 4字节浮点数 /// public float WireRopeDiameter { get => wireRopeDiameter; set { wireRopeDiameter = value; OnPropertyChanged(nameof(WireRopeDiameter)); } } /// /// 钢丝绳股数 1字节 /// public short WireRopeStrandCount { get => wireRopeStrandCount; set { wireRopeStrandCount = value; OnPropertyChanged(nameof(WireRopeStrandCount)); } } /// /// 钢丝绳每股丝数,2字节整型 /// public short WireRopeStrandWireCount { get => wireRopeStrandWireCount; set { wireRopeStrandWireCount = value; OnPropertyChanged(nameof(WireRopeStrandWireCount)); } } /// /// 编码器方向,1=正向,2=反向 /// public EncoderDirection EncoderDirection { get => encoderDirection; set { encoderDirection = value; OnPropertyChanged(nameof(EncoderDirection)); } } /// /// 系统时间 /// public DateTime? SystemTime { get => systemTime; set { systemTime = value; OnPropertyChanged(nameof(SystemTime)); } } /// /// 判伤捻距系数,浮点数,判伤捻距默认为7d,可通过此参数设置系数来调整(与损伤判定相关)。 /// 默认值为1.0,设置2.0表示判伤捻距为2 x 7 = 14d /// public float TwistFactor { get => twistFactor; set { twistFactor = value; OnPropertyChanged(nameof(TwistFactor)); } } /// /// 限位1校准位置 /// public float FirstCalibrationPositiont { get => firstCalibrationPositiont; set { firstCalibrationPositiont = value; OnPropertyChanged(nameof(FirstCalibrationPositiont)); } } /// /// 限位2校准位置 /// public float SecondCalibrationPositiont { get => secondCalibrationPositiont; set { secondCalibrationPositiont = value; OnPropertyChanged(nameof(SecondCalibrationPositiont)); } } public event PropertyChangedEventHandler PropertyChanged; protected internal virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }