基于图莫斯的CAN UDS升级上位机-LabVIEW版本(十一):LogManager.vi — 日志管理

1. 引言

在UDS刷写上位机中,日志管理是一个看似简单却至关重要的模块。它记录着整个刷写过程中每一次CAN报文的收发细节,是故障排查、流程审计和数据分析的核心依据。

在开发调试阶段,日志帮助我们快速定位协议交互中的异常;在生产环境中,日志记录了每一次固件升级的完整过程,为质量追溯提供证据。可以说,没有日志的刷写工具是不完整的

LogManager.vi 正是为了解决这一问题而设计的。它独立于UDS协议栈之外,通过功能全局变量(FGV) 模式管理日志文件的生命周期,提供简洁的"打开-写入-关闭"接口,让主VI可以无感知地记录所有诊断通信。

本文将详细介绍日志管理子VI的设计思路、功能全局变量实现、文件操作细节以及在刷写流程中的集成方式。


2. 子VI功能概述

2.1 设计目标

  • 提供Open/Write/Close三个命令,管理日志文件的打开、写入和关闭

  • 自动在指定目录(默认VI所在路径下的LOG文件夹)创建以时间戳命名的日志文件

  • 支持记录发送(TX)和接收(RX)数据,包含时间戳(精确到毫秒)

  • 数据以十六进制格式显示,便于阅读

  • 使用非重入功能全局变量,确保多次调用共享同一个文件句柄

  • 自动检测文件句柄有效性,若文件未打开则自动创建

  • 提供错误反馈,便于调试

2.2 输入参数

控件 类型 说明
命令 枚举(Open/Write/Close) 控制日志操作类型
数据方向 枚举(TX/RX) 仅在Write命令时有效,标识发送或接收
数据 U8数组 要记录的字节数据(Write命令时有效)
数据长度 I32 数据的有效字节数(可选,可用数组大小自动获取)

2.3 输出参数

控件 类型 说明
错误信息 字符串 操作失败时的错误描述
状态 布尔(可选) True表示操作成功

注意 :本子VI不调用TOOMOSS_SendAndWaitResp,仅负责文件I/O操作,与CAN通信无关。


3. 前面板设计

实际使用中,该子VI通常作为"函数"被调用,前面板可隐藏。


4. 程序框图设计

4.1 整体框架:功能全局变量(FGV)

LogManager.vi采用功能全局变量(Functional Global Variable, FGV) 模式,其核心特征:

  • 非重入执行:VI属性设置为"非重入执行",确保所有调用共享同一个移位寄存器

  • While循环 :循环条件接真常量(只执行一次),用于存放移位寄存器状态

  • 移位寄存器:保存文件引用(Refnum),在多次调用间持久存在

  • 条件结构:根据命令(Open/Write/Close)执行不同分支

这种模式的优点是数据封装、线程安全,且调用接口清晰。

4.2 各命令分支详解

4.2.1 Open命令

功能:创建或打开日志文件(如果文件已打开则忽略)。

执行流程

  1. 从移位寄存器读取当前文件引用

  2. 使用"非数字/路径/引用句柄?"判断引用是否有效

  3. 如果无效,则创建新日志文件:

    • 获取VI路径,去除文件名得到目录

    • 创建LOG子文件夹(若不存在)

    • 生成时间戳文件名:uds_upgrade_YYYY-MM-DD_HH-MM-SS.txt

    • 使用"打开/创建/替换文件"创建文件(模式:创建或替换,操作:打开)

    • 将新引用存入移位寄存器

  4. 如果已有效,则直接透传引用

4.2.2 Write命令

功能:将一条日志行追加到文件末尾。

执行流程

  1. 从移位寄存器读取文件引用

  2. 检查引用是否有效,若无效则自动调用Open逻辑创建文件

  3. 获取当前系统时间,格式化为 HH:MM:SS.zzz(时:分:秒.毫秒)

  4. 将数据数组转换为十六进制字符串(使用"数组至电子表格字符串转换",分隔符为空格)

  5. 根据数据方向(TX/RX)选择标识符

  6. 组合日志行:时间 [TX/RX] 数据: 十六进制

  7. 使用"写入文本文件"追加写入(偏移量设为"结束")

  8. 将文件引用透传回移位寄存器

日志行示例

复制代码
14:30:25.123 [TX] 数据: 2B 1A 03 FF
14:30:25.456 [RX] 数据: 7F 10 11
4.2.3 Close命令

功能:关闭日志文件,释放文件引用。

执行流程

  1. 从移位寄存器读取文件引用

  2. 检查引用是否有效

  3. 如果有效,调用"关闭文件"函数关闭该引用

  4. 将移位寄存器重置为"无效文件引用常量"

  5. 返回错误信息(如有)


5. 关键实现细节

5.1 毫秒级时间戳获取

使用"格式化日期/时间字符串"函数,格式字符串设为 "%H:%M:%S.%3u",其中 %3u 输出3位毫秒。输入时间源为"获取日期/时间(秒)"(该函数返回包含小数秒的浮点数)。

