a
This commit is contained in:
@@ -0,0 +1,242 @@
|
||||
# 任务参数配置
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
- [GeoMative.rc](file://GeoMative.rc)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件围绕任务参数配置功能进行深入文档化,重点聚焦于DialCfgTaskPacket对话框的UI组件与交互逻辑,涵盖:
|
||||
- 循环次数、时间间隔、PLC ID等参数的配置与校验规则(循环次数与时间间隔范围为1-60000)。
|
||||
- 任务选择下拉框的数据来源:通过CTaskDataOper::QueryTdBrowseInfo从数据库查询任务列表。
|
||||
- 任务包属性的存储结构:涉及tdTaskPacket与tdTaskPacketInfo两张表的关联关系。
|
||||
- 提供代码示例路径,展示OnInitDialog中初始化UI控件与OnOK中保存配置数据的具体实现。
|
||||
|
||||
## 项目结构
|
||||
任务参数配置功能位于视图层(Views)与数据操作层(Operator)之间,UI由DialCfgTaskPacket负责,数据访问由TaskDataOper封装。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "视图层"
|
||||
DCP["DialCfgTaskPacket<br/>对话框"]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
TDO["CTaskDataOper<br/>任务数据操作"]
|
||||
end
|
||||
subgraph "数据库"
|
||||
TP["tdTaskPacket<br/>主表"]
|
||||
TPI["tdTaskPacketInfo<br/>明细表"]
|
||||
TD["td<br/>任务基础表"]
|
||||
end
|
||||
DCP --> TDO
|
||||
TDO --> TD
|
||||
TDO --> TP
|
||||
TDO --> TPI
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h#L1-L54)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L1-L177)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L297-L336)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h#L1-L54)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L1-L177)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L297-L336)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
|
||||
## 核心组件
|
||||
- DialCfgTaskPacket:任务参数配置对话框,包含任务选择下拉框、任务列表、循环次数、时间间隔、PLC ID输入框及添加/删除按钮。
|
||||
- CTaskDataOper:封装数据库访问,提供任务浏览信息查询、任务包属性查询、任务包信息查询以及任务包写入等接口。
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h#L1-L54)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L297-L336)
|
||||
|
||||
## 架构总览
|
||||
DialCfgTaskPacket作为UI入口,调用CTaskDataOper完成数据库读写;数据库层面以tdTaskPacket为主表存储任务包属性(循环次数、时间间隔、PLC ID),以tdTaskPacketInfo为明细表存储任务包内任务序列(TaskID、TaskName、TaskPacketID);任务基础信息来源于td表。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant D as "DialCfgTaskPacket"
|
||||
participant O as "CTaskDataOper"
|
||||
participant DB as "数据库"
|
||||
U->>D : 打开“任务参数配置”对话框
|
||||
D->>O : QueryTdBrowseInfo(查询任务列表)
|
||||
O->>DB : SELECT td
|
||||
DB-->>O : 返回任务列表
|
||||
O-->>D : 返回任务列表
|
||||
D->>D : 初始化下拉框与列表列头
|
||||
U->>D : 输入循环次数/时间间隔/PLC ID
|
||||
U->>D : 添加任务到列表
|
||||
D->>D : 去重检查与序号更新
|
||||
U->>D : 点击“保存”
|
||||
D->>D : 参数校验(1-60000, PLC ID非空)
|
||||
D->>O : InsertTaskPacketInfo(批量写入)
|
||||
O->>DB : INSERT tdTaskPacket
|
||||
O->>DB : DELETE tdTaskPacketInfo WHERE TaskPacketID=1
|
||||
O->>DB : INSERT tdTaskPacketInfo (逐条)
|
||||
DB-->>O : 提交事务
|
||||
O-->>D : 写入成功
|
||||
D-->>U : 显示保存结果
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L123-L177)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L300)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1085-L1140)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### DialCfgTaskPacket 对话框
|
||||
- UI控件
|
||||
- 任务选择下拉框:用于选择可执行的任务项。
|
||||
- 任务列表:显示已选任务序列,包含序号、任务名、任务ID三列。
|
||||
- 按钮:添加、删除。
|
||||
- 参数输入框:循环次数、时间间隔(分钟)、PLC ID。
|
||||
- 初始化流程(OnInitDialog)
|
||||
- 查询任务列表并填充下拉框。
|
||||
- 读取任务包属性(循环次数、时间间隔、PLC ID)并回填到对应输入框。
|
||||
- 初始化任务列表列头与内容。
|
||||
- 交互逻辑
|
||||
- 添加:校验下拉框选中状态,去重检查后插入列表。
|
||||
- 删除:选中行删除,末尾行删除时需重排序号。
|
||||
- 保存:对循环次数、时间间隔进行范围校验(1-60000),对PLC ID进行非空校验;收集列表数据与参数,调用数据操作层写入数据库。
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L47-L108)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L123-L177)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L300)
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h#L1-L54)
|
||||
|
||||
### 任务选择下拉框数据来源
|
||||
- 数据源:CTaskDataOper::QueryTdBrowseInfo返回std::vector<STTdBrowseInfo>,其中包含任务名与任务ID。
|
||||
- 下拉框填充:将任务名加入组合框,同时将任务ID存入SetItemData以便后续使用。
|
||||
- 使用场景:添加任务时,根据下拉框当前选中项获取任务ID与任务名。
|
||||
|
||||
章节来源
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1013-L1083)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L297-L306)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L123-L142)
|
||||
|
||||
### 任务包属性与存储结构
|
||||
- 属性结构:STTaskPacketAttr包含循环次数、时间间隔、PLC ID三项。
|
||||
- 存储位置:
|
||||
- 主表:tdTaskPacket(主键字段MainID=1,存储循环次数、时间间隔、PLC ID)。
|
||||
- 明细表:tdTaskPacketInfo(字段TaskPacketID=1,存储每个任务的TaskID与TaskName)。
|
||||
- 写入策略:先写入tdTaskPacket,再清空tdTaskPacketInfo中TaskPacketID=1的旧记录,最后批量插入新任务序列,事务提交。
|
||||
|
||||
章节来源
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L324-L335)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
|
||||
### 参数验证规则
|
||||
- 循环次数与时间间隔:必须为整数且在1至60000之间。
|
||||
- PLC ID:必须非空。
|
||||
- 重复任务:列表中不允许出现相同任务ID。
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L258)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L110-L121)
|
||||
|
||||
### 代码示例路径
|
||||
- OnInitDialog中初始化UI控件与读取任务包属性
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L123-L177)
|
||||
- OnOK中保存配置数据
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L300)
|
||||
- 任务包写入数据库
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L123-L177)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L300)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
|
||||
## 依赖分析
|
||||
- DialCfgTaskPacket依赖CTaskDataOper进行数据库读写。
|
||||
- CTaskDataOper依赖ADO Recordset访问td、tdTaskPacket、tdTaskPacketInfo表。
|
||||
- UI资源定义在GeoMative.rc中,包含对话框控件ID与布局。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CDialCfgTaskPacket {
|
||||
+DoDataExchange(pDX)
|
||||
+OnInitDialog() bool
|
||||
+OnOK() void
|
||||
+OnButtonAdd() void
|
||||
+OnButtonDel() void
|
||||
-InitialTaskList() void
|
||||
-IsRepeatTask(iTaskID) bool
|
||||
-m_listTaskPacket
|
||||
-m_cmbTaskName
|
||||
}
|
||||
class CTaskDataOper {
|
||||
+QueryTdBrowseInfo(vt, bIsQueryTimerTd) void
|
||||
+QueryTdBrowseInfo(vt, iSptType, iType, bIsQueryTimerTd) void
|
||||
+QueryTaskPacketAttr(iLoopTime, iInterval, strPlcID) bool
|
||||
+QueryTaskPacketInfo(vt) bool
|
||||
+InsertTaskPacketInfo(vt, stAttr) bool
|
||||
}
|
||||
CDialCfgTaskPacket --> CTaskDataOper : "调用"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h#L1-L54)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L297-L336)
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h#L1-L54)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L297-L336)
|
||||
|
||||
## 性能考虑
|
||||
- 列表操作:删除末尾行时避免重排所有序号,仅在需要时更新后续行序号,降低O(n)更新成本。
|
||||
- 数据库写入:批量插入tdTaskPacketInfo,减少多次往返;使用事务保证一致性。
|
||||
- UI输入限制:对PLC ID设置最大长度,减少无效输入带来的处理开销。
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L81-L108)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L158-L160)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
|
||||
## 故障排查指南
|
||||
- 无法加载任务列表
|
||||
- 检查CTaskDataOper::QueryTdBrowseInfo是否抛出异常或返回空集。
|
||||
- 确认数据库连接正常,td表存在且包含有效记录。
|
||||
- 保存失败
|
||||
- 检查InsertTaskPacketInfo返回值与事务回滚日志。
|
||||
- 确认循环次数、时间间隔、PLC ID均满足校验条件。
|
||||
- 重复任务
|
||||
- 确认IsRepeatTask逻辑正确,列表中不存在相同TaskID。
|
||||
- UI无响应
|
||||
- 检查消息映射与控件ID是否匹配(见资源定义)。
|
||||
|
||||
章节来源
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1013-L1083)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L300)
|
||||
|
||||
## 结论
|
||||
DialCfgTaskPacket通过CTaskDataOper实现了任务参数配置的完整闭环:从任务列表加载、参数输入与校验,到任务包属性与任务序列的持久化存储。其设计遵循清晰的职责分离与事务一致性保障,适合在实际工程中扩展与维护。
|
||||
|
||||
## 附录
|
||||
- 控件ID与资源定义参考
|
||||
- [GeoMative.rc](file://GeoMative.rc#L1925-L1941)
|
||||
Reference in New Issue
Block a user