1. 结论
跳转到“1. 结论”工业振动分析仪上位机必须把软件分级作为产品架构的一等能力,而不是后期销售包装。建议采用:
单一安装包 / 单一可执行文件+ 运行时许可证控制+ 功能模块自注册+ UI 动态启用、禁用或引导升级+ CMake 模块化工程+ i.MX8MP 嵌入式部署闭环核心判断:
| 方向 | 决策 |
|---|---|
| 商业模式 | 采用基础版、高级版、专业版三级软件授权。 |
| 技术实现 | 所有功能编入同一二进制,通过许可证在运行时控制访问。 |
| 工程结构 | 采用 core -> domain modules -> app -> ui 单向依赖。 |
| 产品基线 | 适配 i.MX8MP + FPGA + AD7768-4,支持后续从 4 通道扩展到 8 通道。 |
| 首要改造 | 先内建 licensing 和 feature_manager,再拆分析、采集、存储和平衡模块。 |
这个方案的价值不只是“限制功能”,而是让同一套硬件可以覆盖入门巡检、现场诊断、专业测试三类客户,并为后续授权升级、代理商销售和算法模块收费留下空间。
2. 为什么必须做版本分级
跳转到“2. 为什么必须做版本分级”工业振动分析仪的客户差异很大。基础客户需要快速测振、频谱和简单平衡;中端客户需要多通道、包络、启停机和历史管理;高端客户才需要阶次跟踪、FRF、ODS、模态和高级报告。把这些功能全部放在一个价格里,会同时伤害低端成交率和高端利润。
版本分级的作用:
| 维度 | 影响 |
|---|---|
| 销售 | 同一硬件可形成不同报价,代理商更容易匹配客户预算。 |
| 利润 | 高级算法、专业分析和报告能力可独立变现。 |
| 维护 | 客户后续通过 license 升级,不必更换硬件或重装软件。 |
| 算力 | 高级功能通常需要更多缓存、CPU 和交互复杂度,不应默认压到所有用户路径。 |
| 产品定位 | 基础版负责走量,专业版负责品牌与利润,高级版承担主力成交。 |
因此,版本分级不是 UI 层的小开关,而是商业模式、架构边界和发布流程共同决定的产品能力。
3. 版本设计
跳转到“3. 版本设计”建议初始定义三档:
| 版本 | 目标客户 | 产品定位 |
|---|---|---|
| 基础版 Basic | 设备巡检、维修班组、教育和低预算客户 | 快速上手,覆盖基础测振、FFT、单面平衡和 CSV 导出。 |
| 高级版 Advanced | 工厂设备管理、现场服务、常规故障诊断 | 多通道同步采集、包络、启停机、双面平衡、历史数据库和报告。 |
| 专业版 Professional | 第三方检测、研发测试、旋转机械专家 | 阶次跟踪、FRF、ODS、模态、相干分析、高级导出和高通道扩展。 |
功能矩阵:
| 功能 | 基础版 | 高级版 | 专业版 |
|---|---|---|---|
| 采集通道数 | 1-2 | 4 | 4-8 |
| 最高采样率 | 25.6 kHz | 102.4 kHz | 102.4 kHz 或硬件允许上限 |
| 时域波形、RMS、峰值、峭度 | 支持 | 支持 | 支持 |
| FFT、倍频识别、基础频谱 | 支持 | 支持 | 支持 |
| 包络分析 | 不支持 | 支持 | 支持 |
| 瀑布图 | 不支持 | 支持 | 支持 |
| 启停机分析 | 不支持 | 支持 | 支持 |
| 单面动平衡 | 支持 | 支持 | 支持 |
| 双面动平衡 | 不支持 | 支持 | 支持 |
| 影响系数法平衡 | 不支持 | 可选 | 支持 |
| 阶次跟踪 | 不支持 | 不支持 | 支持 |
| FRF、相干函数 | 不支持 | 不支持 | 支持 |
| ODS、模态分析 | 不支持 | 不支持 | 支持 |
| CSV 导出 | 支持 | 支持 | 支持 |
| SQLite 历史库 | 不支持 | 支持 | 支持 |
| PDF 报告 | 基础模板 | 标准模板 | 高级模板 |
| MATLAB 或专业数据导出 | 不支持 | 不支持 | 支持 |
价格和授权策略应围绕 Advanced 设计,因为它最可能成为主销版本。Basic 用于降低入口门槛,Professional 用于拉高上限。
4. 错误做法
跳转到“4. 错误做法”不要使用代码分支式分级:
if (license == PROFESSIONAL) { runModalAnalysis();}这种写法如果散落在业务代码、UI 代码和算法代码中,会导致版本逻辑无法审计,也会让每次改功能都必须人工搜索所有条件分支。
也不要发布三套二进制:
VibrationAnalyzer_Basic.exeVibrationAnalyzer_Advanced.exeVibrationAnalyzer_Professional.exe多二进制会放大发布、升级、售后和现场安装成本。客户装错版本后需要重新安装,代理商也很难维护统一交付流程。
5. 正确架构
跳转到“5. 正确架构”正确做法是单二进制加运行时许可证控制:
- 所有功能进入同一套源码和同一个发布包。
- 每个功能声明自己需要的最低版本或 feature flag。
- 启动时由
LicenseManager读取授权,计算当前可用功能。 FeatureRegistry通知业务模块启用或禁用功能。FeatureManager负责 UI、菜单、工作流和升级提示。- 授权变化时支持重新加载,避免重装软件。
运行时关系:
flowchart LR LicenseFile["license.lic<br/>签名授权文件"] Validator["LicenseValidator<br/>签名与期限校验"] Manager["LicenseManager<br/>版本与功能集合"] Registry["FeatureRegistry<br/>功能自注册"] App["FeatureManager<br/>业务开关"] UI["Qt UI<br/>按钮、菜单、页面"] Module["分析/平衡/存储模块"]
LicenseFile --> Validator --> Manager --> Registry Manager --> App --> UI Registry --> Module建议的许可证文件为签名 JSON,实际落盘可加密或封装:
{ "licensee": "某某工厂", "serial": "VA-PRO-2026-XXXX", "edition": "Professional", "features": [ "MultiChannelAcquisition", "OrderTracking", "ODS" ], "expiry": "2027-12-31", "signature": "RSA signature"}重点是签名验证,而不是简单加密。加密只能降低可读性,签名才能判断授权内容是否被篡改。
6. 核心接口
跳转到“6. 核心接口”建议先定义稳定的授权接口:
enum class ProductEdition { Basic, Advanced, Professional};
enum class Feature { MultiChannelAcquisition, HighSampleRate, EnvelopeAnalysis, WaterfallPlot, RunupAnalysis, OrderTracking, FRF, ODS, ModalAnalysis, SinglePlaneBalancing, TwoPlaneBalancing, InfluenceCoefficientBalancing, DatabaseStorage, AdvancedReporting, MatlabExport};
class LicenseManager {public: static LicenseManager& instance();
bool initialize(const QString& licensePath); ProductEdition currentEdition() const; bool hasFeature(Feature feature) const;
bool isTrialMode() const; int trialDaysRemaining() const;
signals: void licenseChanged(ProductEdition edition); void featureAccessDenied(Feature feature);};每个功能模块自注册:
class FeatureRegistration {public: FeatureRegistration( Feature feature, ProductEdition minimumEdition, std::function<void()> enableCallback, std::function<void()> disableCallback);};使用示例:
namespace {FeatureRegistration orderTrackingReg( Feature::OrderTracking, ProductEdition::Professional, []() { /* enable order tracking */ }, []() { /* disable action and hide workflow */ });}UI 层只问“功能是否可用”,不要自行判断版本等级。这样未来增加试用、按模块购买、临时授权时,不需要改 UI 判断逻辑。
7. 工程目录
跳转到“7. 工程目录”建议的上位机目录:
vibration_analyzer/├── CMakeLists.txt├── CMakePresets.json├── cmake/│ ├── modules/│ │ ├── VaAddModule.cmake│ │ ├── VaQtSetup.cmake│ │ ├── VaFeatureGate.cmake│ │ └── VaLayeringCheck.cmake│ └── toolchains/│ └── imx8mp-aarch64-linux.cmake├── src/│ ├── core/│ │ ├── models/│ │ ├── signal/│ │ ├── protocol/│ │ └── math/│ ├── acquisition/│ │ ├── source/│ │ ├── pipeline/│ │ └── trigger/│ ├── analysis/│ │ ├── spectrum/│ │ ├── waveform/│ │ ├── tracking/│ │ └── advanced/│ ├── balancing/│ ├── storage/│ │ ├── logger/│ │ ├── database/│ │ └── export/│ ├── licensing/│ │ ├── license_manager.{h,cpp}│ │ ├── feature_registry.{h,cpp}│ │ ├── activation_dialog.{h,cpp}│ │ └── crypto/│ ├── app/│ ├── ui/│ └── main.cpp├── include/├── third_party/├── resources/├── tests/├── deploy/│ ├── systemd/│ ├── yocto/│ ├── udev/│ └── scripts/├── docs/└── tools/ ├── license_generator/ └── performance_profiler/模块职责:
| 模块 | 职责 | 依赖 |
|---|---|---|
core | 数据模型、DSP 基础、协议解析、数学工具 | 不依赖 Qt Widgets,不依赖业务模块 |
acquisition | FPGA/网络/串口/设备节点数据源、缓冲、触发 | core |
analysis | FFT、包络、阶次、FRF、ODS 等分析算法 | core |
balancing | 单面、双面、影响系数法动平衡 | core |
storage | CSV、二进制记录、SQLite、报告导出 | core |
licensing | 授权、功能注册、激活、签名验证 | core,Qt Core |
app | 控制器、会话、功能协调 | 各业务模块 |
ui | 页面、控件、对话框、主题 | app 和业务模块 |
依赖方向:
flowchart TD UI["ui"] APP["app"] ACQ["acquisition"] ANA["analysis"] BAL["balancing"] STO["storage"] LIC["licensing"] CORE["core"]
UI --> APP APP --> ACQ APP --> ANA APP --> BAL APP --> STO APP --> LIC ACQ --> CORE ANA --> CORE BAL --> CORE STO --> CORE LIC --> CORE规则:core 必须保持最干净,ui 才能依赖 Qt Widgets。算法、采集和存储模块不直接操作界面,也不互相反向调用。
8. 采集与硬件边界
跳转到“8. 采集与硬件边界”当前硬件方向是 i.MX8MP + FPGA + AD7768-4。软件边界应把数据源抽象出来,避免上位机被某一种 FPGA 通信方式锁死。
建议 acquisition/source 预留四种输入:
| 数据源 | 用途 |
|---|---|
network_source | 兼容 TCP/UDP 数据桥或实验室验证链路。 |
serial_source | 低速控制、调试或早期原型。 |
device_source | Linux /dev/xdma*、mmap 或内核驱动高速采集。 |
mock_source | 开发、测试、演示和 CI 回归。 |
采集管线应把硬件抖动隔离在缓冲层:
DataSource -> FrameParser -> RingBuffer -> ChannelRouter -> AnalysisWindow优先级:
- 先稳定 4 通道同步采集、时间戳、丢包计数和溢出状态。
- 再做实时 FFT、包络和瀑布图。
- 最后做启停机、阶次跟踪、FRF、ODS 和模态。
9. 实施路线
跳转到“9. 实施路线”原始方案在“创建 licensing 模块”处中断。补全后的实施路线如下。
Step 1:创建授权与功能门禁
跳转到“Step 1:创建授权与功能门禁”产物:
src/licensing/license_manager.{h,cpp}src/licensing/feature_registry.{h,cpp}src/app/feature_manager.{h,cpp}tests/unit/licensing/test_license_validation.cppdocs/architecture/feature_matrix.md
验收标准:
- Basic、Advanced、Professional 三档能从测试 license 加载。
- 每个 feature 能被单元测试判定可用或不可用。
- 无授权、过期授权、签名错误授权都有确定降级行为。
Step 2:建立 CMake 模块边界
跳转到“Step 2:建立 CMake 模块边界”产物:
va_coreva_acquisitionva_analysisva_balancingva_storageva_licensingva_appva_ui
验收标准:
- 各模块能单独编译。
- 依赖方向由 CMake 或 CI 检查。
core不链接 Qt Widgets。
Step 3:抽象采集数据源
跳转到“Step 3:抽象采集数据源”产物:
IDataSourceDeviceSourceMockSourceAcquisitionPipelineRingBufferBufferPool
验收标准:
- mock 数据源可稳定产生四通道数据。
- 采集线程和 UI 线程解耦。
- 采集溢出、丢包、停止、恢复都有明确状态。
Step 4:迁移基础分析能力
跳转到“Step 4:迁移基础分析能力”范围:
- 时域波形
- RMS、峰值、峰峰值、峭度、波峰因数
- FFT、窗函数、倍频识别
- 基础报警阈值
验收标准:
- Basic 版本可完成完整基础测量闭环。
- 核心算法有可重复单元测试。
- UI 只调用分析服务,不直接嵌入算法。
Step 5:加入高级版功能
跳转到“Step 5:加入高级版功能”范围:
- 四通道同步采集
- 包络分析
- 启停机分析
- 双面平衡
- SQLite 历史库
- 标准报告导出
验收标准:
- Basic 中对应按钮禁用或隐藏,并有清晰升级提示。
- Advanced 中功能可完整运行。
- 历史记录和报告与采集会话绑定。
Step 6:加入专业版功能
跳转到“Step 6:加入专业版功能”范围:
- 阶次跟踪
- 坎贝尔图
- FRF
- 相干函数
- ODS
- 模态分析接口
- MATLAB 或专业数据格式导出
验收标准:
- Professional 功能集中在
analysis/tracking和analysis/advanced。 - 需要转速输入的功能显式检查键相信号质量。
- 大计算量任务不阻塞采集线程和 UI 线程。
Step 7:完成嵌入式部署
跳转到“Step 7:完成嵌入式部署”范围:
- systemd 服务
- udev 规则
- 安装脚本
- 更新脚本
- 日志目录
- license 目录
验收标准:
- 首次开机可进入试用或激活流程。
- 软件异常退出后能保留日志和最后一次会话状态。
- 现场升级不覆盖用户数据和 license。
Step 8:建立发布与售后工具
跳转到“Step 8:建立发布与售后工具”范围:
- 内部 license 生成器
- 授权查询工具
- 版本功能矩阵文档
- 售后诊断包导出
- 性能 profiling 工具
验收标准:
- 销售能按客户生成 Basic、Advanced、Professional 授权。
- 售后能判断客户实际版本、机器码、有效期和已启用功能。
- 发布包只有一个,版本差异由授权决定。
10. 风险与约束
跳转到“10. 风险与约束”| 风险 | 影响 | 处理 |
|---|---|---|
| 授权逻辑散落在 UI 和业务代码中 | 后续维护困难,版本行为不可控 | 所有判断集中到 LicenseManager 和 FeatureManager。 |
| 高级算法过早开发 | 占用基础采集和稳定性资源 | 先打通 Basic 闭环,再加 Advanced 和 Professional。 |
| UI 与采集线程耦合 | 实时数据卡顿或丢采样 | 采集、分析、显示使用明确缓冲和异步边界。 |
| 许可证只做加密不做签名 | 容易被篡改 | 使用私钥签名、公钥验签;必要时绑定机器码。 |
| 专业功能依赖转速输入但硬件未闭环 | 阶次、启停机、坎贝尔图不可用 | 在采集层尽早定义键相信号质量指标。 |
| 直接以当前硬件写死通路 | 后续接口变化成本高 | 使用 IDataSource 隔离 FPGA、网络、串口和 mock。 |
| 只做桌面安装,不做嵌入式部署 | 现场交付不可控 | 从一开始维护 deploy/。 |
11. 当前最小可交付版本
跳转到“11. 当前最小可交付版本”建议把第一个软件里程碑定义为 Basic 闭环,而不是追求专业功能完整:
AD7768-4 / mock data-> FPGA or device source-> acquisition pipeline-> waveform + FFT-> channel selection-> single-plane balancing-> CSV export-> license check-> embedded install package这个版本可以验证最关键的产品假设:硬件采集稳定、界面可用、基础诊断闭环可交付、授权体系可运行。Advanced 和 Professional 在这个基础上逐步放大价值。
12. 最终建议
跳转到“12. 最终建议”本项目应优先做三件事:
- 先把软件分级固化为架构能力,避免后期返工。
- 先完成 Basic 可交付闭环,确保采集、显示、基础分析、导出和授权能稳定运行。
- 把 Advanced 和 Professional 做成可插拔增长层,而不是让高级功能污染基础路径。
一句话版本:工业振动分析仪上位机的正确路线是“一个软件包、三档授权、模块化架构、先基础闭环、再高级增值”。