更新地址
This commit is contained in:
@@ -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),Float,2個寄存器
|
public ushort TestStrokeRegister { get; set; } = 26; // 測試行程 (mm),Float,2個寄存器
|
||||||
public ushort SamplingRateRegister { get; set; } = 28; // 採樣頻率 (Hz),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
|
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),Float,2個寄存器
|
public ushort TestStrokeRegister { get; set; } = 26; // 測試行程 (mm),Float,2個寄存器
|
||||||
public ushort SamplingRateRegister { get; set; } = 28; // 採樣頻率 (Hz),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
|
public ushort CalibrationRegister { get; set; } = 1300; // 校準命令寄存器 M1300
|
||||||
|
|
||||||
|
|||||||
@@ -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; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user