一、首先INCA软件是当前主流标定开发软件之一,尤其在动力系统控制器的标定中应用非常广泛;ProF编程脚本是INCA软件提供各种实用功能之一,使用者可根据需求编写ProF脚本对ECU闪存编程等各种自定义操作。
二、然而ProF脚本语言在ETAS的官网或其他网络上并没有专门的使用教程,通常只有ETAS技术支持人员提供的ProF Documentation文档,然而该文档仅涉及ProF语言的函数的使用说明,没有从全局的框架上介绍ProF脚本的层次结构。
三、本人编写整理了ProF脚本语言编写教程,尽自己的绵薄之力与各位共享(若有错误敬请指正)
1、ProF脚本(安装包)架构
ProF安装包结构
profe文件夹
prof文件夹
2、install.ini文件说明, install文件是标准的INI文件格式,定义了ProF安装包的信息(包括ProF名称、版本、文件集内容等)
2.1 [Configuration] ProF配置信息定义
[Configuration]
Name=TC_Prof_XXX
Version=0301
Description="Software download for XXX Project."
2.2 [ChangePath_XX] 需要变更路径的文件及变更内容(后面章节将说明该属性的作用)
File = layout 需要变更路径的文件定义
ConfigPath = c:\$prof\Install 变更的路径定义
[ChangePath_Install]
File=layout
ConfigPath=c:\$prof\Install
[ChangePath_Common.PRI]
File=common1.pri
ConfigPath=c:\$prof\Install
EmptyPath=c:\$prof\
SecurityPath=c:\$security
2.3 [Files] prof文件夹内的文件定义
[Files]
SecurityFile=seedms6.dll
2.4 [LanguageFiles] profe文件夹内的文件定义
[LanguageFiles]
File=info.txt
LayoutFile=layout
File=config_func.cnf
File=config_phys.cnf
File=main.prm
File=common1.pri
...
3、*.cnf文件 定义了ProF脚本操作对象控制器协议的基础信息,它的格式在ProF Documentation文档中有严格的定义。主要包括通信速率、控制器ID、Memory_layout,Checksum计算方式等信息
举例:
*****************************************************************************
***** Configuration Software download for xxx access *****
*****************************************************************************
;
ECU_ADDR:, 0x7C; ; address of ECU
PROJECT_NAME:, Software download for xxx
PROG_ST_ADDR:, 0xF1; ; address of tester on K-Line
;
PENDING_TIMEOUT:, 5000; ; timeout value for 'pending response'
;
; ; V_Prog = (Vpp * MAX) / 4096
; 0 Volt 5 Volt 12 Volt 16 Volt frei
SSC_UPROG_VALUES:, 0x0000, 0x02bc, 0x0690, 0x08c0, 0x0000;
;
; ; timing parameter for stimulation
; Index p1Max p2Min p2Max p3Min p3Max p4Min
;
;KWP2000_TP:, 1, 0x0014, 0x0000, 0x0032, 0x0037, 0x1388, 0x0000;
;
; timing parameter for maximum speed
;
;
; ; parameter for key71 stimulation
; baud w1 w2 w3 w4Min w4Max w5
;KWP2000_STP:, 0x14, 0x1e, 0xc8, 0xc8, 0x19, 0x32, 0x1e;
;
; ; parameter for KWP2000 stimulation
; Index tiniL wuP reizLtg reiztyp
KWP2000_SP:, 1, 0x0019, 0x0032, 0x00, 0x81;
;
; Index Baudrate i k ; some baud rates for this ECU
;HIGH_BDR:, 1, 500000, 0, 20;
;
DIAG_MODE:, 0x02; ; xx Flash programming
;
; index count data
SECURITY_ACCESS_MODE:, 1, 1, 0x05; ; SLD security access mode
;
; Routine no. Code for RNC Result flag
;
; no. of loc. routine for erasing Flash
LOC_ROUTINE_ERASE:, 0xFF00, 0x21, 0x01; ;direct result
;
; no. of loc. routine for checksum calculation
LOC_ROUTINE_CHK:, 0xFF01, 0x23, 0x01; ;direct result
;
VERIFY_METHOD:, 0x02; ; code for CRC32
;
CHECKSUM_RESULT_INVERSION:, 0x01 ; activate checksum inversion
;
ADDRESS_AND_LENGTH_FORMAT_IDENTIFIER:, 0x44; general setting
AALFI_FOR_CHECKSUM_CALCULATION:, 0x44;
AALFI_FOR_WRITE_MEMORY_BY_ADDR:, 0x33;
AALFI_FOR_READ_MEMORY_BY_ADDR:, 0x33;
AALFI_FOR_DYNAMICALLY_DEFINE_DATA_ID:, 0x33;
AALFI_FOR_REQUEST_DOWNLOAD:, 0x44;
DATA_FORMAT_IDENTIFIER:, 0x00;
;
;
MAX_LENGTH:, 0xfc; ; Patch for maximum length of transfer
;
;
ERASE_MEM_AREA:, 1, 0x00, 0x00, 0x100000L, 0x13FFFFL; Data section
ERASE_MEM_AREA:, 2, 0x00, 0x00, 0x020100L, 0x0FFFFFL; APPL
;
;CAN
;===
;
ECU_TO_INCA_CAN_ID:, 0x000007xx;
;TGT_INCA:, 0xE1; EXTENDED ADDRESS
INCA_TO_ECU_CAN_ID:, 0x000007xx;
;TGT_ECU:, 0xE9; EXTENDED ADDRESS
;
4、layout文件 ProF界面设置文件。这里是最蛋疼的地方(ETAS完全没有说明,只能穷举的方式进行尝试,很多数字都不知道具体含义)
3 1 1 "#File name: " 1 1 1 1 1
"*.HEX"
2 1 1 "#Channel: " 1 1 1 1 2
"CAN_HS" "1"
"CAN_MS" "1"
2 1 1 "#Action: " 1 1 1 1 4
"Read Identification" "ident noconv c:\$prof\Install\main.prm"
"Download - Application Code, Data" "prog_app_data convert c:\$prof\Install\main.prm"
"Download - Application Code" "prog_app convert c:\$prof\Install\main.prm"
"Download - Application Data" "prog_data convert c:\$prof\Install\main.prm"
选项1: 当取值是3时,表示此参数采用按键(button)方式选择一个参数,如File name选项所示
当取值是2时,表示此参数采用下来选项方式选择一个参数,如Channel选项所示
选项2:当选项1等于2时,选项2的值表示下拉栏中有多少个选择项
* 当然上述界面仅在进行Action = Flash programming时有效
5、*.prm文件和*.pri文件说明:
一个ProF脚本文件只有一个.prm文件,它类似C语言中的main函数; 而一个ProF脚本文件却可以有一个或者多个.pri文件,它类似C语言中的子函数。
举例:
;%
;% <conv>: hex file conversion
;% convert = convert
;% noconv = do not convert
;%========================================================================
#include "define.pri"
#include "error_mess.pri"
#include "%7.pri"
#include "%8.pri"
;----------------------------------------------------------------------------
; Main programm
;----------------------------------------------------------------------------
[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]
5.1 上述主流程描述文件大体上逐步按照每个[Section] ...[Section_END] 之上而下执行。在每个[Section]内部会根据上一个函数的执行结果来判断下一步跳转的位置
执行INIT_FLASH_PROGRAMMING(ECU_ADDRESS,1,CONFIG"phys.cnf") 成功时TRUE,
则执行INIT_USB,否则执行DSP_ERROR
5.2 执行子流程文件(子函数)
当prm文件中调用子流程时,CALL ( programECUFlash ) ,ProF脚本会自动跳转到对应的xxx.pri文件中执行对应的procedure ,
以下是prog_app_data.pri文件中procedure programECUFlash 子函数/流程的定义
procedure programECUFlash
{
[INFO]
SHOW_PROGRAMMING_INFO (1,"%1."EXT,1)
case TRUE : start
default : $return
[INFO_END]
#include "flash.pri" ; common routines
[erase]
DISPLAY_MESSAGE("", FALSE)
DISPLAY_MESSAGE("Erasure of Code area in the TCU Flash ", FALSE)
UDSX_ERASE_MEMORY_FORMAT(2, FMT_AALFI, FMT_START_ADDR, FMT_MEM_LEN, 50000)
case FPA_ACK : erase_success
default : $return FALSE
[erase_END]
[erase_success]
DISPLAY_MESSAGE ("Erase of Code area successfully completed. ",GREEN_FALSE)
default : prog
[erase_success_END]
6、重点/难点说明
大家都知道在进行控制器的刷新操作时,可以选择刷新的区域;或者可以选择进行读取控制器信息的操作。那样的话 我们该怎么样对不同的操作需求进行跳转流程控制呢?
6.1 返回查看layout文件,其实当选择不同的Action时,ProF会传递不同的参数进入主流程描述文件中,例如当我们选择
"Download - Application Code, Data" "prog_app_data convert c:\$prof\Install\main.prm"时
实际上传递了多个参数到prm文件,根据空格符号进行区分。
- prog_app_data(参数7)
- convert (参数8)
- c:\$prof\Install\main.prm(参数9) 关于[ c:\$prof\Install ]后续与变更路径一起
6.2 再次返回prm文件,在#include "%7.pri" #include "%8.pri" 表示载入参数7名 和 参数8名对应的文件
#include "%7.pri" == #include "prog_app_data.pri"
#include "%8.pri" == #include "convert.pri"
在ProF文件夹中编写多个不同名字的.pri文件, 实际主流程描述文件根据用户在Action的选择,而选择了对应文件的xxx.pri子流程文件来执行。当用户选择了"Download - Application Code, Data" "prog_app_data convert c:\$prof\Install\main.prm"时
实际等价于选择了 main.prm , convert.pri, prog_app_data.pri
6.3 细心的同学会发现,我展示的layout文件略有差异:差异之处在于 参数9中的地址:
ProF安装包中layout文件,地址是相对地址
ProF安装安装到本机后文件,变成了电脑中ETAS数据文件夹(ETASDATA)所在的地址
这里就是之前 2.2 章节中提及的 install.ini 安装文件[ChangePath]属性作用,实际上INCA在安装ProF脚本的过程中会自动将install.ini [Files][LanguageFiles] 里面的文件全部复制到INCA指定的目录中。
而后INCA会根据[ChangePath_XX]里面的信息,变更里面指定文件File = XX
指定配置路径的ConfigPath = XX 全部转换成安装后的实际路径
当然也而已采用类似swith语句的方式实现以上操作。
四、总结
ProF脚本还可以调用基于windows的控制台*.exe文件或.dll文件,实现更多扩展功能。各位可参照ProF Documentation文档进行开发。本文基于个人有限的经验整理而得,若有错误敬请指正。