一、首先INCA软件是当前主流标定开发软件之一,尤其在动力系统控制器的标定中应用非常广泛;ProF编程脚本是INCA软件提供各种实用功能之一,使用者可根据需求编写ProF脚本对ECU闪存编程等各种自定义操作。

livenessProbe 脚本 incampro脚本教程_Code


二、然而ProF脚本语言在ETAS的官网或其他网络上并没有专门的使用教程,通常只有ETAS技术支持人员提供的ProF Documentation文档,然而该文档仅涉及ProF语言的函数的使用说明,没有从全局的框架上介绍ProF脚本的层次结构。

livenessProbe 脚本 incampro脚本教程_#include_02

   

livenessProbe 脚本 incampro脚本教程_Data_03


三、本人编写整理了ProF脚本语言编写教程,尽自己的绵薄之力与各位共享(若有错误敬请指正)

1、ProF脚本(安装包)架构

livenessProbe 脚本 incampro脚本教程_#include_04

ProF安装包结构

livenessProbe 脚本 incampro脚本教程_#include_05

profe文件夹

livenessProbe 脚本 incampro脚本教程_Data_06

prof文件夹

livenessProbe 脚本 incampro脚本教程_livenessProbe 脚本_07

2、install.ini文件说明,  install文件是标准的INI文件格式,定义了ProF安装包的信息(包括ProF名称、版本、文件集内容等)

livenessProbe 脚本 incampro脚本教程_livenessProbe 脚本_08

2.1 [Configuration]  ProF配置信息定义

[Configuration]
Name=TC_Prof_XXX
Version=0301
Description="Software download for XXX Project."

livenessProbe 脚本 incampro脚本教程_Code_09

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计算方式等信息

livenessProbe 脚本 incampro脚本教程_livenessProbe 脚本_10

举例:

*****************************************************************************
***** 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"

livenessProbe 脚本 incampro脚本教程_Data_11

选项1: 当取值是3时,表示此参数采用按键(button)方式选择一个参数,如File name选项所示

              当取值是2时,表示此参数采用下来选项方式选择一个参数,如Channel选项所示

选项2:当选项1等于2时,选项2的值表示下拉栏中有多少个选择项

livenessProbe 脚本 incampro脚本教程_Code_12

* 当然上述界面仅在进行Action = Flash programming时有效

livenessProbe 脚本 incampro脚本教程_#include_13

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]内部会根据上一个函数的执行结果来判断下一步跳转的位置

livenessProbe 脚本 incampro脚本教程_#include_14

执行INIT_FLASH_PROGRAMMING(ECU_ADDRESS,1,CONFIG"phys.cnf") 成功时TRUE,

则执行INIT_USB,否则执行DSP_ERROR

5.2  执行子流程文件(子函数) 

livenessProbe 脚本 incampro脚本教程_Data_15

当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、重点/难点说明

大家都知道在进行控制器的刷新操作时,可以选择刷新的区域;或者可以选择进行读取控制器信息的操作。那样的话 我们该怎么样对不同的操作需求进行跳转流程控制呢?

livenessProbe 脚本 incampro脚本教程_#include_16

6.1 返回查看layout文件,其实当选择不同的Action时,ProF会传递不同的参数进入主流程描述文件中,例如当我们选择

"Download - Application Code, Data"          "prog_app_data convert c:\$prof\Install\main.prm"时

livenessProbe 脚本 incampro脚本教程_Code_17

实际上传递了多个参数到prm文件,根据空格符号进行区分。

  1.   prog_app_data(参数7)
  2.   convert (参数8)
  3.   c:\$prof\Install\main.prm(参数9)    关于[ c:\$prof\Install ]后续与变更路径一起

livenessProbe 脚本 incampro脚本教程_Data_18

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"

livenessProbe 脚本 incampro脚本教程_Data_19

livenessProbe 脚本 incampro脚本教程_#include_20

在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

livenessProbe 脚本 incampro脚本教程_Data_21

6.3 细心的同学会发现,我展示的layout文件略有差异:差异之处在于 参数9中的地址:

ProF安装包中layout文件,地址是相对地址

livenessProbe 脚本 incampro脚本教程_Data_22

ProF安装安装到本机后文件,变成了电脑中ETAS数据文件夹(ETASDATA)所在的地址

livenessProbe 脚本 incampro脚本教程_livenessProbe 脚本_23

这里就是之前 2.2 章节中提及的 install.ini 安装文件[ChangePath]属性作用,实际上INCA在安装ProF脚本的过程中会自动将install.ini [Files][LanguageFiles] 里面的文件全部复制到INCA指定的目录中。

而后INCA会根据[ChangePath_XX]里面的信息,变更里面指定文件File = XX

指定配置路径的ConfigPath = XX 全部转换成安装后的实际路径

livenessProbe 脚本 incampro脚本教程_livenessProbe 脚本_24

         

livenessProbe 脚本 incampro脚本教程_Code_25

 

当然也而已采用类似swith语句的方式实现以上操作。

 

四、总结

ProF脚本还可以调用基于windows的控制台*.exe文件或.dll文件,实现更多扩展功能。各位可参照ProF Documentation文档进行开发。本文基于个人有限的经验整理而得,若有错误敬请指正。