既然是换个方式,那我们先看下之前是怎么在CANoe中进行SOA仿真的。

在车载以太网和SOME/IP兴起之前,我们若想要在CANoe中仿真传统CAN /LIN总线,首先会在CANoe Simulation Setup中新建总线和仿真节点,随后依次添加Database、交互层dll文件、CAPL文件、设计Panel面板和交互的系统变量等,配置全部完成后,就可以在CAPL中开始访问各类对象实现目标功能了(参考《总线仿真,还可以这样玩!》)。放张图帮助大家理解。
现在,假设我们要用同样的方法去实现SOA仿真,是不是把数据库换成SOME/IP的ARXML(或者FIBEX)数据库并加载SOMEIP_IL.dll就可以了呢?答案是一定的。但是Hold的住吗?Hold不住,此种方式下,Consumer和Provider的概念如何体现?中间件的概念、松耦合的概念如何体现?复杂数据类型又如何实现?数据库修改又该如何操作?

在这种情况下,新的方式/方法必将诞生。
咱们首先从概念层面来看下“升级后”的需求变化。

图片来源:Vector
在这些概念变换Database >> Data Source、ECU/Node >> Participants、Frame/PDU/Signal >> Communication Object(CO) 、Interaction layer(IL) >> Binding中,前者是传统概念,后者是SOA中的新兴概念。这些新概念都在Communication Setup中进行了体现,包括Endpoint概念。
通过上图,我们能看出需求的变化。
ok,铺垫了这么久,终于要上干货了!

vCDL:全称叫Vector Communication Description Language。顾名思义,vCDL是Vector提供的一种对SOA通信进行描述的语言,通过vCDL可以编写后缀为.vCDL的Data Source来代替ARXML用在CANoe仿真中。
接下来,重点来咯!我们将通过三步曲来换个方式进行SOA仿真:Data Source导入/设计/修改 >> 仿真配置和程序设计 >> 仿真结果分析。

“设计”的话,我们通过vCDL来实现。
写vCDL需要文本文档编辑器,推荐使用Notepad++,并按照下图导入vCDL的自定义语言格式(https://zdrv.com.cn/3JaVIb)。

篇幅原因,小编无法详细讲解vCDL的语法,大家可以浏览下Help文档中对vCDL的语法描述,和小编一起研究。Help路径在此:
下面小编简单介绍下vCDL内容结构,给大家抛砖引玉。Vector也提供了Demo给大家,CANoe 11.0之后版本的用户在自带Demo工程SOA文件夹下可以找到。
如上图,vCDL文件中主要有三个命名空间,分别为Participants、Services和DataTypes。
在Participants下面这样去定义,表明几个participant和其关联的service。
然后在DataTypes下面这样去定义一系列datatype。比如服务接口:
比如一些编解码方式,[attribute]里面定义的是一些属性。
看到这里是否有疑问?为什么没有服务IP和ID的信息呀?这个其实也是可以设计的,大家可以在Help文档中vCDL语法介绍的SOME/IP Binding目录下找到编写规则,如下图。

图片来源:Vector
目前来说,建议大家暂时先做纯抽象层的SOA仿真,如下图是纯抽象层仿真的示意图,不带以太网应用层以下的协议内容。后期小编再给大家分享带以太网应用层以下参数的仿真方法。

图片来源:Vector
对于DataSource的“修改”工作,包括vCDL和ARXML,这里分享个强大的工具,叫Communication Object Editor,大家可以在这里修改各类通信对象。
但是要注意的是,Communication Object Editor不会将vCDL或者ARXML的源文件改掉,而是通过在工程中附加***.vCODM的描述文件来实现的修改,这些文件可以在_COData_***文件夹中可以找到。所以只能是工程中修改工程中使用哦。
在讲这一步之前,先要给大家看下在Communication Setup中通过C#仿真的基本框架。
我们使用C#将仿真程序写在Application Model中,其他的交互经由dll文件实现访问。那么现在可以思考一个问题。我们是不是可以像IT行业一样在Visual Studio中去写仿真程序,使用C#通过调用dll就可以完成应用程序的设计了?Yes,确实是这样做的,我们在Visual Studio中将仿真程序写好,编译通过,然后将cs文件加载到Communication Setup中就可以了。这个时候,程序员只关心程序的实现,而无需关心数据具体从哪里来到哪里去,只关心程序需要提供什么服务,消费什么服务,然后通过dll中的接口进行调用即可。
那么怎么做呢?大家可以先参考小编总结的一个设计流程(如下图),先完成基本的仿真配置,再进行程序的设计。
注意上图中空的C#文件不是随便新建就可以,那么从哪里来?小编建议使用Vector的Demo工程(如下图),通过ApplicationModels.sln去部署C#程序。将其编译通过后添加进去,按右边的拖拽操作之后,系统变量和Data Source就自动在工程文件夹中转化为dll了,在Visual Studio工程中引用它们就可以了。
这个工程有调用CANoe PostCompiler来对C#文件进行编译校验。
打开这个解决方案(如下图),会看到引用结构中有各类dll,包括CANoe的内核、系统变量、DataSource等。
在这里,小编要灵魂发问一下:如果我要用protobuf编解码方法或者json来序列化和反序列化一个服务的payload,该怎么做呢?
——其实直接加protobuf或者json的C#的源文件或者dll就可以啦。

那么下面就分享C#编程SOA的一些方法,供大家参考:
然后再分享一个CANoe.Net编程的Demo,可以用来做按键控制和打印调试。
E.g,检测一个Key事件,并调用Write函数打印信息到CANoe Write窗口
[OnKey('g’)]
public void get_field_1(char ch)
{
Output.WriteLine(“get field_1 value”); //Write函数,
}
更多.Net编程的方法参考Help,Help在此:
同样的,我们还可以做Event和Field的验证。比如下图通过Panel更改Event的值,然后触发通知给Cosumer。
Field的验证通过Setter远程更改Provider的Field1的值,然后通过Getter去查询这个值是否被更改。

好啦,今天的分享就到这里啦,主要是纯抽象层的一些数据验证和通信交互SOA仿真,后续会给大家分享完整的带以太网全协议层参数的通信交互仿真(例如下图)。
ps:最后给大家预告一下,Vector即将发布CANoe 13.0,相信会给我们带来更大的惊喜,尤其SOA仿真方向,所谓工欲善其事,必先利其器,这种新的SOA仿真方式一定会极大的降低大家进行SOA仿真的复杂度,提升工作效率。

相关精彩推荐:


