CANOE入门到精通——CANOE系列教程记录2

news2024/11/25 20:27:50

本系列以初学者角度记录学习CANOE,以《CANoe开发从入门到精通》参考学习,CANoe16 demo版就可以进行学习

创建工程

在一个路径中,创建这几个文件夹
在这里插入图片描述
创建工程,将工程命名Vehicle_System_CAN.cfg
在这里插入图片描述

创建Database dbc文件

在实际开发中,需要拿到整车厂的dbc文件。
VehicleSystem.dbc
在这里插入图片描述
创建message
在这里插入图片描述

创建 value Table
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建信号
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
剩下信号按前面类似操作创建

在这里插入图片描述

将signels和message进行关联
用鼠标点击对应的信号 拖到 报文下
在这里插入图片描述
创建网络节点 右键Network nodes
在这里插入图片描述

BCM 节点添加接受报文
在这里插入图片描述
添加发送报文
在这里插入图片描述
创建IPC和Gateway节点操作类似,需要添加对应的接受报文和发送报文
在这里插入图片描述
如果开始位和位的长度对不上,需要修改,修改报文下的信号的开始位,就是就是信号发送的顺序和信号的大小
在这里插入图片描述

有几个地方需要注意message 需要修改:
在这里插入图片描述

在这里插入图片描述
加入到工程中
在这里插入图片描述

创建系统变量

在这里插入图片描述
Cluster、Vehicle_Contrl和Vehicle_Key
在这里插入图片描述

Cluster
在这里插入图片描述
Vehicle_Contrl在这里插入图片描述
Vehicle_Key在这里插入图片描述

Panel

在这里插入图片描述

在这里插入图片描述

CAPL代码实现

右键总线,Insert Network Node,插入三个网络节点,分别命名IPC、BCM和Gateway
在这里插入图片描述

分别双击三个网络节点,编写CAPL代码(BCM.can、IPC.can、Gateway.can)
在这里插入图片描述

BCM.can

/*@!Encoding:1252*/
includes
{
  //To add the head files
}

variables
{
  msTimer msTcrank;      //define the timer(ms) for crank delay
  msTimer msTIL;         //define the timer(ms) for deactivate CANoe IL
  int flashPeriod=500;   //Hazards flash cycle

  int TurnLightStatus;   //define the turn light status: 0 - both off; 1 - Left flash; 2 - Right flash; 3 - Hazards on
  msTimer msTleftflash,msTrightflash; //define the timers(ms) for Left/Right Light flash
  message Driver_Info Msgdriver; //define the message for driver info
}

on preStart
{
  ILControlInit(); //Initialize CANoe IL 
  ILControlStop(); //Deactivate CANoe IL 
}

//to process the key position
on sysvar_update Vehicle_Key::Key_State
{
  $Ignition_Info::KeyState=@this;
  if(@this==3)
  {
    @Vehicle_Control::Speed_Up=0;
    setTimer(msTcrank,800);   //Simulate the crank behavior    
  }
}

//return to Run status from Crank after 800ms
on timer msTcrank
{
  $KeyState=2; //Simulate the crank behavior
  @sysvar::Vehicle_Key::Key_State =2;
}

//to process the driver ID change
on sysvar_update Vehicle_Key::Car_Driver
{
  //Set the value of driver ID based on system variable Car_Driver
  if(@this==1)
  {
    Msgdriver.byte(0)=0;
  }
  else if(@this==2)
  {
    Msgdriver.byte(0)=0x1;
  }
  output(Msgdriver);
}

//to process the event of Unlock Car
on sysvar_update Vehicle_Key::Unlock_Car
{
  if(@this==1)
  {
    ILControlStart();
    $LockStatus=1;
    @Vehicle_Key::Car_Driver=2;//driver 2 is set to default
  }
}

//to process the event of Lock Car
on sysvar_update Vehicle_Key::Lock_Car
{
  if(@this==1)
  {
    $LockStatus=0;
    setTimer(msTIL,1500); //wait 1.5s to make sure other ECUs are offline
  }
}

