发现与决策
需求
- 集成三个库:Stateless(状态机)、Elsa Workflows(工作流)、Quartz.NET(定时任务)
- 目标:完善项目架构,提升设备状态管理、工艺流程编排、任务调度能力
- 完成后编译提交,问题归档到 docs/
研究发现
项目现状
- 框架:.NET 8 + Avalonia UI 12 + CommunityToolkit.Mvvm
- 状态机库:❌ 未安装
- 任务编排库:❌ 未安装
- 自定义状态机:❌ 无(仅有枚举 + 三元表达式描述设备状态)
- 任务调度方式:手写
while + Task.Delay 轮询循环,System.Timers.Timer 做 UI 定时
现有设备状态
DeviceStatus 枚举:Stopped / Running / Fault / Maintenance
ValveStatus 枚举:Open / Closed / Middle
MainViewModel 中用三元表达式映射状态到 UI 文本/颜色
- 位置:
Models/EquipmentStatus.cs
现有任务调度
| 组件 |
方式 |
文件位置 |
PlcPollingService |
Task.Run + while(!ct) + Task.Delay(PollingIntervalMs) |
Services/PlcPollingService.cs |
DataLoggingService |
while(!ct) + Task.Delay(1000) + 计数器 |
Services/DataLoggingService.cs |
MainViewModel |
System.Timers.Timer(1000) |
ViewModels/MainViewModel.cs |
启动流程(App.axaml.cs)
OnFrameworkInitializationCompleted() → DatabaseService.Initialize()
→ ShowLoginWindow() → [登录成功] → StartServices() → ShowMainWindow()
StartServices() → 根据 RunMode 选择:
- Direct: StartPlcServices()
- Server: StartPlcServices() + HubServer
- Client: HubClient + DataLoggingService
StartPlcServices():
- Mock模式: MockPlcService.Enable()
- 真实模式: PlcService.Initialize()
- PlcPollingService.Instance.Start()
- AlarmService.Instance.Start()
- DataLoggingService.Start()
集成点分析
1. Stateless 状态机
- 目标:为泵、阀门、报警创建设备状态机
- 替换:
DeviceStatus 枚举的三元表达式映射
- 新增:状态转换规则(如 Stopped → Running、Running → Fault)
- 位置:创建
Services/DeviceStateMachine.cs
2. Quartz.NET 定时任务
- 目标:替代手写的
while+Task.Delay 轮询
- 替换:
PlcPollingService.PollingLoopAsync() → PlcPollingJob
DataLoggingService.LoggingLoopAsync() → DataLoggingJob
MainViewModel._clockTimer → 保持原样(UI 时钟不适合 Quartz)
- 位置:创建
Services/QuartzSchedulerService.cs 和 Jobs 目录
3. Elsa Workflows 工作流
- 目标:支持工艺流程编排(如污水处理流程)
- 新增:配置 Elsa 服务,创建示例工作流
- 位置:创建
Services/WorkflowService.cs 和 Workflows/ 目录
技术决策
| 决策 |
理由 |
| Stateless 用于设备状态建模 |
轻量零依赖,Fluent API 适合工业设备 |
| Quartz.NET 用于定时任务 |
成熟稳定,支持 cron 表达式,替代手写轮询 |
| Elsa Workflows 用于流程编排 |
.NET 生态最活跃的工作流引擎,支持可视化 |
| MainViewModel 的 UI 时钟保留 System.Timers.Timer |
UI 定时器不适合用 Quartz(需要与 UI 线程交互) |
遇到的问题
资源
每执行2次查看/浏览器/搜索操作后更新此文件
防止视觉信息丢失