This commit is contained in:
GukSang.Jin
2026-01-30 13:05:56 +08:00
parent 0d62014149
commit 546b16b7e9
2 changed files with 72 additions and 45 deletions

View File

@@ -499,9 +499,18 @@ namespace COFTester.Services
protected abstract Task WriteDirectionRegisterAsync(ushort register, ushort value);
/// <summary>
/// 寫入測試參數到 PLC 寄存器
/// 寫入測試參數到 PLC 寄存器(受保护方法)
/// </summary>
protected abstract Task WriteTestParametersAsync(TestParameters parameters);
/// <summary>
/// 公开方法:写入测试参数到 PLC 寄存器
/// 供外部调用(如 ViewModel 在应用配置时调用)
/// </summary>
public async Task WriteTestParametersPublicAsync(TestParameters parameters)
{
await WriteTestParametersAsync(parameters);
}
/// <summary>
/// 將兩個寄存器轉換為 Float (IEEE 754 Big-Endian)
@@ -645,30 +654,29 @@ namespace COFTester.Services
{
try
{
// 1. 寫入測試參數到 PLC
System.Diagnostics.Debug.WriteLine("[ModbusTCP] 開始寫入測試參數...");
await WriteTestParametersAsync(parameters);
System.Diagnostics.Debug.WriteLine("[ModbusTCP] 測試參數寫入完成");
// ===== 关键修改:移除测试开始时的参数写入 =====
// 参数只在"应用配置"时写入,测试时不再重复写入
System.Diagnostics.Debug.WriteLine("[ModbusTCP] 开始数据采集(参数已在配置时写入)");
// 短暫延遲確保 PLC 處理完參數
// 短暂延迟确保系统准备就绪
await Task.Delay(100, token);
// 2. 循環讀取傳感器數據(不再送 Start 命令)
// 循环读取传感器数据(不再送 Start 命令)
double intervalMs = 1000.0 / parameters.SamplingRate;
int totalPoints = (int)(parameters.TestDuration * parameters.SamplingRate);
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 開始數據採集: {totalPoints} , 隔 {intervalMs:F1}ms");
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 注意:使用方向控制按鈕(M0-M3)來啟動運動");
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 数据采集配置: {totalPoints} , 隔 {intervalMs:F1}ms");
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 注意:使用 M31=1 启动测试M31=0 停止测试");
// 3. 循環讀取傳感器數據(包含力值、位移和位置)
// 循环读取传感器数据(包含力值、位移和位置)
for (int i = 0; i < totalPoints && !token.IsCancellationRequested; i++)
{
// 取力值和位移
// 取力值和位移
var dataPoint = await ReadSensorDataAsync();
if (dataPoint != null)
{
// 取升降位置和水平位置
// 取升降位置和水平位置
try
{
var (verticalPos, horizontalPos) = await ReadPositionDataAsync();
@@ -677,8 +685,8 @@ namespace COFTester.Services
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 取位置數據失敗: {ex.Message}");
// 位置取失不影響主數據採集,繼續執
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 取位置数据失败: {ex.Message}");
// 位置取失不影响主数据采集,继续执
dataPoint.VerticalPosition = 0;
dataPoint.HorizontalPosition = 0;
}
@@ -690,7 +698,7 @@ namespace COFTester.Services
}
catch (OperationCanceledException)
{
System.Diagnostics.Debug.WriteLine("[ModbusTCP] 測試被取消");
System.Diagnostics.Debug.WriteLine("[ModbusTCP] 测试被取消");
}
catch (Exception ex)
{
@@ -1103,30 +1111,29 @@ namespace COFTester.Services
{
try
{
// 1. 寫入測試參數到 PLC
System.Diagnostics.Debug.WriteLine("[ModbusRTU] 開始寫入測試參數...");
await WriteTestParametersAsync(parameters);
System.Diagnostics.Debug.WriteLine("[ModbusRTU] 測試參數寫入完成");
// ===== 关键修改:移除测试开始时的参数写入 =====
// 参数只在"应用配置"时写入,测试时不再重复写入
System.Diagnostics.Debug.WriteLine("[ModbusRTU] 开始数据采集(参数已在配置时写入)");
// 短暫延遲確保 PLC 處理完參數
// 短暂延迟确保系统准备就绪
await Task.Delay(100, token);
// 2. 循環讀取傳感器數據(不再送 Start 命令)
// 循环读取传感器数据(不再送 Start 命令)
double intervalMs = 1000.0 / parameters.SamplingRate;
int totalPoints = (int)(parameters.TestDuration * parameters.SamplingRate);
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 開始數據採集: {totalPoints} , 隔 {intervalMs:F1}ms");
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 注意:使用方向控制按鈕(M0-M3)來啟動運動");
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 数据采集配置: {totalPoints} , 隔 {intervalMs:F1}ms");
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 注意:使用 M31=1 启动测试M31=0 停止测试");
// 3. 循環讀取傳感器數據(包含力值、位移和位置)
// 循环读取传感器数据(包含力值、位移和位置)
for (int i = 0; i < totalPoints && !token.IsCancellationRequested; i++)
{
// 取力值和位移
// 取力值和位移
var dataPoint = await ReadSensorDataAsync();
if (dataPoint != null)
{
// 取升降位置和水平位置
// 取升降位置和水平位置
try
{
var (verticalPos, horizontalPos) = await ReadPositionDataAsync();
@@ -1135,8 +1142,8 @@ namespace COFTester.Services
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 取位置數據失敗: {ex.Message}");
// 位置取失不影響主數據採集,繼續執
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 取位置数据失败: {ex.Message}");
// 位置取失不影响主数据采集,继续执
dataPoint.VerticalPosition = 0;
dataPoint.HorizontalPosition = 0;
}
@@ -1148,7 +1155,7 @@ namespace COFTester.Services
}
catch (OperationCanceledException)
{
System.Diagnostics.Debug.WriteLine("[ModbusRTU] 測試被取消");
System.Diagnostics.Debug.WriteLine("[ModbusRTU] 测试被取消");
}
catch (Exception ex)
{
@@ -1545,29 +1552,28 @@ namespace COFTester.Services
{
try
{
// 1. 寫入測試參數到 PLC
System.Diagnostics.Debug.WriteLine("[ModbusASCII] 開始寫入測試參數...");
await WriteTestParametersAsync(parameters);
System.Diagnostics.Debug.WriteLine("[ModbusASCII] 測試參數寫入完成");
// ===== 关键修改:移除测试开始时的参数写入 =====
// 参数只在"应用配置"时写入,测试时不再重复写入
System.Diagnostics.Debug.WriteLine("[ModbusASCII] 开始数据采集(参数已在配置时写入)");
await Task.Delay(100, token);
// 2. 循環讀取傳感器數據(不再送 Start 命令)
// 循环读取传感器数据(不再送 Start 命令)
double intervalMs = 1000.0 / parameters.SamplingRate;
int totalPoints = (int)(parameters.TestDuration * parameters.SamplingRate);
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 開始數據採集: {totalPoints} , 隔 {intervalMs:F1}ms");
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 注意:使用方向控制按鈕(M0-M3)來啟動運動");
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 数据采集配置: {totalPoints} , 隔 {intervalMs:F1}ms");
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 注意:使用 M31=1 启动测试M31=0 停止测试");
// 3. 循環讀取傳感器數據(包含力值、位移和位置)
// 循环读取传感器数据(包含力值、位移和位置)
for (int i = 0; i < totalPoints && !token.IsCancellationRequested; i++)
{
// 取力值和位移
// 取力值和位移
var dataPoint = await ReadSensorDataAsync();
if (dataPoint != null)
{
// 取升降位置和水平位置
// 取升降位置和水平位置
try
{
var (verticalPos, horizontalPos) = await ReadPositionDataAsync();
@@ -1576,8 +1582,8 @@ namespace COFTester.Services
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 取位置數據失敗: {ex.Message}");
// 位置取失不影響主數據採集,繼續執
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 取位置数据失败: {ex.Message}");
// 位置取失不影响主数据采集,继续执
dataPoint.VerticalPosition = 0;
dataPoint.HorizontalPosition = 0;
}
@@ -1589,7 +1595,7 @@ namespace COFTester.Services
}
catch (OperationCanceledException)
{
System.Diagnostics.Debug.WriteLine("[ModbusASCII] 測試被取消");
System.Diagnostics.Debug.WriteLine("[ModbusASCII] 测试被取消");
}
catch (Exception ex)
{
@@ -1598,7 +1604,7 @@ namespace COFTester.Services
finally
{
_isAcquiring = false;
System.Diagnostics.Debug.WriteLine("[ModbusASCII] 數據採集結束(不再送 Stop 命令)");
System.Diagnostics.Debug.WriteLine("[ModbusASCII] 数据采集结束(不再送 Stop 命令)");
OnTestFinished();
}
}

View File

@@ -1078,7 +1078,7 @@ namespace COFTester.ViewModels
private void OpenConfig()
{
var configViewModel = new ConfigViewModel(Parameters, _daqService);
configViewModel.ConfigApplied += (s, newParams) =>
configViewModel.ConfigApplied += async (s, newParams) =>
{
// 更新測試參數
Parameters.Standard = newParams.Standard;
@@ -1108,7 +1108,28 @@ namespace COFTester.ViewModels
Parameters.DirectionLeft = newParams.DirectionLeft;
OnPropertyChanged(nameof(Parameters));
StatusMessage = Lang.SystemReady;
// ===== 关键修改:只在应用配置时写入参数到寄存器 =====
if (IsConnected && _daqService is ModbusServiceBase modbusService)
{
try
{
StatusMessage = "正在写入配置参数到设备...";
await modbusService.WriteTestParametersPublicAsync(Parameters);
StatusMessage = "配置参数已应用并写入设备";
System.Diagnostics.Debug.WriteLine("[ViewModel] 配置参数已写入寄存器");
}
catch (Exception ex)
{
StatusMessage = $"写入参数失败: {ex.Message}";
System.Diagnostics.Debug.WriteLine($"[ViewModel] 写入参数失败: {ex.Message}");
MessageBox.Show($"写入参数到设备失败:\n{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
else
{
StatusMessage = Lang.SystemReady;
}
};
var configWindow = new Views.ConfigWindow(configViewModel)