ON Timer msTIL
{
  ILControlStop();
}
void LightOFF(void)
{
  //Initilize the light status
  $VehicleLight=0;
  TurnLightStatus=0;
  $LightStatus=0;  
}

To realize the functions of turn left,turn right and Hazards///
on sysvar Vehicle_Control::Left_Turn_Enable
{
  if(@this==1)
  {
    @sysvar::Vehicle_Control::Right_Turn_Enable=0;
    $VehicleLight=1;TurnLightStatus=1;
    settimer(msTleftflash,flashPeriod);
  }
  else
  {
    if(@Vehicle_Control::Right_Turn_Enable==0 && @Vehicle_Control::Hazards_Enable==0)
    {
      LightOFF();
    }
    cancelTimer(msTleftflash);
    @Cluster::Left_Turn_Indicator=0;
  }
}

on timer msTleftflash
{
  $LightStatus=!$LightStatus;@Cluster::Left_Turn_Indicator=!@Cluster::Left_Turn_Indicator;
  setTimer(msTleftflash,flashPeriod);
}

on sysvar Vehicle_Control::Right_Turn_Enable
{
  if(@this==1)
  {
    @sysvar::Vehicle_Control::Left_Turn_Enable=0;
    $VehicleLight=2;TurnLightStatus=2;
    settimer(msTrightflash,flashPeriod);
  }
  else
  {
    if(@Vehicle_Control::Left_Turn_Enable==0 && @Vehicle_Control::Hazards_Enable==0)
    {
      LightOFF();
    }
    cancelTimer(msTrightflash);
    @Cluster::Right_Turn_Indicator=0;
  }
}

on timer msTrightflash
{
  $LightStatus=!$LightStatus;@Cluster::Right_Turn_Indicator=!@Cluster::Right_Turn_Indicator;
  setTimer(msTrightflash,flashPeriod);
}

on sysvar Vehicle_Control::Hazards_Enable
{
  if(@this==1)
  {
    $VehicleLight=3;@Cluster::Left_Turn_Indicator=1;@Cluster::Right_Turn_Indicator=1;
    settimer(msTleftflash,flashPeriod);setTimer(msTrightflash,flashPeriod);
  }
  else
  {
    $VehicleLight=TurnLightStatus;
    switch(TurnLightStatus)
    {
      case 1: //Left Light flash
        cancelTimer(msTrightflash);
        @Cluster::Right_Turn_Indicator=0;
      break;
      case 2: //Right Light flash
        cancelTimer(msTleftflash);
        @Cluster::Left_Turn_Indicator=0;
      break;
      case 0: //swicth off both light
        cancelTimer(msTrightflash);
        cancelTimer(msTleftflash);
        $LightStatus=0;
        @Cluster::Left_Turn_Indicator=0;
        @Cluster::Right_Turn_Indicator=0;
      break;
    }
  }
}

IPC.can

/*@!Encoding:1252*/
includes
{
  //To add the head files
}

variables
{
  //To add the variables
  int busflag=0; //current bus status: 0 - Deactivate CANoe IL ; 1 - Activate CANoe IL 
}

on preStart
{
  ILControlInit(); //Initialize CANoe IL 
  ILControlStop(); //Deactivate CANoe IL 
}

on signal_update LockStatus
{
  if(this!=busflag)
  {
    if(this==1)
    {
      ILControlStart();  //Activate CANoe IL    
    }
    else if(this==0)
    {
      ILControlStop();  //Deactivate CANoe IL      
    }
    busflag=this;
  }
}


on signal_update Gear
{
  @Cluster::Gear_Status= this;   //To display current Gear status in panel
}

Gateway.can

/*@!Encoding:1252*/
includes
{
  //To add the head files
}

variables
{
  msTimer msTVehSpeedDown; //define the timer(ms) for Vehicle Speed down
  msTimer msTEngSpeedDown; //define the timer(ms) for Engine Speed down
  dword WritePage;
  int busflag=0; //current bus status: 0 - Deactivate CANoe IL ; 1 - Activate CANoe IL 
}

