跳转到内容
新建笔记

工业振动分析仪上位机软件分级与架构方案

工业振动分析仪上位机必须把软件分级作为产品架构的一等能力,而不是后期销售包装。建议采用:

单一安装包 / 单一可执行文件
+ 运行时许可证控制
+ 功能模块自注册
+ 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 层的小开关,而是商业模式、架构边界和发布流程共同决定的产品能力。

建议初始定义三档:

版本目标客户产品定位
基础版 Basic设备巡检、维修班组、教育和低预算客户快速上手,覆盖基础测振、FFT、单面平衡和 CSV 导出。
高级版 Advanced工厂设备管理、现场服务、常规故障诊断多通道同步采集、包络、启停机、双面平衡、历史数据库和报告。
专业版 Professional第三方检测、研发测试、旋转机械专家阶次跟踪、FRF、ODS、模态、相干分析、高级导出和高通道扩展。

功能矩阵:

功能基础版高级版专业版
采集通道数1-244-8
最高采样率25.6 kHz102.4 kHz102.4 kHz 或硬件允许上限
时域波形、RMS、峰值、峭度支持支持支持
FFT、倍频识别、基础频谱支持支持支持
包络分析不支持支持支持
瀑布图不支持支持支持
启停机分析不支持支持支持
单面动平衡支持支持支持
双面动平衡不支持支持支持
影响系数法平衡不支持可选支持
阶次跟踪不支持不支持支持
FRF、相干函数不支持不支持支持
ODS、模态分析不支持不支持支持
CSV 导出支持支持支持
SQLite 历史库不支持支持支持
PDF 报告基础模板标准模板高级模板
MATLAB 或专业数据导出不支持不支持支持

价格和授权策略应围绕 Advanced 设计,因为它最可能成为主销版本。Basic 用于降低入口门槛,Professional 用于拉高上限。

不要使用代码分支式分级:

if (license == PROFESSIONAL) {
runModalAnalysis();
}

这种写法如果散落在业务代码、UI 代码和算法代码中,会导致版本逻辑无法审计,也会让每次改功能都必须人工搜索所有条件分支。

也不要发布三套二进制:

VibrationAnalyzer_Basic.exe
VibrationAnalyzer_Advanced.exe
VibrationAnalyzer_Professional.exe

多二进制会放大发布、升级、售后和现场安装成本。客户装错版本后需要重新安装,代理商也很难维护统一交付流程。

正确做法是单二进制加运行时许可证控制:

  1. 所有功能进入同一套源码和同一个发布包。
  2. 每个功能声明自己需要的最低版本或 feature flag。
  3. 启动时由 LicenseManager 读取授权,计算当前可用功能。
  4. FeatureRegistry 通知业务模块启用或禁用功能。
  5. FeatureManager 负责 UI、菜单、工作流和升级提示。
  6. 授权变化时支持重新加载,避免重装软件。

运行时关系:

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"
}

重点是签名验证,而不是简单加密。加密只能降低可读性,签名才能判断授权内容是否被篡改。

建议先定义稳定的授权接口:

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 判断逻辑。

建议的上位机目录:

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,不依赖业务模块
acquisitionFPGA/网络/串口/设备节点数据源、缓冲、触发core
analysisFFT、包络、阶次、FRF、ODS 等分析算法core
balancing单面、双面、影响系数法动平衡core
storageCSV、二进制记录、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。算法、采集和存储模块不直接操作界面,也不互相反向调用。

当前硬件方向是 i.MX8MP + FPGA + AD7768-4。软件边界应把数据源抽象出来,避免上位机被某一种 FPGA 通信方式锁死。

建议 acquisition/source 预留四种输入:

数据源用途
network_source兼容 TCP/UDP 数据桥或实验室验证链路。
serial_source低速控制、调试或早期原型。
device_sourceLinux /dev/xdma*、mmap 或内核驱动高速采集。
mock_source开发、测试、演示和 CI 回归。

采集管线应把硬件抖动隔离在缓冲层:

DataSource -> FrameParser -> RingBuffer -> ChannelRouter -> AnalysisWindow

优先级:

  1. 先稳定 4 通道同步采集、时间戳、丢包计数和溢出状态。
  2. 再做实时 FFT、包络和瀑布图。
  3. 最后做启停机、阶次跟踪、FRF、ODS 和模态。

原始方案在“创建 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.cpp
  • docs/architecture/feature_matrix.md

验收标准:

  • Basic、Advanced、Professional 三档能从测试 license 加载。
  • 每个 feature 能被单元测试判定可用或不可用。
  • 无授权、过期授权、签名错误授权都有确定降级行为。

Step 2:建立 CMake 模块边界

跳转到“Step 2:建立 CMake 模块边界”

产物:

  • va_core
  • va_acquisition
  • va_analysis
  • va_balancing
  • va_storage
  • va_licensing
  • va_app
  • va_ui

验收标准:

  • 各模块能单独编译。
  • 依赖方向由 CMake 或 CI 检查。
  • core 不链接 Qt Widgets。

Step 3:抽象采集数据源

跳转到“Step 3:抽象采集数据源”

产物:

  • IDataSource
  • DeviceSource
  • MockSource
  • AcquisitionPipeline
  • RingBuffer
  • BufferPool

验收标准:

  • 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 授权。
  • 售后能判断客户实际版本、机器码、有效期和已启用功能。
  • 发布包只有一个,版本差异由授权决定。
风险影响处理
授权逻辑散落在 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 在这个基础上逐步放大价值。

本项目应优先做三件事:

  1. 先把软件分级固化为架构能力,避免后期返工。
  2. 先完成 Basic 可交付闭环,确保采集、显示、基础分析、导出和授权能稳定运行。
  3. 把 Advanced 和 Professional 做成可插拔增长层,而不是让高级功能污染基础路径。

一句话版本:工业振动分析仪上位机的正确路线是“一个软件包、三档授权、模块化架构、先基础闭环、再高级增值”。