更新
This commit is contained in:
@@ -15,6 +15,16 @@ namespace COFTester.Models
|
|||||||
public double Displacement { get; set; } // 位移 (mm)
|
public double Displacement { get; set; } // 位移 (mm)
|
||||||
public double Force { get; set; } // 力值 (N)
|
public double Force { get; set; } // 力值 (N)
|
||||||
public DateTime Timestamp { get; set; } // 採樣時間戳
|
public DateTime Timestamp { get; set; } // 採樣時間戳
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 升降位置 (mm) - 從 D12 寄存器讀取
|
||||||
|
/// </summary>
|
||||||
|
public double VerticalPosition { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 水平位置 (mm) - 從 D16 寄存器讀取
|
||||||
|
/// </summary>
|
||||||
|
public double HorizontalPosition { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -444,6 +444,13 @@ namespace COFTester.Services
|
|||||||
protected abstract Task AcquisitionLoopAsync(TestParameters parameters, CancellationToken token);
|
protected abstract Task AcquisitionLoopAsync(TestParameters parameters, CancellationToken token);
|
||||||
protected abstract Task<TestDataPoint?> ReadSensorDataAsync();
|
protected abstract Task<TestDataPoint?> ReadSensorDataAsync();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 讀取位置數據(升降位置和水平位置)
|
||||||
|
/// D12 升降位置(只讀), D16 水平位置(只讀)
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>元組 (升降位置, 水平位置)</returns>
|
||||||
|
protected abstract Task<(double verticalPos, double horizontalPos)> ReadPositionDataAsync();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 寫入校準命令到 M1300 寄存器
|
/// 寫入校準命令到 M1300 寄存器
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -594,7 +601,7 @@ namespace COFTester.Services
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 數據採集主循環
|
/// 數據採集主循環
|
||||||
/// 正確流程:1. 寫入測試參數 → 2. 循環讀取數據
|
/// 正確流程:1. 寫入測試參數 → 2. 循環讀取數據(力值、位移、位置)
|
||||||
/// 注意:不再發送 Start/Stop 命令,由方向控制(M0-M3)來控制運動
|
/// 注意:不再發送 Start/Stop 命令,由方向控制(M0-M3)來控制運動
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected override async Task AcquisitionLoopAsync(TestParameters parameters, CancellationToken token)
|
protected override async Task AcquisitionLoopAsync(TestParameters parameters, CancellationToken token)
|
||||||
@@ -616,12 +623,29 @@ namespace COFTester.Services
|
|||||||
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 開始數據採集: {totalPoints} 點, 間隔 {intervalMs:F1}ms");
|
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 開始數據採集: {totalPoints} 點, 間隔 {intervalMs:F1}ms");
|
||||||
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 注意:請使用方向控制按鈕(M0-M3)來啟動運動");
|
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 注意:請使用方向控制按鈕(M0-M3)來啟動運動");
|
||||||
|
|
||||||
// 3. 循環讀取傳感器數據
|
// 3. 循環讀取傳感器數據(包含力值、位移和位置)
|
||||||
for (int i = 0; i < totalPoints && !token.IsCancellationRequested; i++)
|
for (int i = 0; i < totalPoints && !token.IsCancellationRequested; i++)
|
||||||
{
|
{
|
||||||
|
// 讀取力值和位移
|
||||||
var dataPoint = await ReadSensorDataAsync();
|
var dataPoint = await ReadSensorDataAsync();
|
||||||
|
|
||||||
if (dataPoint != null)
|
if (dataPoint != null)
|
||||||
{
|
{
|
||||||
|
// 讀取升降位置和水平位置
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var (verticalPos, horizontalPos) = await ReadPositionDataAsync();
|
||||||
|
dataPoint.VerticalPosition = verticalPos;
|
||||||
|
dataPoint.HorizontalPosition = horizontalPos;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 讀取位置數據失敗: {ex.Message}");
|
||||||
|
// 位置讀取失敗不影響主數據採集,繼續執行
|
||||||
|
dataPoint.VerticalPosition = 0;
|
||||||
|
dataPoint.HorizontalPosition = 0;
|
||||||
|
}
|
||||||
|
|
||||||
OnDataReceived(dataPoint);
|
OnDataReceived(dataPoint);
|
||||||
}
|
}
|
||||||
await Task.Delay((int)intervalMs, token);
|
await Task.Delay((int)intervalMs, token);
|
||||||
@@ -795,7 +819,7 @@ namespace COFTester.Services
|
|||||||
/// 讀取位置數據(升降位置和水平位置)
|
/// 讀取位置數據(升降位置和水平位置)
|
||||||
/// D12 升降位置(只讀), D16 水平位置(只讀)
|
/// D12 升降位置(只讀), D16 水平位置(只讀)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected virtual async Task<(double verticalPos, double horizontalPos)> ReadPositionDataAsync()
|
protected override async Task<(double verticalPos, double horizontalPos)> ReadPositionDataAsync()
|
||||||
{
|
{
|
||||||
if (_modbusMaster == null) return (0, 0);
|
if (_modbusMaster == null) return (0, 0);
|
||||||
|
|
||||||
@@ -926,7 +950,7 @@ namespace COFTester.Services
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 數據採集主循環
|
/// 數據採集主循環
|
||||||
/// 正確流程:1. 寫入測試參數 → 2. 循環讀取數據
|
/// 正確流程:1. 寫入測試參數 → 2. 循環讀取數據(力值、位移、位置)
|
||||||
/// 注意:不再發送 Start/Stop 命令,由方向控制(M0-M3)來控制運動
|
/// 注意:不再發送 Start/Stop 命令,由方向控制(M0-M3)來控制運動
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected override async Task AcquisitionLoopAsync(TestParameters parameters, CancellationToken token)
|
protected override async Task AcquisitionLoopAsync(TestParameters parameters, CancellationToken token)
|
||||||
@@ -948,12 +972,29 @@ namespace COFTester.Services
|
|||||||
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 開始數據採集: {totalPoints} 點, 間隔 {intervalMs:F1}ms");
|
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 開始數據採集: {totalPoints} 點, 間隔 {intervalMs:F1}ms");
|
||||||
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 注意:請使用方向控制按鈕(M0-M3)來啟動運動");
|
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 注意:請使用方向控制按鈕(M0-M3)來啟動運動");
|
||||||
|
|
||||||
// 3. 循環讀取傳感器數據
|
// 3. 循環讀取傳感器數據(包含力值、位移和位置)
|
||||||
for (int i = 0; i < totalPoints && !token.IsCancellationRequested; i++)
|
for (int i = 0; i < totalPoints && !token.IsCancellationRequested; i++)
|
||||||
{
|
{
|
||||||
|
// 讀取力值和位移
|
||||||
var dataPoint = await ReadSensorDataAsync();
|
var dataPoint = await ReadSensorDataAsync();
|
||||||
|
|
||||||
if (dataPoint != null)
|
if (dataPoint != null)
|
||||||
{
|
{
|
||||||
|
// 讀取升降位置和水平位置
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var (verticalPos, horizontalPos) = await ReadPositionDataAsync();
|
||||||
|
dataPoint.VerticalPosition = verticalPos;
|
||||||
|
dataPoint.HorizontalPosition = horizontalPos;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 讀取位置數據失敗: {ex.Message}");
|
||||||
|
// 位置讀取失敗不影響主數據採集,繼續執行
|
||||||
|
dataPoint.VerticalPosition = 0;
|
||||||
|
dataPoint.HorizontalPosition = 0;
|
||||||
|
}
|
||||||
|
|
||||||
OnDataReceived(dataPoint);
|
OnDataReceived(dataPoint);
|
||||||
}
|
}
|
||||||
await Task.Delay((int)intervalMs, token);
|
await Task.Delay((int)intervalMs, token);
|
||||||
@@ -1149,7 +1190,7 @@ namespace COFTester.Services
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 讀取位置數據
|
/// 讀取位置數據
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected virtual async Task<(double verticalPos, double horizontalPos)> ReadPositionDataAsync()
|
protected override async Task<(double verticalPos, double horizontalPos)> ReadPositionDataAsync()
|
||||||
{
|
{
|
||||||
if (_modbusMaster == null) return (0, 0);
|
if (_modbusMaster == null) return (0, 0);
|
||||||
|
|
||||||
@@ -1270,7 +1311,7 @@ namespace COFTester.Services
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 數據採集主循環
|
/// 數據採集主循環
|
||||||
/// 正確流程:1. 寫入測試參數 → 2. 循環讀取數據
|
/// 正確流程:1. 寫入測試參數 → 2. 循環讀取數據(力值、位移、位置)
|
||||||
/// 注意:不再發送 Start/Stop 命令,由方向控制(M0-M3)來控制運動
|
/// 注意:不再發送 Start/Stop 命令,由方向控制(M0-M3)來控制運動
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected override async Task AcquisitionLoopAsync(TestParameters parameters, CancellationToken token)
|
protected override async Task AcquisitionLoopAsync(TestParameters parameters, CancellationToken token)
|
||||||
@@ -1291,12 +1332,29 @@ namespace COFTester.Services
|
|||||||
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 開始數據採集: {totalPoints} 點, 間隔 {intervalMs:F1}ms");
|
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 開始數據採集: {totalPoints} 點, 間隔 {intervalMs:F1}ms");
|
||||||
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 注意:請使用方向控制按鈕(M0-M3)來啟動運動");
|
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 注意:請使用方向控制按鈕(M0-M3)來啟動運動");
|
||||||
|
|
||||||
// 3. 循環讀取傳感器數據
|
// 3. 循環讀取傳感器數據(包含力值、位移和位置)
|
||||||
for (int i = 0; i < totalPoints && !token.IsCancellationRequested; i++)
|
for (int i = 0; i < totalPoints && !token.IsCancellationRequested; i++)
|
||||||
{
|
{
|
||||||
|
// 讀取力值和位移
|
||||||
var dataPoint = await ReadSensorDataAsync();
|
var dataPoint = await ReadSensorDataAsync();
|
||||||
|
|
||||||
if (dataPoint != null)
|
if (dataPoint != null)
|
||||||
{
|
{
|
||||||
|
// 讀取升降位置和水平位置
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var (verticalPos, horizontalPos) = await ReadPositionDataAsync();
|
||||||
|
dataPoint.VerticalPosition = verticalPos;
|
||||||
|
dataPoint.HorizontalPosition = horizontalPos;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 讀取位置數據失敗: {ex.Message}");
|
||||||
|
// 位置讀取失敗不影響主數據採集,繼續執行
|
||||||
|
dataPoint.VerticalPosition = 0;
|
||||||
|
dataPoint.HorizontalPosition = 0;
|
||||||
|
}
|
||||||
|
|
||||||
OnDataReceived(dataPoint);
|
OnDataReceived(dataPoint);
|
||||||
}
|
}
|
||||||
await Task.Delay((int)intervalMs, token);
|
await Task.Delay((int)intervalMs, token);
|
||||||
@@ -1480,7 +1538,7 @@ namespace COFTester.Services
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 讀取位置數據
|
/// 讀取位置數據
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected virtual async Task<(double verticalPos, double horizontalPos)> ReadPositionDataAsync()
|
protected override async Task<(double verticalPos, double horizontalPos)> ReadPositionDataAsync()
|
||||||
{
|
{
|
||||||
if (_modbusMaster == null) return (0, 0);
|
if (_modbusMaster == null) return (0, 0);
|
||||||
|
|
||||||
|
|||||||
@@ -475,11 +475,17 @@ namespace COFTester.Services
|
|||||||
// 確保力值非負
|
// 確保力值非負
|
||||||
force = Math.Max(0, force);
|
force = Math.Max(0, force);
|
||||||
|
|
||||||
|
// 模擬位置數據(與位移同步變化)
|
||||||
|
double verticalPos = 0.0; // 模擬升降位置(可根據需要調整)
|
||||||
|
double horizontalPos = currentDisp; // 模擬水平位置(與位移一致)
|
||||||
|
|
||||||
DataReceived?.Invoke(this, new TestDataPoint
|
DataReceived?.Invoke(this, new TestDataPoint
|
||||||
{
|
{
|
||||||
Displacement = currentDisp,
|
Displacement = currentDisp,
|
||||||
Force = force,
|
Force = force,
|
||||||
Timestamp = DateTime.Now
|
Timestamp = DateTime.Now,
|
||||||
|
VerticalPosition = verticalPos,
|
||||||
|
HorizontalPosition = horizontalPos
|
||||||
});
|
});
|
||||||
|
|
||||||
await Task.Delay((int)intervalMs, _cts.Token);
|
await Task.Delay((int)intervalMs, _cts.Token);
|
||||||
|
|||||||
@@ -446,13 +446,13 @@ namespace COFTester.ViewModels
|
|||||||
// 使用 Dispatcher 確保在 UI 線程更新
|
// 使用 Dispatcher 確保在 UI 線程更新
|
||||||
Application.Current?.Dispatcher.InvokeAsync(() =>
|
Application.Current?.Dispatcher.InvokeAsync(() =>
|
||||||
{
|
{
|
||||||
|
// 更新力值和位移
|
||||||
CurrentForce = point.Force;
|
CurrentForce = point.Force;
|
||||||
CurrentDisp = point.Displacement;
|
CurrentDisp = point.Displacement;
|
||||||
|
|
||||||
// Update position displays (using displacement as position for now)
|
// 更新實際位置數據(從 PLC 讀取)
|
||||||
// In a real system, these would come from separate position sensors
|
LiftPosition = point.VerticalPosition; // D12 升降位置
|
||||||
LiftPosition = 0.0; // Placeholder - would come from vertical position sensor
|
HorizontalPosition = point.HorizontalPosition; // D16 水平位置
|
||||||
HorizontalPosition = point.Displacement; // Using displacement as horizontal position
|
|
||||||
|
|
||||||
_realTimePoints.Add(point);
|
_realTimePoints.Add(point);
|
||||||
OnPropertyChanged(nameof(DataPointsCount));
|
OnPropertyChanged(nameof(DataPointsCount));
|
||||||
|
|||||||
Reference in New Issue
Block a user