on preStart
{
  ILControlInit(); //Initialize CANoe IL 
  ILControlStop(); //Deactivate CANoe IL 
  
  //Write simulation information in write window
  writeLineEx(WritePage,1,"--------This demo demonstrated the CAN bus simulation!!--------"); 
  writeLineEx(0,1,"Press <1> to start/stop CAN_logging");  
}

on key '1'
{
  int logflag;

  if(logflag==0)
  {
    logflag=1;
    write("CAN logging starts");
    //start logging Logging CAN with a pretrigger with 500ms
    startlogging("CAN_Logging",500);
  }
  else 
  {
    logflag=0;
    write("CAN logging ends");
    //stop logging Logging CAN with a posttriggre with 1000ms
    stoplogging("CAN_Logging",1000);
  }   
}


on signal_update LockStatus
{
  if(this!=busflag)
  {
    if(this==1)
    {
      ILControlStart();
    }
    else if(this==0)
    {
      ILControlStop();
    }
    busflag=this;
  }
}

on sysvar Vehicle_Control::Gear
{
  $Gear=@this;      //Change Gear status based on user operation
}

void EngineData_Init(void)
{
  //Initialize the data of Engine
  $VehicleSpeed=0;
  $EngSpeed=0;
  $EngTemp=0;
  $PetrolLevel=0;
}

on signal_update KeyState
{
  if(this==0)
  {
    EngineData_Init();   //Init engine data based on KeyState
  }
  if(this>0)
  {
    $PetrolLevel=255;    //Init PetrolLevel based on KeyState
  }
}
on sysvar_update Vehicle_Control::Eng_Speed     
{
  //Engine speed only available when Key is ON
  if(@Vehicle_Key::Key_State==2)
  {
    $EngineData::EngSpeed=@this;
  }
  else
  {
    $EngineData::EngSpeed=0;
  }
}

on sysvar_update Vehicle_Control::Veh_Speed
{
  //Vehicle speed only available when Gear is Drive and Key is ON
  if((@Vehicle_Control::Gear==3)&&(@Vehicle_Key::Key_State==2))
  {
    $VehicleData::VehicleSpeed=@this;
  }
  else
  {
    $VehicleData::VehicleSpeed=0;
  }
}

//only for simulation
on sysvar_update Vehicle_Control::Speed_Up  //Speed up when sysvar speed_up enabled
{
  if($EngTemp<90)
  {
    $EngTemp=@this*1.5;
  }
  else
  {
    $EngTemp=90;
  }
  if($PetrolLevel<255)
  {
    $PetrolLevel=@this*8.5;
  }
  else
  {
    $PetrolLevel=255;
  }
  @Vehicle_Control::Veh_Speed=@this;
  @Vehicle_Control::Eng_Speed=@this*40;
  if(@this>120)
  {
    @this=60;
  }
}

on sysvar Vehicle_Control::Brake    //Speed down when Brake is enable
{
  int i;
  if(@this==1)
  {
    $GearLock=0;
    setTimer(msTVehSpeedDown,50);
    setTimer(msTEngSpeedDown,50);
  }
  else
  {
    $GearLock=1;
    cancelTimer(msTVehSpeedDown);
    cancelTimer(msTEngSpeedDown);
  }
}

on timer msTVehSpeedDown      //Implement speed down function
{
  @Vehicle_Control::Veh_Speed=@Vehicle_Control::Veh_Speed-1;
  setTimer(this,50);
  if(@Vehicle_Control::Veh_Speed<=0)
  {
    cancelTimer(msTVehSpeedDown);
    @Vehicle_Control::Veh_Speed=0;
   }
}

on timer msTEngSpeedDown    //Implement engine speed down function
{
  @Vehicle_Control::Eng_Speed=@Vehicle_Control::Eng_Speed-40;
  setTimer(this,50);  
  if(@Vehicle_Control::Eng_Speed<=0)
  {
    cancelTimer(msTEngSpeedDown);
    @Vehicle_Control::Eng_Speed=0;    
  }
}

仿真

