更新
This commit is contained in:
@@ -33,25 +33,25 @@ namespace COFTester.Models
|
|||||||
public class TestParameters : INotifyPropertyChanged
|
public class TestParameters : INotifyPropertyChanged
|
||||||
{
|
{
|
||||||
private string _standard = "GB 10006";
|
private string _standard = "GB 10006";
|
||||||
private double _sledMass = 200.0;
|
private double _sledMass = 0.0; // 不设置默认值,从寄存器读取
|
||||||
private double _testSpeed = 100.0;
|
private double _testSpeed = 0.0; // 不设置默认值,从寄存器读取
|
||||||
private double _testDuration = 40.0;
|
private double _testDuration = 0.0; // 不设置默认值,从寄存器读取
|
||||||
private double _testStroke = 80.0;
|
private double _testStroke = 0.0; // 不设置默认值,从寄存器读取
|
||||||
private double _staticCalcStart = 0.0;
|
private double _staticCalcStart = 0.0;
|
||||||
private double _staticCalcEnd = 5.0;
|
private double _staticCalcEnd = 5.0;
|
||||||
private double _kineticCalcStart = 10.0;
|
private double _kineticCalcStart = 10.0;
|
||||||
private double _kineticCalcEnd = 75.0;
|
private double _kineticCalcEnd = 75.0;
|
||||||
private double _sampleWidth = 25.0; // 試樣寬度 (mm),用於剝離強度計算
|
private double _sampleWidth = 25.0; // 試樣寬度 (mm),用於剝離強度計算
|
||||||
|
|
||||||
// 手动控制参数
|
// 手动控制参数 - 不设置默认值,从寄存器读取
|
||||||
private double _horizontalManualSpeed = 10.0; // 水平手动速度 (mm/s)
|
private double _horizontalManualSpeed = 0.0;
|
||||||
private double _horizontalManualDisplacement = 5.0; // 水平手动位移 (mm)
|
private double _horizontalManualDisplacement = 0.0;
|
||||||
private double _verticalManualSpeed = 5.0; // 升降手动速度 (mm/s)
|
private double _verticalManualSpeed = 0.0;
|
||||||
private double _verticalManualDisplacement = 2.0; // 升降手动位移 (mm)
|
private double _verticalManualDisplacement = 0.0;
|
||||||
private double _verticalLimit = 100.0; // 升降极限 (mm)
|
private double _verticalLimit = 0.0;
|
||||||
private double _horizontalLimit = 200.0; // 水平极限 (mm)
|
private double _horizontalLimit = 0.0;
|
||||||
private double _forceCoefficient = 1.0; // 拉力系数 (N/V)
|
private double _forceCoefficient = 0.0;
|
||||||
private double _forceProtection = 500.0; // 拉力保护 (N)
|
private double _forceProtection = 0.0;
|
||||||
|
|
||||||
// 方向控制
|
// 方向控制
|
||||||
private bool _directionUp = true;
|
private bool _directionUp = true;
|
||||||
@@ -230,7 +230,7 @@ namespace COFTester.Models
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public double SamplingRate { get; set; } = 100.0; // 採樣頻率 (Hz)
|
public double SamplingRate { get; set; } = 0.0; // 採樣頻率 (Hz) - 从寄存器读取
|
||||||
public string MaterialType { get; set; } = "Plastic Film"; // 材料類型
|
public string MaterialType { get; set; } = "Plastic Film"; // 材料類型
|
||||||
public string Operator { get; set; } = "Default"; // 操作員
|
public string Operator { get; set; } = "Default"; // 操作員
|
||||||
|
|
||||||
|
|||||||
@@ -481,6 +481,13 @@ namespace COFTester.Services
|
|||||||
/// <returns>元組 (升降位置, 水平位置)</returns>
|
/// <returns>元組 (升降位置, 水平位置)</returns>
|
||||||
protected abstract Task<(double verticalPos, double horizontalPos)> ReadPositionDataAsync();
|
protected abstract Task<(double verticalPos, double horizontalPos)> ReadPositionDataAsync();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 讀取手動控制參數從 PLC 寄存器
|
||||||
|
/// D350 水平手動速度, D360 水平手動位移, D310 升降手動速度, D320 升降手動位移
|
||||||
|
/// D290 升降極限, D292 水平極限, D1320 拉力系數, D1322 拉力保護
|
||||||
|
/// </summary>
|
||||||
|
public abstract Task<TestParameters?> ReadManualControlParametersAsync();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 寫入校準命令到 M1300 寄存器
|
/// 寫入校準命令到 M1300 寄存器
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -874,6 +881,115 @@ namespace COFTester.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 讀取手動控制參數從 PLC 寄存器
|
||||||
|
/// </summary>
|
||||||
|
public override async Task<TestParameters?> ReadManualControlParametersAsync()
|
||||||
|
{
|
||||||
|
if (_modbusMaster == null || !_isConnected)
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine("[ModbusTCP] 無法讀取參數:設備未連接");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 所有參數讀取完成:");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" === 基本測試參數 ===");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 滑塊質量: {parameters.SledMass} g");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 測試速度: {parameters.TestSpeed} mm/min");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 測試時長: {parameters.TestDuration} s");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 測試行程: {parameters.TestStroke} mm");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 採樣頻率: {parameters.SamplingRate} Hz");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" === 手動控制參數 ===");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 水平手動速度: {parameters.HorizontalManualSpeed} mm/min");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 水平手動位移: {parameters.HorizontalManualDisplacement} mm");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 升降手動速度: {parameters.VerticalManualSpeed} mm/min");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 升降手動位移: {parameters.VerticalManualDisplacement} mm");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 升降極限: {parameters.VerticalLimit} mm");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 水平極限: {parameters.HorizontalLimit} mm");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 拉力系數: {parameters.ForceCoefficient} N/V");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 拉力保護: {parameters.ForceProtection} N");
|
||||||
|
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 讀取參數失敗: {ex.Message}");
|
||||||
|
OnErrorOccurred($"讀取參數失敗: {ex.Message}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override void Dispose()
|
public override void Dispose()
|
||||||
{
|
{
|
||||||
base.Dispose();
|
base.Dispose();
|
||||||
@@ -1243,6 +1359,87 @@ namespace COFTester.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 讀取手動控制參數從 PLC 寄存器
|
||||||
|
/// </summary>
|
||||||
|
public override async Task<TestParameters?> ReadManualControlParametersAsync()
|
||||||
|
{
|
||||||
|
if (_modbusMaster == null || !_isConnected)
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine("[ModbusRTU] 無法讀取參數:設備未連接");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 所有參數讀取完成");
|
||||||
|
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 讀取參數失敗: {ex.Message}");
|
||||||
|
OnErrorOccurred($"讀取參數失敗: {ex.Message}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override void Dispose()
|
public override void Dispose()
|
||||||
{
|
{
|
||||||
base.Dispose();
|
base.Dispose();
|
||||||
@@ -1591,6 +1788,87 @@ namespace COFTester.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 讀取手動控制參數從 PLC 寄存器
|
||||||
|
/// </summary>
|
||||||
|
public override async Task<TestParameters?> ReadManualControlParametersAsync()
|
||||||
|
{
|
||||||
|
if (_modbusMaster == null || !_isConnected)
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine("[ModbusASCII] 無法讀取參數:設備未連接");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 所有參數讀取完成");
|
||||||
|
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 讀取參數失敗: {ex.Message}");
|
||||||
|
OnErrorOccurred($"讀取參數失敗: {ex.Message}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override void Dispose()
|
public override void Dispose()
|
||||||
{
|
{
|
||||||
base.Dispose();
|
base.Dispose();
|
||||||
|
|||||||
@@ -3,9 +3,11 @@ using System.Collections.Generic;
|
|||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using COFTester.Models;
|
using COFTester.Models;
|
||||||
using COFTester.Resources;
|
using COFTester.Resources;
|
||||||
|
using COFTester.Services;
|
||||||
|
|
||||||
namespace COFTester.ViewModels
|
namespace COFTester.ViewModels
|
||||||
{
|
{
|
||||||
@@ -14,35 +16,39 @@ namespace COFTester.ViewModels
|
|||||||
private TestStandard? _selectedStandard;
|
private TestStandard? _selectedStandard;
|
||||||
private TestParameters _configParams;
|
private TestParameters _configParams;
|
||||||
private bool _showKineticWarning;
|
private bool _showKineticWarning;
|
||||||
|
private readonly IDataAcquisitionService? _daqService;
|
||||||
|
|
||||||
public ConfigViewModel(TestParameters currentParams)
|
public ConfigViewModel(TestParameters currentParams, IDataAcquisitionService? daqService = null)
|
||||||
{
|
{
|
||||||
// 複製當前參數(包括所有手動控制參數)
|
_daqService = daqService;
|
||||||
|
|
||||||
|
// 初始化參數為空值(0),不使用 currentParams 的值
|
||||||
|
// 只有從寄存器讀取後才會顯示實際值
|
||||||
_configParams = new TestParameters
|
_configParams = new TestParameters
|
||||||
{
|
{
|
||||||
// 基本測試參數
|
// 基本測試參數 - 初始化為 0(空值)
|
||||||
Standard = currentParams.Standard,
|
Standard = currentParams.Standard, // 保留標準選擇
|
||||||
SledMass = currentParams.SledMass,
|
SledMass = 0.0,
|
||||||
TestSpeed = currentParams.TestSpeed,
|
TestSpeed = 0.0,
|
||||||
TestDuration = currentParams.TestDuration,
|
TestDuration = 0.0,
|
||||||
TestStroke = currentParams.TestStroke,
|
TestStroke = 0.0,
|
||||||
StaticCalcStart = currentParams.StaticCalcStart,
|
StaticCalcStart = currentParams.StaticCalcStart, // 保留計算區間
|
||||||
StaticCalcEnd = currentParams.StaticCalcEnd,
|
StaticCalcEnd = currentParams.StaticCalcEnd,
|
||||||
KineticCalcStart = currentParams.KineticCalcStart,
|
KineticCalcStart = currentParams.KineticCalcStart,
|
||||||
KineticCalcEnd = currentParams.KineticCalcEnd,
|
KineticCalcEnd = currentParams.KineticCalcEnd,
|
||||||
SampleWidth = currentParams.SampleWidth,
|
SampleWidth = currentParams.SampleWidth, // 保留試樣寬度
|
||||||
|
|
||||||
// 手動控制參數
|
// 手動控制參數 - 初始化為 0(空值)
|
||||||
HorizontalManualSpeed = currentParams.HorizontalManualSpeed,
|
HorizontalManualSpeed = 0.0,
|
||||||
HorizontalManualDisplacement = currentParams.HorizontalManualDisplacement,
|
HorizontalManualDisplacement = 0.0,
|
||||||
VerticalManualSpeed = currentParams.VerticalManualSpeed,
|
VerticalManualSpeed = 0.0,
|
||||||
VerticalManualDisplacement = currentParams.VerticalManualDisplacement,
|
VerticalManualDisplacement = 0.0,
|
||||||
VerticalLimit = currentParams.VerticalLimit,
|
VerticalLimit = 0.0,
|
||||||
HorizontalLimit = currentParams.HorizontalLimit,
|
HorizontalLimit = 0.0,
|
||||||
ForceCoefficient = currentParams.ForceCoefficient,
|
ForceCoefficient = 0.0,
|
||||||
ForceProtection = currentParams.ForceProtection,
|
ForceProtection = 0.0,
|
||||||
|
|
||||||
// 方向控制
|
// 方向控制 - 保留當前選擇
|
||||||
DirectionUp = currentParams.DirectionUp,
|
DirectionUp = currentParams.DirectionUp,
|
||||||
DirectionDown = currentParams.DirectionDown,
|
DirectionDown = currentParams.DirectionDown,
|
||||||
DirectionRight = currentParams.DirectionRight,
|
DirectionRight = currentParams.DirectionRight,
|
||||||
@@ -64,6 +70,12 @@ namespace COFTester.ViewModels
|
|||||||
|
|
||||||
// 監聽語言切換事件
|
// 監聽語言切換事件
|
||||||
LanguageResources.Instance.PropertyChanged += OnLanguageChanged;
|
LanguageResources.Instance.PropertyChanged += OnLanguageChanged;
|
||||||
|
|
||||||
|
// 如果設備已連接,從寄存器讀取當前值
|
||||||
|
if (_daqService != null && _daqService.IsConnected)
|
||||||
|
{
|
||||||
|
_ = LoadParametersFromDeviceAsync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnLanguageChanged(object? sender, PropertyChangedEventArgs e)
|
private void OnLanguageChanged(object? sender, PropertyChangedEventArgs e)
|
||||||
@@ -72,6 +84,76 @@ namespace COFTester.ViewModels
|
|||||||
OnPropertyChanged(nameof(Lang));
|
OnPropertyChanged(nameof(Lang));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 從設備讀取手動控制參數
|
||||||
|
/// </summary>
|
||||||
|
private async Task LoadParametersFromDeviceAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine("[ConfigViewModel] 開始從設備讀取參數...");
|
||||||
|
|
||||||
|
// 檢查是否為 ModbusServiceBase 類型
|
||||||
|
if (_daqService is ModbusServiceBase modbusService)
|
||||||
|
{
|
||||||
|
var deviceParams = await modbusService.ReadManualControlParametersAsync();
|
||||||
|
|
||||||
|
if (deviceParams != null)
|
||||||
|
{
|
||||||
|
// 更新基本測試參數
|
||||||
|
ConfigParams.SledMass = deviceParams.SledMass;
|
||||||
|
ConfigParams.TestSpeed = deviceParams.TestSpeed;
|
||||||
|
ConfigParams.TestDuration = deviceParams.TestDuration;
|
||||||
|
ConfigParams.TestStroke = deviceParams.TestStroke;
|
||||||
|
ConfigParams.SamplingRate = deviceParams.SamplingRate;
|
||||||
|
|
||||||
|
// 更新手動控制參數
|
||||||
|
ConfigParams.HorizontalManualSpeed = deviceParams.HorizontalManualSpeed;
|
||||||
|
ConfigParams.HorizontalManualDisplacement = deviceParams.HorizontalManualDisplacement;
|
||||||
|
ConfigParams.VerticalManualSpeed = deviceParams.VerticalManualSpeed;
|
||||||
|
ConfigParams.VerticalManualDisplacement = deviceParams.VerticalManualDisplacement;
|
||||||
|
ConfigParams.VerticalLimit = deviceParams.VerticalLimit;
|
||||||
|
ConfigParams.HorizontalLimit = deviceParams.HorizontalLimit;
|
||||||
|
ConfigParams.ForceCoefficient = deviceParams.ForceCoefficient;
|
||||||
|
ConfigParams.ForceProtection = deviceParams.ForceProtection;
|
||||||
|
|
||||||
|
// 通知 UI 更新
|
||||||
|
OnPropertyChanged(nameof(ConfigParams));
|
||||||
|
|
||||||
|
System.Diagnostics.Debug.WriteLine("[ConfigViewModel] 參數讀取成功");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" === 基本測試參數 ===");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 滑塊質量: {deviceParams.SledMass} g");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 測試速度: {deviceParams.TestSpeed} mm/min");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 測試時長: {deviceParams.TestDuration} s");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 測試行程: {deviceParams.TestStroke} mm");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 採樣頻率: {deviceParams.SamplingRate} Hz");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" === 手動控制參數 ===");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 水平手動速度: {deviceParams.HorizontalManualSpeed} mm/min");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 水平手動位移: {deviceParams.HorizontalManualDisplacement} mm");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 升降手動速度: {deviceParams.VerticalManualSpeed} mm/min");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 升降手動位移: {deviceParams.VerticalManualDisplacement} mm");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 升降極限: {deviceParams.VerticalLimit} mm");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 水平極限: {deviceParams.HorizontalLimit} mm");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 拉力系數: {deviceParams.ForceCoefficient} N/V");
|
||||||
|
System.Diagnostics.Debug.WriteLine($" 拉力保護: {deviceParams.ForceProtection} N");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine("[ConfigViewModel] 從設備讀取參數失敗,使用當前值");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine("[ConfigViewModel] 當前服務不支持參數讀取(非 Modbus 服務)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine($"[ConfigViewModel] 讀取參數異常: {ex.Message}");
|
||||||
|
// 讀取失敗時保持當前值,不影響用戶操作
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public LanguageResources Lang => LanguageResources.Instance;
|
public LanguageResources Lang => LanguageResources.Instance;
|
||||||
|
|
||||||
public List<TestStandard> Standards { get; }
|
public List<TestStandard> Standards { get; }
|
||||||
|
|||||||
@@ -1077,7 +1077,7 @@ namespace COFTester.ViewModels
|
|||||||
|
|
||||||
private void OpenConfig()
|
private void OpenConfig()
|
||||||
{
|
{
|
||||||
var configViewModel = new ConfigViewModel(Parameters);
|
var configViewModel = new ConfigViewModel(Parameters, _daqService);
|
||||||
configViewModel.ConfigApplied += (s, newParams) =>
|
configViewModel.ConfigApplied += (s, newParams) =>
|
||||||
{
|
{
|
||||||
// 更新測試參數
|
// 更新測試參數
|
||||||
|
|||||||
Reference in New Issue
Block a user