Files
Axi_Omron/README.md
yunxiao.zhu d70b94e904 feat(*): 添加扫码枪启动探活、全局退出助手及 README
- 添加扫码枪串口启动探活,检测端口占用并更新 UI 状态
- 新增 ShutdownHelper 安全停止 Host 扩展方法
- 新增 README.md 项目说明文档
- 更新 WorkflowHostedService 启动探活逻辑
- 补充 ShutdownHelper 与 WorkflowHostedService 单元测试
- 优化 DashboardPage 与 SystemSettingsPage 界面布局
- 调整 ModbusTcpPlcService 监控镜像读取逻辑
2026-04-19 14:29:07 +08:00

7.7 KiB
Raw Permalink Blame History

AxiOmron.PcbCheck

基于 .NET 8 + WPF + MVVM Toolkit + Generic Host/DI + NLog 的 PCB 目检上位机示例工程,包含 PLC 通信、扫码枪触发、SFTP 文件校验、安灯报警和运行态监控。

项目结构

Axi_Omron/
  src/
    AxiOmron.PcbCheck/
  tests/
    AxiOmron.PcbCheck.Tests/
  docs/
  AxiOmron.PcbCheck.slnx

主程序位于 src/AxiOmron.PcbCheck,测试位于 tests/AxiOmron.PcbCheck.Tests

技术栈

  • .NET 8 / WPF
  • CommunityToolkit.Mvvm
  • Microsoft.Extensions.Hosting
  • NLog
  • IoTClient Modbus TCP
  • SSH.NET
  • HandyControl

配置说明

主配置文件位于 src/AxiOmron.PcbCheck/appConfig.json

当前 PLC 相关默认配置示例:

  • Plc.Host: 127.0.0.1
  • Plc.Port: 502
  • Plc.UnitId: 1
  • Plc.PollIntervalMs: 200
  • Plc.ReleasePulseMs: 500
  • Plc.ReleaseAckTimeoutMs: 2000

点位映射示例:

  • 输入点位
  • PcbArrived = 0
  • PlcReset = 1
  • PlcAckRelease = 2
  • 输出点位
  • PcBusy = 51
  • ReleasePermit = 52
  • 寄存器
  • ResultCode = 0

系统设置页可修改 PLC 参数,界面入口在 SystemSettingsPage.xaml

注意:配置保存后会写入运行目录下的 appConfig.json,当前界面提示为“重启应用后完全生效”。

构建与运行

dotnet restore .\src\AxiOmron.PcbCheck\AxiOmron.PcbCheck.csproj
dotnet build .\src\AxiOmron.PcbCheck\AxiOmron.PcbCheck.csproj -c Debug
dotnet run --project .\src\AxiOmron.PcbCheck\AxiOmron.PcbCheck.csproj -c Debug
dotnet test .\tests\AxiOmron.PcbCheck.Tests\AxiOmron.PcbCheck.Tests.csproj

PLC 后台轮询调用链

总览

App 启动
  -> BuildHost 注册 WorkflowHostedService 为 HostedService
  -> Host.StartAsync()
  -> WorkflowHostedService.ExecuteAsync()

ExecuteAsync 主循环
  -> ProbePlcOnStartupAsync() 启动先探活
  -> while (...)
     -> _plcService.ReadSignalsAsync() 读取 PLC 输入
     -> HandleSignalSnapshot() 刷 PLC 连接状态
     -> RefreshPlcMonitorSnapshotAsync() 刷监控区
     -> if PlcReset = true
          -> ResetAsync()
        else if ShouldStartWorkflow() 命中上升沿
          -> StartWorkflowInBackground()
             -> RunWorkflowOnceAsync()

RunWorkflowOnceAsync 单板流程
  -> InitializeBoardState()
  -> ApplyProcessStateAsync(Triggered, PcBusy=true)
  -> ExecuteScanFlowAsync()
     -> _scannerService.TriggerScanAsync()
  -> ExecuteSftpFlowAsync(barcode)
     -> _sftpLookupService.CheckFileAsync()
  -> ReleaseAndCompleteAsync()
     -> ApplyProcessStateAsync(Releasing, ReleasePermit=true)
     -> 循环 _plcService.ReadSignalsAsync() 等 PlcAckRelease
     -> Delay(ReleasePulseMs)
     -> ApplyProcessStateAsync(Completed, ReleasePermit=false, PcBusy=false)
     -> _stateStore.AddRecord(...)

状态/UI 更新支线
  -> PublishRuntimeState() / UpdateSnapshot()
  -> AppStateStore.SnapshotChanged
  -> MainWindowViewModel.OnSnapshotChanged()
  -> DashboardPage / SystemSettingsPage 绑定刷新

关键代码入口

PLC 底层读写落点

UI 刷新链

常用排查入口

说明

本 README 主要补充程序整体说明与 PLC 后台轮询调用链便于排查“PLC 轮询在哪里启动、如何触发单板流程、状态如何回写和刷新 UI”这类问题。