更新地址

This commit is contained in:
GukSang.Jin
2026-01-29 15:17:00 +08:00
parent 971cd0cd24
commit 4638e4c094
5 changed files with 426 additions and 0 deletions

View File

@@ -162,6 +162,10 @@ namespace COFTester.Models
// === 傳感器數據寄存器(只讀)=== // === 傳感器數據寄存器(只讀)===
public ushort ForceRegister { get; set; } = 0; // 力值寄存器2個寄存器Float public ushort ForceRegister { get; set; } = 0; // 力值寄存器2個寄存器Float
public ushort DisplacementRegister { get; set; } = 2; // 位移寄存器2個寄存器Float public ushort DisplacementRegister { get; set; } = 2; // 位移寄存器2個寄存器Float
public ushort FrictionForceRegister { get; set; } = 1314; // D1314 摩擦力只讀曲線圖力值2個寄存器Float
public ushort CurveDisplacementRegister { get; set; } = 360; // D360 水平手動位移 曲線圖位移值2個寄存器Float
public ushort VerticalPositionRegister { get; set; } = 12; // D12 升降位置只讀2個寄存器Float
public ushort HorizontalPositionRegister { get; set; } = 16; // D16 水平位置只讀2個寄存器Float
// === 控制寄存器(讀寫)=== // === 控制寄存器(讀寫)===
public ushort ControlRegister { get; set; } = 10; // 控制命令0=停止1=開始2=重置 public ushort ControlRegister { get; set; } = 10; // 控制命令0=停止1=開始2=重置
@@ -174,6 +178,15 @@ namespace COFTester.Models
public ushort TestStrokeRegister { get; set; } = 26; // 測試行程 (mm)Float2個寄存器 public ushort TestStrokeRegister { get; set; } = 26; // 測試行程 (mm)Float2個寄存器
public ushort SamplingRateRegister { get; set; } = 28; // 採樣頻率 (Hz)Float2個寄存器 public ushort SamplingRateRegister { get; set; } = 28; // 採樣頻率 (Hz)Float2個寄存器
// === 手動控制參數寄存器(讀寫)===
public ushort HorizontalManualSpeedRegister { get; set; } = 350; // D350 水平手動速度 (mm/s)Float2個寄存器
public ushort VerticalManualSpeedRegister { get; set; } = 310; // D310 升降手動速度 (mm/s)Float2個寄存器
public ushort VerticalManualDisplacementRegister { get; set; } = 320; // D320 升降手動位移 (mm)Float2個寄存器
public ushort VerticalLimitRegister { get; set; } = 290; // D290 升降極限 (mm)Float2個寄存器
public ushort HorizontalLimitRegister { get; set; } = 292; // D292 水平極限 (mm)Float2個寄存器
public ushort ForceCoefficientRegister { get; set; } = 1320; // D1320 拉力系數 (N/V)Float2個寄存器
public ushort ForceProtectionRegister { get; set; } = 1322; // D1322 拉力保護 (N)Float2個寄存器
// === 校準寄存器(寫入)=== // === 校準寄存器(寫入)===
public ushort CalibrationRegister { get; set; } = 1300; // 校準命令寄存器 M1300 public ushort CalibrationRegister { get; set; } = 1300; // 校準命令寄存器 M1300
@@ -199,6 +212,10 @@ namespace COFTester.Models
// === 傳感器數據寄存器(只讀)=== // === 傳感器數據寄存器(只讀)===
public ushort ForceRegister { get; set; } = 0; // 力值寄存器2個寄存器Float public ushort ForceRegister { get; set; } = 0; // 力值寄存器2個寄存器Float
public ushort DisplacementRegister { get; set; } = 2; // 位移寄存器2個寄存器Float public ushort DisplacementRegister { get; set; } = 2; // 位移寄存器2個寄存器Float
public ushort FrictionForceRegister { get; set; } = 1314; // D1314 摩擦力只讀曲線圖力值2個寄存器Float
public ushort CurveDisplacementRegister { get; set; } = 360; // D360 水平手動位移 曲線圖位移值2個寄存器Float
public ushort VerticalPositionRegister { get; set; } = 12; // D12 升降位置只讀2個寄存器Float
public ushort HorizontalPositionRegister { get; set; } = 16; // D16 水平位置只讀2個寄存器Float
// === 控制寄存器(讀寫)=== // === 控制寄存器(讀寫)===
public ushort ControlRegister { get; set; } = 10; // 控制命令0=停止1=開始2=重置 public ushort ControlRegister { get; set; } = 10; // 控制命令0=停止1=開始2=重置
@@ -211,6 +228,15 @@ namespace COFTester.Models
public ushort TestStrokeRegister { get; set; } = 26; // 測試行程 (mm)Float2個寄存器 public ushort TestStrokeRegister { get; set; } = 26; // 測試行程 (mm)Float2個寄存器
public ushort SamplingRateRegister { get; set; } = 28; // 採樣頻率 (Hz)Float2個寄存器 public ushort SamplingRateRegister { get; set; } = 28; // 採樣頻率 (Hz)Float2個寄存器
// === 手動控制參數寄存器(讀寫)===
public ushort HorizontalManualSpeedRegister { get; set; } = 350; // D350 水平手動速度 (mm/s)Float2個寄存器
public ushort VerticalManualSpeedRegister { get; set; } = 310; // D310 升降手動速度 (mm/s)Float2個寄存器
public ushort VerticalManualDisplacementRegister { get; set; } = 320; // D320 升降手動位移 (mm)Float2個寄存器
public ushort VerticalLimitRegister { get; set; } = 290; // D290 升降極限 (mm)Float2個寄存器
public ushort HorizontalLimitRegister { get; set; } = 292; // D292 水平極限 (mm)Float2個寄存器
public ushort ForceCoefficientRegister { get; set; } = 1320; // D1320 拉力系數 (N/V)Float2個寄存器
public ushort ForceProtectionRegister { get; set; } = 1322; // D1322 拉力保護 (N)Float2個寄存器
// === 校準寄存器(寫入)=== // === 校準寄存器(寫入)===
public ushort CalibrationRegister { get; set; } = 1300; // 校準命令寄存器 M1300 public ushort CalibrationRegister { get; set; } = 1300; // 校準命令寄存器 M1300

