学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令

news2024/12/29 14:43:47

前一篇文章已经对CANOE如何模拟主节点和从节点进行LIN通信做了简单的记录,修改主节点发送的指令需要修改LIN ISC模块里的Frames帧对应的signal。这样改起来比较麻烦且不直观,幸好CANOE提供了Panel designer这样的工具,我们可以利用它设计自己的上位机控制面板,通过面板不同的操作修改对应的系统变量,再通过CAPL脚本将环境变量赋值给LIN帧对应的signal,从而实现面板控制LIN帧中信号值。

本文简单记录实现创建CANOE面板控制主副驾座椅的通风加热功能。

一、创建系统变量

要实现panel面板的控件和LIN帧信号值进行绑定,需要用到系统变量。创建系统变量过程如下图所示:

 其中NameSpace是命名空间,后续创建的系统变量都归属于该命名空间下。比如我创建了一个SeatType系统变量用来记录当前面板控制的是主驾还是副驾。如下图所示:

SeatType为int数据类型,最大值为1,关联了一个Value Table,点击红线圈的按钮可以看到SeatTypeList如下所示,可以在下图左边列表通过右键单击New创建新的Value Table:

 

为了控制通风加热我又创建了如下的系统变量:

 

其中FanOn用来控制风扇开关,关联的值为0和1;FanLevel用来控制风扇档位分别为高中低三档;加热类似。

二、设计Panel界面

 点击菜单栏的Tools,选择Panel Designer,进入面板设计界面:

(1)首先我们添加一个组合框控件用来选择需要控制的座椅(主/副驾),在1红线圈的位置可以进行Toolbox和组件属性进行切换显示。需要注意的是SeatType这个控件需要关联到SeatType系统变量,在右边的属性Symbol中Filter选择Variable然后Symbol选择前面创建的SeatType系统变量。如下图2,3所示。

 

(2) 分别添加两个Combox组件用来选择通风和加热档位,并且分别绑定FanLevel和HeatLevel系统变量。

 

(3)分别添加两个Switch /Indicator开关控件用来控制通风和加热的开启和加热,并且分别关联FanOn和HeatOn系统变量。

 开关关联的图片可以替换为自己制作的,图片一定要按下图的格式进行制作,每个图片由三个图标组成,第一图标是面板显示时显示的图片,第二和第三个是开关来回切换时显示的图片。

(4)保存设计好的面板为xvp文件。

三、CAPL脚本编写

经过上两步已经完成了面板的设计以及面板控件和系统变量的绑定,但是系统变量值的变化并没有关联到LIN帧信号变化。这部分工作需要在CAPL脚本里完成。CAPL语法就不多赘述了。

首先双击上图中红线圈的Master模拟节点,打开下图的CAPL编辑界面:

/*@!Encoding:936*/
includes
{
  
}

variables
{
  int frame_cnt = 0;
}

//通风开关状态发生变化
on sysvar sysvar::SeatEcuCtrl::FanOn
{
  if(@this) {
    write("风扇开关ON");  
    if(@sysvar::SeatEcuCtrl::SeatType == 0) {
       //通风档位系统变量赋值给IBCM_MSG帧的DriverSeatVentilationControl_Request信号
       $IBCM_MSG::DriverSeatVentilationControl_Request = @sysvar::SeatEcuCtrl::FanLevel + 0x01;
    }
    else {
       $IBCM_MSG::PassengerSeatVentilationControl_Request = @sysvar::SeatEcuCtrl::FanLevel + 0x01;
    }
  }
  else {
    write("风扇开关OFF");  
    if(@sysvar::SeatEcuCtrl::SeatType == 0) {
       //通风档位系统变量赋值给IBCM_MSG帧的DriverSeatVentilationControl_Request信号
       $IBCM_MSG::DriverSeatVentilationControl_Request = 0x07;
    }
    else {
       $IBCM_MSG::PassengerSeatVentilationControl_Request = 0x07;
    }
  }
}

