目录
一、基础介绍
二、vCDL介绍
1、vCDL工程创建
2、 vCDL编辑器关键字介绍
3、创建命名空间Datatype
接口示例
4、创建命名空间ICalculate
5、创建命名空间Participants
一、基础介绍
SomeIP作为车载以太网一个重要的组成部分,因为它的测试也是我们作为总线测试工程师一定要攻克的一个重要知识点;CANoe中主要在simulation setup和communication setup中实现SomeIP通信的方式;并且支持多种格式的数据导入,例如:arxml、vCDL、vCODM等多种数据格式,本篇文章主要介绍VCDL实现SomeIP数据格式。
vCDL 是 Vector Communication Description Language 的首字母缩写,用于描述 CANoe 中的通信对象,是 Vector 推荐使用的一种语言。
vCODM 是 Vector Communication Data Model 的首字母缩写, 该类型文件伴随着 CANoe工程一起自动生成,可以使用 Model Editor 编辑。
二、vCDL介绍
1、vCDL工程创建
Tools -> vCDL Editor -> Vector Tools Environment
作为一个测试工程师基本都是使用Vector自带的这个vCDL编辑工具,不过据说也是有其他的vCDL文件编辑工具,大家可以根据自己的需求选择编辑工具。
2、 vCDL编辑器关键字介绍
Element | Font | Example |
Keyword | Blue monospace | service |
Data Type | Dark blue monospace | uint16 |
String Literal | Dark red monospace | "string" |
Numeric Literal | Orange monospace | 2.0e-10 |
Comment | Green monospace | //comment |
Attribute Key | Gray monospace,italics | unit |
Binding Namespace | Gray monospace,italics | Abstract |
Encoding Formula Variable | Brown monospace,italics | x |
Separators | Black monospace | .: |
Operators | Black monospace | +-*/ |
Brackets | Black monospace | {}()<> |
Identifiers | Black monospace | Engine |
3、创建命名空间Datatype
1)使用namespace关键字声明一个命名空间
2)复用结构体StateType和接口ServiceInterface归属在同一命名空间Datatype
3)声明结构体采用关键字struct,定义4个变量基础数据
接口示例
//DataTypes下包含结构体 (struct) 和接口 (terface)
namespace DataTypes
{//关键字struct声明结构体stateTypestruct stateType{//结构体stateType由4个int32的数据组成dword AddCount;int64 SubstractCount;int32 MultiplyCount;int32 DivideCount;}//关键字interface接口,定义服务接口interface ServiceInterface{//关键字event声明事件,事件env的数据类型是结构体stateTypeevent StateType env;//关键字field声明字段,字段F1d的数据类型是uint32field uint32 Fld://定义method方法,采用定义函数的方式声明了Add,Substract,Multiply,Divide//函数内in表示输入参数,out表示输出,不指定in/out则默认是invoid Add(int32 operand1, int32 operand2, out float result);void Substract(int32 operand1, int32 operand2, out float result);void Multiply(int32 operand1, int32 operand2, out float result);void Divide(int32 operand1, int32 operand2, out float result);}
}
4、创建命名空间ICalculate
1)使用namespace关键字声明一个命名空间,用于指定服务的命名空间
2)服务 Calculate 采用 service 关键字声明,必由服务接口实现,并指向 Datatypes 中的接口ServiceInterface。
3)服务中需要提供通信端点的信息,通信端点采用关键字 provider 和 consumer 声明,即服务的提供者和消费者。 此示例中, 服务 Calculate 的提供者和消费者分别为 server 和 client。
4)服务 Calculate 使用 refine 关键字引用接口 ServiceInterface 中的事件、字段和方法,事件组采用关键字 eventgroup 定义, 此处定义 env 和 fld 为同一事件组。
//ICalculate下包含服务
namespace ICalculate
{//[]的内容用于定义属性,此处声明了服务的属性version为0.1和serviceID为1666[version=0.1, serviceId=1666]//关键字service声明服务Calculate,Calculate使用冒号指向使用的服务接口service Calculate:DataTypes::ServiceInterface{//关键字provider声明服务的提供者 (名为server),并以[]声明server的IP端口信息[simulated=true,udpEndpoint="192.168.1.1:40000",multicastEndpoint="224.0.0,22:40000",sdMulticastEndooint="239,0.0,1:30490", mac="20:00:00:00:00:00", instanceId=1]provider server;//关键字consumer声明服务的消费者 (名为client),其订阅的事件组名为envGrp1, clientid=1[simulated=true subscribedEventGroups=envGrpl, udpEndpoint="192,168,1,10:40001",multicastEndpoint="224.0.0.22:40001", mac="20:00:00:00:00:01", sdMulticastEndpoint="239.0.0.1:30490",clientId=1]consumer client;//关键字refine可以引用对象或者端点,此处引用函数原型,并赋予methodId的属性refine Add[methodId = 201]:refine Substract[methodid = 202]:refine Multiply[methodid = 203];refine Divide[methodId = 204];//引|用事件env,设置属性eventID为101,引用字段Fld,设置对应的ID属性refine env [eventId=101];refine Fld [getterId =301,setterId=302,eventId=303];//关键字binding将通信对象绑定到SOME/IPbinding SOMEIP{//关键字eventgroup用于定义事件组,此处定义groupId厘性为17的envGrp1事件组,包含env和Fld[groupId=17,multicastThreshold=5]eventgroup envGrp1 = env,Fld;}}
}
5、创建命名空间Participants
1)使用namespace关键字声明一个命名空间,关键字participant 声明, 包含一个或多个通信端点。
2)示例创建名为 Consumer 和 Provider 的参与者, 分别引用来自 ICalculate 下服务 Calculate 的通信端点 client 和 server。
//Participants (namespace) 组下包含Consumer和Provider (participant) 的参与者
namespace Participants
{//关键字participant参与者,用于声明参与者,对ECU或SWC的通信端点进行分组//此处声明名为Consumer和Provider的参与者participant Consumer{//Consumer包含端点clientICalculate::Calculate.client}participant Provider{//Provider包含端点serverICalculate::Calculate.server}
}
以上对于vCDL进行简单的介绍,如果需要更进一步了解,大家可以评论区讨论!!!