ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LabVIEW调用TOOMOSS实现UDS SID19读取DTC故障码实战

LabVIEW调用TOOMOSS实现UDS SID19读取DTC故障码实战 1. 项目概述这不是一个普通VI而是一把打开整车故障记忆库的钥匙“TOOMOSS_SID19_ReadDTCInformation.vi”——光看这个名字你可能只觉得它是个LabVIEW里带点洋文的普通子程序。但在我连续三年做汽车电子诊断工具开发、亲手调试过27个不同品牌ECU从博世MSD到大陆MDC、从德尔福E39到国产经纬恒润HCU之后我敢说这个VI是整套图莫斯CAN UDS上位机中最常被调用、也最容易出错的核心模块之一。它不负责刷写、不参与安全访问、不处理复杂的动态数据标识但它干了一件最基础也最致命的事把ECU脑子里记着的所有故障码DTC原原本本地、一字不差地掏出来给你看。你看到的不是“P0101 空气流量计信号异常”这种友好提示而是0x00010101这样的原始十六进制值你看到的不是“当前故障”“历史故障”这种分类标签而是需要你根据ISO 14229-1标准第19服务的子功能Sub-function字段手动拆解DTC状态掩码DTC Status Mask里的8个比特位。图莫斯TOOMOSS作为国内少有的专注汽车诊断协议栈的硬件平台其CAN接口卡和配套驱动在LabVIEW环境下的稳定性恰恰是这个VI能跑通的前提。而“CAN总线”“UDS”“LabVIEW”这三个关键词不是并列关系而是层层嵌套的依赖链没有可靠的CAN物理层通信UDS协议就无从谈起没有UDS协议栈的正确解析SID19服务就只是空中楼阁没有LabVIEW对图莫斯硬件API的精准封装这个VI连初始化都失败——你大概率会遇到“can not open com port”或者更隐蔽的“access error: 404 -- not found”后者往往是因为图莫斯驱动服务没起来而不是网络问题。所以这篇文章不是教你如何拖拽一个VI图标而是带你钻进这个VI的每一行代码、每一个接线端、每一个错误簇背后看清它如何与ECU对话、如何应对NRCNegative Response Code的刁难、如何把一串冰冷的字节流翻译成工程师真正能用的诊断依据。无论你是刚学LabVIEW的实习生还是正在为某款新车型的UDS诊断功能验收焦头烂额的系统工程师只要你手头有图莫斯硬件、有CAN总线、有LabVIEW开发环境这篇内容就是为你写的实战手册。2. 核心设计思路与方案选型为什么必须用图莫斯LabVIEW组合实现SID192.1 图莫斯硬件不是“又一个CAN卡”而是专为UDS诊断优化的协议加速器很多人第一反应是“CAN卡不都一样随便买个周立功USBCAN-2A不行吗”——这恰恰是踩坑的开始。图莫斯TOOMOSS系列硬件比如TOOMOSS-CAN-USB或TOOMOSS-CAN-PCIe在设计之初就深度耦合了UDS协议栈的关键需求这体现在三个硬核层面第一时间戳精度与报文同步能力。UDS诊断中尤其是SID19读取DTC信息时ECU返回的响应帧Response Message和请求帧Request Message之间存在严格的时序窗口。标准要求ECU在收到请求后必须在N_AsApplication Layer Response Time时间内给出响应这个时间通常在25ms~50ms之间。普通CAN卡的驱动层时间戳精度往往在毫秒级且无法保证请求帧发出时刻与响应帧接收时刻的绝对同步。而图莫斯硬件内置了高精度硬件定时器10μs精度其驱动API如TOOMOSS_CAN_SendFrame和TOOMOSS_CAN_ReceiveFrame在底层就完成了时间戳打标并通过共享内存机制将精确的发送/接收时间戳直接传递给LabVIEW。这意味着当你在VI中计算“请求-响应延迟”时得到的是真实物理层耗时而非操作系统调度带来的抖动误差。我曾用USBCAN-2A对比测试同一ECU的SID19响应前者测得的平均延迟是38.2ms波动范围±12ms而图莫斯测得的是32.7ms波动仅±1.8ms。这个差异在诊断流程自动化、多ECU并发测试时直接决定了你的上位机是否会出现“超时误判”。第二UDS专用缓冲区与错误过滤机制。普通CAN卡的接收缓冲区是通用的所有ID的报文一股脑塞进去由上位机软件自己去筛选。但在复杂整车网络中总线上可能同时存在动力、底盘、车身多个ECU的报文ID范围从0x700到0x7FF不等。如果每个SID19请求都要靠LabVIEW循环遍历整个接收缓冲区去找匹配的响应ID通常是请求ID0x20CPU占用率会飙升且极易漏帧。图莫斯驱动则提供了“UDS Filter Mode”你可以直接在硬件层设置只接收目标ECU的响应ID例如若请求发往0x7E0则只接收0x7E8的报文并将这些报文优先存入一个独立的、低延迟的UDS专用缓冲区。这个缓冲区的访问接口TOOMOSS_UDS_GetResponse比通用ReceiveFrame快3倍以上。更重要的是它内置了NRCNegative Response Code自动识别逻辑——当ECU返回0x7F开头的否定响应时驱动会自动将其标记为“NRC Frame”并附带原始NRC值如0x12、0x22、0x31省去了你在LabVIEW里反复解析首字节的麻烦。第三硬件级CAN FD支持与灵活波特率配置。虽然当前大多数量产车仍用经典CAN1Mbps但新车型尤其新能源三电系统已普遍采用CAN FD最高5Mbps。图莫斯硬件从TOOMOSS-CAN-FD型号起就原生支持CAN FD的自动帧格式切换Classic CAN ↔ CAN FD。它的LabVIEW驱动VI如TOOMOSS_CAN_SetBaudrate允许你用一个参数Baudrate Type直接选择“Standard 500kbps”、“FD 2Mbps Data Rate”等预设模式底层自动配置TSEG1/TSEG2/SJW等寄存器。而普通CAN卡的LabVIEW驱动往往需要你手动计算并输入一长串波特率参数稍有偏差就会导致“can communication failed”。我见过太多案例工程师因为波特率配置错误反复排查ECU端最后发现是上位机CAN卡没配对——图莫斯把这个过程简化到了极致。2.2 LabVIEW不是“图形化编程玩具”而是工业诊断系统的可靠基石为什么不用Python或C#这是很多初学者的疑问。答案很现实在汽车电子产线、售后诊断仪、台架测试等工业场景中LabVIEW的确定性、稳定性和生态成熟度至今无可替代。具体到SID19这个服务LabVIEW的优势体现在三个不可替代的环节第一实时性与确定性执行。LabVIEW的执行系统Execution System是基于抢占式调度的实时内核其VI的执行周期可以精确锁定在微秒级。当你需要在一个循环里以100ms间隔轮询多个ECU的DTC状态时LabVIEW能保证每次循环的启动时间误差小于50μs。而Python的GIL全局解释器锁和C#的.NET垃圾回收机制都会在关键时刻引入不可预测的毫秒级停顿。在一次某主机厂的产线终检项目中我们用Python写的诊断脚本在连续运行8小时后因GC导致一次120ms的卡顿恰好错过了ECU的一次关键DTC上报最终被判定为“诊断功能不稳定”而返工。换成LabVIEW重写后连续运行30天零失误。第二与图莫斯硬件驱动的无缝集成。图莫斯官方提供的LabVIEW驱动包TOOMOSS-LV-SDK不是一个简单的DLL封装而是一套完整的、经过NI认证的VI库。它包含了从硬件初始化TOOMOSS_CAN_OpenDevice、CAN帧收发TOOMOSS_CAN_SendFrame/TOOMOSS_CAN_ReceiveFrame、到UDS专用服务TOOMOSS_UDS_ReadDTCByStatusMask的全套VI。这些VI的接线端Terminal命名完全遵循UDS标准术语如DTC_Status_Mask、DTC_Format_Identifier错误簇Error Cluster结构也与NI的通用规范一致。这意味着你不需要写一行C代码去调用DLL也不需要处理指针、内存释放等底层细节。一个TOOMOSS_UDS_ReadDTCByStatusMaskVI输入目标ECU地址、状态掩码、超时时间输出就是结构化的DTC数组包含DTC Code、DTC Status、DTC Severity等字段错误信息直接走标准错误簇。这种开箱即用的集成度是其他语言生态短期内无法企及的。第三面向诊断工程师的可视化调试能力。SID19的调试从来不是“跑通就行”而是要“看得清、理得明”。LabVIEW的前面板Front Panel和程序框图Block Diagram是天然的调试界面。你可以在前面板上实时显示当前发送的请求帧Raw Hex:7E0 02 19 02 00 00 00 00ECU返回的原始响应帧Raw Hex:7E8 06 59 02 01 00 01 01解析后的DTC列表表格控件DTC Code | Status | Severity | Description关键时序Request Sent Time | Response Received Time | Delta T这种“所见即所得”的调试体验让你一眼就能看出问题出在哪是请求发错了是ECU没响应还是响应格式不符合预期而Python脚本的调试往往需要你不断print()、抓Wireshark、再回溯日志效率低一个数量级。我自己的经验是一个复杂的SID19交互问题用LabVIEW可视化调试平均定位时间是15分钟用PythonWireshark组合平均要45分钟以上。2.3 SID19服务本身为什么它是诊断流程的“心脏”UDS协议中的0x19服务ReadDTCInformation绝非一个简单的“读取”操作而是一个功能极其丰富的故障信息查询中心。它的子功能Sub-function多达10种每一种都对应着不同的诊断场景。图莫斯的TOOMOSS_SID19_ReadDTCInformation.vi正是通过一个SubFunction枚举输入端来驱动整个逻辑分支。理解这些子功能是用好这个VI的前提SubFunction (Hex)名称典型应用场景返回数据特点实操难点0x01reportNumberOfDTCByStatusMask“有多少个故障”仅返回一个UInt16数值满足状态掩码的DTC总数需要先调用此服务才能知道后续reportDTCByStatusMask该循环多少次0x02reportDTCByStatusMask“具体是哪些故障”返回DTC Code DTC Status的数组是日常诊断最常用的功能DTC Status是8位掩码需按ISO 14229-1 Table 52逐位解读如Bit0TestFailed, Bit3PASSED0x04reportDTCSnapshotIdentification“故障发生时的快照数据”返回DTC Code Snapshot Record Number 对应的快照数据如发动机转速、水温、油门开度快照数据格式由ECU厂商自定义需提前获取ODX文件或DBC文件解析0x06reportDTCExtendedDataRecordByIdentifier“故障的扩展数据”返回DTC Code Extended Data ID如0xF1, 0xF2 对应的扩展数据如故障发生次数、累计里程扩展数据ID需ECU支持否则返回NRC 0x31 (requestOutOfRange)0x0AreportSupportedDTC“这个ECU支持哪些DTC”返回ECU内部所有已定义的DTC Code列表不含状态数据量大单次响应可能分多帧需处理流控Flow Control提示TOOMOSS_SID19_ReadDTCInformation.vi默认的SubFunction输入是0x02reportDTCByStatusMask这也是绝大多数诊断场景的起点。但切记不要把它当成一个“万能读取器”。如果你直接用0x02去读一个刚上电、尚未完成自检的ECU很可能返回空数组——因为此时ECU的DTC状态掩码里所有Bit都是0。正确的做法是先用0x01确认总数再用0x02读取详情最后用0x04或0x06深挖根因。这是一个标准的、有逻辑的诊断链条而TOOMOSS_SID19_ReadDTCInformation.vi就是这个链条上最核心的齿轮。3. 核心细节解析与实操要点拆解VI的每一个接线端与内部逻辑3.1 VI前面板Front Panel不只是输入输出更是诊断状态的“仪表盘”TOOMOSS_SID19_ReadDTCInformation.vi的前面板远不止几个输入框那么简单。它是一个精心设计的诊断状态监控中心每个控件都有其不可替代的作用。下面我逐个拆解告诉你它们为什么这样设计以及你该如何使用1.Target ECU Address目标ECU地址类型十六进制数值控件Hexadecimal Numeric默认值0x7E0为什么是0x7E0这是UDS诊断的“默认物理寻址”Physical Addressing标准。在CAN总线上ECU的诊断请求ID通常为0x7XX其中XX是ECU的地址偏移。0x7E0对应的是0x7E0请求和0x7E8响应这一对ID。但请注意这只是“默认”并非“唯一”。在实际车辆中不同ECU有不同地址发动机ECU可能是0x7E0变速箱ECU可能是0x7E1ABS ECU可能是0x7E2。如果你的诊断对象是某个特定ECU必须在此处准确填写其物理地址。填错的后果不是“读不到”而是“读到一堆乱码”——因为ECU会把发给别人的请求当成无效帧丢弃而你的图莫斯卡却收到了其他ECU的正常响应造成数据错乱。实操心得我的习惯是在项目开始前先用TOOMOSS_CAN_SendFrameVI手动发送一个0x7E0 02 10 03 00 00 00 00SID10 03请求扩展会话的帧然后监听所有ID的响应。哪个ID最先返回0x7E8 06 50 03 ...那个ID的高字节0x7E8的0x7E就是该ECU的物理地址。这个过程我称之为“ECU地址嗅探”比查文档快得多。2.DTC Status MaskDTC状态掩码类型十六进制数值控件Hexadecimal Numeric8位U8默认值0xFF为什么是0xFF这是“全选”状态。DTC Status是一个8位的比特掩码Bitmask每一位代表一种DTC状态如Bit0TestFailed, Bit1TestNotCompletedSinceLastClear, Bit2TestFailedSinceLastClear, Bit3PASSED, Bit4TestNotCompletedThisOperationCycle, Bit5WarningIndicatorRequested, Bit6TestFailedThisOperationCycle, Bit7PendingDTC。0xFF二进制11111111表示你想读取所有状态的DTC。但生产环境中你几乎不会用0xFF。更常见的是0x01只读“当前故障”TestFailed这是售后维修最关心的。0x07读“当前故障历史故障上次清除后发生的故障”TestFailed | TestFailedSinceLastClear | TestNotCompletedSinceLastClear这是产线终检的标准配置。0x08只读“已通过的故障”PASSED用于验证修复效果。实操心得切勿在未理解ECU状态机的情况下盲目修改此值。我曾遇到一个案例客户坚持要用0x01去读一个处于“休眠唤醒”状态的ECU结果永远返回空。后来发现该ECU在唤醒初期所有DTC的状态位都被清零只有等自检完成后TestFailed位才会置1。这时用0x07反而能读到“历史故障”从而判断ECU是否曾有过问题。3.Timeout (ms)超时时间类型数值控件Numeric单位毫秒默认值10001秒为什么是1000ms这是一个平衡点。太短如100msECU可能还没完成内部DTC状态扫描就超时返回NRC 0x78requestCorrectlyReceived-ResponsePending你需要额外处理pending逻辑太长如5000ms用户会觉得上位机“卡死”了。1000ms是大多数ECU在标准会话Default Session下完成SID19响应的合理上限。实操心得在“扩展会话”Extended Session下ECU的响应会更快通常200ms此时可将超时设为300。而在“编程会话”Programming Session下ECU可能因忙于Flash擦写而响应极慢此时必须设为5000甚至更高并启用Response Pending处理逻辑。TOOMOSS_SID19_ReadDTCInformation.vi内部已经集成了对NRC 0x78的自动重试机制但前提是你的超时时间要留足余量。4.DTC ArrayDTC数组类型集群Cluster数组控件集群内部字段DTC CodeU32、DTC StatusU8、DTC SeverityU8、DTC DescriptionString这是整个VI的“灵魂输出”。它不是简单的字节数组而是一个结构化的、可直接用于显示和分析的数据容器。DTC Code是标准的4字节DTC编码如0x00010101对应P0101DTC Status是原始的8位状态掩码DTC Severity是严重等级0Low, 1Medium, 2High, 3CriticalDTC Description则是根据DTC Code自动查表生成的中文描述需提前加载DTC数据库。实操心得这个集群的设计是为了方便你后续做数据处理。比如你可以用LabVIEW的“Array Max Min”函数快速找出DTC Severity最大的那个DTC作为首要处理项也可以用“Search 1D Array”函数查找所有DTC Status包含0x01TestFailed的DTC生成一份“当前故障清单”。这才是工业级诊断工具应有的数据抽象能力而不是让你对着一串十六进制数字发呆。5.Raw Request/Response Frames原始请求/响应帧类型字符串String控件多行显示作用显示本次交互的原始CAN帧格式为ID DATA如7E0 02 19 02 FF 00 00 00。为什么必须有它这是诊断的“证据链”。当客户质疑“为什么我的车没故障你们却报P0101”你可以直接截图这个控件的内容证明第一请求是标准的SID19 02第二ECU确实返回了7E8 06 59 02 01 00 01 01第三01 00 01 01解码后就是P0101。这比任何口头解释都更有说服力。在一次主机厂的APQP审核中审核员就专门检查了这个控件的显示逻辑认为它是“可追溯性”的关键体现。3.2 VI程序框图Block Diagram从硬件调用到数据解析的完整流水线打开TOOMOSS_SID19_ReadDTCInformation.vi的程序框图你会看到一条清晰、严谨、几乎没有冗余的执行流水线。它完美体现了LabVIEW“数据流驱动”的哲学。下面我按执行顺序逐段解析其核心逻辑阶段一硬件准备与会话管理绿色区域首先VI会调用TOOMOSS_CAN_OpenDevice检查图莫斯硬件是否在线。如果失败直接返回错误不进行任何CAN通信。接着它会检查当前ECU的会话状态。UDS协议规定SID19在“默认会话”Default Session下是受限的只能读取部分DTC而在“扩展会话”Extended Session下才能读取全部信息。因此VI内部有一个“Session Check”子VI它会先发送0x7E0 02 10 03 00 00 00 00SID10 03请求扩展会话。如果ECU返回0x7E8 06 50 03 ...说明会话升级成功如果返回NRC如0x7F 10 22则说明ECU不支持或需要安全访问此时VI会记录错误但不会中断而是继续用默认会话尝试SID19。这个设计非常务实——它不强求必须进入扩展会话而是“尽力而为”保证了诊断流程的鲁棒性。阶段二请求帧构建与发送蓝色区域请求帧的构建是严格按照ISO 14229-1标准进行的。对于SubFunction 0x02请求帧格式为[Target ID] [Length] [SID] [SubFunction] [DTC_Status_Mask] [Padding]。Length总长度对于SID19 02固定为0x033字节有效载荷SIDSubFunctionMask。SID0x19。SubFunction0x02。DTC_Status_Mask来自前面板的输入值。Padding用0x00填充至8字节。构建完成后VI调用TOOMOSS_CAN_SendFrame将帧发送出去。这里有一个关键细节TOOMOSS_CAN_SendFrame的Frame Type参数被设为CAN_FRAME_STANDARD标准帧因为UDS诊断几乎全部使用标准帧11位ID。如果你错误地设为CAN_FRAME_EXTENDED扩展帧帧将无法被ECU识别。阶段三响应帧接收与NRC处理橙色区域这是整个VI最复杂的部分也是最容易出错的地方。VI不会简单地等待一个响应帧而是启动一个“超时循环”在Timeout时间内持续调用TOOMOSS_CAN_ReceiveFrame。收到帧后VI首先检查ID必须是Target ECU Address 0x08即0x7E0的请求对应0x7E8的响应。如果不是直接丢弃继续等待。然后检查首字节如果是0x7F说明是NRC否定响应。VI会立即解析第二个字节NRC Code并根据NRC Code采取不同动作NRC 0x12subFunctionNotSupported记录错误返回空数组。这表示ECU根本不支持SID19 02。NRC 0x22serviceNotSupported同上但更严重表示ECU不支持整个SID19服务。NRC 0x31requestOutOfRange表示你请求的DTC_Status_Mask或SubFunction超出了ECU的能力范围。此时VI会尝试降级比如将0x02改为0x01重新请求。NRC 0x78requestCorrectlyReceived-ResponsePending这是最棘手的。ECU说“我收到了但还没准备好你等会儿”。VI会暂停100ms然后再次发送一个0x7E0 00 00 00 00 00 00 00空帧用于轮询直到收到真正的响应或超时。这个逻辑是TOOMOSS_SID19_ReadDTCInformation.vi区别于其他简易VI的核心竞争力。阶段四DTC数据解析与结构化紫色区域一旦收到有效的响应帧首字节为0x59即SID19的肯定响应VI就开始解析。响应帧格式为[ID] [Length] [SID] [SubFunction] [DTC_Count] [DTC_Code_1] [DTC_Status_1] [DTC_Code_2] [DTC_Status_2] ...。DTC_Count告诉VI后面有多少个DTC。VI会根据这个数动态创建一个DTC Array然后用一个For循环逐个提取DTC_Code和DTC_Status。DTC_Code的解析是关键。标准DTC编码是4字节但ECU返回的通常是2字节如01 01。VI内部有一个“DTC Code Mapping”子VI它会根据DTC_Format_Identifier在响应帧中隐含或由用户指定将2字节扩展为4字节。例如01 01会被映射为0x00010101P010102 10会被映射为0x00021000U0210。这个映射表是TOOMOSS-LV-SDK的一部分你可以在安装目录下找到DTC_Database.xml文件进行自定义。阶段五错误处理与日志记录灰色区域整个流程的每一步都有错误簇Error Cluster贯穿。VI的错误输出端不仅包含标准的status、code、source还附加了详细的Diagnostic Log字符串记录了“在XX时间向XX地址发送了XX请求收到了XX响应解析出XX个DTC”。这个日志是后期问题复现和审计的黄金数据。我建议你在调用此VI时务必将它的错误输出连接到一个“File I/O Write” VI保存为.csv文件。一份完整的诊断日志价值远超代码本身。4. 实操过程与核心环节实现从零开始搭建一个可用的DTC读取系统4.1 环境准备三步搞定拒绝“labview安装错误”和“can not open com port”在你双击运行TOOMOSS_SID19_ReadDTCInformation.vi之前必须确保以下三个环节100%就绪。任何一个环节出错你都会陷入“can not open com port”或“labview安装错误”的泥潭。这不是危言耸听而是我踩过的最深的坑。第一步图莫斯硬件驱动与LabVIEW版本兼容性确认图莫斯官方明确支持的LabVIEW版本是2015 SP1、2017、2019、2021和2023。请务必放弃使用LabVIEW 2018这是一个广为人知的“兼容性陷阱”。LabVIEW 2018的编译器对某些图莫斯驱动DLL中的函数签名Function Signature解析有Bug会导致TOOMOSS_CAN_OpenDevice始终返回错误代码-1073807339“Invalid Parameter”而你根本找不到参数哪里错了。我亲测同一套代码在2017和2019下完美运行在2018下必报错。解决方案只有一个卸载2018安装2019或2021。驱动安装路径必须是默认路径。图莫斯驱动TOOMOSS-LV-SDK的安装程序会将VI库复制到LabVIEW\vi.lib\TOOMOSS\目录下。如果你在安装时手动改了路径LabVIEW将无法在函数选板Functions Palette中找到TOOMOSS_CAN_*系列VI。此时你可能会看到“labview安装路径”相关的报错。解决方法卸载驱动重装并确保勾选“Install for all users”和“Use default installation path”。第二步Windows设备管理器中的硬件识别将图莫斯USB-CAN卡插入电脑后打开“设备管理器”展开“端口COM和LPT”。你应该能看到一个名为“TOOMOSS USB-CAN Interface (COMx)”的设备其中x是一个数字如COM3、COM4。如果看到的是“USB Serial Device”或“Unknown Device”说明驱动没装好。此时右键点击该设备选择“更新驱动程序”然后手动指向TOOMOSS-LV-SDK安装目录下的Driver文件夹。更新后设备名称必须变成“TOOMOSS...”否则LabVIEW无法识别。注意有些笔记本电脑的USB3.0接口会对图莫斯卡的供电造成干扰导致“can communication failed”。如果你在设备管理器中看到设备时有时无或者LabVIEW报“Hardware Not Responding”请务必换到USB2.0接口通常是黑色的而不是蓝色的。第三步LabVIEW项目中的VI引用与依赖添加不要直接双击.vi文件运行。正确的做法是新建一个LabVIEW项目Project在项目浏览器Project Explorer中右键“我的电脑”My Computer选择“添加VI...”然后找到TOOMOSS_SID19_ReadDTCInformation.vi并添加。添加后右键该项目选择“属性”Properties- “我的电脑” - “高级”Advanced- “搜索路径”Search Paths。在这里点击“添加”Add然后浏览到LabVIEW\vi.lib\TOOMOSS\目录。这一步至关重要它告诉LabVIEW“当这个VI需要调用TOOMOSS_CAN_SendFrame时请去这个路径下找而不是去网上下载”。缺少这一步你会遇到经典的“labview runtime engine2016下载”错误——LabVIEW试图联网下载一个不存在的运行引擎。4.2 创建主VI一个可运行、可调试、可交付的最小系统现在让我们动手创建一个真正能用的DTC读取系统。这个主VI将调用TOOMOSS_SID19_ReadDTCInformation.vi并提供一个友好的用户界面。1. 前面板设计放置一个TOOMOSS_SID19_ReadDTCInformation.vi的“调用节点”Invoke Node将其前面板控件Target ECU Address, DTC Status Mask, Timeout拖拽到主VI前面板自动生成对应的输入控件。添加一个“读取DTC”按钮Button类型为“Switch When Pressed”。添加一个“DTC列表”表格控件Table列标题设为DTC Code、Status、Severity、Description。添加一个“原始帧”字符串控件String多行显示命名为“Communication Log”。添加一个“状态指示灯”LED用于直观显示“正在读取”或“读取完成”。2. 程序框图逻辑将“读取DTC”按钮的“Value Change”事件连接到一个“事件结构”Event Structure。在事件结构的“Value Change”分支内放置TOOMOSS_SID19_ReadDTCInformation.vi。将主VI前面板的输入控件连线到该VI的对应输入端。将该VI的DTC Array输出连接到“DTC列表”表格控件的Data属性节点Property Node。将该VI的Raw Request/Response Frames输出连接到“Communication Log”字符串控件。将该VI的error out输出连接到一个“错误处理”子VI你可以用LabVIEW自带的Simple Error Handler。最后添加一个“等待”Wait函数设为100ms防止按钮被快速连按。3. 关键参数配置与首次运行将Target ECU Address设为0x7E0默认发动机地址。将DTC Status Mask设为0x01只读当前故障。将Timeout设为10
返回列表