//收到从节点反馈帧DR_Pneumatic_FB_MSG
on linFrame DR_Pneumatic_FB_MSG {
  frame_cnt++; 
  write("frame cnt = %d", frame_cnt);
}

 上诉代码中当FanOn系统变量发生改变时会触发on sysvar sysvar::SeatEcuCtrl::FanOn函数的调用,也就是当面板的风扇开关按钮点击的时候其关联的FanOn系统变量就会发生改变并触发该函数的调用,函数里面主要实现当ON的时候将风扇档位赋值给相应的帧信号,当为OFF的时候帧信号赋值为0x7。同时上诉代码还实现了监听从机节点反馈帧并进行计数的功能。

选择通风档位,点击风扇切换图标按钮,对应的LIN信号发生变化如下图所示:

 

至此通过CANOE面板来控制LIN信号的功能基本实现,特此记录下。 

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

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

相关文章

谷歌浏览器配置允许跨域

1、在谷歌浏览器导航栏搜索chrome://flags 2、搜索Block insecure private network requests 3、修改状态

代码随想录打卡第六十三天|84.柱状图中最大的矩形

84.柱状图中最大的矩形 题目&#xff1a;给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 提示&#xff1a; 1 < heights.length <105 0 < h…

C语言:对于宏的一些概念及技巧

一、前言 宏在C语言中是一段有名称的代码段&#xff0c;在程序编译过程中&#xff0c;会将宏的内容被这段代码进行替换&#xff0c;常常用于定义一些常量、函数、代码块等&#xff0c;由于近年来发现许多公司进行面试时对于宏的面试题尤为多&#xff0c;故本文将对C语言中的宏的…

基于springboot实现招生平台管理系统项目【项目源码+论文说明】

基于springboot实现招生管理系统演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括招生管理系统的网络应用&#xff0c;在外国招生管理系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。招…

使用Keepalived实现双机热备,实现服务高可用

安装&#xff08;所有节点&#xff09; yum -y install keepalived修改配置 vi /etc/keepalived/keepalived.conf :set nu //显示行号 :35 dG // 删除35行以后的所有行ip a将master1虚拟机挂起&#xff0c;再次执行ip a 看vip是否漂移到另一台虚拟机worker1 漂移了&…

一图搞懂傅里叶变换(FT)、DTFT、DFS和DFT之间的关系

自然界中的信号都是模拟信号&#xff0c;计算机无法处理&#xff0c;因此我们会基于奈奎斯特定理对模拟信号采样得到数字信号。 但是我们发现&#xff0c;即便是经过采样&#xff0c;在时域上得到了数字信号&#xff0c;而在频域上还是连续信号。 因此我们可以在时域中选取N点…

Softing TDX——设计模板

| 高质量的设计模板——减少开发诊断仪所需的工作量 现今&#xff0c;用户对诊断仪的界面和操作理念提出了更高的要求。一个直观的用户界面既能减少用户熟悉诊断仪的时间&#xff0c;又能减少在日常工作中进行诊断任务的时间。然而&#xff0c;创建一个精巧又独立于平台的诊断…

apollo docker搭建

1 mysql搭建 先需要一个mysql&#xff0c;mysql我使用的是5.7&#xff0c;搭建过程忽略 2 数据导入 我们需要从github上下载apolloportaldb.sql, apolloconfigdb.sql 2个sql 随后cp apolloconfigdb.sql apolloconfigdbUat.sql cp apolloconfigdb.sql apolloconfigdbDev.sq…

翻转二叉树(C++解法)

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&…

STM32G0+EMW3080+阿里云飞燕平台实现单片机WiFi智能联网功能(三)STM32G0控制EMW3080实现IoT功能

项目描述&#xff1a;该系列记录了STM32G0EMW3080实现单片机智能联网功能项目的从零开始一步步的实现过程&#xff1b;硬件环境&#xff1a;单片机为STM32G030C8T6&#xff1b;物联网模块为EMW3080V2-P&#xff1b;网联网模块的开发板为MXKit开发套件&#xff0c;具体型号为XCH…

