文章概述:
1:CANOE工具及CAPL脚本的基本使用;
2:功能实现;
一:CANOE工具及CAPL脚本的基本使用
在嵌入式行业中,基本都会使用CANOE工具去收发报文,那么如何基于CANOE工具实现自动化功能呢? 如你所料可以基于 -CAPL- 脚本实现CANOE的自动化。
在我基于CAPL脚本实现某一功能的过程中,较大一部分时间花在CAPL脚本的基本使用上,直接使用示例都无法运行,经过一番挣扎后终于搞定,那么下面将以我遇到的问题展开分析:
1.1>加 载 DBC文件:接触过CANOE工具的应该都知道“Simulation Setup”这个界面,在database处右击添加DBC文件;【解析文件】
1.2>添加节点:插入网络节点【Insert Network node】;
由于我在调试过程中选择插入 test CAPL node,导致一系列的问题,所以在此强调一定是“Network node”
1.3>网络节点属性配置:右击Configuration
此处主要关联DBC文件中配置的CAN 节点以及绑定该节点的CAPL脚本文件;
1.4>编写-编译-加载运行脚本文件:点击按钮即可开始编写自己的CAPL脚本了,编写完成后需点击编译,直至编译完成后加载至该节点;点击CANOE的运行按钮,该节点的脚本将自动执行;
二:功能实现
功能设计思路如下:
1:整车环境模型搭建
2:实时监控XXX节点的发送帧
3:模拟节点发送CAN帧,观测xxx节点能否正常接收
4:实时监控总线负载率
5:界面化编程
2.1:整车环境模型搭建
由于整车环境与实验室环境存在很大的差异,导致实验室环境下测试结论在整车环境下是不可靠的,为避免整车CAN异常,很有必要模拟整车环境验证当前节点CAN是否符合设计预期;
注意:由于以上各节点绑定DBC中的节点,模型会自动按照DBC中配置发送相应帧,如果涉及该帧的相关功能验证,建议点击按钮disable CAN 帧;
2.2:实时监控XXX节点的发送帧
如果想监控xxx节点,首先新增测试节点,编写相应CAPL脚本自动接收总线上CAN数据,并做Checksum,Rollingcounter,Timeout校验,观测整车环境下有无丢帧等异常情况;【CAPL编程:建议直接参考手册,很完善的资料】
On message *
{
Switch(this.id)
{
Case 0x123:
{
Timeout校验;
Checksum校验;
Rollingcounter校验;
}break;
Case 0x124:
{
Timeout校验;
Checksum校验;
Rollingcounter校验;
}break;
Default :break;
}
}
具体Checksum,Rollingcounter,Timeout校验的策略很多,此处便不多加赘述;
2.3 模拟节点发送CAN帧,观测xxx节点能否正常接收
按照帧周期触发定时器向总线推送该数据,如果此帧属于关键帧,那么需按照Checksum及RollCnt策略实时更新数据,观测在整车环境能否正常接收报文;
setTimer(timer_xxx,xxx.GenMsgCycleTime):按照DBC配置周期设置定时器;
On timer timer_xxx
{
Xxx.y1= random(100);
Xxx.y2= random(100);
Xxx.rollingcounter = RollCnt;
Xxx.Checksum = Checksum;
Output(Xxx);
setTimer(timer_xxx,xxx.GenMsgCycleTime);
}
2.4:实时监控总线负载率
直接调用相应接口函数即可:
Busload = canGetBusLoad( channel);
2.5:界面化编程
2.5.1:搭建视图层:Panel Designer:拖拉控件
2.5.2:视图层与database绑定
每个控件都需要右击绑定属性:基本是attach signal /attach environment ;
Attach signal :将该控件绑定总线上的该信号,该控件实时反馈总线上该信号的数值,capl脚本中不需要额外的配置;
Attach environment :将该控件绑定一个环境变量,在capl脚本中就可基于此环境变量进行相应的动作、事件【putvalue,getValue】;那么问题来了,这个环境变量如何配置?
具体配置见下图,需在DBC文件中新增该环境变量,并设置类型,权限,单位,table等值;注意:此环境变量不必与DBC中的信号进行关联;
2.5.3:数值的更新、获取
由上推断:控件绑定了环境变量,但是环境变量却没有与DBC中的信号进行关联,那么如何需要获取、更新该数值呢?
在CAPL脚本视图中控件数值变更会触发一个事件,再基于getValue接口获取视图中的数值;
On envvar 环境变量
{
Zzz = getvalue(环境变量);
Putvalue(环境变量,3);
}