汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)
1 数据对象的创建
Ctrl+H打开Model Explorer,在Base workspace中点击工具栏add,出现如下界面,
可以看到Simulink提供了多种数据类型
- Matlab Variable:
- Simulink.Parameter:使用该数据对象表示工程应用中的标定量
- Simulink.Signal:用于生成观测量
- Simulink.NumericType:指定浮点数、整数,通常用于数据定点化处理
- Simulink.AliasType:为数据类型创建别名
常用的也就是这些,具体还有其他的可以参考help。
添加两个parameter,如下图所示:
将参数的名字改为标定量的名字,如下图(通常标定量命名规则按三段来分block_function_uint_C)
然后就是根据需求对数据类型的处理,在右边可以进行选择,如下图
(试想,如果全用这种方式来进行数据的管理有多累,可以采用excel的方式;他们用python可以实现当然,可否用matlab来读取excel写相应脚本?)已完成matlab来处理
然后建立相应的观测量,如下图:
使用constant和out建立如下模型,将constant参数名改为标定量的名称,
右键输出信号的信号线,选择properties,命名为观测量(按照依相的方式,也将观测量做出一个类似于constant的模块,需要好好研究一下)
PS:需要注意的是,两个标定量均为uint8类型,而观测量为uint16,这样simulink会出现编译错误,因此可以在加法模块上选择output data type为下图所示,这样就强制与后面的类型相匹配。
因此,要想做出自己的模型开发库,要做出标定量模块的封装、常用算数符号封装(与后面数据类型匹配)、观测量封装,(后续继续添加)。
2 Code的配置
至此便完成了一个简单的模型,ctrl+E打开configuration parameter,
solve界面下选择定点步长,因为是在单片机上运行。
选择optimization>Signals and Parameters,选取Inline Parameter(为什么?)
选择Code Generation,选择ert.tlc,打钩generate code only
Report>Create code generation report
Interface>data exchange,选择asap2生成相应a2l(不包含头部分)
最后进行编译(ctrl+B),完毕后生成相应的报告
在与基础软件集成时,要将Model files和Utility files的文件全部放到基础软件中。(还可以优化数据类型的定义)
3 自动在生成的代码中添加#pragma语句
3.1 为什么添加#pragma语句
通常情况下,编译器会给变量自动分配内存地址,但是标定来说,标定量和观测量必须放到指定位置才能实现标定和观测的功能, #pragma语句就可以实现上述功能。
不同编译器对于地址的分配的语句不同,例如hightec,从该工程的ld文件中可以看到区域名。
那么在拿到应用层代码之后首先就是要对变量进行地址分配,编译完成后。
但是实际上在工程应用中,标定量的定义常用到ConstVolatile、观测量常用到Volatile
3.2 const, volatile释义
const含义是“请做为常量使用”,而并非“放心吧,那肯定是个常量”。
volatile的含义是“请不要做自以为是的优化,这个值可能变掉的”,而并非“你可以修改这个值”。
1)const, volatile的作用以及起作用的阶段
const只在编译期有用
在运行期无用。const在编译期保证在C的“源代码”里面,没有对其修饰的变量进行修改的地方(如有则报错,编译不通过),而运行期该变量的值是否被改变则不受const的限制。
volatile在编译期和运行期都有用
在编译期告诉编译器:请不要做自以为是的优化,这个变量的值可能会变掉;
在运行期:每次用到该变量的值,都从内存中取该变量的值。
2)const, volatile同时修饰一个变量
合法性 “volatile”的含义并非是“non-const”,volatile 和 const 不构成反义词,所以可以放一起修饰一个变量。
同时修饰一个变量的含义
表示一个变量在程序编译期不能被修改且不能被优化;在程序运行期,变量值可修改,但每次用到该变量的值都要从内存中读取,以防止意外错误。
3.3 模型生成代码自动添加#pragma语句
如果数据很少的、或者应用层软件标定量和观测量全部集成在一个头文件和c文件中,使用手动的方式进行添加也可以,但是一旦数据量剧增或者变量在不同文件下,这样在做处理时就会比较麻烦,因此考虑在代码生成时将变量集中到一个.h .c文件,并且自动添加相应的#pragma语句。
Simulink数据类型里提供了这样一种方式,
首先创建一个数据类型,例如 Demo_Mea_mp = Simulink.Signal,
在Storage class下选择Volatile类型。会弹出Custom attribute对话框,输入想生成的文件名.h和.c。生成的代码如下:
可以看到能够将变量统一放到同一文件,但是还是需要手动添加#pragma语句。
如何自动添加该语句呢?我们可以来分析一下Simulin.Parameter这个数据类型的特点。
使用cscdesigner打开自定义类编辑器
在memory section中可以看到
在这里添加#pragma语句即可,但是simulink自带的类又全是只读的,所以需要自己建立一个类(参考matlab官网help:Define Data Classes)。
首先找到路径%matlabpath%\toolbox\simulink\simulink\dataclasses
在此目录下建立一个文件夹(以+UserName命名)
在+App中添加@Parameter和@Signal两个文件夹,可以将mpt中的parameter.m、signal.m复制过来进行修改。
需要修改的几个地方
将custom和global注释掉,不然会报错(why)
输入指令cscdesigner(‘App’)
然后选择编辑数据类型的特性,每一项都需要。这里我们把ConstVolatile进行处理,在Memory section中输入相应的#pragma语句即可。
最后编译生成的文件有
代码如下:
4. 自定义生成完整A2L文件
to be continue...
汽车标定合集:
汽车标定技术(一):XCP概述-CSDN博客
汽车标定技术(二)--基于XCP的标定测量实战-CSDN博客
汽车标定技术(三)--XCP协议如何支持测量功能-CSDN博客
汽车标定技术(四)--问题分析:多周期测量时上位机显示异常-CSDN博客
汽车标定的ASAM MCD-1 POD-CSDN博客
相关文章:

汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)
1 数据对象的创建 CtrlH打开Model Explorer,在Base workspace中点击工具栏add,出现如下界面, 可以看到Simulink提供了多种数据类型 Matlab Variable:Simulink.Parameter:使用该数据对象表示工程应用中的标定量Simuli…...
重启某个节点、重启电脑服务器后,kubernetes无法运行,k8s无法运行
问题描述 环境:ubuntu18.04 LTS 现象:按步骤安装kubernetes后,正常启动,各个命令均可正常使用。服务器重启后,执行命令错误信息如下: sudo kubectl get nodesThe connection to the server 127.0.0.1:644…...

【ARMv8 SIMD和浮点指令编程】浮点加减乘除指令——四则运算
浮点指令有专门的加减乘除四则运算指令,比如 FADD、FSUB、FMUL、FDIV 等。 1 FADD (scalar) 浮点加法(标量)。该指令将两个源 SIMD&FP 寄存器的浮点值相加,并将结果写入目标 SIMD&FP 寄存器。 该指令可以产生浮点异常。根据 FPCR 中的设置,异常会导致在 FPSR 中…...
JDBC SQL Server Source Connector: 一览与实践
在快速发展的数据驱动业务环境中,确保数据在各个系统间高效、准确地同步至关重要。为了进一步的数据处理和分析,经常需要将这些数据同步到其他数据处理系统。Apache SeaTunnel 提供了一个强大而灵活的数据集成框架,使得从 SQL Server 到其他系…...

WebDAV之π-Disk派盘 + Keepass2Android
推荐一款密码管理器,允许人们使用复杂的组合进行登录,而不必记住所有的组合。 Keepass2Android可以支持大多数安卓互联网浏览器, Android设备上同步软件,还支持通过WebDAV添加葫芦儿派盘。 Keepass2Android 目前安全方面最大的问题之一是大多数人几乎在任何地方都使用通用…...
AspectJX - Android开发平台的AOP框架
官网 GitHub - HujiangTechnology/gradle_plugin_android_aspectjx: A Android gradle plugin that effects AspectJ on Android project and can hook methods in Kotlin, aar and jar file. 项目简介 一个基于AspectJ并在此基础上扩展出来可应用于Android开发平台的AOP框架…...

