简介:面向汽车电子标定与ECU开发人员的 INCA ProF 脚本教程 PDF,聚焦 INCA 标定工具中 ProF 自动化编程脚本的入门与梳理,帮助读者理解如何通过脚本定制 ECU 闪存编程及重复性标定任务。内容围绕三类核心文件展开:主控制流描述文件负责整体执行顺序,子流程文件承载可复用过程,控制器配置文件定义通信速率、控制器 ID、内存布局与校验和计算方式;同时说明 layout 如何生成按键或下拉菜单式交互界面,以及 Section 顺序执行、CASE 分支跳转、CALL 子流程调用和错误处理的组织方式,并结合 Flash programming 主流程展示脚本的结构化写法。资源包共 1 个 PDF 文件,大小约 271KB,轻量便于查阅。已有 6756 人学习,适合需要建立 ProF 脚本整体认知、理清模块化编写思路与排错分支的工程师作为案头参考。
1. 一次刷写卡在 INIT_USB:INCA ProF 脚本到底管哪一段
INCA ProF 脚本不是把鼠标操作录一遍就完事的宏,它更像一套把 ECU 刷写、文件转换和错误处理串起来的状态机。常见的翻车场景是:Download - Application Code, Data 的 Action 配好了,第一次刷写却停在 INIT_USB,界面只弹一行 START section,于是有人怀疑 USB 线玄学,实际是 .prm 里 %7/%8/%9 的传参和 layout 下拉项数量对不上。这份资源把 .prm 主控制流、.pri 子流程、.cnf 控制器配置和 install.ini 安装定义拆开讲,适合正在做 ECU 闪存编程自动化、需要把手工刷写固化成可重复流程的工程师;新手能照着核对文件,熟手可以直接看参数落点和避坑表。
2. 拆开 ProF 工程目录:.prm、.pri、.cnf 与 install.ini 的职责边界
2.1 .prm 只能有一个,.pri 可以多个:主函数和子函数的边界
ProF 工程的入口是 .prm 文件,一个脚本只有一个 .prm,它承担的是主控制流描述,作用类似 C 语言里的 main 函数。.pri 是子流程文件,一个工程可以有一个或者多个,作用类似 C 语言里的子函数。这个划分看起来简单,真正落地时最容易乱的地方是“把所有逻辑都塞进 .prm”。我一般会把 .prm 控制成一条可读的骨架:初始化、通信、转换、刷写、成功或错误出口;具体动作放进 .pri,由 CALL 跳过去执行。这样查问题时先看 .prm 的 Section 跳转,再看 .pri 里某个 procedure 的内部实现,边界清楚。
目录里常见的文件职责可以先用一张表对齐,再动手改:
| 文件或目录 | 职责 | 落地时先核对什么 |
|---|---|---|
| .prm | 主控制流描述,类似 main | Section 顺序、CASE 返回值、CALL 目标 |
| .pri | 子流程文件,类似子函数 | procedure 名是否和 CALL 一致 |
| .cnf | 控制器配置文件 | 通信速率、控制器 ID、Memory_layout、Checksum |
| layout | 定义 ProF 界面 | 按钮/下拉类型、下拉项数量、Action 绑定 |
| install.ini | ProF 安装与路径定义 | [Configuration]、[ChangePath_XX]、[Files]、[LanguageFiles] |
| security.dll 等安全文件 | 刷写安全访问相关组件 | 文件名、路径、是否随安装目录一起迁移 |
这张表不是让你背概念,而是排查时按行定位。比如 START 后直接进 DSP_ERROR,先看 .prm 里 INIT_FLASH_PROGRAMMING 的 CONFIG 参数指向哪个 .cnf;如果报的是找不到文件,再去看 install.ini 的路径变更和 [Files] 段;如果界面选项不对,回到 layout 和 Action 命令行。三处不要混着改,否则一次刷写失败会留下好几个变量,后面很难判断是哪一处生效。
2.2 .cnf 不是可选项:通信速率、控制器 ID 和校验和先对齐
.cnf 是控制器配置文件,定义 ProF 脚本操作对象控制器协议的基础信息。原文说得很明确:格式在 ProF 文档里有严格定义,主要包括通信速率、控制器 ID、Memory_layout、Checksum 计算方式等信息。很多新手把 .cnf 当成“跟脚本无关的配置文件”,直到刷写过程中校验和报错才回头翻。我的习惯是先把 .cnf 当成硬件契约:通信速率对不上,初始化阶段就会挂;控制器 ID 不对,后续 UDS 通信可能连不上;Memory_layout 和 Checksum 方式不匹配,最危险的是流程走到后面才报校验失败,前面看起来都正常。
看 .prm 里这一句:
INIT_FLASH_PROGRAMMING(ECU_ADDRESS,1,CONFIG"phys.cnf")第一个参数在工程里通常对应控制器地址或目标标识,第二个参数常见做法是通道或重试计数,第三个参数指向物理层配置文件。不要照抄我的叫法,按工程内注释和函数声明核对。真正要抄作业的是检查顺序:先确认phys.cnf和 .prm 在同一搜索路径下,再确认 .cnf 里的通信速率、控制器 ID、Memory_layout、Checksum 与当前硬件一致,最后才改 .prm 的调用参数。顺序反过来,容易把配置问题误判成脚本跳转问题。
提示:改 .cnf 前先备份原文件,并在文件名或注释里标出对应硬件状态。只改一个参数就刷一次,不要一次改通信速率、ID 和校验和三项。
2.3 install.ini 里的路径、语言文件和安全文件怎么核对
install.ini 是 ProF 安装定义信息,常见段落包括 [Configuration]、[ChangePath_XX]、[Files]、[LanguageFiles]。原文给出的片段里能看到ConfigPath = c:$prof\Install这种路径变更定义,也能看到SecurityFile=seedms6.dll、LayoutFile=layout、File=config_func.cnf、File=config_phys.cnf、File=main.prm一类条目。换电脑、换安装目录、把工程从一台设备拷到另一台设备时,最先失效的往往不是脚本语法,而是这些路径和文件名。
[Configuration] ; ProF 配置信息定义,工程迁移时先核对这一段 ProFVersion=current [ChangePath_XX] ; 需要变更路径的文件及变更内容 ConfigPath = c:$prof\Install [Files] ; 安全访问相关文件,缺失时不要直接跳过 SecurityFile=seedms6.dll [LanguageFiles] ; 界面语言、布局和控制器配置文件的落点 File=info.txt LayoutFile=layout File=config_func.cnf File=config_phys.cnf File=main.prm File=common1.pri代码里的字段名要按你手上的工程替换,不要硬套。逻辑说明:[ChangePath_XX]负责把安装路径映射到实际目录,[Files]管安全文件,[LanguageFiles]管界面语言、layout 和 .cnf/.prm/.pri 的加载。参数说明:ConfigPath如果写成固定绝对路径,换机器就会失效;常见做法是改成安装变量或相对路径,并在迁移后先跑一次只加载、不刷写的空流程。SecurityFile文件名必须和实际文件大小写一致,Windows 下有时看起来不区分,但脚本里写错一个字母,报错信息未必直接指向它。
我一般会先跑一段目录检查,把 include 和配置文件是否存在先确认掉:
# 在 ProF 工程根目录执行,先确认关键文件没有漏拷 PROF_ROOT="c:/prof/Install" for f in main.prm common1.pri config_func.cnf config_phys.cnf layout seedms6.dll; do if [ -f "$PROF_ROOT/$f" ]; then echo "OK $f" else echo "MISS $f" fi done # 再检查 .prm 里 include 的 .pri 是否都在同目录或搜索路径下 grep -n '#include' "$PROF_ROOT/main.prm"这段 bash 不负责刷写,只负责把“文件找不到”这类低级问题提前暴露。PROF_ROOT换成你的安装目录,for列表里放工程实际依赖的文件名;grep用来对照#include "define.pri"、#include "error_mess.pri"、#include "%7.pri"这些行。注意%7.pri不是固定文件名,它由 Action 命令行传入的 %7 决定,所以检查时要把实际参数值代进去看,例如 %7 是prog_app_data,就去确认prog_app_data.pri是否存在。这个细节在后面第 3 章会展开,但目录核对阶段先记下来:包含关系不是静态的,参数一变,加载的 .pri 就变。
3. 主流程怎么跑:Section 状态机、CASE 跳转与 %7/%8/%9 参数落点
3.1 从 [START] 到 [START_END]:顺序执行不等于无脑往下走
ProF 主流程大体上按照每个[Section] ... [Section_END]自上而下执行,但在每个 Section 内部,会根据上一个函数的执行结果判断下一步跳转。原文给出的骨架很典型:[START]里先关掉默认屏幕布局和扩展消息,显示 START section,然后进入INIT_CNF;INIT_CNF里调用INIT_FLASH_PROGRAMMING,成功走INIT_USB,否则走DSP_ERROR;INIT_USB里调用UDSB_INIT_COMMUNICATION,收到FPA_ACK才进入CONV1;CONV1调用convert,成功进MAIN;MAIN调用programECUFlash,成功到success,按 ESCAPE 走DSP_break,其他情况走DSP_ERROR。
[START] DEFAULT_SCREEN_LAYOUT (FALSE) EXTENDED_MESSAGE(FALSE) DISPLAY_MESSAGE ("START section!!! ",FALSE) case TRUE : INIT_CNF default : INIT_CNF [START_END] [INIT_CNF] INIT_FLASH_PROGRAMMING(ECU_ADDRESS,1,CONFIG"phys.cnf") case TRUE : INIT_USB default: DSP_ERROR [INIT_CNF_END] [INIT_USB] UDSB_INIT_COMMUNICATION case FPA_ACK : CONV1 default: DSP_ERROR [INIT_USB_END] [CONV1] CALL (convert) case TRUE : MAIN default: DSP_ERROR [CONV1_END] [MAIN] CALL (programECUFlash) case TRUE : success case ESCAPE: DSP_break default : DSP_ERROR [MAIN_END] [success] EXTENDED_MESSAGE(FALSE) default : EXIT [success_END]这段代码的逻辑说明:每个 Section 是一个小状态,Section 名就是跳转标签;case后面的值来自上一个函数或子流程的返回,default是兜底分支。参数说明:DEFAULT_SCREEN_LAYOUT(FALSE)和EXTENDED_MESSAGE(FALSE)控制界面显示策略,调试阶段可以打开扩展消息看更多信息,正式刷写时再关掉;DISPLAY_MESSAGE用来看当前跑到哪一段;INIT_FLASH_PROGRAMMING的第三个参数是CONFIG"phys.cnf",这里不要随手改成别的 .cnf 文件名,除非你确认路径和硬件配置一起变了;UDSB_INIT_COMMUNICATION的返回不是布尔值,这里匹配的是FPA_ACK,所以不能写成case TRUE。
我见过最常见的误用,是把default写成success,理由是“前面都成功了,默认往下走”。这在调试期很危险:只要某个函数返回了没预料到的值,流程会直接进成功段,看起来刷完了,实际 ECU 可能没写进去。我的习惯是default永远指向DSP_ERROR,成功分支只接受明确的TRUE或FPA_ACK。这样日志会难看一点,但问题不会藏起来。
3.2 CALL 跳进 .pri:子流程边界和返回值约定
当 .prm 里出现CALL (programECUFlash),ProF 脚本会跳到对应的 .pri 文件里执行 procedure。原文提到prog_app_data.pri文件中 procedureprogramECUFlash的定义,这说明 CALL 的目标不是随便一个标签,而是 .pri 里的过程名。工程里可以把转换、刷写、校验、恢复分别放进不同的 .pri,主流程只保留调用和跳转。这样改一个刷写细节时,不用在主流程里翻半天。
下面是一个结构示意,函数名和段名按你手上的工程替换,不要直接覆盖原文件:
; prog_app_data.pri 的结构示意,保留 Section 风格 [programECUFlash] ; 子流程内部先做前置检查,再进刷写动作 DISPLAY_MESSAGE ("enter programECUFlash",FALSE) case TRUE : programECUFlash_prepare default : DSP_ERROR [programECUFlash_END] [programECUFlash_prepare] ; 这里放擦除、写入、校验等工程内动作 ; 每一步仍然用 case 判断返回值,不要一路平铺 default : EXIT [programECUFlash_prepare_END]逻辑说明:CALL 进入 .pri 后,子流程同样按 Section 执行,子流程结束要回到调用点,主流程再根据返回值走TRUE、ESCAPE或default。参数说明:programECUFlash是过程名,必须和 .prm 里的CALL (programECUFlash)完全一致;段的结束标签不能漏,漏掉后流程可能继续往下读,表现为“子流程不返回”或“跳到了不该去的段”。返回值约定要在工程内统一:TRUE表示步骤成功,ESCAPE表示用户中断或可恢复退出,其他值一律进错误处理。不要在一个子流程里混用两套返回值含义,否则主流程的 CASE 会变成猜谜。
注意:CALL 的目标名、#include 的文件名、Action 命令行里的参数名是三套东西。名字相似不代表自动关联,改一个就要检查另外两个。
3.3 Action 菜单如何把参数塞进 .prm
原文里有一个关键说明:当选择不同的 Action 时,ProF 会传递不同的参数进入主流程描述文件。例如选择 “Download - Application Code, Data” 时,命令行可能是prog_app_data convert c:$prof\Install\main.prm,实际上传递了多个参数到 .prm,按空格区分:%7 是prog_app_data,%8 是convert,%9 是c:$prof\Install\main.prm。这解释了为什么 .prm 里会写#include "%7.pri"和#include "%8.pri":%7 和 %8 不只是普通参数,它们还参与决定加载哪个 .pri 文件。
| 参数位置 | 示例值 | 在 .prm 里的常见用途 | 注意 |
|---|---|---|---|
| %7 | prog_app_data | 作为 include 文件名,加载 prog_app_data.pri | 不要带空格,不要带多余后缀 |
| %8 | convert | 作为 include 文件名,加载 convert.pri | 和 CALL(convert) 的过程名对应 |
| %9 | c:$prof\Install\main.prm | 主流程文件路径 | 路径含空格时要确认命令行解析 |
把这三个参数代进 include 行看:
; 假设 Action 命令行传入:prog_app_data convert c:$prof\Install\main.prm ; 则下面两行实际加载 prog_app_data.pri 和 convert.pri #include "%7.pri" #include "%8.pri" ; 主流程里再调用对应的过程 [CONV1] CALL (convert) case TRUE : MAIN default: DSP_ERROR [CONV1_END]逻辑说明:#include "%7.pri"在解析时把 %7 替换成prog_app_data,于是加载prog_app_data.pri;#include "%8.pri"替换成convert,加载convert.pri。参数说明:%7、%8、%9是 Action 命令行按空格切出来的业务参数,前面的位置通常被运行环境占用,工程里稳定使用 %7 之后的参数;%9是路径,路径里如果有空格,命令行切分就会错位,后面的参数全部偏移。我的做法是 Action 命令行里不放未转义空格,工程目录也尽量不用中文和空格;如果必须用,先打印 %7/%8/%9 的实际值再刷。
这一段最容易出现的误判是:看到CALL (convert)就以为 convert 是内置函数。其实 convert 来自%8.pri,是工程自己加载的子流程;%8 变成别的值,CALL 的目标就可能找不到。排查时不要只盯 .prm 的 CALL 行,要同时看 Action 命令行、include 行和 .pri 文件名三处是否一致。
4. layout 界面与 Flash programming:按钮、下拉和参数数量怎么配
4.1 layout 选项 3 和 2 的差别不是外观,是参数来源
layout 定义 ProF 界面。原文给出的规则很具体:选项 1 取值是 3 时,表示此参数采用按键方式选择一个参数,例如 File name;取值是 2 时,表示此参数采用下拉选项方式选择一个参数,例如 Channel;当选项 1 等于 2 时,选项 2 的值表示下拉栏中有多少个选择项。这三个数字看起来像界面配置,实际影响的是参数怎么进入脚本。按钮方式通常对应文件路径、文件名这类需要浏览或手填的字段;下拉方式对应通道、模式、动作类型这类有限枚举。把文件路径做成下拉,或者把通道做成按键手填,界面也能显示,但参数来源不稳定,后面刷写就会飘。
| layout 配置 | 界面表现 | 适合字段 | 落地检查 |
|---|---|---|---|
| 选项 1 = 3 | 按键选择/文件浏览 | File name、路径类参数 | 路径是否存在、是否含空格 |
| 选项 1 = 2 | 下拉框 | Channel、模式、动作枚举 | 选项 2 的数量是否等于实际项数 |
| 选项 2 = N | 下拉栏有 N 个选择项 | 与 .cnf 或通道表对应 | N 不能多也不能少,顺序要和命令行一致 |
我一般先把 layout 字段、Action 命令行参数、.prm 里的 %n 做成一张三列表,再改界面文案。比如 layout 里有一个 Channel 下拉,选项 2 写 4,那么 .cnf 或通道表里就应有 4 个可用通道;Action 命令行里对应位置传的也必须是这 4 个值之一。只要有一处数量不一致,界面可能显示空项,或者选第 3 项实际传到脚本里的是第 2 项。这个错很难从日志直接看出来,因为流程可能照样往下走,只是刷错了对象。
提示:改 layout 下拉项数量前,先数一遍 .cnf 和 Action 命令行里的实际项。数量对不上时,不要靠“多写几个空项”兜底。
4.2 只在 Action = Flash programming 生效的界面约束
原文特别说明:上述界面仅在进行Action = Flash programming时有效。这句话在落地时很关键。layout 不是所有 Action 都按同一套界面解释,刷写动作下的按钮、下拉、参数数量才按这套规则走。有人在 Download 动作里调好了下拉,切到 Flash programming 发现选项数量不对,以为是 layout 文件坏了,实际是 Action 变了,界面解释规则也跟着变。我的做法是每次切换 Action 后,先跑一次不写数据的空流程,看界面字段是否还能对应到预期参数,再执行真实刷写。
另一个容易忽略的点是:layout 定义界面,但参数最终由 Action 命令行传入。界面选了什么,不等于 .prm 里拿到的 %7/%8/%9 一定对。比如界面里 File name 选了一个带空格的路径,Action 命令行按空格切分,%9 可能只拿到路径的前半段,后面的参数全部错位。排查时不要只看界面显示的文件名,要在 .prm 开头临时加一行消息,把 %7、%8、%9 打出来。确认参数值后再删掉调试消息,正式流程保持干净。
4.3 把界面字段映射到 .prm 参数:先定顺序再改文案
界面字段和 .prm 参数的映射,最稳的办法是先定顺序再改文案。顺序包括三层:layout 里字段出现的顺序、Action 命令行里参数出现的顺序、.prm 里使用 %n 的顺序。三层顺序一旦定下来,只改显示文案不影响流程;如果先改文案再调顺序,后面的人看界面名称和命令行参数对不上,排查成本会翻倍。我一般会在工程目录放一张映射表,至少写清楚:界面字段名、Action 命令行示例、%n 位置、对应 .cnf 或 .pri 文件。
举个落地检查的例子:Action 选择 “Download - Application Code, Data”,命令行是prog_app_data convert c:$prof\Install\main.prm,那么 %7 是 prog_app_data,%8 是 convert,%9 是 main.prm 路径。layout 里如果有一个 File name 字段,它最终影响的是 %9 还是别的参数,要看 Action 命令行的拼接方式,不要凭字段名猜。改完 layout 后,先只改一个字段,刷一次空流程,打印 %7/%8/%9;确认三值不变,再改下一个字段。一次改三个字段,日志里看不出是谁导致的偏移。
5. 避坑与排查:五类高频翻车现场
5.1 初始化与通信类
现象:START 之后直接进 DSP_ERROR,日志只有 START section,没有具体函数名。原因通常是INIT_FLASH_PROGRAMMING(ECU_ADDRESS,1,CONFIG"phys.cnf")里的 .cnf 路径或文件名不对,或者 .cnf 里的通信速率、控制器 ID 与当前硬件不一致。解决时先在 .prm 同目录确认phys.cnf存在,再把CONFIG"phys.cnf"改成实际路径做一次对照;然后核对 .cnf 的通信速率、控制器 ID、Memory_layout、Checksum。不要一上来改 Section 跳转,初始化失败时跳转逻辑还没真正参与。
现象:INIT_USB 一直等不到 FPA_ACK,最后走 default。原因可能是UDSB_INIT_COMMUNICATION的返回不是布尔值,而 .prm 里写了case TRUE;也可能是通信速率或控制器 ID 不匹配。解决时把case TRUE改成工程约定的case FPA_ACK,并在 default 前加一行DISPLAY_MESSAGE输出实际返回值。参数说明:FPA_ACK是通信初始化约定的确认值,不要用 TRUE 代替;如果返回值一直是别的值,先查 .cnf 和硬件连接,不要反复改 CASE。
5.2 文件路径与包含关系类
现象:#include "%7.pri"报找不到文件。原因通常是 Action 命令行里的 %7 和实际 .pri 文件名不一致,例如命令行写prog_app_data,目录里却是prog_app_data_v2.pri;或者参数里带了空格,%7 被截断。解决时先把 %7 打印出来,确认值是否等于文件名去掉.pri后的部分;再检查 Action 命令行是否有多余空格。参数说明:%7 和 %8 既参与 include,也可能参与 CALL 目标,改文件名时要同时改 Action 命令行和 .prm 里的 CALL。
现象:换电脑后 Install.ini 路径失效,安全文件加载失败。原因通常是[ChangePath_XX]里的ConfigPath写死绝对路径,或者[Files]里的SecurityFile文件名与实际文件大小写不一致。解决时先核对 install.ini 的 [Configuration]、[ChangePath_XX]、[Files]、[LanguageFiles] 四段,把ConfigPath改成安装变量或相对路径;再确认SecurityFile指向的文件确实在安装目录下。安全文件缺失时不要跳过,跳过可能让刷写流程走到后面才失败,日志更难读。
5.3 跳转、返回值与错误处理类
现象:CALL 子流程后不返回,或者直接进 success。原因通常是子流程 Section 缺少结束标签,或者default被写成了success。解决时检查每个[Section]是否有对应的[Section_END],每个 CALL 后是否只保留case TRUE、case ESCAPE、default三支;default必须指向DSP_ERROR。下面这段是错误处理的底线写法:
[MAIN] CALL (programECUFlash) case TRUE : success case ESCAPE: DSP_break default : DSP_ERROR [MAIN_END]逻辑说明:TRUE才允许进 success,ESCAPE走可控中断,其他返回值一律进 DSP_ERROR。参数说明:DSP_break和DSP_ERROR是工程内的错误/中断出口,不要改成普通 Section 名;如果工程里错误出口叫别的名字,按工程现有命名替换,但不要删掉 default 分支。我的血泪经验是:调试期把 default 指向 success 能“跑通”,但那种跑通没有意义,后面一定会在某个边界值上翻车。
现象:下拉框选 Channel 2,实际刷到 Channel 1。原因通常是 layout 选项 1=2 时选项 2 的数量与 .cnf/通道表不一致,或者界面顺序与 Action 命令行顺序不同。解决时先把选项 2 改成实际通道数,再做一张界面字段、命令行参数、%n 的三列映射表;每次只改一个字段,刷一次空流程并打印参数。注意:下拉项数量不是越多越好,多出来的空项会让选择结果偏移;少写项会让某些通道无法选到。
排查顺序可以固定成四步:先看 install.ini 路径和文件是否存在,再看 .cnf 通信参数是否匹配,再看 Action 命令行 %7/%8/%9 是否偏移,最后看 Section 的 CASE/default 是否写错。这个顺序能把“文件找不到”“通信连不上”“参数错位”“跳转错误”分开,不至于一上来就改主流程。
6. 把脚本跑稳的进阶手法:日志、回归验证与安全文件检查
6.1 给每个 Section 加可检索日志
调试 ProF 脚本时,最怕日志只有一行 START section,后面直接 DSP_ERROR。我的习惯是在每个关键 Section 入口加一条可检索消息,格式统一成段名 + 关键参数,例如DISPLAY_MESSAGE ("INIT_CNF phys.cnf",FALSE)、DISPLAY_MESSAGE ("CONV1 %7 %8",FALSE)。这样刷写失败时,日志能直接告诉你停在哪一段、当时 %7/%8 是什么值。正式发布前把调试消息关掉或删掉,避免界面被刷屏;但错误分支里的消息要保留,尤其是 default 前的返回值输出。
6.2 用一张回归表验证参数传递
改完 layout 或 Action 命令行后,不要直接上真实 ECU。先做一张回归表,至少覆盖三组参数:正常文件路径、带空格路径、错误文件名。每组只看 %7/%8/%9 和 include 是否加载成功,不执行真实刷写。下面这段 bash 可以放在工程根目录,用来快速核对关键文件是否齐全:
# 刷写前的最小检查:只查文件,不碰硬件 ROOT="c:/prof/Install" for f in main.prm common1.pri config_func.cnf config_phys.cnf layout; do [ -f "$ROOT/$f" ] || echo "missing: $f" done # 打印 Action 命令行相关 include,确认 %7/%8 对应的 .pri 存在 grep -n '#include "%[78]\.pri"' "$ROOT/main.prm"ROOT换成实际安装目录,for列表按工程依赖增删;grep用来提醒你 %7/%8 是动态文件名,必须结合 Action 命令行确认。回归表里再加一列“实际加载的 .pri”,每次改完 Action 就填一次,三次都对得上再动硬件。
6.3 安全文件检查不要留到最后一刻
安全文件(如SecurityFile=seedms6.dll)和 install.ini 的路径检查要放在刷写前,不要等流程走到安全访问才报错。我一般把 install.ini 的 [Files]、[LanguageFiles] 和 .cnf 的通信参数做成一张启动前检查表,和回归表放在一起。换电脑、换安装目录、升级工程包之后,先跑文件检查,再跑空流程,最后才做真实刷写。从那以后我每次改 Action 命令行,都先把 %7/%8/%9 打印一遍再刷。希望帮到你。
本文还有配套的精品资源,点击获取