feat: add 寄存器地址

This commit is contained in:
GukSang.Jin
2026-02-28 10:24:18 +08:00
parent 5700195897
commit 2a312e798f
4 changed files with 128 additions and 2 deletions

Binary file not shown.

View File

@@ -551,4 +551,90 @@ public class ModbusService : IDisposable
}
#endregion
#region
/// <summary>
/// 触发关闭门并开始洗护按钮 M80复归型
/// M80 是复归型按钮需要写入脉冲信号true → 延迟 → false
/// </summary>
public async Task TriggerStartWashAsync()
{
try
{
if (_modbusMaster != null && _isConnected)
{
const ushort START_WASH_BUTTON_ADDRESS = 80; // M80 复归型按钮
_logger.LogInfo($"[Modbus] 触发关闭门并开始洗护按钮 M{START_WASH_BUTTON_ADDRESS}");
// 写入 true触发
await WriteSingleCoilAsync(START_WASH_BUTTON_ADDRESS, true);
_logger.LogInfo($"[Modbus] M{START_WASH_BUTTON_ADDRESS} = true");
// 延迟 100ms
await Task.Delay(100);
// 写入 false复位
await WriteSingleCoilAsync(START_WASH_BUTTON_ADDRESS, false);
_logger.LogInfo($"[Modbus] M{START_WASH_BUTTON_ADDRESS} = false");
// 延迟 100ms 确保 PLC 处理完成
await Task.Delay(100);
_logger.LogInfo($"[Modbus] M{START_WASH_BUTTON_ADDRESS} 脉冲信号发送完成");
}
else
{
throw new InvalidOperationException("Modbus 未连接");
}
}
catch (Exception ex)
{
_logger.LogError($"触发关闭门并开始洗护失败: {ex.Message}", ex);
throw;
}
}
/// <summary>
/// 触发紧急停止按钮 M83复归型
/// M83 是复归型按钮需要写入脉冲信号true → 延迟 → false
/// </summary>
public async Task TriggerEmergencyStopAsync()
{
try
{
if (_modbusMaster != null && _isConnected)
{
const ushort EMERGENCY_STOP_BUTTON_ADDRESS = 83; // M83 复归型按钮
_logger.LogInfo($"[Modbus] 触发紧急停止按钮 M{EMERGENCY_STOP_BUTTON_ADDRESS}");
// 写入 true触发
await WriteSingleCoilAsync(EMERGENCY_STOP_BUTTON_ADDRESS, true);
_logger.LogInfo($"[Modbus] M{EMERGENCY_STOP_BUTTON_ADDRESS} = true");
// 延迟 100ms
await Task.Delay(100);
// 写入 false复位
await WriteSingleCoilAsync(EMERGENCY_STOP_BUTTON_ADDRESS, false);
_logger.LogInfo($"[Modbus] M{EMERGENCY_STOP_BUTTON_ADDRESS} = false");
// 延迟 100ms 确保 PLC 处理完成
await Task.Delay(100);
_logger.LogInfo($"[Modbus] M{EMERGENCY_STOP_BUTTON_ADDRESS} 脉冲信号发送完成");
}
else
{
throw new InvalidOperationException("Modbus 未连接");
}
}
catch (Exception ex)
{
_logger.LogError($"触发紧急停止失败: {ex.Message}", ex);
throw;
}
}
#endregion
}

View File

@@ -758,7 +758,10 @@ public partial class MainViewModel : ObservableObject
try
{
_logger.LogInfo($"关门订单ID: {CurrentOrder.Id}");
_logger.LogInfo($"关门并开始洗护订单ID: {CurrentOrder.Id}");
// 触发 Modbus M80 复归型按钮
await _modbusService.TriggerStartWashAsync();
// 通过MQTT发送关门状态
await _mqttService.PublishAsync("device/status", new
@@ -794,6 +797,42 @@ public partial class MainViewModel : ObservableObject
}
}
[RelayCommand]
private async Task EmergencyStopAsync()
{
try
{
_logger.LogInfo("触发紧急停止");
// 触发 Modbus M83 复归型按钮
await _modbusService.TriggerEmergencyStopAsync();
// 停止洗护流程
IsWashing = false;
// 通过MQTT发送紧急停止状态
await _mqttService.PublishAsync("device/status", new
{
status = "emergency_stop",
orderId = CurrentOrder?.Id,
timestamp = DateTime.Now
});
StatusMessage = "紧急停止已触发";
_logger.LogInfo("紧急停止执行成功");
MessageBox.Show("紧急停止已触发!\n\n设备已停止运行",
"紧急停止", MessageBoxButton.OK, MessageBoxImage.Warning);
}
catch (Exception ex)
{
_logger.LogError("紧急停止失败", ex);
StatusMessage = $"紧急停止失败: {ex.Message}";
MessageBox.Show($"紧急停止失败\n\n{ex.Message}", "错误",
MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private async Task SimulateWashingProcessAsync()
{
try

View File

@@ -1337,7 +1337,8 @@
Foreground="White"
BorderThickness="0"
Margin="0,20,0,0"
Cursor="Hand">
Cursor="Hand"
Command="{Binding EmergencyStopCommand}">
<Button.Template>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}" CornerRadius="25">