View File

@@ -361,6 +361,16 @@ namespace COFTester.Models
/// <param name="start">true=开始移动, false=停止移动</param> /// <param name="start">true=开始移动, false=停止移动</param>
void DirectionControl(string direction, bool start); void DirectionControl(string direction, bool start);
/// <summary>
/// 开始指定方向的测试 - 写入1到对应寄存器
/// </summary>
void StartDirectionTest(string direction);
/// <summary>
/// 停止指定方向的测试 - 写入0到对应寄存器
/// </summary>
void StopDirectionTest(string direction);
bool IsConnected { get; } bool IsConnected { get; }
} }

View File

@@ -311,6 +311,63 @@ namespace COFTester.Services
} }
} }
/// <summary>
/// 开始指定方向的测试 - 写入1到对应寄存器
/// M0=上升, M1=下降, M2=向右, M3=向左
/// </summary>
public virtual void StartDirectionTest(string direction)
{
try
{
if (_modbusMaster != null && _isConnected)
{
ModbusDirectionRegister register = direction.ToUpper() switch
{
"UP" => ModbusDirectionRegister.Up,
"DOWN" => ModbusDirectionRegister.Down,
"RIGHT" => ModbusDirectionRegister.Right,
"LEFT" => ModbusDirectionRegister.Left,
_ => throw new ArgumentException($"未知方向: {direction}")
};
System.Diagnostics.Debug.WriteLine($"[Modbus] 开始测试: {direction} - 寫入寄存器 M{(ushort)register} = 1");
WriteDirectionRegisterAsync((ushort)register, 1).Wait();
}
}
catch (Exception ex)
{
OnErrorOccurred($"开始测试失败: {ex.Message}");
}
}
/// <summary>
/// 停止指定方向的测试 - 写入0到对应寄存器
/// </summary>
public virtual void StopDirectionTest(string direction)
{
try
{
if (_modbusMaster != null && _isConnected)
{
ModbusDirectionRegister register = direction.ToUpper() switch
{
"UP" => ModbusDirectionRegister.Up,
"DOWN" => ModbusDirectionRegister.Down,
"RIGHT" => ModbusDirectionRegister.Right,
"LEFT" => ModbusDirectionRegister.Left,
_ => throw new ArgumentException($"未知方向: {direction}")
};
System.Diagnostics.Debug.WriteLine($"[Modbus] 停止测试: {direction} - 寫入寄存器 M{(ushort)register} = 0");
WriteDirectionRegisterAsync((ushort)register, 0).Wait();
}
}
catch (Exception ex)
{
OnErrorOccurred($"停止测试失败: {ex.Message}");
}
}
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();
protected abstract Task WriteControlRegisterAsync(ushort value); protected abstract Task WriteControlRegisterAsync(ushort value);
@@ -650,6 +707,9 @@ namespace COFTester.Services
System.Diagnostics.Debug.WriteLine($" 測試時長: {parameters.TestDuration}s → 寄存器[{_config.TestDurationRegister}]"); System.Diagnostics.Debug.WriteLine($" 測試時長: {parameters.TestDuration}s → 寄存器[{_config.TestDurationRegister}]");
System.Diagnostics.Debug.WriteLine($" 測試行程: {parameters.TestStroke}mm → 寄存器[{_config.TestStrokeRegister}]"); System.Diagnostics.Debug.WriteLine($" 測試行程: {parameters.TestStroke}mm → 寄存器[{_config.TestStrokeRegister}]");
System.Diagnostics.Debug.WriteLine($" 採樣頻率: {parameters.SamplingRate}Hz → 寄存器[{_config.SamplingRateRegister}]"); System.Diagnostics.Debug.WriteLine($" 採樣頻率: {parameters.SamplingRate}Hz → 寄存器[{_config.SamplingRateRegister}]");
// 寫入手動控制參數
await WriteManualControlParametersAsync(parameters);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -658,6 +718,97 @@ namespace COFTester.Services
} }
} }
/// <summary>
/// 寫入手動控制參數到 PLC 寄存器
/// D350 水平手動速度, D310 升降手動速度, D320 升降手動位移
/// D290 升降極限, D292 水平極限, D1320 拉力系數, D1322 拉力保護
/// </summary>
protected virtual async Task WriteManualControlParametersAsync(TestParameters parameters)
{
if (_modbusMaster == null) return;
try
{
// D350 水平手動速度
var hSpeedRegs = ConvertFloatToRegisters((float)parameters.HorizontalManualSpeed);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.HorizontalManualSpeedRegister, hSpeedRegs);
// 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(
_config.SlaveId, _config.ForceProtectionRegister, forceProtRegs);
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 手動控制參數寫入完成:");
System.Diagnostics.Debug.WriteLine($" 水平手動速度: {parameters.HorizontalManualSpeed}mm/s → D{_config.HorizontalManualSpeedRegister}");
System.Diagnostics.Debug.WriteLine($" 升降手動速度: {parameters.VerticalManualSpeed}mm/s → D{_config.VerticalManualSpeedRegister}");
System.Diagnostics.Debug.WriteLine($" 升降手動位移: {parameters.VerticalManualDisplacement}mm → D{_config.VerticalManualDisplacementRegister}");
System.Diagnostics.Debug.WriteLine($" 升降極限: {parameters.VerticalLimit}mm → D{_config.VerticalLimitRegister}");
System.Diagnostics.Debug.WriteLine($" 水平極限: {parameters.HorizontalLimit}mm → D{_config.HorizontalLimitRegister}");
System.Diagnostics.Debug.WriteLine($" 拉力系數: {parameters.ForceCoefficient} → D{_config.ForceCoefficientRegister}");
System.Diagnostics.Debug.WriteLine($" 拉力保護: {parameters.ForceProtection}N → D{_config.ForceProtectionRegister}");
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 手動控制參數寫入失敗: {ex.Message}");
throw;
}
}
/// <summary>
/// 讀取位置數據(升降位置和水平位置)
/// D12 升降位置(只讀), D16 水平位置(只讀)
/// </summary>
protected virtual async Task<(double verticalPos, double horizontalPos)> ReadPositionDataAsync()
{
if (_modbusMaster == null) return (0, 0);
try
{
// 讀取 D12 升降位置2個寄存器
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)
{
System.Diagnostics.Debug.WriteLine($"[ModbusTCP] 讀取位置數據失敗: {ex.Message}");
return (0, 0);
}
}
/// <summary> /// <summary>
/// 讀取設備狀態 /// 讀取設備狀態
/// </summary> /// </summary>
@@ -956,6 +1107,9 @@ namespace COFTester.Services
System.Diagnostics.Debug.WriteLine($" 測試時長: {parameters.TestDuration}s → 寄存器[{_config.TestDurationRegister}]"); System.Diagnostics.Debug.WriteLine($" 測試時長: {parameters.TestDuration}s → 寄存器[{_config.TestDurationRegister}]");
System.Diagnostics.Debug.WriteLine($" 測試行程: {parameters.TestStroke}mm → 寄存器[{_config.TestStrokeRegister}]"); System.Diagnostics.Debug.WriteLine($" 測試行程: {parameters.TestStroke}mm → 寄存器[{_config.TestStrokeRegister}]");
System.Diagnostics.Debug.WriteLine($" 採樣頻率: {parameters.SamplingRate}Hz → 寄存器[{_config.SamplingRateRegister}]"); System.Diagnostics.Debug.WriteLine($" 採樣頻率: {parameters.SamplingRate}Hz → 寄存器[{_config.SamplingRateRegister}]");
// 寫入手動控制參數
await WriteManualControlParametersAsync(parameters);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -964,6 +1118,78 @@ namespace COFTester.Services
} }
} }
/// <summary>
/// 寫入手動控制參數到 PLC 寄存器
/// </summary>
protected virtual async Task WriteManualControlParametersAsync(TestParameters parameters)
{
if (_modbusMaster == null) return;
try
{
var hSpeedRegs = ConvertFloatToRegisters((float)parameters.HorizontalManualSpeed);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.HorizontalManualSpeedRegister, hSpeedRegs);
var vSpeedRegs = ConvertFloatToRegisters((float)parameters.VerticalManualSpeed);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.VerticalManualSpeedRegister, vSpeedRegs);
var vDispRegs = ConvertFloatToRegisters((float)parameters.VerticalManualDisplacement);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.VerticalManualDisplacementRegister, vDispRegs);
var vLimitRegs = ConvertFloatToRegisters((float)parameters.VerticalLimit);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.VerticalLimitRegister, vLimitRegs);
var hLimitRegs = ConvertFloatToRegisters((float)parameters.HorizontalLimit);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.HorizontalLimitRegister, hLimitRegs);
var forceCoefRegs = ConvertFloatToRegisters((float)parameters.ForceCoefficient);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.ForceCoefficientRegister, forceCoefRegs);
var forceProtRegs = ConvertFloatToRegisters((float)parameters.ForceProtection);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.ForceProtectionRegister, forceProtRegs);
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 手動控制參數寫入完成");
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 手動控制參數寫入失敗: {ex.Message}");
throw;
}
}
/// <summary>
/// 讀取位置數據
/// </summary>
protected virtual async Task<(double verticalPos, double horizontalPos)> ReadPositionDataAsync()
{
if (_modbusMaster == null) return (0, 0);
try
{
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)
{
System.Diagnostics.Debug.WriteLine($"[ModbusRTU] 讀取位置數據失敗: {ex.Message}");
return (0, 0);
}
}
/// <summary> /// <summary>
/// 讀取設備狀態 /// 讀取設備狀態
/// </summary> /// </summary>
@@ -1232,6 +1458,9 @@ namespace COFTester.Services
_config.SlaveId, _config.SledMassRegister, allRegisters); _config.SlaveId, _config.SledMassRegister, allRegisters);
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 參數寫入完成"); System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 參數寫入完成");
// 寫入手動控制參數
await WriteManualControlParametersAsync(parameters);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -1240,6 +1469,78 @@ namespace COFTester.Services
} }
} }
/// <summary>
/// 寫入手動控制參數到 PLC 寄存器
/// </summary>
protected virtual async Task WriteManualControlParametersAsync(TestParameters parameters)
{
if (_modbusMaster == null) return;
try
{
var hSpeedRegs = ConvertFloatToRegisters((float)parameters.HorizontalManualSpeed);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.HorizontalManualSpeedRegister, hSpeedRegs);
var vSpeedRegs = ConvertFloatToRegisters((float)parameters.VerticalManualSpeed);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.VerticalManualSpeedRegister, vSpeedRegs);
var vDispRegs = ConvertFloatToRegisters((float)parameters.VerticalManualDisplacement);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.VerticalManualDisplacementRegister, vDispRegs);
var vLimitRegs = ConvertFloatToRegisters((float)parameters.VerticalLimit);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.VerticalLimitRegister, vLimitRegs);
var hLimitRegs = ConvertFloatToRegisters((float)parameters.HorizontalLimit);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.HorizontalLimitRegister, hLimitRegs);
var forceCoefRegs = ConvertFloatToRegisters((float)parameters.ForceCoefficient);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.ForceCoefficientRegister, forceCoefRegs);
var forceProtRegs = ConvertFloatToRegisters((float)parameters.ForceProtection);
await _modbusMaster.WriteMultipleRegistersAsync(
_config.SlaveId, _config.ForceProtectionRegister, forceProtRegs);
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 手動控制參數寫入完成");
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 手動控制參數寫入失敗: {ex.Message}");
throw;
}
}
/// <summary>
/// 讀取位置數據
/// </summary>
protected virtual async Task<(double verticalPos, double horizontalPos)> ReadPositionDataAsync()
{
if (_modbusMaster == null) return (0, 0);
try
{
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)
{
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 讀取位置數據失敗: {ex.Message}");
return (0, 0);
}
}
protected override async Task<ModbusDeviceStatus> ReadDeviceStatusAsync() protected override async Task<ModbusDeviceStatus> ReadDeviceStatusAsync()
{ {
if (_modbusMaster == null) return ModbusDeviceStatus.Error; if (_modbusMaster == null) return ModbusDeviceStatus.Error;
@@ -1450,6 +1751,61 @@ namespace COFTester.Services
} }
} }
/// <summary>
/// 开始指定方向的测试 - 写入1到对应寄存器
/// M0=上升, M1=下降, M2=向右, M3=向左
/// </summary>
public void StartDirectionTest(string direction)
{
try
{
if (_serialPort != null && _isConnected)
{
string command = direction.ToUpper() switch
{
"UP" => "TEST_UP_START", // 向M0写入1
"DOWN" => "TEST_DOWN_START", // 向M1写入1
"RIGHT" => "TEST_RIGHT_START", // 向M2写入1
"LEFT" => "TEST_LEFT_START", // 向M3写入1
_ => throw new ArgumentException($"未知方向: {direction}")
};
_serialPort.WriteLine(command);
System.Diagnostics.Debug.WriteLine($"[ModbusService] 开始测试: {direction} -> {command}");
}
}
catch (Exception ex)
{
OnErrorOccurred($"开始测试失败: {ex.Message}");
}
}
/// <summary>
/// 停止指定方向的测试 - 写入0到对应寄存器
/// </summary>
public void StopDirectionTest(string direction)
{
try
{
if (_serialPort != null && _isConnected)
{
string command = direction.ToUpper() switch
{
"UP" => "TEST_UP_STOP", // 向M0写入0
"DOWN" => "TEST_DOWN_STOP", // 向M1写入0
"RIGHT" => "TEST_RIGHT_STOP", // 向M2写入0
"LEFT" => "TEST_LEFT_STOP", // 向M3写入0
_ => throw new ArgumentException($"未知方向: {direction}")
};
_serialPort.WriteLine(command);
System.Diagnostics.Debug.WriteLine($"[ModbusService] 停止测试: {direction} -> {command}");
}
}
catch (Exception ex)
{
OnErrorOccurred($"停止测试失败: {ex.Message}");
}
}
private async Task AcquisitionLoopAsync(TestParameters parameters, CancellationToken token) private async Task AcquisitionLoopAsync(TestParameters parameters, CancellationToken token)
{ {
try try

View File

@@ -536,5 +536,17 @@ namespace COFTester.Services
string action = start ? "開始" : "停止"; string action = start ? "開始" : "停止";
System.Diagnostics.Debug.WriteLine($"[Simulated] 方向控制: {direction} {action}"); System.Diagnostics.Debug.WriteLine($"[Simulated] 方向控制: {direction} {action}");
} }
public void StartDirectionTest(string direction)
{
// 模擬开始测试(無實際操作)
System.Diagnostics.Debug.WriteLine($"[Simulated] 开始测试: {direction}");
}
public void StopDirectionTest(string direction)
{
// 模擬停止测试(無實際操作)
System.Diagnostics.Debug.WriteLine($"[Simulated] 停止测试: {direction}");
}
} }
} }