在空白桌面右键,新建一个新的桌面
在这里插入图片描述
右键 前面我们创建的Panel,将其固定在新的桌面上。
在这里插入图片描述

仿真
在这里插入图片描述

自动序列,播放以及录制运行序列,Simulation→Automation进行配置

在这里插入图片描述

在这里插入图片描述

添加loging block,并添加相关Channel Fiter模块
在这里插入图片描述
工程文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/478097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SignOff Criteria——OCV applied and results

文章目录 1. O v e r v i e w Overview Overview1.1 w h a t i s o c v what\ is\ ocv what is ocv&#xff1f;1.2 O C V . E f f e c t o n s i g n o f f OCV.\ Effect\ on\ signoff OCV. Effect on signoff1.3 H o w t o r e m o v e t h e e f f e c t s o f O C V Ho…

【hello Linux】可重入函数、volatile和SIGCHLD信号

目录 1. 可重入函数 2. volatile 3. SIGCHLD信号 Linux&#xff01;&#x1f337; 1. 可重入函数 先来谈一下重入函数的概念&#xff1a;重入函数便是在该函数还没有执行完毕便重复进入该函数&#xff08;一般发生在多线程中&#xff09;&#xff1b; 可重入函数&#xff1a…

C++程序设计——lambda表达式

一、问题引入 在C98中&#xff0c;如果想对一个数据集合中的元素进行排序&#xff0c;可以使用sort()方法&#xff0c;但如果待排序元素为自定义类型&#xff0c;就需要用户自己定义排序时的比较规则。 随着C语法的发展&#xff0c;人们开始觉得其编写比较复杂&#xff0c;每次…

Word2vec原理+实战学习笔记(一)

来源&#xff1a;投稿 作者&#xff1a;阿克西 编辑&#xff1a;学姐 视频链接&#xff1a;https://ai.deepshare.net/detail/p_5ee62f90022ee_zFpnlHXA/6 文章标题&#xff1a; Efficient Estimation of Word Representations in Vector Space 基于向量空间中词表示的有效估计…

【计算机网络】学习笔记:第四章 网络层(七千字详细配图)【王道考研】

基于本人观看学习b站王道计算机网络课程所做的笔记&#xff0c;不做任何获利 仅进行交流分享 特此鸣谢王道考研 若有侵权请联系&#xff0c;立删 如果本篇笔记帮助到了你&#xff0c;还请点赞 关注 支持一下 ♡>&#x16966;<)!! 主页专栏有更多&#xff0c;如有疑问欢迎…

安装chatglm

地址 下载源代码 下载完成后解压 安装cuda 输入nvcc -V查看是否安装cuda 输入nvidia-smi查看支持的最高版本&#xff0c;最高支持12.1 下载cudahttps://developer.nvidia.com/cuda-downloads 双击安装 同意之后点击下一步 选择精简模式即可 等待下载安装包 …

链接sqlite

一.sqlite库函数 1.sqlite3_open()函数 语法&#xff1a;*sqlite3_open(const char *filename, sqlite3 *ppDb) 作用&#xff1a;该例程打开一个指向 SQLite 数据库文件的连接&#xff0c;返回一个用于其他 SQLite 程序的数据库连接对象。 参数1&#xff1a;如果 filename …

如何在自己的Maven工程上搭建Mybatis框架?

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 目录 前言 一. 什么是Mybatis框架&#xff1f;1.1 框架是什么&#xff1f;1.2 什么是MyBatis &#xff1f;1…

3.11 C结构体及结构体数组

结构体的意义 问题&#xff1a;学籍管理需要每个学生的下列数据&#xff1a;学号、姓名、性别、年龄、分数&#xff0c;请用C语言程序存储并处理一组学生的学籍。 思考&#xff1a;如果有多个学生&#xff0c;该怎么定义 已学数据类型无法解决。 结构体概述 正式&#xff1a;…

【Sping学习详解】

