使用vCDL在程序间调用函数

描述

在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窗口中的显示,可以直接观测函数的传入参数、返回值等。这使得跨程序的函数调用可以像总线报文一样进行跟踪和调试,大大提升问题定位的效率。

程序

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分