# XP.Hardware.RaySource 工业 X 射线源控制模块 | Industrial X-Ray Source Control Module --- ## 项目概述 | Project Overview XP.Hardware.RaySource 是 XplorePlane X 射线检测系统的核心硬件控制模块,负责与工业 X 射线源设备进行通讯和控制。该模块采用策略模式和工厂模式设计,支持多种 X 射线源型号的统一管理,提供完整的设备生命周期控制和安全机制。 ### 主要特性 | Key Features - 支持多种 X 射线源型号(当前支持 Comet 225kV) - 基于 Named Pipe IPC 的进程隔离架构(.NET 8 主进程 ↔ .NET Framework 4.8 Host 进程) - 完整的设备生命周期管理(初始化、连接变量、暖机、训机、灯丝校准、自动定心、开关射线) - 精确的电压电流控制(20-225kV / 10-1000μA) - 实时状态监控和错误检测 - 基于 Prism 事件聚合器的松耦合跨模块通讯 - 安全机制:紧急关闭优先级、参数范围验证 - 灯丝寿命管理:使用时长记录、累计统计、预警提醒 - TXI 开关控制、功率模式切换(Micro Focus / High Power) - 完整的日志记录和异常处理 --- ## 框架架构 | Architecture ``` XP.Hardware.RaySource/ ├── Abstractions/ # 抽象层 | Abstraction Layer │ ├── IXRaySource.cs # 策略接口(同步方法) │ ├── XRaySourceBase.cs # 抽象基类 │ ├── XRayResult.cs # 结果封装类 │ ├── IRaySourceFactory.cs # 工厂接口 │ ├── Enums/ # 枚举定义 │ │ └── RaySourceStatus.cs # 三态枚举(Unavailable/Closed/Opened) │ └── Events/ # Prism 事件定义 │ ├── StatusUpdatedEvent.cs # 系统状态更新事件 │ ├── ErrorOccurredEvent.cs # 错误触发事件 │ ├── OperationResultEvent.cs # 操作结果事件 │ ├── RaySourceStatusChangedEvent.cs # 射线源状态变更事件 │ └── VariablesConnectedEvent.cs # PVI 变量连接状态事件 ├── Implementations/ # 实现层 | Implementation Layer │ ├── Comet225RaySource.cs # Comet 225kV 适配器(委托 IPC 客户端) │ ├── CometHostManager.cs # Host 进程生命周期管理器 │ └── CometIpcClient.cs # Named Pipe IPC 客户端 ├── Factories/ # 工厂层 | Factory Layer │ └── RaySourceFactory.cs # 射线源工厂 ├── Services/ # 业务服务层 | Service Layer │ ├── IRaySourceService.cs # 服务接口 │ ├── RaySourceService.cs # 服务实现(单例) │ ├── IFilamentLifetimeService.cs # 灯丝寿命服务接口 │ └── FilamentLifetimeService.cs # 灯丝寿命服务实现 ├── Config/ # 配置层 | Configuration Layer │ ├── RaySourceConfig.cs # 配置实体 │ └── ConfigLoader.cs # 配置加载器(支持保存) ├── Module/ # Prism 模块 | Prism Module │ └── RaySourceModule.cs # 模块注册 ├── ViewModels/ # 视图模型 | View Models │ ├── RaySourceConfigViewModel.cs # 配置视图模型(初始化/连接/断开/设备状态监控/灯丝寿命) │ └── RaySourceOperateViewModel.cs # 操作视图模型(开关/电压电流调节) ├── Views/ # WPF 视图 | WPF Views │ ├── RaySourceConfigView.xaml # 配置视图(设备状态面板) │ ├── RaySourceConfigWindow.xaml # 配置窗口(包裹 ConfigView) │ └── RaySourceOperateView.xaml # 操作视图(开关/滑块) ├── Converters/ # WPF 值转换器 | WPF Value Converters │ ├── RaySourceOperateConverter.cs # 状态→颜色/边框色/启用状态 │ └── FilamentLifetimeColorConverter.cs # 灯丝寿命百分比→颜色 └── Documents/ # 文档 | Documentation ├── README.md # 项目说明(本文档) ├── ProjectStructure.md # 项目结构详解 ├── GUIDENCE.md # 使用指南 ├── README_RaySourceOperateView.md # 操作视图说明 └── App.config.example # 配置文件示例 ``` ### 设计模式 | Design Patterns - **策略模式**:`IXRaySource` 接口定义统一操作,支持多种设备实现 - **工厂模式**:`IRaySourceFactory` 根据设备类型动态创建实例 - **适配器模式**:`Comet225RaySource` 将 IPC 通信适配为 `IXRaySource` 接口 - **进程隔离**:通过 `CometHostManager` + `CometIpcClient` 实现 .NET 8 与 .NET Framework 4.8 的跨框架通信 - **模板方法模式**:`XRaySourceBase` 提供基础实现框架 - **单例模式**:`IRaySourceService`、`IFilamentLifetimeService` 作为全局单例 - **依赖注入**:通过 Prism 容器管理服务生命周期 - **事件聚合器**:使用 Prism `IEventAggregator` 实现松耦合通讯 ### IPC 进程隔离架构 | IPC Process Isolation Architecture ``` ┌──────────────────────────────────────────────────────────────────────┐ │ .NET 8 主进程 (XP.Hardware.RaySource) │ │ │ │ ViewModel → RaySourceService → Comet225RaySource │ │ │ │ │ CometHostManager(管理 Host 进程生命周期)│ │ CometIpcClient(Named Pipe 双管道通信) │ │ │ │ │ NamedPipe: Cmd(写入)/ Rsp(读取) │ └──────────────────────────────┬───────────────────────────────────────┘ │ Named Pipe IPC ┌──────────────────────────────┴───────────────────────────────────────┐ │ .NET Framework 4.8 Host 进程 (Comet.Host) │ │ │ │ CometPviClient ← BR.AN.PviServices.dll │ │ (PVI 通讯层,直接操作 PLC 变量) │ └──────────────────────────────────────────────────────────────────────┘ ``` --- ## 核心功能 | Core Features ### 1. 设备生命周期管理 | Device Lifecycle Management ```csharp // 初始化射线源(类型从配置文件读取) XRayResult result = _raySourceService.Initialize(); // 连接 PVI 变量并启动实时状态通讯 XRayResult connectResult = _raySourceService.ConnectVariables(); // 异步执行初始化 + 连接变量的完整流程 XRayResult autoResult = await _raySourceService.InitializeAndConnectAsync(); // 开启射线 _raySourceService.TurnOn(); // 关闭射线 _raySourceService.TurnOff(); // 紧急关闭(最高优先级) _raySourceService.EmergencyShutdown(); // 断开连接(保留实例以便重连) _raySourceService.Disconnect(); ``` ### 2. 电压电流控制 | Voltage and Current Control ```csharp // 设置电压(20-225kV) _raySourceService.SetVoltage(100f); // 设置电流(10-1000μA) _raySourceService.SetCurrent(500f); // 读取实际电压 XRayResult voltageResult = _raySourceService.ReadVoltage(); float voltage = voltageResult.GetFloat(); // 读取实际电流 XRayResult currentResult = _raySourceService.ReadCurrent(); float current = currentResult.GetFloat(); ``` ### 3. 设备操作 | Device Operations ```csharp // TXI 开启/关闭 _raySourceService.TxiOn(); _raySourceService.TxiOff(); // 暖机 _raySourceService.WarmUp(); // 训机 _raySourceService.Training(); // 灯丝校准 _raySourceService.FilamentCalibration(); // 全部电压自动定心 _raySourceService.AutoCenter(); // 设置功率模式(1=Micro Focus,2=High Power) _raySourceService.SetPowerMode(1); ``` ### 4. 状态监控 | Status Monitoring ```csharp // 读取系统状态 _raySourceService.ReadSystemStatus(); // 检查错误 _raySourceService.CheckErrors(); // 清除错误 _raySourceService.ClearErrors(); // 检查状态属性 bool isInitialized = _raySourceService.IsInitialized; bool isConnected = _raySourceService.IsConnected; bool isXRayOn = _raySourceService.IsXRayOn; RaySourceStatus status = _raySourceService.CurrentStatus; ``` ### 5. 灯丝寿命管理 | Filament Lifetime Management ```csharp // 初始化灯丝寿命服务(模块启动时自动调用) _filamentLifetimeService.Initialize(); // 获取累计使用秒数 double totalSeconds = _filamentLifetimeService.GetCurrentTotalLifeSeconds(); // 获取寿命百分比 double percentage = _filamentLifetimeService.GetLifetimePercentage(); // 检查是否需要预警(≥90%) bool shouldWarn = _filamentLifetimeService.ShouldShowLifetimeWarning(); ``` ### 6. 事件通讯 | Event Communication ```csharp // 订阅射线源状态变化事件(三态:Unavailable/Closed/Opened) _eventAggregator.GetEvent() .Subscribe(OnRaySourceStatusChanged, ThreadOption.UIThread); // 订阅系统状态更新事件(电压/电流/各子系统状态) _eventAggregator.GetEvent() .Subscribe(OnStatusUpdated, ThreadOption.UIThread); // 订阅错误事件 _eventAggregator.GetEvent() .Subscribe(OnErrorOccurred, ThreadOption.UIThread); // 订阅操作结果事件 _eventAggregator.GetEvent() .Subscribe(OnOperationResult, ThreadOption.UIThread); // 订阅 PVI 变量连接状态事件 _eventAggregator.GetEvent() .Subscribe(OnVariablesConnected, ThreadOption.UIThread); ``` --- ## 技术要求 | Technical Requirements ### 运行环境 | Runtime Environment - **.NET 8.0** (net8.0-windows7.0) - **Windows 操作系统**(WPF 依赖) - **Visual Studio 2022** 或更高版本 ### 核心依赖 | Core Dependencies | 依赖库 | 版本 | 用途 | |--------|------|------| | **Prism.Wpf** | 9.0.537 | MVVM 框架和依赖注入 | | **Telerik UI for WPF** | 2024.1.408 | UI 控件库 | | **System.Configuration.ConfigurationManager** | 8.0.0 | 配置文件管理 | | **XP.Common** | - | 日志、数据库、多语言基础设施 | | **XP.Hardware.RaySource.Comet.Messages** | - | IPC 消息定义(netstandard2.0 共享库) | ### 关联项目 | Related Projects | 项目 | 框架 | 用途 | |------|------|------| | **XP.Hardware.RaySource.Comet.Host** | .NET Framework 4.8 | Host 子进程,运行 B&R PVI 通讯 | | **XP.Hardware.RaySource.Comet.Messages** | netstandard2.0 | IPC 命令/响应消息定义 | --- ## 快速开始 | Quick Start ### 1. 配置文件设置 参见 [App.config.example](./App.config.example) ### 2. 注册模块 在 `App.xaml.cs` 中: ```csharp protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { moduleCatalog.AddModule(); } ``` ### 3. 使用服务 在 ViewModel 中注入并使用: ```csharp public class YourViewModel : BindableBase { private readonly IRaySourceService _raySourceService; private readonly IEventAggregator _eventAggregator; public YourViewModel( IRaySourceService raySourceService, IEventAggregator eventAggregator) { _raySourceService = raySourceService; _eventAggregator = eventAggregator; _eventAggregator.GetEvent() .Subscribe(OnStatusChanged, ThreadOption.UIThread); } public void Initialize() { XRayResult result = _raySourceService.Initialize(); if (result.Success) { _raySourceService.ConnectVariables(); } } } ``` --- ## 配置参数说明 | Configuration Parameters | 参数 | 类型 | 默认值 | 说明 | |------|------|--------|------| | SourceType | string | Comet225 | 射线源类型 | | PlcIpAddress | string | 192.168.12.10 | PLC IP 地址 | | PlcPort | int | 11159 | PLC 端口号 | | StationNumber | int | 1 | 源站号 | | PortNumber | int | 11 | 源端口号 | | CpuName | string | cpu | CPU 名称 | | ConnectionTimeout | int | 5000 | 连接超时(毫秒)| | MinVoltage | float | 20 | 最小电压(kV)| | MaxVoltage | float | 225 | 最大电压(kV)| | MinCurrent | float | 10 | 最小电流(μA)| | MaxCurrent | float | 1000 | 最大电流(μA)| | AdvanceExePath | string | FXEControl.exe 路径 | 高级设置外部程序路径 | | HostExePath | string | 空(自动查找) | Host 进程可执行文件路径 | | InitializationTimeout | int | 30000 | 初始化超时(毫秒)| | WarmUpTimeout | int | 300000 | 暖机超时(5分钟)| | StartUpTimeout | int | 180000 | 启动超时(3分钟)| | AutoCenterTimeout | int | 120000 | 自动定心超时(2分钟)| | FilamentAdjustTimeout | int | 120000 | 灯丝调整超时(2分钟)| | GeneralOperationTimeout | int | 10000 | 一般操作超时(毫秒)| | SerialNumber | string | 空 | 射线源序列号(灯丝寿命管理) | | TotalLifeThreshold | int | 1000 | 灯丝总寿命阈值(小时) | --- ## 安全机制 | Safety Mechanisms ### 1. 参数范围验证 所有参数在设置前都会进行范围验证,超出范围返回错误结果。 ### 2. 紧急关闭优先级 紧急关闭具有最高优先级,可以在任何状态下执行,会依次关闭射线、完全关闭设备。 ### 3. 业务规则校验 - 未初始化禁止操作 - 防重复开启/关闭(双重检查锁定) - 异常断联自动检测和状态重置 ### 4. 灯丝寿命预警 灯丝使用时长达到阈值 90% 时,系统自动弹出预警对话框。 --- ## 文档索引 | Documentation Index - **[README.md](./README.md)** - 本文档,项目概述和快速参考 - **[ProjectStructure.md](./ProjectStructure.md)** - 项目结构详解和调用链路 - **[GUIDENCE.md](./GUIDENCE.md)** - 详细使用指南,包含完整代码示例 - **[README_RaySourceOperateView.md](./README_RaySourceOperateView.md)** - 操作视图使用说明 - **[App.config.example](./App.config.example)** - 配置文件示例 --- ## 故障排查 | Troubleshooting ### 初始化失败 - 检查 Host 进程可执行文件是否存在(默认路径:`{主程序目录}/Host/XP.Hardware.RaySource.Comet.Host.exe`) - 检查 PLC IP 地址和端口配置 - 确认 PLC 网络连接正常 - 查看日志中 Named Pipe 连接状态 ### 射线无法开启 - 确认已成功初始化并连接变量(`IsInitialized && IsConnected`) - 检查设备错误状态 - 验证互锁信号 ### 电压电流设置失败 - 验证参数在有效范围内 - 确认射线源已初始化 - 检查 IPC 管道连接状态 ### Host 进程异常 - 检查 Host 进程是否正常启动(查看日志中 PID 信息) - 确认 BR.AN.PviServices.dll 已正确部署到 Host 目录 - 检查是否有残留的 Host 进程(CometHostManager 会自动清理) 详细故障排查请参考 [GUIDENCE.md](./GUIDENCE.md) 第 14 节。 --- ## 许可证 | License 本模块是 XplorePlane 项目的一部分,遵循项目整体许可协议。 --- **最后更新 | Last Updated**: 2026-03-26