24 KiB
QtUI 韩国 喷码机项目架构说明文档
版本: V6.7.5
目标平台: ARM Linux (全志H618) / x86 (模拟调试)
Qt 版本: Qt 5.x (ARM) / Qt 5.x (x86)
屏幕分辨率: 800x600
文档最后更新日期: 2026-07-23
目录
1. 项目概述
本项目是一个工业喷码机(CIJ,Continuous Ink Jet)的上位机控制系统,运行在嵌入式ARM Linux平台上。软件通过串口与FPGA和STM32两块下位机硬件通信,实现喷码内容的编辑、预览、打印控制、设备状态监控、系统参数管理等功能。
核心功能
- 喷码内容编辑: 支持文本、日期、计数器、图片、条形码(一维码)、二维码(QR/DataMatrix)等图元
- 打印控制: 支持时延触发、电眼触发、同步器触发、电眼+同步器等多种触发模式
- 设备管理: 墨路控制(阀门、泵、加热器)、粘度检测、相位检测、高压控制
- 系统管理: 参数配置、FPGA/STM32固件升级、软件更新、日志管理
- 文件管理: 作业文件的创建、保存、导入、导出(U盘)
- RFID刷卡: 墨水/溶剂/保养卡的身份验证与消耗管理
2. 技术栈
| 类别 | 技术 |
|---|---|
| 框架 | Qt 5.x (ARM) / Qt 5.x (x86) |
| 语言 | C++ (C++11),部分C |
| 构建工具 | qmake |
| UI设计 | Qt Designer (.ui文件) |
| 序列化 | XML (作业文件) |
| 通信 | QSerialPort (RS232/RS485) |
| 网络 | Qt Network (WiFi) |
| 条码生成 | C语言库 (BarCode目录) |
| 二维码生成 | C语言库 (QtQREnCode目录) |
| DataMatrix | C++库 (Matrix目录) |
| Modbus | 开源FreeModbus库 |
| 加密 | SM3/SM4 国密算法 |
| 日志 | 自定义Logger框架 |
3. 整体架构
项目采用分层架构,自上而下分为:
┌─────────────────────────────────────────────────────────┐
│ UI 表现层 │
│ InkJetPrinter (主窗口) + MainWidget (打印主界面) │
│ 各功能页面: SystemManage, SystemSetting, LogInfo, ... │
│ 场景编辑器: TestPrintWidget, PicScene │
├─────────────────────────────────────────────────────────┤
│ 业务逻辑层 │
│ SysPara (系统参数管理) │
│ DevOp (设备操作) │
│ RunTimeCtrl (运行时间统计) │
│ RFIDManager (刷卡管理) │
├─────────────────────────────────────────────────────────┤
│ 通信层 │
│ Serial (串口通信封装) │
│ Modbus (Modbus协议) │
├─────────────────────────────────────────────────────────┤
│ 硬件抽象层 │
│ FPGA (喷印控制、充电电压、相位检测) │
│ STM32 (墨路控制、传感器采集) │
│ RFID读卡器 (IC卡读写) │
└─────────────────────────────────────────────────────────┘
模块依赖关系图
InkJetPrinter (顶层窗口)
├── MainWidget (打印主界面)
│ ├── generatePrintContent (打印文件载入预览)
│ ├── FileManageWidget (文件管理)
│ ├── PrintTextDisplay (打印预览)
| └── 其他
├── TestPrintWidget (编辑界面)
│ ├── PicScene (场景内容容器)
│ ├── ItemEditor (文本图元编辑)
│ ├── ImageLoader (图片图元加载)
│ ├── BarcodeEditor (条码图元编辑)
| ├── DateVarSet (日期变量设置)
│ ├── CounterVarSet (计数器图元设置)
| └── ScheduleShiftsEditor (班次编辑)
├── SystemManage (系统管理)
├── SystemSetting (系统设置)
├── SystemUpdate (系统升级)
├── PrintSetting (打印设置)
├── MainInstruction (主指令)
├── LogInfo (日志信息)
├── OtherInfo (其他信息)
└── DialogFileOperation (打印文件选择操作)
SysPara (系统参数,贯穿所有模块)
Serial (串口通信,连接FPGA和STM32)
RFIDManager (RFID刷卡管理)
RunTimeCtrl (运行时间控制)
4. 目录结构
项目根目录/
├── QtUI.pro # 项目文件 (qmake)
├── main.cpp # 程序入口
├── mainwidget.h/cpp # 打印主界面 (MainWidget)
├── InkJetPrinter.h/cpp # 顶层主窗口
├── Public.h/cpp # 公共工具类
├── SysPara.h/cpp # 系统参数管理 (核心)
├── DevOp.h/cpp # 设备操作 (FPGA寄存器读写)
├── myinclude.h # 全局宏定义、枚举
├── VerBVersion.h # 版本号定义
├── dump.h/cpp # 崩溃信号处理
├── runtimectrl.h/cpp # 运行时间统计
│
├── scene/ # 场景(喷码内容)编辑系统
│ ├── picscene.h/cpp # 场景类 (QGraphicsScene)
│ ├── myview.h/cpp # 视图类 (QGraphicsView)
│ ├── PicSceneLoader.h/cpp # 场景XML加载/保存
│ ├── pictextitem.h/cpp # 文本图元
│ ├── PicDateItem.h/cpp # 日期图元
│ ├── PicImageItem.h/cpp # 图片图元
│ ├── PicCounterItem.h/cpp # 计数器图元
│ ├── PicScheduleShiftItem.h/cpp # 班次图元
│ ├── piccodeitem.h/cpp # 条码/二维码图元
│ ├── ViewModels.h/cpp # 视图模型 (数据结构)
│ ├── ItemCommon.h/cpp # 图元工具函数
│ ├── ItemGeneralSettings.* # 图元通用设置
│ ├── BarcodeEditor.* # 条码编辑器
│ ├── CounterEditor.* # 计数器编辑器
│ ├── DateFormatEditor.* # 日期格式编辑器
│ ├── DateReplaceEditor.* # 日期替换编辑器
│ ├── ScheduleShiftsEditor.* # 班次编辑器
│ ├── DlgBarcodeFormat.* # 条码格式对话框
│ └── DlgQrcodeFormat.* # 二维码格式对话框
│
├── rfid/ # RFID刷卡模块
│ ├── rfidmanager.h/cpp # 刷卡管理核心
│ ├── rfidfunction.h/cpp # 刷卡功能函数
│ ├── sm3.h/cpp # SM3 国密哈希
│ └── sm4.h/cpp # SM4 国密加密
│
├── Serial/ # 串口通信封装
│ └── serial.h/cpp # 串口封装 (FPGA/STM32双通道)
│
├── fileManage/ # 文件管理
│ ├── FileManageWidget.* # 文件管理界面
│ └── UDiskComboBox.* # U盘检测与文件列表
│
├── modbus/ # Modbus协议
│ ├── modbus/ # FreeModbus库
│ ├── port/ # 移植层
│ ├── modbusserial.* # Modbus串口
│ └── modbustcp.* # Modbus TCP
│
├── Log/ # 日志框架
│ ├── logger.h/cpp # 日志基类
│ ├── filelogger.h/cpp # 文件日志
│ ├── logmessage.h/cpp # 日志消息
│ └── logglobal.h # 日志全局宏
│
├── BarCode/ # 一维条码生成库 (C)
│ ├── barcode.h # 条码头文件
│ ├── code128.c/code39.c/ # 各类型条码实现
│ └── ...
│
├── QtQREnCode/ # 二维码生成库 (C)
│ ├── qrencode.h/c # QR码生成
│ └── ...
│
├── Matrix/ # DataMatrix码生成库 (C++)
│ ├── dm200.cpp # DataMatrix实现
│ └── ...
│
├── image.qrc # Qt资源文件
├── *.ts # 多语言翻译文件
│
├── 0/ ~ 101/ # 字库图片资源 (计数器图元 数字占位图)
│ └── image/
│ └── digitalWidth*.bmp
│
└── conf/ # 运行时配置目录 (部署后)
├── sysPara.bin # 系统参数二进制文件
├── config.ini # 日志配置
└── ...
5. 核心模块详解
5.1 程序入口 (main.cpp)
程序启动流程:
- 读取键盘类型配置(多语言键盘/普通键盘)
- 创建 QApplication,配置日志系统 (FileLogger)
- 加载字体和应用级样式
- 根据语言配置加载对应翻译文件 (.qm)
- 创建 MyInputMethod(自定义输入法)
- 创建 InkJetPrinter 主窗口并显示
5.2 主窗口 (InkJetPrinter)
InkJetPrinter.h | InkJetPrinter.cpp
职责: 顶层窗口,管理所有子页面和核心业务流程。
关键成员:
m_StackedWidget- 页面容器,通过索引切换不同功能页面m_MainWidget- 打印主界面(首页)m_TestPrintWidget- 编辑界面serialFPGA/serialSTM32- 两个独立串口线程,分别与FPGA和STM32通信ctrl_runTime- 运行时间控制器manager_rfid- RFID刷卡管理器
核心定时器:
m_Timer- 主定时器 (10ms),处理设备状态轮询、自动控制viscosity_timer- 粘度检测定时器 (1s)
设备自动控制:
autoControlValvePump()- 阀门/泵自动控制pressureAdj()- 压力自动调节(PID算法)autoControlHeater()- 加热器自动控制detectAndcontrolReclaimTank()- 回收槽检测与控制
5.3 打印主界面 (MainWidget)
职责: 打印操作的主界面,包含打印预览、打印控制、文件管理。
关键功能:
generatePrintContent()- 将场景渲染为打印数据并写入缓冲区待发送至FPGAonPreviewScene- 场景数据转为FPGA点阵数据,解析场景内容生成计数器字模及其它控制信息variableItemsUpdate()- 更新动态图元(日期、轮班、条形码/二维码等)并写入缓冲区SendPrintDataToFpga()- 通过串口向FPGA发送打印内容数据
页面切换:
- 通过底部导航按钮(编辑、新增、主界面、管理、消息)切换子页面
- 使用信号槽
sendButtonClickedSignal(int)通知 InkJetPrinter 切换页面
5.4 系统参数管理 (SysPara)
职责: 管理所有系统参数,是系统的数据中枢。所有模块通过 SysPara 读写参数。
核心数据结构:
calandar_and_dat_t- 日历/计数器数据(发送给FPGA)sysPara_t- 系统参数设定sysStatus_t- 系统状态结构体vars_t- 变量类型参数设定stepPrint_t- 分段打印设定alterPrint_t- 交替打印设定Cnt1ByGroup_t- 分段计米设定PrintSettingModel- 打印设置模型(跟随作业文件保存)voltePara_t- 旧的 FPGA 墨点充电参数集结构体,用于 67 版本 FPGAvoltePara_t_25Dots- 目前常用的 72 版本 FPGA 所对应的墨点充电数据集结构voltePara_t_No73- 96K 40um 喷嘴专用的FPGA墨点充电数据集结构体,专用于73版本(F8.2.1)
参数持久化:
- 二进制文件:
PARA_ROOT_DIR/sysPara.bin- 对于系统参数的直接二进制保存 - XML文件:
PARA_ROOT_DIR/defPrintSet.xml- 默认打印设置保存,新建文件时使用此配置,此配置也可通过MainInstruction 打开默认打印设置的设置窗口(实际是复用PrintSetting窗口)。
5.5 设备操作 (DevOp)
职责: 封装FPGA寄存器的读写操作,提供设备控制的高层接口。
关键操作:
- 阀门控制:
controlInkValve(),controlMixValve(),controlReleaseValve() - 泵控制:
WriteMoterPump() - 电压控制: DAC表读写 (
DAC_TABLE_ADDR,MATCH_*_DAC_TABLE_ADDR) - 打印控制: 启停、回收槽开关、故障恢复
- 计数器读写: 产品计数、同步计数
FPGA地址空间: 通信地址与定义位于连续墨点喷码机通信协议,大致内存分布如下
0x0000-0x01FF: 状态读取区0xA400-0xA5FF: 打印控制寄存器0xB000-0xCFFF: 数据写入区(DAC表、打印数据、日历数据等)0xE000-0xFFFF: 数字字符点阵数据
5.6 串口通信 (Serial)
Serial/serial.h | Serial/serial.cpp
职责: 封装与FPGA和STM32的串口通信。
设计特点:
- 支持双通道(FPGA和STM32各自独立串口)
- 使用消息队列管理发送数据
- CRC16校验保证数据完整性
- 支持STM32固件升级(IAP协议)
- 运行在独立QThread中,不阻塞UI
通信协议:
- 自定义帧格式:命令 + 地址 + 数据 + CRC16
- 发送队列:
queueFPGA/queue - 接收解析: 通过信号槽分发到上层(
receivedFromFPGA/receivedFromSTM32)
5.7 日志系统 (Log)
职责: 提供分级日志记录功能。
类层次:
Logger- 日志基类,定义日志格式、级别过滤FileLogger- 文件日志实现,支持缓冲区批量写入LogMessage- 日志消息封装
使用方式:
qInfo() << "message"; // 信息日志
qWarning() << "warning"; // 警告日志
qCritical() << "error"; // 错误日志
5.8 运行时间统计 (RunTimeCtrl)
职责: 统计软件运行时长,用于设备保养提醒。
功能:
getElapsedSeconds()- 获取本次运行时间getTotalSeconds()- 获取总运行时间sig_alertTimeout()- 保养提醒信号sig_updateTimeoutDay()- 维护到期提醒
6. 数据流与通信机制
6.1 打印数据流
用户编辑场景 (PicScene)
└── 图元 (PicTextItem, PicDateItem, PicCodeItem, ...)
└── 渲染为 QImage
└── imageToPrintData() 转换为点阵数据
└── SendPrintDataToFpga() 通过 Serial 发送
└── FPGA 接收并驱动喷头喷印
6.2 设备状态轮询
timerHandler()
├── serialFPGA->readData() # 读取FPGA状态寄存器
├── serialSTM32->readData() # 读取STM32传感器数据
├── saveFPGAStatus() # 解析FPGA状态
│ ├── 墨线开关、高压状态、回收故障
│ ├── 墨水/溶剂液位警告
│ └── 相位检测结果
├── saveSTM32Status() # 解析STM32状态
│ ├── 齿轮泵转速
│ ├── 脉冲计数
│ └── 压力/粘度值
├── MainWidget::updateSysStatusToUI() # 更新界面状态灯
└── autoControlValvePump() # 自动控制执行
6.3 信号槽通信概览
Serial::receivedFromFPGA ──→ InkJetPrinter::saveFPGAStatus()
Serial::receivedFromSTM32 ──→ InkJetPrinter::saveSTM32Status()
MainWidget::sendButtonClickedSignal ──→ InkJetPrinter::getMainWidgetButtonClickedSlot()
TestPrintWidget::sendButtonClickedSignal ──→ InkJetPrinter::getTestPrintWidgetButtonClickedSlot()
RunTimeCtrl::sig_alertTimeout ──→ InkJetPrinter::slt_warningMaintenance()
RFIDManager::sig_showMsg ──→ InkJetPrinter::slt_showMsg()
7. 场景与打印渲染系统
7.1 架构概述
场景系统基于 Qt Graphics View 框架,用于编辑和预览喷码内容。
PicScene (QGraphicsScene) # 场景,管理所有图元
└── myView (QGraphicsView) # 视图,提供缩放和交互
└── 图元基类
├── PicTextItem # 普通文本
├── PicDateItem # 日期变量 (yyyy-MM-dd HH:mm:ss...)
├── PicCounterItem # 计数器 (可变数字)
├── PicImageItem # 图片 (Logo)
├── PicCodeItem # 条码/二维码
└── PicScheduleShiftItem # 班次 (班次代码替换)
7.2 作业文件格式
作业文件使用XML格式(VBfiles结构),保存场景内容和打印设置:
<VBfiles>
<VBfile>
<!-- 打印设置 -->
<PrintSettings triggerMode="0" ... />
<!-- 文本图元 -->
<VB itemType="text" x="10" y="20" text="ABC" ... />
<!-- 日期图元 -->
<VB itemType="date" x="50" y="20" pattern="yyyy-MM-dd" ... />
<!-- 计数器图元 -->
<VB itemType="counter" x="100" y="20" counterType="7" ... />
<!-- 条码/二维码图元 -->
<VB itemType="code" x="10" y="50" codeType="QR" ... />
<!-- 图片图元 -->
<VB itemType="image" x="200" y="0" ... />
</VBfile>
</VBfiles>
7.3 关键类说明
- PicSceneLoader - 场景文件的加载/保存/预览,负责XML序列化/反序列化
- ViewModels - 定义
DateItemModel、CounterViewModel等视图模型,用于编辑器与图元之间的数据传递 - ItemCommon - 图元工具函数,如根据日期模型生成文本字符串
- ItemEditor - 图元通用编辑器(字体、颜色、位置等)
- 打印设置 -
PrintSettingModel与作业文件绑定,包含触发模式、字宽、同步器参数等
8. RFID刷卡模块
8.1 模块概述
职责: 管理IC卡(墨水卡、溶剂卡、保养卡)的读写与验证。
功能:
- 墨水/溶剂添加验证(刷卡 + 物理添加)
- 保养卡识别与提醒
- 自动扣减卡内余额
- 卡片使用标记(防重复使用)
加密: 使用SM3(哈希)+ SM4(对称加密)国密算法保护卡片数据。
8.2 刷卡流程
检测到墨水/溶剂不足
└── 弹出刷卡提示对话框
└── 用户刷卡
├── RFIDManager 读取卡片数据
├── 验证卡片类型和有效性
├── 标记卡片为已使用
└── 通知 InkJetPrinter 更新报警状态
9. 编译构建系统
9.1 编译配置
项目使用 qmake 构建系统,主配置文件为 QtUI.pro。
目标平台:
- ARM Linux:
TARGET = QtUI - 交叉编译: 使用
linux-arm-g++mkspec - x86桌面: 使用
linux-g++mkspec,用于开发调试
9.2 模块依赖
QT += core gui network serialport virtualkeyboard sql xml
9.3 编译命令
# ARM交叉编译
qmake -spec /usr/local/Trolltech/QtEmbedded-4.6.3-arm/mkspecs/qws/linux-arm-g++ \
"DEFINES+=ARM" "DEFINES+=QTV3" "DEFINES+=VNLG"
# x86桌面编译(调试)
qmake "DEFINES+=X86TEST"
make
10. 关键配置与宏定义
10.1 全局宏 (myinclude.h)
| 宏 | 说明 |
|---|---|
__RFID_CARD |
启用刷卡功能 |
__RFID_OLD |
旧加密算法 |
__RFID_IND |
印度二次加密 |
MULTILANGUAGE |
多语言输入法 |
EnableArabic |
阿拉伯语支持 |
EnableBangla |
孟加拉语支持 |
TEST_MODE |
测试模式 |
SIMULATE_PRINTING_MODE |
模拟打印模式 |
10.2 路径定义 (SysPara.h)
| 路径宏 | 值 | 说明 |
|---|---|---|
PARA_ROOT_DIR |
/home/plg/conf/ |
系统参数目录 |
DOC_ROOT_DIR |
/home/plg/doc/ |
作业文件目录 |
SYS_ROOT_DIR |
/home/plg/ |
系统根目录 |
UDISK_DOC_ROOT_DIR |
/udisk/doc/ |
U盘文档目录 |
10.3 版本号 (VerBVersion.h)
#define UP_PRINTER_MAJOR_VER 6
#define UP_PRINTER_MINOR_VER 7
#define UP_PRINTER_RIVISION_VER 4
#define SUB_VERSION "_KOR"
11. 上手指南
11.1 开发环境搭建
- 安装Qt: 推荐 Qt 5.12+ 用于桌面开发调试
- 获取代码: 通过SVN或Git获取项目源码
- 编译运行:
cd 项目目录 qmake make ./QtUI - 注意事项: x86桌面版仅用于UI调试,硬件相关功能(串口、FPGA通信)不可用
11.2 代码阅读顺序建议
- 入门: main.cpp → myinclude.h → InkJetPrinter.h
- 核心数据: SysPara.h → DevOp.h
- UI页面: MainWidget → TestPrintWidget
- 场景系统: scene/picscene.h → scene/PicSceneLoader.h → scene/ItemCommon.h
- 通信层: Serial/serial.h
- RFID: rfid/rfidmanager.h
11.3 常见开发任务
| 任务 | 涉及文件 | 说明 |
|---|---|---|
| 添加新图元类型 | scene/ 目录 |
继承 PicTextItem,实现渲染和序列化 |
| 修改打印设置 | Printsetting.h/cpp |
修改 PrintSettingModel 结构体 |
| 添加新语言 | *.ts 文件 |
使用 Qt Linguist 编辑翻译 |
| 修改FPGA通信 | DevOp.h/cpp + Serial/ |
注意地址空间分配和CRC校验 |
| 修改UI样式 | .ui 文件 |
使用 Qt Designer 编辑 |
| 添加新功能页面 | 仿照现有页面模式 | 创建 .h/.cpp/.ui 三件套 |
11.4 关键设计模式
- 单例模式:
RFIDManager,RunTimeCtrl,LogInfoCtrl使用单例 - 观察者模式: 大量使用Qt信号槽进行模块间通信
- 策略模式: 打印触发模式(时延/电眼/同步器)通过枚举切换
- MVC变体: 场景系统使用 ViewModel (
ViewModels.h) 解耦编辑器与图元
11.5 调试技巧
- 日志: 使用
qInfo()/qWarning()/qCritical()输出,日志文件位于/home/plg/conf/ - 崩溃分析:
dump.h/cpp安装了信号处理器,崩溃时会生成core dump - FPGA调试: 可通过
SystemManage界面手动控制阀门和泵 - 模拟模式: 设置
SIMULATE_PRINTING_MODE 1可在无硬件环境调试打印逻辑
11.6 注意事项
- 不要直接操作硬件寄存器: 必须通过
DevOp类进行设备操作 - 参数持久化: 修改系统参数后需调用
SysPara的保存方法 - 线程安全: 串口通信在独立线程中,注意跨线程信号槽的连接方式
- 版本兼容: 注意
#ifdef条件编译宏,不同客户可能有不同的功能组合 - UI文件: 项目使用
.ui文件定义界面,编译时通过uic生成ui_*.h文件 - 编码: 所有源文件使用 UTF-8 编码,字符串使用
QString::fromUtf8()或tr()
文档维护: 本文档应随项目迭代持续更新。如有疑问,请联系项目负责人。
文档更新记录
- 2026-07-23: 创建此文档 — 卜永仕