更新地址
This commit is contained in:
@@ -162,6 +162,10 @@ namespace COFTester.Models
|
||||
// === 傳感器數據寄存器(只讀)===
|
||||
public ushort ForceRegister { get; set; } = 0; // 力值寄存器(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=重置
|
||||
@@ -174,6 +178,15 @@ namespace COFTester.Models
|
||||
public ushort TestStrokeRegister { get; set; } = 26; // 測試行程 (mm),Float,2個寄存器
|
||||
public ushort SamplingRateRegister { get; set; } = 28; // 採樣頻率 (Hz),Float,2個寄存器
|
||||
|
||||
// === 手動控制參數寄存器(讀寫)===
|
||||
public ushort HorizontalManualSpeedRegister { get; set; } = 350; // D350 水平手動速度 (mm/s),Float,2個寄存器
|
||||
public ushort VerticalManualSpeedRegister { get; set; } = 310; // D310 升降手動速度 (mm/s),Float,2個寄存器
|
||||
public ushort VerticalManualDisplacementRegister { get; set; } = 320; // D320 升降手動位移 (mm),Float,2個寄存器
|
||||
public ushort VerticalLimitRegister { get; set; } = 290; // D290 升降極限 (mm),Float,2個寄存器
|
||||
public ushort HorizontalLimitRegister { get; set; } = 292; // D292 水平極限 (mm),Float,2個寄存器
|
||||
public ushort ForceCoefficientRegister { get; set; } = 1320; // D1320 拉力系數 (N/V),Float,2個寄存器
|
||||
public ushort ForceProtectionRegister { get; set; } = 1322; // D1322 拉力保護 (N),Float,2個寄存器
|
||||
|
||||
// === 校準寄存器(寫入)===
|
||||
public ushort CalibrationRegister { get; set; } = 1300; // 校準命令寄存器 M1300
|
||||
|
||||
@@ -199,6 +212,10 @@ namespace COFTester.Models
|
||||
// === 傳感器數據寄存器(只讀)===
|
||||
public ushort ForceRegister { get; set; } = 0; // 力值寄存器(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=重置
|
||||
@@ -211,6 +228,15 @@ namespace COFTester.Models
|
||||
public ushort TestStrokeRegister { get; set; } = 26; // 測試行程 (mm),Float,2個寄存器
|
||||
public ushort SamplingRateRegister { get; set; } = 28; // 採樣頻率 (Hz),Float,2個寄存器
|
||||
|
||||
// === 手動控制參數寄存器(讀寫)===
|
||||
public ushort HorizontalManualSpeedRegister { get; set; } = 350; // D350 水平手動速度 (mm/s),Float,2個寄存器
|
||||
public ushort VerticalManualSpeedRegister { get; set; } = 310; // D310 升降手動速度 (mm/s),Float,2個寄存器
|
||||
public ushort VerticalManualDisplacementRegister { get; set; } = 320; // D320 升降手動位移 (mm),Float,2個寄存器
|
||||
public ushort VerticalLimitRegister { get; set; } = 290; // D290 升降極限 (mm),Float,2個寄存器
|
||||
public ushort HorizontalLimitRegister { get; set; } = 292; // D292 水平極限 (mm),Float,2個寄存器
|
||||
public ushort ForceCoefficientRegister { get; set; } = 1320; // D1320 拉力系數 (N/V),Float,2個寄存器
|
||||
public ushort ForceProtectionRegister { get; set; } = 1322; // D1322 拉力保護 (N),Float,2個寄存器
|
||||
|
||||
// === 校準寄存器(寫入)===
|
||||
public ushort CalibrationRegister { get; set; } = 1300; // 校準命令寄存器 M1300
|
||||
|
||||
|
||||
@@ -361,6 +361,16 @@ namespace COFTester.Models
|
||||
/// <param name="start">true=开始移动, false=停止移动</param>
|
||||
void DirectionControl(string direction, bool start);
|
||||
|
||||
/// <summary>
|
||||
/// 开始指定方向的测试 - 写入1到对应寄存器
|
||||
/// </summary>
|
||||
void StartDirectionTest(string direction);
|
||||
|
||||
/// <summary>
|
||||
/// 停止指定方向的测试 - 写入0到对应寄存器
|
||||
/// </summary>
|
||||
void StopDirectionTest(string direction);
|
||||
|
||||
bool IsConnected { get; }
|
||||
}
|
||||
|
||||
|
||||
@@ -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<TestDataPoint?> ReadSensorDataAsync();
|
||||
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.TestStroke}mm → 寄存器[{_config.TestStrokeRegister}]");
|
||||
System.Diagnostics.Debug.WriteLine($" 採樣頻率: {parameters.SamplingRate}Hz → 寄存器[{_config.SamplingRateRegister}]");
|
||||
|
||||
// 寫入手動控制參數
|
||||
await WriteManualControlParametersAsync(parameters);
|
||||
}
|
||||
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>
|
||||
@@ -956,6 +1107,9 @@ 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);
|
||||
}
|
||||
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>
|
||||
@@ -1232,6 +1458,9 @@ namespace COFTester.Services
|
||||
_config.SlaveId, _config.SledMassRegister, allRegisters);
|
||||
|
||||
System.Diagnostics.Debug.WriteLine($"[ModbusASCII] 參數寫入完成");
|
||||
|
||||
// 寫入手動控制參數
|
||||
await WriteManualControlParametersAsync(parameters);
|
||||
}
|
||||
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()
|
||||
{
|
||||
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)
|
||||
{
|
||||
try
|
||||
|
||||
@@ -536,5 +536,17 @@ namespace COFTester.Services
|
||||
string action = start ? "開始" : "停止";
|
||||
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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,10 @@
|
||||
"ConnectTimeout": 5000,
|
||||
"ForceRegister": 0,
|
||||
"DisplacementRegister": 2,
|
||||
"FrictionForceRegister": 1314,
|
||||
"CurveDisplacementRegister": 360,
|
||||
"VerticalPositionRegister": 12,
|
||||
"HorizontalPositionRegister": 16,
|
||||
"ControlRegister": 10,
|
||||
"StatusRegister": 12,
|
||||
"SledMassRegister": 20,
|
||||
@@ -15,6 +19,13 @@
|
||||
"TestDurationRegister": 24,
|
||||
"TestStrokeRegister": 26,
|
||||
"SamplingRateRegister": 28,
|
||||
"HorizontalManualSpeedRegister": 350,
|
||||
"VerticalManualSpeedRegister": 310,
|
||||
"VerticalManualDisplacementRegister": 320,
|
||||
"VerticalLimitRegister": 290,
|
||||
"HorizontalLimitRegister": 292,
|
||||
"ForceCoefficientRegister": 1320,
|
||||
"ForceProtectionRegister": 1322,
|
||||
"CalibrationRegister": 1300,
|
||||
"RetryCount": 3,
|
||||
"RetryDelay": 500
|
||||
@@ -31,6 +42,10 @@
|
||||
"WriteTimeout": 1000,
|
||||
"ForceRegister": 0,
|
||||
"DisplacementRegister": 2,
|
||||
"FrictionForceRegister": 1314,
|
||||
"CurveDisplacementRegister": 360,
|
||||
"VerticalPositionRegister": 12,
|
||||
"HorizontalPositionRegister": 16,
|
||||
"ControlRegister": 10,
|
||||
"StatusRegister": 12,
|
||||
"SledMassRegister": 20,
|
||||
@@ -38,6 +53,13 @@
|
||||
"TestDurationRegister": 24,
|
||||
"TestStrokeRegister": 26,
|
||||
"SamplingRateRegister": 28,
|
||||
"HorizontalManualSpeedRegister": 350,
|
||||
"VerticalManualSpeedRegister": 310,
|
||||
"VerticalManualDisplacementRegister": 320,
|
||||
"VerticalLimitRegister": 290,
|
||||
"HorizontalLimitRegister": 292,
|
||||
"ForceCoefficientRegister": 1320,
|
||||
"ForceProtectionRegister": 1322,
|
||||
"CalibrationRegister": 1300,
|
||||
"RetryCount": 3,
|
||||
"RetryDelay": 500
|
||||
|
||||
Reference in New Issue
Block a user