1
仿真程序设计
在Simulation Setup模式下我们可以通过双击某一个节点进入CAPL程序设计,而在Communication Setup模式下需要在Communication Setup的System Setup窗口中通过Add File按钮将CAPL文件或者C#文件添加到Application Models中。本文将介绍CAPL仿真程序设计,关于如何使用C#开发CANoe仿真程序请移步《换个方式在CANoe中实现SOA仿真》。
添加CAPL文件到Application Models
在添加CAPL文件到Application Models之前需要为仿真工程中每一个Participant创建一个CAPL文件,可以新建一个记事本文件,对其重命名并将其后缀修改为.can。添加完CAPL文件之后点击Add File左侧的Edit File按钮会自动打开Vector CAPL Browser,这是CANoe自带的IDE,用于实现CAPL程序设计。

图 1 Application Models
将CAPL文件添加到Application Models之后需要将其分配给Participant,在Communication Setup窗口的Application Models下可以看到我们刚才添加的CAPL文件,如图2所示。单击Select Participants按钮在弹出的窗口中为我们的CAPL文件分配Participant。

图 2 为CAPL文件分配Participant
通过以上添加CAPL文件到Application Models,并将CAPL文件分配给Participant之后便可以在Vector CAPL Browser 中设计仿真程序了。
面板设计
本文之所以介绍Panel,是因为CANoe提供了一个Method请求控件,通过该控件能大大简化Method的仿真程序设计的复杂度。而且该控件使用也非常方便,只需将其从工具箱中拖拽到面板上,并在控件的Symbol属性中为其分配一个Consumer Side的Method即可。

图 3 为Method Call控件分配Method
由于小怿使用的CANoe13.0 SP2暂不支持Event控件,对于Event仿真最简单的方式是通过一个合适的控件,并将其Symbol属性关联服务提供方的Event。一旦控件内的值发生变更Server就会自动地发送这个Event到订阅了该事件所在事件组的Client。对于Event的触发还有其他很多方式,比如设置按键;关联环境变量,在CAPL中监听环境变量的值,当环境变量的值变更时会自动地发送这个Event;当然也可以设置定时器周期性地发送指定的Event。环境变量以及定时器的应用,需要在CAPL程序设计中实现。
PS:在CANoe14.0 Panel中可以看到Event控件了,相信在不久的将来Event仿真也将像Method一样方便。

下图所示的Panel面板示例中包含一个Method,一个Fire&Forget Method,一个Event以及一个同时包含Getter、Setter、Notifier的Field的服务接口,其中周期型事件的发送行为会在CAPL中实现。

图 5 Panel面板示例
CAPL程序设计
只通过面板虽然可以调用Method并触发Event,但是对于Method的返回值是无法通过面板修改的,同时也无法模拟周期型Event的发送行为,亦无法实现客户端停止订阅事件组,无法实现在服务端模拟停止提供服务等行为。这些复杂行为需要通过CAPL或者C#去实现。
本文将从Method的请求与响应以及Event处理过程两个方面来介绍Adaptive AUTOSAR仿真过程中客户端与服务端常用的API。对于Fire&Forget Method以及Field的仿真参考Method与Event即可实现。
Method仿真:
Method的请求行为需要在服务消费方所对应的Participant关联的CAPL中去实现(下文简称客户端)。在客户端我们需要调用CallAsync函数实现对某个指定的Method的请求,如图6所示。CallAsync是一个异步调用Method的函数,即在服务端给出返回结果之前客户端可以继续处理其他的业务。客户端通过on fctReturned这个函数去监听Method的返回值。

图 6 客户端Method请求以及获取返回值API介绍
在本示例中客户端先请求TestService这个服务所提供的名称为Method的方法,并传入两个参数initData=1,length=100,然后等待服务端响应,客户端收到响应之后将变长数组中的第一个元素打印出来。

图 7 客户端Method请求以及获取返回值API示例
Method的响应行为需要在服务提供方所对应的Participant关联的CAPL中去实现(下文简称服务端)。服务端监听客户端的请求,当收到请求之后即可进入Method的程序中。在实际项目中根据Method的真实功能编写功能实现代码即可。服务端监听客户端请求的函数为on fctCalled。

图 8 服务端Method监听客户端请求API介绍
在本示例中Server端收到Client端请求之后,根据调用Method所传入的参数分别是initData以及length来初始化一个变长数组,数组的初始值为initData,长度为length。
PS:该方法没有任何实际意义,仅仅用于介绍和演示服务端Method监听客户端请求API。

图 9 服务端Method监听客户端请求API示例
Event仿真:
当一个事件发生变更后服务端会主动的将其发送给该事件所属事件组的订阅者。因此对于客户端来说仅需要监听Event值的变更即可,而服务端只需将待传输的数据赋值给Event即可实现事件的发送行为,当然也可以设计成周期性地发送,或者当Event值的变化范围超过某一个增量之后才触发发送行为。
本示例实现的是Event的周期型发送行为,当用户在Panel上设置好周期之后,在CAPL中监听关联了周期的环境变量的变化,并通过一个定时器实现Event的周期型发送行为,如下图所示。

图 10 周期型Event仿真示例

图 11 客户端监听Event API
下图是本示例中客户端监听Event的示例代码,当客户端监听到了Event的值发生了变化,且Event的值能够被10整除时,在Write窗口将Event的值打印出来。

图 12 客户端监听Event示例
对于Fire&Forget Method,Filed Getter/Setter接口的仿真方法参照普通Method的API即可实现。在Communication Setup这种仿真环境中Field Notifier的触发行为是自动的,当Field的值发生变化之后Notifier就会自动地发送给订阅该Notifier所属事件组的Client。由于篇幅的原因此处就不详细展开了。
2
查看仿真结果
当我们的仿真工程搭建完毕,仿真程序(包含Panel面板)也已经设计完成之后便可以在CANoe中运行仿真工程,就可以在trace窗口中查看仿真结果了。
由于Communication Setup已经集成了SOME/IP SD的功能,只需要在PREEvision中配置好SOME/IP SD相关的参数,无需相关的仿真程序即可在trace窗口中看到SOME/IP SD相关报文,如下如所示。

图 13 SOME/IP SD相关报文示例
对于Method、Fire&Forge Method以及 Event的仿真需要配合Panel面板,以及在CAPL中设置的快捷键等方式便可以实现Method的调用和Event的触发行为,然后就可以在trace窗口中查看相应的报文,在write窗口中查看在CAPL中预设的打印信息等。与Simulation Setup仿真一样,也可以使用Graphics窗口或者Data窗口来监控某一个Communication Objects,比如某个Event或者Method等,也可以使用Bus static窗口查看以太网总线的实时负载率等。


图 14 服务接口仿真报文示例
最后我们再总结一下:本文主要是从Communication Setup这种新的仿真环境工程的搭、硬件接口的Network-based模式配置、面板设计、CAPL程序设计、查看仿真结果几个环节介绍如何在CANoe中实现基于Adaptive AUTOSAR的SOA仿真。这种新的仿真方式能大大降低SOA仿真的复杂度,我们只需关心仿真功能逻辑,而无需关心底层通信的实现。怿星科技在Adaptive AUTOSAR的设计、仿真与测试环节都有一定的经验积累,如果各位还有不明白的地方,欢迎在下方评论区留言哦,小怿会及时地为您解答。
更多精彩推荐:
基于Adaptive AUTOSAR的SOA仿真介绍(上篇)
基于PREEvision的AUTOSAR Adaptive设计——上篇
基于PREEvision的AUTOSAR Adaptive设计——下篇


