转自:https://blog.csdn.net/weixin_44536482/article/details/93911832
1、操作步骤
在CANoe中对节点的编程是通过CAPL(Communication Access Programming Laguage)语言进行的。但如果是我们之前已经完成的功能模块,并且想在CAPL中进行调用时,可以在固定模板上按照固定格式添加自己想要被调用的函数,生成可被CAPL调用的dll文件;再在CAPL编程界面下的”includes”中,通过”#pragma library”指令导入我们前面生成的dll文件;此时就可以直接对dll文件中的接口函数进行调用了。具体操作步骤如下:
(1)、生成dll的工程模板在我们安装CANoe时就自动生成了,以Win 7系统、9.0版本的CANoe为例,该工程路径如下:
C:\Users\Public\Documents\Vector\CANoe\9.0\CANoe Sample Configurations\Programming\CAPLdll\VS 2005 Project
(2)、打开工程,将自己想要被调用的接口函数的定义及声明写入到”capldll.cpp”这个文件中;
(3)、按照固定格式在”capldll.cpp”文件的”table”结构体数组中加入我们新增的接口函数描述;格式如下:
typedef struct CAPL_DLL_INFO4{
char cdlName[MAX_CDL_NAME2]; // 在CAPL中调用时显示的函数名
CAPL_FARCALL adr; // 函数地址,即vs工程中函数定义时的函数名
const char* categoryName; // 函数在CAPL中的所属目录,可以用于对函数的分类
const char* hintText; // 对该函数功能的描述介绍(在CAPL中显示)
char resultType; // 函数的返回值类型,用CAPL中的类型的首字母大写去表示
int parCount; // 函数的参数个数
char parTypes[MAXCAPLFUNCPARS_8_1]; // 函数的参数类型,用CAPL中的类型的首字母大写去表示
unsigned char array[MAXCAPLFUNCPARS_8_1]; // 函数的参数是否是数组:\001表示是数组;\000表示不是数组。默认则为\000
const char* parNames[MAXCAPLFUNCPARS_8_1]; // 函数显示的参数名(在CAPL中的声明介绍时)
} CAPL_DLL_INFO4;
Ps:关于"resultType"(返回值的类型)、“parTypes[MAXCAPLFUNCPARS_8_1]”(参数的类型),这两个参数是以CAPL中数据类型的首字母大写来表示的;注意应与函数定义时的返回值类型、参数类型保持一致;否则该工程生成的dll文件在CAPL中是不能使用的。关于这两个参数可选的值如下(即CAPL中的数据类型):
符号 | 代表的类型 | 描述 |
---|---|---|
V | Void | 空类型 |
B | byte | 1字节的无符号整数 |
W | word | 2字节的无符号整数 |
D | dword | 4字节的无符号整数 |
I | int | 2字节的有符号整数 |
L | long | 4字节的有符号整数 |
C | char | 1字节的字符 |
F | float | 8字节的浮点数 |
(4)、将生成的dll文件拷贝到当前CANoe工程路径下,打开CANoe工程中”Simulation Setup”界面下节点的CAPL程序界面
(5)、在CAPL编程界面下的”includes”中,通过如下指令导入我们刚刚生成的dll文件(”capldll.dll”);并进行编译保存
#pragma library("./capldll.dll") //"./capldll.dll"表示当前路径下的"capldll.dll"这个文件
(6)、此时在右边的”CAPL Functions" 显示栏下就会出现”capldll.dll”这一列;我们在第三点的操作中添加在table数组中的接口函数都会在这里显示出来。之后,我们就可以直接在CAPL中调用这些函数接口了(需要注意CAPL中没有指针,所以关于指针部分的使用都是定义为数组去操作的)
2、示例
(1)、假设我们要在CAPL中调用的函数接口如下:
int ChangeGb2312ToUtf8(
char* NameOfGB2312,
char* NameOfUtf8,
unsigned int * LengthOfName,
unsigned int * NumOfMessage)
(2)、我们在"capldll.cpp"这个文件中对其进行定义及声明;并将其按照如下格式在"table"数组中添加为接口函数
{ "dllChangeGb2312ToUtf8", (CAPL_FARCALL)ChangeGb2312ToUtf8, "CAPL_DLL", "This function will Change GB2312 to Utf8", 'L', 4, "CCWW", "\001\001\001\001", { "NameOfGB2312", "NameOfUtf8", "LengthOfName1", "NumOfMessage1" } },
(3)、编译生成dll文件,在CAPL编程中将该dll导入,此时可以看到其生成的函数接口介绍如下:
(4)、此时可以直接在CAPL中对这个接口函数进行调用了,例如:
char NameOfGB2312[500];
char NameOfUtf8[768];
word LengthOfName[1];
word NumOfMessage[1];
byte Res;