View File

@@ -8,6 +8,10 @@
"ConnectTimeout": 5000, "ConnectTimeout": 5000,
"ForceRegister": 0, "ForceRegister": 0,
"DisplacementRegister": 2, "DisplacementRegister": 2,
"FrictionForceRegister": 1314,
"CurveDisplacementRegister": 360,
"VerticalPositionRegister": 12,
"HorizontalPositionRegister": 16,
"ControlRegister": 10, "ControlRegister": 10,
"StatusRegister": 12, "StatusRegister": 12,
"SledMassRegister": 20, "SledMassRegister": 20,
@@ -15,6 +19,13 @@
"TestDurationRegister": 24, "TestDurationRegister": 24,
"TestStrokeRegister": 26, "TestStrokeRegister": 26,
"SamplingRateRegister": 28, "SamplingRateRegister": 28,
"HorizontalManualSpeedRegister": 350,
"VerticalManualSpeedRegister": 310,
"VerticalManualDisplacementRegister": 320,
"VerticalLimitRegister": 290,
"HorizontalLimitRegister": 292,
"ForceCoefficientRegister": 1320,
"ForceProtectionRegister": 1322,
"CalibrationRegister": 1300, "CalibrationRegister": 1300,
"RetryCount": 3, "RetryCount": 3,
"RetryDelay": 500 "RetryDelay": 500
@@ -31,6 +42,10 @@
"WriteTimeout": 1000, "WriteTimeout": 1000,
"ForceRegister": 0, "ForceRegister": 0,
"DisplacementRegister": 2, "DisplacementRegister": 2,
"FrictionForceRegister": 1314,
"CurveDisplacementRegister": 360,
"VerticalPositionRegister": 12,
"HorizontalPositionRegister": 16,
"ControlRegister": 10, "ControlRegister": 10,
"StatusRegister": 12, "StatusRegister": 12,
"SledMassRegister": 20, "SledMassRegister": 20,
@@ -38,6 +53,13 @@
"TestDurationRegister": 24, "TestDurationRegister": 24,
"TestStrokeRegister": 26, "TestStrokeRegister": 26,
"SamplingRateRegister": 28, "SamplingRateRegister": 28,
"HorizontalManualSpeedRegister": 350,
"VerticalManualSpeedRegister": 310,
"VerticalManualDisplacementRegister": 320,
"VerticalLimitRegister": 290,
"HorizontalLimitRegister": 292,
"ForceCoefficientRegister": 1320,
"ForceProtectionRegister": 1322,
"CalibrationRegister": 1300, "CalibrationRegister": 1300,
"RetryCount": 3, "RetryCount": 3,
"RetryDelay": 500 "RetryDelay": 500