【TDK 电容 】介电质 代码 对应温度及变化率
JB 电解质是什么?没找到,只有TDK有,也只有这个温度的区别,并且已经停产在售。 对比发现是mouser网站关于电容的描述错误。下图显示正确的,再然后是错误的。 在TDK官网,这样的描述 温度特性 分类标准代码温…...

随笔--解决ubuntu虚拟环境的依赖问题
文章目录 问题一:在conda虚拟环境中报错ImportError: libcupti.so.11.7:cannot open shared object file: No such file or directory解决步骤问题二: RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling cublasSgemmStridedBatched( …...

Gin学习笔记
Gin学习笔记 Gin文档:https://pkg.go.dev/github.com/gin-gonic/gin 1、快速入门 1.1、安装Gin go get -u github.com/gin-gonic/gin1.2、main.go package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {// 创建路由引…...
使用 OpenTracing 和 LightStep 监控无服务器功能
无服务器功能的采用在企业组织内达到了创纪录的水平。有趣的是,鉴于越来越多的采用和兴趣,许多监控解决方案孤立了在这些环境中执行的代码的性能,或者仅提供有关执行的基本指标。为了了解应用程序的性能,我想知道存在哪些瓶颈、时…...
Sleep(0)、Sleep(1)、SwitchToThread()
当 timeout 参数为 0 时(如 Sleep(0)),操作系统会检查可运行队列中是否有高于或等于当前线程优先级的其他就绪线程。如果有,当前线程将被移除并放弃处理器时间,让其他线程执行。如果没有高优先级的线程,当前…...

前端食堂技术周刊第 103 期:10 月登陆 Web 平台的新功能、TS 5.3 RC、React 2023 状态、高并发的哲学原理、Web 资源加载优先级
美味值:🌟🌟🌟🌟🌟 口味:夏梦玫珑 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来看下…...
Python(三)数据类型转换
程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …...
linq to sql性能优化技巧
linq to sql 是一个代码生成器和ORM工具,他自动为我们做了很多事情,这很容易让我们对他的性能产生怀疑 linq to sql 是一个代码生成器和ORM工具,他自动为我们做了很多事情,这很容易让我们对他的性能产生怀疑。但是也有几个测试证明显示在做好优化的情况下,linq to sql的…...

ubuntu20.04 安装cudnn
中文地址是.cn:cuDNN 历史版本 | NVIDIA 开发者 英文地址是.com:cuDNN 历史版本 | NVIDIA 开发者 1、下载cudnn:cudnn-local-repo-ubuntu2004-8.8.1.3_1.0-1_amd64.deb 解压并安装:sudo dpkg -i cudnn-local-repo-ubuntu2004-8.8…...

手机转接器实现原理,低成本方案讲解
USB-C PD协议里,SRC和SNK双方之间通过CC通信来协商请求确定充电功率及数据传输速率。当个设备需要充电时,它会发送消息去给适配器请求充电,此时充电器会回应设备的请求,并告知其可提供的档位功率,设备端会根据适配器端…...
RDS for MySQL 是什么
RDS for MySQL 是一种托管型数据库服务,RDS代表“关系数据库服务”(Relational Database Service)。这是云服务提供商提供的一种服务,用于简化关系数据库的设置、操作和扩展。对于MySQL版本的RDS,意味着它是专门为运行MySQL数据库管理系统的实…...

Java开发注意事项和细节说明
👨🎓👨🎓博主:发量不足 个人简介:耐心,自信来源于你强大的思想和知识基础!! 📑📑本期更新内容:Java开发注意事项和细节说明&…...

springboot中使用Java代码进行MongoDB集合数据备份
有时候mongo的集合中数据量太大,查询或翻页时可能会超过最大数量报错,可以给mongo的集合进行备份并保留最近一段时间的数据即可 下面是通过Java代码进行mongo的集合备份单元测试 import cn.hutool.core.date.DateUtil; import com.nuoyi.study.dao.mongo…...

JavaEE的渊源
JavaEE的渊源 1. JavaEE的起源2. JavaEE与Spring的诞生3. JavaEE发展历程(2003-2007)4. JavaEE发展历程(2009-至今)5. Java的Spec数目与网络结构 1. JavaEE的起源 我们首先来讲一下JavaEE的起源 ,为什么要来讲起源 ? …...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...