This commit is contained in:
GukSang.Jin
2026-01-30 13:46:39 +08:00
parent 07c8bd92da
commit 52b8cecddc
2 changed files with 110 additions and 13 deletions

View File

@@ -242,8 +242,82 @@ namespace COFTester.Services
/// 实现方式:读取当前状态 → 写入相反状态 → 延迟 100ms /// 实现方式:读取当前状态 → 写入相反状态 → 延迟 100ms
/// 参考case ButtonType.切换型 /// 参考case ButtonType.切换型
/// </summary> /// </summary>
/// <summary>
/// 触发复位按钮 M90复归型
/// M90 是复归型按钮需要写入脉冲信号true → 延迟 → false
/// 然后通过读取 M92 来判断复位是否完成1=复位中0=复位完成)
/// </summary>
public virtual async Task TriggerResetAsync()
{
try
{
if (_modbusMaster != null && _isConnected)
{
const ushort RESET_BUTTON_ADDRESS = 90; // M90 复归型按钮
System.Diagnostics.Debug.WriteLine($"[Modbus] 触发复位按钮 M{RESET_BUTTON_ADDRESS}");
// 写入 true触发
await _modbusMaster.WriteSingleCoilAsync(1, RESET_BUTTON_ADDRESS, true);
System.Diagnostics.Debug.WriteLine($"[Modbus] M{RESET_BUTTON_ADDRESS} = true");
// 延迟 100ms
await Task.Delay(100);
// 写入 false复位
await _modbusMaster.WriteSingleCoilAsync(1, RESET_BUTTON_ADDRESS, false);
System.Diagnostics.Debug.WriteLine($"[Modbus] M{RESET_BUTTON_ADDRESS} = false");
// 延迟 100ms 确保 PLC 处理完成
await Task.Delay(100);
System.Diagnostics.Debug.WriteLine($"[Modbus] M{RESET_BUTTON_ADDRESS} 脉冲信号发送完成");
}
}
catch (Exception ex)
{
OnErrorOccurred($"触发复位失败: {ex.Message}");
System.Diagnostics.Debug.WriteLine($"[Modbus] 触发 M90 异常: {ex.Message}");
throw;
}
}
/// <summary>
/// 读取复位状态标记位 M92
/// M92: 1=复位中0=复位完成
/// </summary>
/// <returns>true=复位中false=复位完成</returns>
public virtual async Task<bool> ReadResetStatusAsync()
{
try
{
if (_modbusMaster != null && _isConnected)
{
const ushort RESET_STATUS_ADDRESS = 92; // M92 状态标记位
var coils = await _modbusMaster.ReadCoilsAsync(1, RESET_STATUS_ADDRESS, 1);
bool isResetting = coils[0];
System.Diagnostics.Debug.WriteLine($"[Modbus] 读取复位状态 M{RESET_STATUS_ADDRESS} = {(isResetting ? "1 ()" : "0 ()")}");
return isResetting;
}
return false;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[Modbus] 读取 M92 状态异常: {ex.Message}");
return false;
}
}
/// <summary>
/// 切换型复位操作(已弃用,请使用 TriggerResetAsync
/// M90 复归型按钮M92 状态标记位1=复位中0=复位完成)
/// </summary>
/// <param name="address">线圈地址例如M1301</param> /// <param name="address">线圈地址例如M1301</param>
/// <returns>返回操作是否成功</returns> /// <returns>返回操作是否成功</returns>
[Obsolete("请使用 TriggerResetAsync() 触发 M90然后通过 ReadResetStatusAsync() 读取 M92 状态")]
public virtual async Task<bool> ToggleResetAsync(ushort address) public virtual async Task<bool> ToggleResetAsync(ushort address)
{ {
try try

View File

@@ -722,21 +722,46 @@ namespace COFTester.ViewModels
CurrentDisp = 0; CurrentDisp = 0;
UpdateScottPlot(); UpdateScottPlot();
// 3. 执行切换型复位操作(使用 NModbus 3.0.81 API // 3. M90 复归型按钮M92 状态标记位1=复位中0=复位完成
// 复位线圈地址为 M90 // 向 M90 写入复归型脉冲来触发复位
const ushort RESET_COIL_ADDRESS = 90;
if (_daqService is ModbusServiceBase modbusService) if (_daqService is ModbusServiceBase modbusService)
{ {
bool success = await modbusService.ToggleResetAsync(RESET_COIL_ADDRESS); // 触发 M90 复归型按钮
await modbusService.TriggerResetAsync();
System.Diagnostics.Debug.WriteLine("[ViewModel] M90 脉冲已发送(触发复位)");
if (success) // 等待一小段时间让 PLC 处理
await Task.Delay(200);
// 持续读取 M92 直到复位完成
int maxAttempts = 50; // 最多等待 5 秒50 * 100ms
int attempts = 0;
bool isResetting = true;
while (isResetting && attempts < maxAttempts)
{ {
StatusMessage = Lang.SystemReset; isResetting = await modbusService.ReadResetStatusAsync();
if (isResetting)
{
// M92 = 1复位中
System.Diagnostics.Debug.WriteLine($"[ViewModel] M92 = 1复位中... (尝试 {attempts + 1}/{maxAttempts})");
await Task.Delay(100); // 等待 100ms 后再次检查
attempts++;
}
else
{
// M92 = 0复位完成
System.Diagnostics.Debug.WriteLine("[ViewModel] M92 = 0复位完成");
StatusMessage = Lang.SystemReset;
break;
}
} }
else
if (attempts >= maxAttempts)
{ {
StatusMessage = "复位失败"; System.Diagnostics.Debug.WriteLine("[ViewModel] 复位超时");
StatusMessage = "复位超时,请检查设备";
} }
} }
else else
@@ -754,10 +779,8 @@ namespace COFTester.ViewModels
finally finally
{ {
// 4. 恢复按钮文本为"复位" // 4. 恢复按钮文本为"复位"
ResetButtonText = Lang.ResetComplete; ResetButtonText = Lang.ResetSystem;
}
// 延迟 500ms 后恢复原始文本
await Task.Delay(500);
ResetButtonText = Lang.ResetSystem; ResetButtonText = Lang.ResetSystem;
} }
} }