C语言编写CAPLdll

时间:2021-08-20 00:00:48

CANoe是一个强大的总线仿真工具,通过CAPL语言可以实现较为复杂的ECU内部逻辑,有效仿真总线网络。但是在使用的时候经常会碰到CAPL库函数不够用的情况,比如需要用到AES加密时,CAPL没有对应函数,而又没有现成的CAPL加密代码。这时就需要编写一个CAPL dll文件,调用外部代码。本文介绍通过Visual Studio编译c代码生成CAPL dll

首先在CANoe的文档路径下可以找到一个CAPLdll的示例工程,直接在此基础上修改即可,我这里是存在C盘下:

C:\Users\Public\Documents\Vector\CANoe\8.5(x64)\CANoe Sample Configurations\Programming\CAPLdll\VS 2005 Project。打开sln文件,由于示例是2005版本,如果使用高版本需要进行单向升级,我使用2013版,升级后可以使用。

        如图所示,这个capldll.cpp就是需要修改的文件,这是一个c++工程,如果需要使用.c文件,只需在#include前后加上externa “C”{}即可正常编译。

C语言编写CAPLdll

    接下来就是加入自己的代码文件。为了制作AES加密库函数,我使用了embedTLS中的AES加密文件,加入工程即可。

C语言编写CAPLdll




找到下面这个table,这里定义了所有要导出的函数。由于是示例工程,原来就有不少定义的函数,大多都是简单的加法,导入导出数据等,看懂后可以删掉其中示例部分,添加自己的导出函数。编写规则大致如下:


C语言编写CAPLdll

    其中Llong Vvoid B为数组,Dint,输入变量有几个就写几个字母。如果有数组,则倒数第二个参数不能为空,要写"\001"(只有一个数组作为输入变量),如果除了数组外,还有一个长度参数,则要写"\000\001",以表示第一个不是数组,如果有三个变量则要写三个,以此类推。

    接下来就是在工程中完成要输出的函数主体。比方我刚刚在输出列表里添加了一个叫做Loadkey的函数,它有一个字节数组作为输入量,一个long作为返回值。添加函数如下:

longCAPLEXPORTfarCAPLPASCAL LoadEncKey(unsignedchardataBlock[])

{

   int i;

   for (i = 0; i < 16; i++)

   {

       enckey[i]=dataBlock[i];

   }

   mbedtls_aes_setkey_enc(&aes,enckey, 128);// set encrypt key

 

   FILE *fp = fopen("d:\\info.txt","a");

   fprintf(fp,"The Encrypt key is: ");

   for (i = 0; i < 16; i++)

       fprintf(fp,"0x%x ", enckey[i]);

   fprintf(fp,"\n");

   fclose(fp);

   return (0);

}



当添加完所有要输出的函数后,即可编译。编译生成的新dlldebug文件夹下,叫做capldll.dll。将其复制到CANoe安装目录下Exec32文件夹下。在CAPL编辑界面下添加include


includes


{


 #pragma library("D:\CANoe8.5\Exec32\capldll.dll")


}


保存后即可发现右边函数栏多了一个CAPLdll文件,里面有刚才编译好的函数。尽情享用吧J~


C语言编写CAPLdll