在2026年,CANoe迎来了它的30周年。在这个重要节点,我们整理了一系列由一线专家团队沉淀的技术经验,希望帮助您在实际项目中更高效地发挥CANoe的能力。每一个主题,都对应一个CANoe的具体功能或典型工作流程,助您解决开发中的实际挑战,优化使用方式,并带来可感知的效率提升。
摘要
在CANoe使用过程中,通常需要在多个仿真或测试程序之间进行内部通信。vCDL(Vector Communication Description Language)为此提供一种结构化的解决方案:通过定义接口,可以在不同程序之间建立清晰的函数调用关系,从而实现更加灵活、可维护的交互机制。相比传统方式,vCDL不仅提升通信能力,也让跨模块协同更加清晰和高效。
能做什么?
能解决什么问题?
CANoe工程可以包含多个不同类型的程序,例如:测试、仿真节点、应用模型。虽然这些程序在结构上是独立的,但在实际工程中,它们之间往往需要交互数据。
例如:
测试脚本需要控制模型切换不同的模式
模型需要根据测试指令动态提供或调整数据
使用CAPL编写的模型,借助C#编写的辅助应用模型完成后台任务
使用Python编写的模型,通过CAPL编写的辅助应用模型访问底层总线
测试脚本需要触发仿真节点中的特定功能(如IL故障注入)
在很多情况下,这类通信可以通过系统变量实现。但对于更为复杂的交互逻辑,除了可以使用基于“数据传递”的通信方式,vCDL还提供一种更强大的机制:可以在vCDL中声明函数接口,然后在某一个程序中实现这些函数,并在其他程序中直接调用这些函数。
如何在CANoe中找到此功能?
如何开始使用?
1.创建vCDL
打开Simulation → Communication Setup后,在Data Sources中选择New Data Source,即可创建vCDL文件作为数据源。这个文件将作为接口定义的统一入口,用于描述不同程序之间的交互方式。

2.声明内部方法
创建的vCDL文件中,默认包含一个命名空间(namespace),可用于逻辑分组和隔离,以便在存在相互引用时进行明确的分类。可以在其中定义数据类型、接口、对象等。
之后,可以定义一个对象(object),并在其中声明内部方法(internal method),用于后续的函数调用。

接口定义中,可以使用vCDL支持的各种数据类型作为参数或返回值,例如:
字符串(string)
枚举(enum)
列表(list)
结构体(struct)
这使得接口不仅可以传递简单数据,也能够描述更复杂的交互场景。
3.实现函数
vCDL本身只负责“声明接口”,接口定义完成后,需要在具体程序中对这些方法进行实现,真正的函数逻辑可以在不同语言中完成,例如CAPL、C#或Python。
以下是在CAPL中实现的示例,在调用该函数时会在Write窗口打印当前mode,并将返回值设为0:

4.调用函数
实现函数之后,在其他编程语言编写的应用程序中都可以调用该函数。
以下是在C#中调用的示例,为函数传入参数1,并将返回值存储在变量result中:

除同步调用外,还可以将Call替换为CallAsync来实现异步调用。调用方无需阻塞等待结果,可以在后续主动等待返回值,或通过额外的事件处理机制来接收结果,这种方式在涉及耗时操作或并行处理时,会更加灵活。
5.观测函数
CANoe还提供一个非常实用的功能:可以在Trace窗口中观测函数。
在函数被调用时,会触发Trace窗口中的显示,可以直接观测函数的传入参数、返回值等。这使得跨程序的函数调用可以像总线报文一样进行跟踪和调试,大大提升问题定位的效率。

-
程序
+关注
关注
117文章
3849浏览量
85472 -
CANoe
+关注
关注
4文章
88浏览量
9907 -
调用函数
+关注
关注
0文章
12浏览量
2496
原文标题:CANoe Tips | 使用vCDL在程序间调用函数
文章出处:【微信号:VectorChina,微信公众号:Vector维克多】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
如何查看及更改函数/函数块的调用环境
高效的C编程之函数调用
使用vCDL在程序间调用函数
评论