chrome安装Vue Devtools插件以及无法添加来自此网站的应用问题

chrome安装Vue Devtools插件以及无法添加来自此网站的应用问题 问题背景 Chrome Vue插件是一款可以帮助前端开发人员在浏览器中实时查看和编辑Vue组件和数据的工具。给前端开发人员提供了极大的便利。本文将介绍Chrome浏览器中如何安装Devtools插件。 问题分析 &#xff08…

SpringBoot上传与下载文件

使用SpringBoot的虚拟路径映射。 Config中的类 import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import o…

iconfont 图标使用

&#xff08;1&#xff09;在阿里巴巴矢量图标库注册账号&#xff0c;然后让同伴拉你进项目iconfont-阿里巴巴矢量图标库 &#xff08;2) 点击资源管理 - 我的项目 - 可以看见该项目的图标了 &#xff08;3&#xff09;点击上传图标至项目 - 可以上传图标 使用图标 &#x…

使用高德地图获取定位报错:INVALID_USER_SCODE(无效用户代码)

1. 确定自己已经申请了相关应用的key&#xff0c;这里有两个key 一个是应用的Key&#xff0c;一个是安全密钥 2. 应用key一般是发送请求的是后通过key"xxx"发送 3. 安全密钥要在head里加入进去 <script type"text/javascript">window._AMapSecuri…

CocosCreator使用物理引擎和回调

在2d中开启碰撞需要在项目设置–功能裁剪–2D物理系统【选择 基于Box2D的2D物理系统】 如果想要两个物体碰撞&#xff0c;则需要添加刚体和碰撞【&#xff01;&#xff01;重点】 设置刚体类型 可以设为四种&#xff0c; Static 静态刚体&#xff0c;零质量&#xff0c;零速度…

《微服务架构设计模式》之三:微服务架构中的进程通信

概述 交互方式 客户端和服务端交互方式可以从两个维度来分&#xff1a; 维度1&#xff1a;一对一和多对多 一对一&#xff1a;每个客户端请求由一个实例来处理。 一对多&#xff1a;每个客户端请求由多个实例来处理。维度2&#xff1a;同步和异步 同步模式&#xff1a;客户端…

如何评价现在的CSGO游戏搬砖市场

如何评价现在的csgo市场&#xff1f; 其实整个搬砖市场&#xff0c;现在已经变得乌烟瘴气&#xff0c;散发着“恶臭”。我个人非常鄙视那些虚有其表&#xff0c;大小通吃的做法&#xff0c;那些甚至连搬砖数据都看不懂的人&#xff0c;也出来吹嘘着“实力强大&#xff0c;经验丰…

[架构之路-244]:目标系统 - 设计方法 - 软件工程 - 软件开发方法:结构化、面向对象、面向服务、面向组件的开发方法

目录 前言&#xff1a; 一、概述: 软件聚合的程度由简单到复杂 二、主要开发方法详见 2.1 结构化的开发方法 2.2 面对对象的开发方法 2.3 面向服务的开发方法 2.4 面向组件的开发方法 三、不同开发方法比较 3.1 结构化开发方法 3.2 面向对象(OOP)开发方法 3.3 面向服…

电源模块测试科普:如何检测电源模块的功率?测试方法是什么?

电源模块功率的重要性 功率是电源模块的一个重要指标。电源模块功率描述了电源的输出能力&#xff0c;即电源模块为电路或设备提供电能的大小&#xff0c;通常用来衡量电源模块的性能和效率。 电源功率直接影响着电子设备的性能和功能。电源模块功率越高&#xff0c;提供的电能…

模块化之CJS, AMD, UMD 和 ESM

[[toc]] 模块化优点 防止命名冲突代码复用高维护性CJS, AMD, UMD 和 ESM 历史 ES6之前,JS一直没有自己的模块体系后来社区出现了CommonJS和AMD,CommonJS 主要用于服务器(Node)AMD 主要用于浏览器ES6引入了ESM到此,JS终于有了自己的模块体系,基本上可以完全取代CJS和AMD…