5.2 数据转十六进制字符串

使用"数组至电子表格字符串转换"函数,将U8数组转换为由空格分隔的十六进制字符串。设置"格式字符串"为 "%x"(十六进制小写)或 "%X"(大写),分隔符为空格。

5.3 文件路径生成

  • 基础路径:使用"当前VI路径" + "条带路径"获取VI所在目录

  • 子文件夹 :使用"组合路径"拼接 LOG

  • 文件名 :使用"格式化日期/时间字符串"生成 Log_YYYY-MM-DD_HH-MM-SS.txt

  • 完整路径:组合子文件夹和文件名

5.4 错误处理

  • 所有文件操作均连接错误簇,在分支末尾使用"错误至字符串"转换为可读信息输出

  • 如果文件操作失败(如磁盘满、路径无效),错误信息会传递给调用者


6. 在刷写流程中的集成

6.1 初始化阶段

Main.vi启动或设备打开后,调用LogManager.vi执行Open命令,创建日志文件。

6.2 通信过程中

每次调用TOOMOSS_SendAndWaitResp.vi发送请求或接收响应后,立即调用LogManager.viWrite命令,将发送和接收的数据分别记录。

示例(发送后):

labview

复制代码
[发送数据] → [LogManager.vi (Write, TX)]

示例(接收后):

labview

复制代码
[响应数据] → [LogManager.vi (Write, RX)]

6.3 结束阶段

在刷写完成或关闭设备时,调用LogManager.vi执行Close命令,关闭日志文件。

6.4 注意事项

  • 日志文件大小:若刷写过程较长(例如下载数MB固件),日志文件可能较大。建议定期清理或按日期分割。

  • 性能影响:每次写入文件会涉及磁盘I/O,可能轻微影响刷写速度。如果对实时性要求极高,可考虑使用队列异步写入,但本设计在大多数场景下性能足够。


7. 典型调用示例(伪代码)

labview

复制代码
// 主VI启动时
LogManager.vi (Open) → 创建日志文件

// 发送10 03请求
[构建请求数据] → TOOMOSS_SendAndWaitResp.vi → [响应]
                   │
                   └→ LogManager.vi (Write, TX, 请求数据)
                                     (Write, RX, 响应数据)

// ... 循环通信 ...

// 刷写完成
LogManager.vi (Close) → 关闭文件

8. 注意事项

要点 说明
非重入设置 必须在VI属性中设为"非重入执行",否则移位寄存器不共享,日志文件句柄无法在多次调用间保持。
路径合法性 确保VI所在目录有写入权限,且LOG文件夹可创建。若路径包含非法字符,文件创建会失败。
文件句柄泄露 务必在程序退出时调用Close命令,否则可能造成文件句柄泄露。
并发调用 若在多线程环境中同时调用,需注意互斥。本设计因文件引用存储在移位寄存器中,非重入VI自然保证了线程安全。
数据长度 数据长度输入可选,若未连接则自动使用数组大小。

9. 总结

LogManager.vi作为UDS上位机的"黑匣子",以极低的开销完整记录了整个刷写过程中的诊断通信。它通过功能全局变量模式,提供了简洁而强大的日志管理能力,使得开发调试和现场问题定位变得有据可依。

本子VI的设计体现了LabVIEW中数据流编程功能封装的优秀实践------将文件管理逻辑完全封装,上层调用者只需关心"记录什么",而无需关心"怎么记录"。

至此,我们已经完成了从设备打开、通信基座、各UDS服务到主VI和日志管理的全部模块。一个完整、可运行、可维护的UDS刷写上位机已初具雏形。

相关推荐
fanchenxinok2 小时前
基于图莫斯的CAN UDS升级上位机-LabVIEW版本(九):TOOMOSS_SID2E_WriteDataByID.vi — 写入数据
can·labview·uds刷写
fanchenxinok14 小时前
基于图莫斯的CAN UDS升级上位机-LabVIEW版本:从零搭建ECU刷写工具
labview·uds升级·升级上位机
fanchenxinok20 小时前
基于图莫斯的CAN UDS升级上位机-LabVIEW版本(一):TOOMOSS_OpenDev(CAN).vi — 设备打开与句柄管理
labview
fanchenxinok1 天前
基于图莫斯的CAN UDS升级上位机-LabVIEW版本(四):TOOMOSS_SID27_SecurityAccess.vi — 安全访问
安全·labview·uds升级·子vi
马不啼1 天前
NI HIL自动化测试10-Labview04-树形结构
labview·simulink·hil·veristand·teststand
LabVIEW开发2 天前
LabVIEW XY Graph中使用真实时间戳显示多曲线
labview·labview知识·labview功能·labview程序
LabVIEW开发6 天前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序
LabVIEW开发6 天前
LabVIEW自动化测试台中的硬件抽象层与插件架构设计
labview·labview知识·labview功能·labview程序
fanchenxinok10 天前
学习笔记:LabVIEW中如何将解析S19/HEX的VI封装为子VI并供主VI调用
笔记·学习·labview·子vi