diff --git a/CSI-H238M/CSI-H238M/Services/ModbusService.cs b/CSI-H238M/CSI-H238M/Services/ModbusService.cs index affa18d..dc5963a 100644 --- a/CSI-H238M/CSI-H238M/Services/ModbusService.cs +++ b/CSI-H238M/CSI-H238M/Services/ModbusService.cs @@ -254,23 +254,23 @@ namespace COFTester.Services if (_modbusMaster != null && _isConnected) { const ushort RESET_BUTTON_ADDRESS = 90; // M90 复归型按钮 - + System.Diagnostics.Debug.WriteLine($"[Modbus] 触发复位按钮 M{RESET_BUTTON_ADDRESS}"); - + // 写入 true(触发) await _modbusMaster.WriteSingleCoilAsync(1, RESET_BUTTON_ADDRESS, true); System.Diagnostics.Debug.WriteLine($"[Modbus] M{RESET_BUTTON_ADDRESS} = true"); - + // 延迟 100ms await Task.Delay(100); - + // 写入 false(复位) await _modbusMaster.WriteSingleCoilAsync(1, RESET_BUTTON_ADDRESS, false); System.Diagnostics.Debug.WriteLine($"[Modbus] M{RESET_BUTTON_ADDRESS} = false"); - + // 延迟 100ms 确保 PLC 处理完成 await Task.Delay(100); - + System.Diagnostics.Debug.WriteLine($"[Modbus] M{RESET_BUTTON_ADDRESS} 脉冲信号发送完成"); } } @@ -281,7 +281,7 @@ namespace COFTester.Services throw; } } - + /// /// 读取复位状态标记位 M92 /// M92: 1=复位中,0=复位完成 @@ -294,12 +294,12 @@ namespace COFTester.Services if (_modbusMaster != null && _isConnected) { const ushort RESET_STATUS_ADDRESS = 92; // M92 状态标记位 - + var coils = await _modbusMaster.ReadCoilsAsync(1, RESET_STATUS_ADDRESS, 1); bool isResetting = coils[0]; - + System.Diagnostics.Debug.WriteLine($"[Modbus] 读取复位状态 M{RESET_STATUS_ADDRESS} = {(isResetting ? "1 (复位中)" : "0 (复位完成)")}"); - + return isResetting; } return false; @@ -310,7 +310,7 @@ namespace COFTester.Services return false; } } - + /// /// 切换型复位操作(已弃用,请使用 TriggerResetAsync) /// M90 复归型按钮,M92 状态标记位(1=复位中,0=复位完成) @@ -325,20 +325,20 @@ namespace COFTester.Services if (_modbusMaster != null && _isConnected) { System.Diagnostics.Debug.WriteLine($"[Modbus] 开始切换型复位操作 - 地址: {address}"); - + // 1. 读取当前线圈状态 var coils = await _modbusMaster.ReadCoilsAsync(1, address, 1); bool currentState = coils[0]; System.Diagnostics.Debug.WriteLine($"[Modbus] 当前状态: {currentState}"); - + // 2. 写入相反状态 bool newState = !currentState; await _modbusMaster.WriteSingleCoilAsync(1, address, newState); System.Diagnostics.Debug.WriteLine($"[Modbus] 写入新状态: {newState}"); - + // 3. 延迟 100ms 确保 PLC 处理完成 await Task.Delay(100); - + System.Diagnostics.Debug.WriteLine($"[Modbus] 切换型复位操作完成"); return true; } @@ -363,21 +363,21 @@ namespace COFTester.Services if (_modbusMaster != null && _isConnected) { System.Diagnostics.Debug.WriteLine("[Modbus] 發送零點標定脉冲命令到 M1300"); - + // 写入 true(触发) await _modbusMaster.WriteSingleCoilAsync(1, 1300, true); System.Diagnostics.Debug.WriteLine("[Modbus] M1300 = true"); - + // 延迟 100ms await Task.Delay(100); - + // 写入 false(复位) await _modbusMaster.WriteSingleCoilAsync(1, 1300, false); System.Diagnostics.Debug.WriteLine("[Modbus] M1300 = false"); - + // 延迟 100ms 确保 PLC 处理完成 await Task.Delay(100); - + System.Diagnostics.Debug.WriteLine("[Modbus] 零點標定脉冲命令发送完成"); } } @@ -446,10 +446,10 @@ namespace COFTester.Services }; System.Diagnostics.Debug.WriteLine($"[Modbus] 触发方向控制 M{address} ({direction}) = 1"); - + // 写入1触发方向控制 await _modbusMaster.WriteSingleCoilAsync(1, address, true); - + System.Diagnostics.Debug.WriteLine($"[Modbus] 方向控制 M{address} 已触发"); } } @@ -481,10 +481,10 @@ namespace COFTester.Services }; System.Diagnostics.Debug.WriteLine($"[Modbus] 停止方向控制 M{address} ({direction}) = 0"); - + // 写入0停止方向控制 await _modbusMaster.WriteSingleCoilAsync(1, address, false); - + System.Diagnostics.Debug.WriteLine($"[Modbus] 方向控制 M{address} 已停止"); } } @@ -518,7 +518,7 @@ namespace COFTester.Services ushort value = start ? (ushort)1 : (ushort)0; string action = start ? "開始" : "停止"; - + System.Diagnostics.Debug.WriteLine($"[Modbus] 方向控制: {direction} {action} - 寫入寄存器 M{(ushort)register} = {value}"); await WriteDirectionRegisterAsync((ushort)register, value); } @@ -528,7 +528,7 @@ namespace COFTester.Services OnErrorOccurred($"方向控制失敗: {ex.Message}"); } } - + /// /// 开始指定方向的测试 - 写入1到对应寄存器 /// M0=上升, M1=下降, M2=向右, M3=向左 @@ -547,7 +547,7 @@ namespace COFTester.Services "LEFT" => ModbusDirectionRegister.Left, _ => throw new ArgumentException($"未知方向: {direction}") }; - + System.Diagnostics.Debug.WriteLine($"[Modbus] 开始测试: {direction} - 寫入寄存器 M{(ushort)register} = 1"); await WriteDirectionRegisterAsync((ushort)register, 1); } @@ -557,7 +557,7 @@ namespace COFTester.Services OnErrorOccurred($"开始测试失败: {ex.Message}"); } } - + /// /// 停止指定方向的测试 - 写入0到对应寄存器 /// @@ -575,7 +575,7 @@ namespace COFTester.Services "LEFT" => ModbusDirectionRegister.Left, _ => throw new ArgumentException($"未知方向: {direction}") }; - + System.Diagnostics.Debug.WriteLine($"[Modbus] 停止测试: {direction} - 寫入寄存器 M{(ushort)register} = 0"); await WriteDirectionRegisterAsync((ushort)register, 0); } @@ -585,7 +585,7 @@ namespace COFTester.Services OnErrorOccurred($"停止测试失败: {ex.Message}"); } } - + /// /// 触发测试启动按钮 M30(复归型) /// M30 是复归型按钮,需要写入脉冲信号:true → 延迟 → false @@ -598,23 +598,23 @@ namespace COFTester.Services if (_modbusMaster != null && _isConnected) { const ushort START_BUTTON_ADDRESS = 30; // M30 复归型按钮 - + System.Diagnostics.Debug.WriteLine($"[Modbus] 触发测试启动按钮 M{START_BUTTON_ADDRESS}"); - + // 写入 true(触发) await _modbusMaster.WriteSingleCoilAsync(1, START_BUTTON_ADDRESS, true); System.Diagnostics.Debug.WriteLine($"[Modbus] M{START_BUTTON_ADDRESS} = true"); - + // 延迟 100ms await Task.Delay(100); - + // 写入 false(复位) await _modbusMaster.WriteSingleCoilAsync(1, START_BUTTON_ADDRESS, false); System.Diagnostics.Debug.WriteLine($"[Modbus] M{START_BUTTON_ADDRESS} = false"); - + // 延迟 100ms 确保 PLC 处理完成 await Task.Delay(100); - + System.Diagnostics.Debug.WriteLine($"[Modbus] M{START_BUTTON_ADDRESS} 脉冲信号发送完成"); } } @@ -625,7 +625,7 @@ namespace COFTester.Services throw; } } - + /// /// 读取测试状态标记位 M31 /// M31: 1=测试中,0=停止 @@ -638,12 +638,12 @@ namespace COFTester.Services if (_modbusMaster != null && _isConnected) { const ushort STATUS_FLAG_ADDRESS = 31; // M31 状态标记位 - + var coils = await _modbusMaster.ReadCoilsAsync(1, STATUS_FLAG_ADDRESS, 1); bool isRunning = coils[0]; - + System.Diagnostics.Debug.WriteLine($"[Modbus] 读取测试状态 M{STATUS_FLAG_ADDRESS} = {(isRunning ? "1 (测试中)" : "0 (停止)")}"); - + return isRunning; } return false; @@ -654,7 +654,7 @@ namespace COFTester.Services return false; } } - + /// /// 写入启动/停止寄存器 M31(已弃用,请使用 TriggerTestStartAsync) /// M30 复归型, M31 标注为 1=开始,0=停止 @@ -668,13 +668,13 @@ namespace COFTester.Services if (_modbusMaster != null && _isConnected) { const ushort START_STOP_REGISTER = 31; // M31 - + System.Diagnostics.Debug.WriteLine($"[Modbus] 写入启动/停止寄存器 M{START_STOP_REGISTER} = {value}"); await _modbusMaster.WriteSingleCoilAsync(1, START_STOP_REGISTER, value == 1); - + // 延迟确保 PLC 处理完成 await Task.Delay(100); - + System.Diagnostics.Debug.WriteLine($"[Modbus] M{START_STOP_REGISTER} 写入完成"); } } @@ -688,36 +688,36 @@ namespace COFTester.Services protected abstract Task AcquisitionLoopAsync(TestParameters parameters, CancellationToken token); protected abstract Task ReadSensorDataAsync(); - + /// /// 讀取位置數據(升降位置和水平位置) /// D12 升降位置(只讀), D16 水平位置(只讀) /// /// 元組 (升降位置, 水平位置) protected abstract Task<(double verticalPos, double horizontalPos)> ReadPositionDataAsync(); - + /// /// 讀取手動控制參數從 PLC 寄存器 /// D350 水平手動速度, D360 水平手動位移, D310 升降手動速度, D320 升降手動位移 /// D290 升降極限, D292 水平極限, D1320 拉力系數, D1322 拉力保護 /// public abstract Task ReadManualControlParametersAsync(); - + /// /// 寫入校準命令到 M1300 寄存器 /// protected abstract Task WriteCalibrationRegisterAsync(ushort value); - + /// /// 寫入方向控制命令到 M0-M3 寄存器 /// protected abstract Task WriteDirectionRegisterAsync(ushort register, ushort value); - + /// /// 寫入測試參數到 PLC 寄存器(受保护方法) /// protected abstract Task WriteTestParametersAsync(TestParameters parameters); - + /// /// 公开方法:写入测试参数到 PLC 寄存器 /// 供外部调用(如 ViewModel 在应用配置时调用) @@ -864,7 +864,7 @@ namespace COFTester.Services { // 將浮點數轉換為字節數組 byte[] bytes = BitConverter.GetBytes(value); - + // 參數驗證 if (bytes == null || bytes.Length != 4) throw new InvalidOperationException( @@ -1041,7 +1041,7 @@ namespace COFTester.Services // ===== 关键修改:移除测试开始时的参数写入 ===== // 参数只在"应用配置"时写入,测试时不再重复写入 System.Diagnostics.Debug.WriteLine("[ModbusTCP] 开始数据采集(参数已在配置时写入)"); - + // 短暂延迟确保系统准备就绪 await Task.Delay(100, token); @@ -1053,11 +1053,16 @@ namespace COFTester.Services System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 数据采集配置: 最大 {maxPoints} 点, 间隔 {intervalMs:F1}ms"); System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 停止条件:D1314力值、D360位移、D12升降位置、D16水平位置全为零"); - + bool? m33 = false; // 循环读取传感器数据(包含力值、位移和位置) int i = 0; - while (i < maxPoints && !token.IsCancellationRequested) + while (!m33.Value && !token.IsCancellationRequested) { + m33 = _modbusMaster.ReadCoils(1, 33, 1)[0]; + if (m33.Value) + { + break; + } // 每隔一定次数检查 M31 状态(避免频繁读取) if (i % 10 == 0) // 每 10 个数据点检查一次 { @@ -1076,10 +1081,10 @@ namespace COFTester.Services // 读取失败不影响数据采集,继续执行 } } - + // 读取力值和位移 var dataPoint = await ReadSensorDataAsync(); - + if (dataPoint != null) { // 读取升降位置和水平位置 @@ -1096,19 +1101,19 @@ namespace COFTester.Services dataPoint.VerticalPosition = 0; dataPoint.HorizontalPosition = 0; } - + // 检查是否所有数据都为零(使用小阈值判断浮点数为零) const double epsilon = 0.001; // 小于0.001视为零 - bool allZero = Math.Abs(dataPoint.Force) < epsilon && + bool allZero = Math.Abs(dataPoint.Force) < epsilon && Math.Abs(dataPoint.Displacement) < epsilon && Math.Abs(dataPoint.VerticalPosition) < epsilon && Math.Abs(dataPoint.HorizontalPosition) < epsilon; - + if (allZero) { consecutiveZeroCount++; System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 检测到全零数据 ({consecutiveZeroCount}/{zeroThreshold})"); - + if (consecutiveZeroCount >= zeroThreshold) { System.Diagnostics.Debug.WriteLine("[ModbusTCP] 连续检测到全零数据,停止采集"); @@ -1119,15 +1124,15 @@ namespace COFTester.Services { consecutiveZeroCount = 0; // 重置计数器 } - + OnDataReceived(dataPoint); } - + await Task.Delay((int)intervalMs, token); i++; } } - catch (OperationCanceledException) + catch (OperationCanceledException) { System.Diagnostics.Debug.WriteLine("[ModbusTCP] 测试被取消"); } @@ -1139,7 +1144,7 @@ namespace COFTester.Services { _isAcquiring = false; System.Diagnostics.Debug.WriteLine("[ModbusTCP] 數據採集結束"); - + // 最后再检查一次 M31 状态 try { @@ -1165,7 +1170,7 @@ namespace COFTester.Services // 讀取 D1314 摩擦力(2個寄存器) var forceRegisters = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.FrictionForceRegister, 2); - + // 讀取 D16 位移(2個寄存器) var displacementRegisters = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalPositionRegister, 2); @@ -1231,7 +1236,7 @@ namespace COFTester.Services throw; } } - + /// /// 寫入手動控制參數到 PLC 寄存器 /// D350 水平手動速度, D360 水平手動位移, D310 升降手動速度, D320 升降手動位移 @@ -1247,37 +1252,37 @@ namespace COFTester.Services var hSpeedRegs = ConvertFloatToRegisters((float)parameters.HorizontalManualSpeed); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.HorizontalManualSpeedRegister, hSpeedRegs); - + // D360 水平手動位移 var hDispRegs = ConvertFloatToRegisters((float)parameters.HorizontalManualDisplacement); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.HorizontalManualDisplacementRegister, hDispRegs); - + // D310 升降手動速度 var vSpeedRegs = ConvertFloatToRegisters((float)parameters.VerticalManualSpeed); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.VerticalManualSpeedRegister, vSpeedRegs); - + // D320 升降手動位移 var vDispRegs = ConvertFloatToRegisters((float)parameters.VerticalManualDisplacement); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.VerticalManualDisplacementRegister, vDispRegs); - + // D290 升降極限 var vLimitRegs = ConvertFloatToRegisters((float)parameters.VerticalLimit); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.VerticalLimitRegister, vLimitRegs); - + // D292 水平極限 var hLimitRegs = ConvertFloatToRegisters((float)parameters.HorizontalLimit); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.HorizontalLimitRegister, hLimitRegs); - + // D1320 拉力系數 var forceCoefRegs = ConvertFloatToRegisters((float)parameters.ForceCoefficient); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.ForceCoefficientRegister, forceCoefRegs); - + // D1322 拉力保護 var forceProtRegs = ConvertFloatToRegisters((float)parameters.ForceProtection); await _modbusMaster.WriteMultipleRegistersAsync( @@ -1299,7 +1304,7 @@ namespace COFTester.Services throw; } } - + /// /// 讀取位置數據(升降位置和水平位置) /// D12 升降位置(只讀), D16 水平位置(只讀) @@ -1314,12 +1319,12 @@ namespace COFTester.Services var vPosRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalPositionRegister, 2); var verticalPos = ConvertRegistersToFloat(vPosRegs, 0); - + // 讀取 D16 水平位置(2個寄存器) var hPosRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalPositionRegister, 2); var horizontalPos = ConvertRegistersToFloat(hPosRegs, 0); - + return (verticalPos, horizontalPos); } catch (Exception ex) @@ -1328,7 +1333,7 @@ namespace COFTester.Services return (0, 0); } } - + /// /// 讀取手動控制參數從 PLC 寄存器 /// @@ -1343,90 +1348,90 @@ namespace COFTester.Services try { var parameters = new TestParameters(); - + // === 讀取基本測試參數 === // D20 滑塊質量 var sledMassRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.SledMassRegister, 2); parameters.SledMass = ConvertRegistersToFloat(sledMassRegs, 0); - + // D22 測試速度 var testSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.TestSpeedRegister, 2); parameters.TestSpeed = ConvertRegistersToFloat(testSpeedRegs, 0); - + // D24 測試時長 var testDurationRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.TestDurationRegister, 2); parameters.TestDuration = ConvertRegistersToFloat(testDurationRegs, 0); - + // D26 測試行程 var testStrokeRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.TestStrokeRegister, 2); parameters.TestStroke = ConvertRegistersToFloat(testStrokeRegs, 0); - + // D28 採樣頻率 var samplingRateRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.SamplingRateRegister, 2); parameters.SamplingRate = ConvertRegistersToFloat(samplingRateRegs, 0); - + // === 讀取手動控制參數 === // D350 水平手動速度 var hSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalManualSpeedRegister, 2); parameters.HorizontalManualSpeed = ConvertRegistersToFloat(hSpeedRegs, 0); - + // D360 水平手動位移 var hDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalManualDisplacementRegister, 2); parameters.HorizontalManualDisplacement = ConvertRegistersToFloat(hDispRegs, 0); - + // D310 升降手動速度 var vSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalManualSpeedRegister, 2); parameters.VerticalManualSpeed = ConvertRegistersToFloat(vSpeedRegs, 0); - + // D320 升降手動位移 var vDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalManualDisplacementRegister, 2); parameters.VerticalManualDisplacement = ConvertRegistersToFloat(vDispRegs, 0); - + // D290 升降極限 var vLimitRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalLimitRegister, 2); parameters.VerticalLimit = ConvertRegistersToFloat(vLimitRegs, 0); - + // D292 水平極限 var hLimitRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalLimitRegister, 2); parameters.HorizontalLimit = ConvertRegistersToFloat(hLimitRegs, 0); - + // D1320 拉力系數 var forceCoefRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.ForceCoefficientRegister, 2); parameters.ForceCoefficient = ConvertRegistersToFloat(forceCoefRegs, 0); - + // D1322 拉力保護 var forceProtRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.ForceProtectionRegister, 2); parameters.ForceProtection = ConvertRegistersToFloat(forceProtRegs, 0); - + // === 讀取基本測試參數(新增)=== // D370 水平測試速度 var hTestSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalTestSpeedRegister, 2); parameters.HorizontalTestSpeed = ConvertRegistersToFloat(hTestSpeedRegs, 0); - + // D380 水平測試位移 var hTestDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalTestDisplacementRegister, 2); parameters.HorizontalTestDisplacement = ConvertRegistersToFloat(hTestDispRegs, 0); - + // D330 升降測試速度 var vTestSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalTestSpeedRegister, 2); parameters.VerticalTestSpeed = ConvertRegistersToFloat(vTestSpeedRegs, 0); - + // D340 升降測試位移 var vTestDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalTestDisplacementRegister, 2); @@ -1453,7 +1458,7 @@ namespace COFTester.Services System.Diagnostics.Debug.WriteLine($" 水平測試位移: {parameters.HorizontalTestDisplacement} mm"); System.Diagnostics.Debug.WriteLine($" 升降測試速度: {parameters.VerticalTestSpeed} mm/min"); System.Diagnostics.Debug.WriteLine($" 升降測試位移: {parameters.VerticalTestDisplacement} mm"); - + return parameters; } catch (Exception ex) @@ -1553,10 +1558,10 @@ namespace COFTester.Services { _modbusMaster?.Dispose(); _modbusMaster = null; - + _adapter?.Dispose(); _adapter = null; - + if (_serialPort != null) { if (_serialPort.IsOpen) @@ -1581,7 +1586,7 @@ namespace COFTester.Services // ===== 关键修改:移除测试开始时的参数写入 ===== // 参数只在"应用配置"时写入,测试时不再重复写入 System.Diagnostics.Debug.WriteLine("[ModbusRTU] 开始数据采集(参数已在配置时写入)"); - + // 短暂延迟确保系统准备就绪 await Task.Delay(100, token); @@ -1593,7 +1598,7 @@ namespace COFTester.Services System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 数据采集配置: 最大 {maxPoints} 点, 间隔 {intervalMs:F1}ms"); System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 停止条件:D1314力值、D360位移、D12升降位置、D16水平位置全为零"); - + bool m33 = true; // 循环读取传感器数据(包含力值、位移和位置) int i = 0; while (i < maxPoints && !token.IsCancellationRequested) @@ -1616,10 +1621,10 @@ namespace COFTester.Services // 读取失败不影响数据采集,继续执行 } } - + // 读取力值和位移 var dataPoint = await ReadSensorDataAsync(); - + if (dataPoint != null) { // 读取升降位置和水平位置 @@ -1636,19 +1641,19 @@ namespace COFTester.Services dataPoint.VerticalPosition = 0; dataPoint.HorizontalPosition = 0; } - + // 检查是否所有数据都为零(使用小阈值判断浮点数为零) const double epsilon = 0.001; // 小于0.001视为零 - bool allZero = Math.Abs(dataPoint.Force) < epsilon && + bool allZero = Math.Abs(dataPoint.Force) < epsilon && Math.Abs(dataPoint.Displacement) < epsilon && Math.Abs(dataPoint.VerticalPosition) < epsilon && Math.Abs(dataPoint.HorizontalPosition) < epsilon; - + if (allZero) { consecutiveZeroCount++; System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 检测到全零数据 ({consecutiveZeroCount}/{zeroThreshold})"); - + if (consecutiveZeroCount >= zeroThreshold) { System.Diagnostics.Debug.WriteLine("[ModbusRTU] 连续检测到全零数据,停止采集"); @@ -1659,15 +1664,15 @@ namespace COFTester.Services { consecutiveZeroCount = 0; // 重置计数器 } - + OnDataReceived(dataPoint); } - + await Task.Delay((int)intervalMs, token); i++; } } - catch (OperationCanceledException) + catch (OperationCanceledException) { System.Diagnostics.Debug.WriteLine("[ModbusRTU] 测试被取消"); } @@ -1679,7 +1684,7 @@ namespace COFTester.Services { _isAcquiring = false; System.Diagnostics.Debug.WriteLine("[ModbusRTU] 數據採集結束"); - + // 最后再检查一次 M31 状态 try { @@ -1687,7 +1692,7 @@ namespace COFTester.Services System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 采集结束时 M31 = {(isTestRunning ? "1 (测试中)" : "0 (停止)")}"); } catch { } - + OnTestFinished(); } } @@ -1705,7 +1710,7 @@ namespace COFTester.Services // 讀取 D1314 摩擦力(2個寄存器) var forceRegisters = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.FrictionForceRegister, 2); - + // 讀取 D360 位移(2個寄存器) var displacementRegisters = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalPositionRegister, 2); @@ -1765,7 +1770,7 @@ namespace COFTester.Services { // 準備所有參數數據(5個Float = 10個寄存器) var allRegisters = new ushort[10]; - + var sledMassRegs = ConvertFloatToRegisters((float)parameters.SledMass); var testSpeedRegs = ConvertFloatToRegisters((float)parameters.TestSpeed); var testDurationRegs = ConvertFloatToRegisters((float)parameters.TestDuration); @@ -1794,7 +1799,7 @@ namespace COFTester.Services System.Diagnostics.Debug.WriteLine($" 測試時長: {parameters.TestDuration}s → 寄存器[{_config.TestDurationRegister}]"); System.Diagnostics.Debug.WriteLine($" 測試行程: {parameters.TestStroke}mm → 寄存器[{_config.TestStrokeRegister}]"); System.Diagnostics.Debug.WriteLine($" 採樣頻率: {parameters.SamplingRate}Hz → 寄存器[{_config.SamplingRateRegister}]"); - + // 寫入手動控制參數 await WriteManualControlParametersAsync(parameters); } @@ -1804,7 +1809,7 @@ namespace COFTester.Services throw; } } - + /// /// 寫入手動控制參數到 PLC 寄存器 /// @@ -1818,37 +1823,37 @@ namespace COFTester.Services var hSpeedRegs = ConvertFloatToRegisters((float)parameters.HorizontalManualSpeed); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.HorizontalManualSpeedRegister, hSpeedRegs); - + // D360 水平手動位移 var hDispRegs = ConvertFloatToRegisters((float)parameters.HorizontalManualDisplacement); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.HorizontalManualDisplacementRegister, hDispRegs); - + // D310 升降手動速度 var vSpeedRegs = ConvertFloatToRegisters((float)parameters.VerticalManualSpeed); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.VerticalManualSpeedRegister, vSpeedRegs); - + // D320 升降手動位移 var vDispRegs = ConvertFloatToRegisters((float)parameters.VerticalManualDisplacement); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.VerticalManualDisplacementRegister, vDispRegs); - + // D290 升降極限 var vLimitRegs = ConvertFloatToRegisters((float)parameters.VerticalLimit); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.VerticalLimitRegister, vLimitRegs); - + // D292 水平極限 var hLimitRegs = ConvertFloatToRegisters((float)parameters.HorizontalLimit); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.HorizontalLimitRegister, hLimitRegs); - + // D1320 拉力系數 var forceCoefRegs = ConvertFloatToRegisters((float)parameters.ForceCoefficient); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.ForceCoefficientRegister, forceCoefRegs); - + // D1322 拉力保護 var forceProtRegs = ConvertFloatToRegisters((float)parameters.ForceProtection); await _modbusMaster.WriteMultipleRegistersAsync( @@ -1862,7 +1867,7 @@ namespace COFTester.Services throw; } } - + /// /// 讀取位置數據 /// @@ -1875,11 +1880,11 @@ namespace COFTester.Services var vPosRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalPositionRegister, 2); var verticalPos = ConvertRegistersToFloat(vPosRegs, 0); - + var hPosRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalPositionRegister, 2); var horizontalPos = ConvertRegistersToFloat(hPosRegs, 0); - + return (verticalPos, horizontalPos); } catch (Exception ex) @@ -1888,7 +1893,7 @@ namespace COFTester.Services return (0, 0); } } - + /// /// 讀取手動控制參數從 PLC 寄存器 /// @@ -1903,77 +1908,77 @@ namespace COFTester.Services try { var parameters = new TestParameters(); - + // === 讀取基本測試參數 === var sledMassRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.SledMassRegister, 2); parameters.SledMass = ConvertRegistersToFloat(sledMassRegs, 0); - + var testSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.TestSpeedRegister, 2); parameters.TestSpeed = ConvertRegistersToFloat(testSpeedRegs, 0); - + var testDurationRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.TestDurationRegister, 2); parameters.TestDuration = ConvertRegistersToFloat(testDurationRegs, 0); - + var testStrokeRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.TestStrokeRegister, 2); parameters.TestStroke = ConvertRegistersToFloat(testStrokeRegs, 0); - + var samplingRateRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.SamplingRateRegister, 2); parameters.SamplingRate = ConvertRegistersToFloat(samplingRateRegs, 0); - + // === 讀取手動控制參數 === var hSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalManualSpeedRegister, 2); parameters.HorizontalManualSpeed = ConvertRegistersToFloat(hSpeedRegs, 0); - + var hDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalManualDisplacementRegister, 2); parameters.HorizontalManualDisplacement = ConvertRegistersToFloat(hDispRegs, 0); - + var vSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalManualSpeedRegister, 2); parameters.VerticalManualSpeed = ConvertRegistersToFloat(vSpeedRegs, 0); - + var vDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalManualDisplacementRegister, 2); parameters.VerticalManualDisplacement = ConvertRegistersToFloat(vDispRegs, 0); - + var vLimitRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalLimitRegister, 2); parameters.VerticalLimit = ConvertRegistersToFloat(vLimitRegs, 0); - + var hLimitRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalLimitRegister, 2); parameters.HorizontalLimit = ConvertRegistersToFloat(hLimitRegs, 0); - + var forceCoefRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.ForceCoefficientRegister, 2); parameters.ForceCoefficient = ConvertRegistersToFloat(forceCoefRegs, 0); - + var forceProtRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.ForceProtectionRegister, 2); parameters.ForceProtection = ConvertRegistersToFloat(forceProtRegs, 0); - + // === 讀取基本測試參數(新增)=== // D370 水平測試速度 var hTestSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalTestSpeedRegister, 2); parameters.HorizontalTestSpeed = ConvertRegistersToFloat(hTestSpeedRegs, 0); - + // D380 水平測試位移 var hTestDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalTestDisplacementRegister, 2); parameters.HorizontalTestDisplacement = ConvertRegistersToFloat(hTestDispRegs, 0); - + // D330 升降測試速度 var vTestSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalTestSpeedRegister, 2); parameters.VerticalTestSpeed = ConvertRegistersToFloat(vTestSpeedRegs, 0); - + // D340 升降測試位移 var vTestDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalTestDisplacementRegister, 2); @@ -1985,7 +1990,7 @@ namespace COFTester.Services System.Diagnostics.Debug.WriteLine($" 水平測試位移: {parameters.HorizontalTestDisplacement} mm"); System.Diagnostics.Debug.WriteLine($" 升降測試速度: {parameters.VerticalTestSpeed} mm/min"); System.Diagnostics.Debug.WriteLine($" 升降測試位移: {parameters.VerticalTestDisplacement} mm"); - + return parameters; } catch (Exception ex) @@ -2080,10 +2085,10 @@ namespace COFTester.Services { _modbusMaster?.Dispose(); _modbusMaster = null; - + _adapter?.Dispose(); _adapter = null; - + if (_serialPort != null) { if (_serialPort.IsOpen) _serialPort.Close(); @@ -2105,7 +2110,7 @@ namespace COFTester.Services // ===== 关键修改:移除测试开始时的参数写入 ===== // 参数只在"应用配置"时写入,测试时不再重复写入 System.Diagnostics.Debug.WriteLine("[ModbusASCII] 开始数据采集(参数已在配置时写入)"); - + await Task.Delay(100, token); // 循环读取传感器数据(不再发送 Start 命令) @@ -2121,6 +2126,7 @@ namespace COFTester.Services int i = 0; while (i < maxPoints && !token.IsCancellationRequested) { + // 每隔一定次数检查 M31 状态(避免频繁读取) if (i % 10 == 0) // 每 10 个数据点检查一次 { @@ -2139,10 +2145,10 @@ namespace COFTester.Services // 读取失败不影响数据采集,继续执行 } } - + // 读取力值和位移 var dataPoint = await ReadSensorDataAsync(); - + if (dataPoint != null) { // 读取升降位置和水平位置 @@ -2159,19 +2165,19 @@ namespace COFTester.Services dataPoint.VerticalPosition = 0; dataPoint.HorizontalPosition = 0; } - + // 检查是否所有数据都为零(使用小阈值判断浮点数为零) const double epsilon = 0.001; // 小于0.001视为零 - bool allZero = Math.Abs(dataPoint.Force) < epsilon && + bool allZero = Math.Abs(dataPoint.Force) < epsilon && Math.Abs(dataPoint.Displacement) < epsilon && Math.Abs(dataPoint.VerticalPosition) < epsilon && Math.Abs(dataPoint.HorizontalPosition) < epsilon; - + if (allZero) { consecutiveZeroCount++; System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 检测到全零数据 ({consecutiveZeroCount}/{zeroThreshold})"); - + if (consecutiveZeroCount >= zeroThreshold) { System.Diagnostics.Debug.WriteLine("[ModbusASCII] 连续检测到全零数据,停止采集"); @@ -2182,15 +2188,15 @@ namespace COFTester.Services { consecutiveZeroCount = 0; // 重置计数器 } - + OnDataReceived(dataPoint); } - + await Task.Delay((int)intervalMs, token); i++; } } - catch (OperationCanceledException) + catch (OperationCanceledException) { System.Diagnostics.Debug.WriteLine("[ModbusASCII] 测试被取消"); } @@ -2202,7 +2208,7 @@ namespace COFTester.Services { _isAcquiring = false; System.Diagnostics.Debug.WriteLine("[ModbusASCII] 数据采集结束"); - + // 最后再检查一次 M31 状态 try { @@ -2210,7 +2216,7 @@ namespace COFTester.Services System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 采集结束时 M31 = {(isTestRunning ? "1 (测试中)" : "0 (停止)")}"); } catch { } - + OnTestFinished(); } } @@ -2228,7 +2234,7 @@ namespace COFTester.Services // 讀取 D1314 摩擦力(2個寄存器) var forceRegisters = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.FrictionForceRegister, 2); - + // 讀取 D360 位移(2個寄存器) var displacementRegisters = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalPositionRegister, 2); @@ -2283,7 +2289,7 @@ namespace COFTester.Services try { var allRegisters = new ushort[10]; - + var sledMassRegs = ConvertFloatToRegisters((float)parameters.SledMass); var testSpeedRegs = ConvertFloatToRegisters((float)parameters.TestSpeed); var testDurationRegs = ConvertFloatToRegisters((float)parameters.TestDuration); @@ -2305,7 +2311,7 @@ namespace COFTester.Services _config.SlaveId, _config.SledMassRegister, allRegisters); System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 參數寫入完成"); - + // 寫入手動控制參數 await WriteManualControlParametersAsync(parameters); } @@ -2315,7 +2321,7 @@ namespace COFTester.Services throw; } } - + /// /// 寫入手動控制參數到 PLC 寄存器 /// @@ -2329,37 +2335,37 @@ namespace COFTester.Services var hSpeedRegs = ConvertFloatToRegisters((float)parameters.HorizontalManualSpeed); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.HorizontalManualSpeedRegister, hSpeedRegs); - + // D360 水平手動位移 var hDispRegs = ConvertFloatToRegisters((float)parameters.HorizontalManualDisplacement); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.HorizontalManualDisplacementRegister, hDispRegs); - + // D310 升降手動速度 var vSpeedRegs = ConvertFloatToRegisters((float)parameters.VerticalManualSpeed); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.VerticalManualSpeedRegister, vSpeedRegs); - + // D320 升降手動位移 var vDispRegs = ConvertFloatToRegisters((float)parameters.VerticalManualDisplacement); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.VerticalManualDisplacementRegister, vDispRegs); - + // D290 升降極限 var vLimitRegs = ConvertFloatToRegisters((float)parameters.VerticalLimit); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.VerticalLimitRegister, vLimitRegs); - + // D292 水平極限 var hLimitRegs = ConvertFloatToRegisters((float)parameters.HorizontalLimit); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.HorizontalLimitRegister, hLimitRegs); - + // D1320 拉力系數 var forceCoefRegs = ConvertFloatToRegisters((float)parameters.ForceCoefficient); await _modbusMaster.WriteMultipleRegistersAsync( _config.SlaveId, _config.ForceCoefficientRegister, forceCoefRegs); - + // D1322 拉力保護 var forceProtRegs = ConvertFloatToRegisters((float)parameters.ForceProtection); await _modbusMaster.WriteMultipleRegistersAsync( @@ -2373,7 +2379,7 @@ namespace COFTester.Services throw; } } - + /// /// 讀取位置數據 /// @@ -2386,11 +2392,11 @@ namespace COFTester.Services var vPosRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalPositionRegister, 2); var verticalPos = ConvertRegistersToFloat(vPosRegs, 0); - + var hPosRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalPositionRegister, 2); var horizontalPos = ConvertRegistersToFloat(hPosRegs, 0); - + return (verticalPos, horizontalPos); } catch (Exception ex) @@ -2399,7 +2405,7 @@ namespace COFTester.Services return (0, 0); } } - + /// /// 讀取手動控制參數從 PLC 寄存器 /// @@ -2414,77 +2420,77 @@ namespace COFTester.Services try { var parameters = new TestParameters(); - + // === 讀取基本測試參數 === var sledMassRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.SledMassRegister, 2); parameters.SledMass = ConvertRegistersToFloat(sledMassRegs, 0); - + var testSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.TestSpeedRegister, 2); parameters.TestSpeed = ConvertRegistersToFloat(testSpeedRegs, 0); - + var testDurationRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.TestDurationRegister, 2); parameters.TestDuration = ConvertRegistersToFloat(testDurationRegs, 0); - + var testStrokeRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.TestStrokeRegister, 2); parameters.TestStroke = ConvertRegistersToFloat(testStrokeRegs, 0); - + var samplingRateRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.SamplingRateRegister, 2); parameters.SamplingRate = ConvertRegistersToFloat(samplingRateRegs, 0); - + // === 讀取手動控制參數 === var hSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalManualSpeedRegister, 2); parameters.HorizontalManualSpeed = ConvertRegistersToFloat(hSpeedRegs, 0); - + var hDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalManualDisplacementRegister, 2); parameters.HorizontalManualDisplacement = ConvertRegistersToFloat(hDispRegs, 0); - + var vSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalManualSpeedRegister, 2); parameters.VerticalManualSpeed = ConvertRegistersToFloat(vSpeedRegs, 0); - + var vDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalManualDisplacementRegister, 2); parameters.VerticalManualDisplacement = ConvertRegistersToFloat(vDispRegs, 0); - + var vLimitRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalLimitRegister, 2); parameters.VerticalLimit = ConvertRegistersToFloat(vLimitRegs, 0); - + var hLimitRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalLimitRegister, 2); parameters.HorizontalLimit = ConvertRegistersToFloat(hLimitRegs, 0); - + var forceCoefRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.ForceCoefficientRegister, 2); parameters.ForceCoefficient = ConvertRegistersToFloat(forceCoefRegs, 0); - + var forceProtRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.ForceProtectionRegister, 2); parameters.ForceProtection = ConvertRegistersToFloat(forceProtRegs, 0); - + // === 讀取基本測試參數(新增)=== // D370 水平測試速度 var hTestSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalTestSpeedRegister, 2); parameters.HorizontalTestSpeed = ConvertRegistersToFloat(hTestSpeedRegs, 0); - + // D380 水平測試位移 var hTestDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalTestDisplacementRegister, 2); parameters.HorizontalTestDisplacement = ConvertRegistersToFloat(hTestDispRegs, 0); - + // D330 升降測試速度 var vTestSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalTestSpeedRegister, 2); parameters.VerticalTestSpeed = ConvertRegistersToFloat(vTestSpeedRegs, 0); - + // D340 升降測試位移 var vTestDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalTestDisplacementRegister, 2); @@ -2496,7 +2502,7 @@ namespace COFTester.Services System.Diagnostics.Debug.WriteLine($" 水平測試位移: {parameters.HorizontalTestDisplacement} mm"); System.Diagnostics.Debug.WriteLine($" 升降測試速度: {parameters.VerticalTestSpeed} mm/min"); System.Diagnostics.Debug.WriteLine($" 升降測試位移: {parameters.VerticalTestDisplacement} mm"); - + return parameters; } catch (Exception ex) @@ -2700,7 +2706,7 @@ namespace COFTester.Services OnErrorOccurred($"方向控制失败: {ex.Message}"); } } - + /// /// 开始指定方向的测试 - 写入1到对应寄存器 /// M0=上升, M1=下降, M2=向右, M3=向左 @@ -2728,7 +2734,7 @@ namespace COFTester.Services OnErrorOccurred($"开始测试失败: {ex.Message}"); } } - + /// /// 停止指定方向的测试 - 写入0到对应寄存器 /// @@ -2796,7 +2802,7 @@ namespace COFTester.Services await Task.Run(() => _serialPort.WriteLine("READ")); string? response = await Task.Run(() => _serialPort.ReadLine()); - + if (string.IsNullOrEmpty(response)) return null; var parts = response.Split(','); @@ -2841,7 +2847,7 @@ namespace COFTester.Services { var mode = config.CommunicationMode?.ToUpper(); System.Diagnostics.Debug.WriteLine($"[ModbusServiceFactory] 创建服务,模式: {config.CommunicationMode} -> {mode}"); - + IDataAcquisitionService service = mode switch { "MODBUSTCP" => new ModbusTcpService(config.ModbusTcp), @@ -2851,7 +2857,7 @@ namespace COFTester.Services "SIMULATED" => new SimulatedDataAcquisitionService(), _ => new SimulatedDataAcquisitionService() // 默認使用模擬模式 }; - + System.Diagnostics.Debug.WriteLine($"[ModbusServiceFactory] 已创建服务: {service.GetType().Name}"); return service; } diff --git a/CSI-H238M/CSI-H238M/ViewModels/ViewModel.cs b/CSI-H238M/CSI-H238M/ViewModels/ViewModel.cs index 1e67022..789762f 100644 --- a/CSI-H238M/CSI-H238M/ViewModels/ViewModel.cs +++ b/CSI-H238M/CSI-H238M/ViewModels/ViewModel.cs @@ -415,16 +415,7 @@ namespace COFTester.ViewModels } } - public List RealTimePoints - { - get => _realTimePoints; - private set - { - _realTimePoints = value; - OnPropertyChanged(); - OnPropertyChanged(nameof(DataPointsCount)); - } - } + public int DataPointsCount => _realTimePoints?.Count ?? 0;