重新学习Spring很久了&#xff0c;也看了不少的视频&#xff0c;但是没有系统总结&#xff0c;容易忘记&#xff0c;网上寻找相关博客&#xff0c;也没有找到按照路线总结的&#xff0c;只能说不顺我心&#xff0c;所以自己总结一下&#xff01;&#xff01;&#xff01; 从下…

vulnhub靶机dpwwn1

准备工作 下载连接&#xff1a;https://download.vulnhub.com/dpwwn/dpwwn-01.zip 网络环境&#xff1a;DHCP、NAT 下载完后解压&#xff0c;然后用VMware打开dpwwn-01.vmx文件即可导入虚拟机 信息收集 主机发现 端口发现 继续查看端口服务信息 打开网站发现只有Apache默认…

【Spring篇】IOC/DI注解开发

&#x1f353;系列专栏:Spring系列专栏 &#x1f349;个人主页:个人主页 目录 一、IOC/DI注解开发 1.注解开发定义bean 2.纯注解开发模式 1.思路分析 2.实现步骤 3.注解开发bean作用范围与生命周期管理 1.环境准备 2.Bean的作用范围 3.Bean的生命周期 4.注解开发依赖…

行为识别 Activity Recognition

行为识别 行为检测是一个广泛的研究领域&#xff0c;其应用包括安防监控、健康医疗、娱乐等。 课程大纲 导论 图卷积在行为识别中的应用&#xff1a;论文研读&#xff0c;代码解读&#xff0c;实验 Topdown关键点检测中的hrnet&#xff1a;论文研读&#xff0c;代码解读&a…

ETL工具 - Kettle 流程、应用算子介绍

一、Kettle 流程和应用算子 上篇文章对Kettle 转换算子进行了介绍&#xff0c;本篇文章继续对Kettle 的流程和应用算子进行讲解。 下面是上篇文章的地址&#xff1a; ETL工具 - Kettle 转换算子介绍 流程算子主要用来控制数据流程和数据流向&#xff1a; 应用算子则是Kettle给…

ESP32 ESP-Rainmaker 本地点灯控制Demo测试

基于ESP-Rainmaker 本地点灯控制Demo测试 &#x1f33f;ESP-Rainmaker项目地址&#xff1a;https://github.com/espressif/esp-rainmaker/tree/master ✨这个项目早些时候就已经开始测试了&#xff0c;最后卡在了手机APP连接esp32设备端一直无法连接上&#xff0c;也一直没有找…

性能:Intel Xeon(Ice Lake) Platinum 8369B阿里云CPU处理器

阿里云服务器CPU处理器Intel Xeon(Ice Lake) Platinum 8369B&#xff0c;基频2.7 GHz&#xff0c;全核睿频3.5 GHz&#xff0c;计算性能稳定。目前阿里云第七代云服务器ECS计算型c7、ECS通用型g7、内存型r7等规格均采用该款CPU。 Intel Xeon(Ice Lake) Platinum 8369B Intel …

Linux第五章

文章目录 前言一、MySQL5.7版本在CentOS系统安装二、Tomcat安装部署1.安装JDK环境2. 解压并安装Tomcat 三、Nginx安装部署四、RabbitMQ安装部署五、Redis安装部署六、ElasticSearch安装部署七、集群化环境前置准备八、Zookeeper集群安装部署九、Kafka集群安装部署十、大数据集群…

操作系统的进程调度

进程调度概述 一、操作系统的调度时机 1、什么时候进行进程调度&#xff1f; 主动放弃&#xff08;进程正常终止、运行过程中发生异常而终止、进程主动请求阻塞&#xff09; 被动放弃&#xff08;分给进程的时间片用完、有更紧急的事需要处理、有更高优先级的进程进入就绪队列…

CentOS7 安装MySQL8

CentOS7 安装MySQL8 安装 VMware 以及 CentOS更新系统添加 MySQL Yum 存储库安装 MySQL 8启动 MySQL检查 MySQL 状态查看临时密码用临时密码登录修改密码 安装 VMware 以及 CentOS 由于本博主之前写过&#xff0c;在这给出链接&#xff0c;不再赘述了 https://blog.csdn.net/w…