Simulink建模:位运算
本文研究Simulink中常用的按位运算的建模方法。
文章目录
- 1 引入
- 2 位运算模块
- 2.1 移位模块
- 2.1 按位逻辑运算
- 3 代码生成
- 4 位运算的应用
- 4.1DBC矩阵解析
- 4.2 bool信号打包
- 5 总结
1 引入
在计算机的基础课中,学过把一个十进制数转换成二进制数。例如,十进制的63转换为二进制就是111111。系统自带的计算器工具选择程序员模式,就可以很方便地进行转换操作。
这里的二进制数,最右边就是第0位,往左一个就是第1位,再往左一个就是第二位,依次类推。后文中博主会介绍自己工作中常用的位运算建模方法。这里暂时只讨论正整数的位运算,因为在博主的工作中用到的正整数相关位运算比较多。
2 位运算模块
2.1 移位模块
在Simulink中,可以通过Shift Arithmetic模块,对输入的数字左移或右移若干个位。例如下图中,Direction中配置为Left,Number配置为3,也就是将输入的数值左移3位,得到的结果输出。
例如输入的数值是3(十进制),输出的数值就是24;
这里的计算过程如下,3转换成二进制得到"0011",将"0011"左移3位变成"0001 1000",再将"0001 1000"转换成十进制就变成了24。
或者,移位其实就是乘以2的n次方,所以out = 32^3 = 38 = 24;
2.1 按位逻辑运算
逻辑运算包括与或非等等,这个在门电路里面是非常常用的。在Simulink中有一种按位进行逻辑运算的模块Bitwise Operator,可以对整数的每一位进行逻辑运算,然后再输出。
这里以Bitwise And为例,下图中将Operator选为And,表示按位进行与运算,Bit Mask中是bin2dec(“11011001”),表示将输入的数值和"11011001"的每个对应的为进行与运算,再输出。
例如下图中,输入为19,经过Bitwise And后,输出为17.
这里的计算过程如下,首先,十进制的19转为2进制是"0001 0011",和"1101 1001"按位进行与运算,必须同样的位都是1才输出1,所以运算结果是"0001 0001",转换成十进制就是17了。
3 代码生成
上面讲的两种位运算生成代码也比较简单,这里就看一看。
例如做了两个简单的输入输出,分别接bitwise and模块和shift模块。
生成代码后就是对应C语言中的移位运算和AND运算。
4 位运算的应用
博主在做电控开发的经验中,有以下两种情况会用到位运算:DBC矩阵解析和bool信号打包。本节会简单讲讲应用的方法。
4.1DBC矩阵解析
关于DBC文件相关概念,博主在以前的博客中写过这里不再赘述,可以参考以下文章。
- Matlab编程技巧:导入DBC文件
- Matlab编程技巧:通过正则表达式解析DBC文件
- Simulink代码生成:CAN Pack模块及其代码
参考如下DBC矩阵,显示的是ID号为0x258的帧。DriverDoorWindow信号处于该帧矩阵的第2行和第3行。假设Byte Order属性是Intel格式,那么第2行的前4位就是该信号的低4位,第3行的后4位就是该信号的高4位。同时假设factor和offset分别为1和0,以便简化后面的计算演示。
假设我们的控制器接收到这一帧,可以通过如下方式解析出来。
1)首先通过底层软件可以解析出每一行的的8个位组成的数值,那么第2行和第3行就是Data_2和Data_3,作为port口引入模型;
2)通过Bitwise And,将第2行的前4位取出来,那么Data_2需要和"1111 0000"做一个Bitwise And,这样就将Data_2的低4位全部置为0,Data_2的高4位全部保留,然后再右移4位,就能将Data_2的高4位转换成DriverDoorWindow信号的低4位;
3)同理,通过Bitwise And,将第3行的后4位取出来,那么Data_3需要和"0000 1111"做一个Bitwise And,这样就将Data_3的高4位全部置为0,Data_3的低4位全部保留,然后再左移4位,就能将Data_3的低4位转换成DriverDoorWindow信号的高4位;
4)最后,把2)和3)步骤中的输出加起来,就得到了完整的DriverDoorWindow信号;
最后说明一下,通过应用层模块解析DBC文件已经不是很常见了,行业内基本上都是通过Autosar架构配置完成CAN信号的解析。
4.2 bool信号打包
在建模的过程中,可以将若干个bool信号打包成一个信号,用于后面的判断,或者采集观测。例如,ACC(自适应巡航)系统的激活条件要求如下条件都满足:
bit位 | 条件 | 信号名 |
---|---|---|
bit0 | 挡位处于前进档 | GearPos |
bit1 | 车门关闭 | DoorStatus |
bit2 | 安全带系上 | SeatBeltStatus |
bit3 | 车速小于150kmph | VehSpd |
bit4 | 制动踏板未踩下 | BrkPedStatus |
实际中的ACC激活条件不止这些。建模的过程中,可以将这些布尔信号通过移位相加组装成一个uint8的信号,每一位代表其中一个条件是否满足。可以建模如下:
通过这种建模方式,就可以用ACC_Enable信号的每个位来表示各个条件是否满足。
比方说ACC_Enable = 27,转为2进制就是"0001 1011",其中第0,第1,第3,第4位都是1,第2位是0。对应模型中左移两位的信号是SeatBeltStatus,所以就是安全带没系上,导致了ACC不激活。
5 总结
本文研究Simulink中常用的按位运算的建模方法,位运算的建模比较简单,可以很容易地掌握。
>>返回个人博客总目录
Simulink建模:位运算相关推荐
- ANPC仿真模型,有源中点钳位三电平逆变器,基于MATLAB Simulink建模仿真
ANPC仿真模型,有源中点钳位三电平逆变器,基于MATLAB Simulink建模仿真. 具备三种ANPC调制方法,包含中点平衡SVPWM控制算法. 仿真模型使用MATLAB 2017b搭建 ID:2 ...
- python调用simulink_使用Python从dbc文件中提取simulink建模数据定义
使用dbc文件建模完成CAN通讯是一种比较高效的开发模式,不过在建模的过程中dbc文件中描述的数据需要自己去定义.使用文本编辑工具打开dbc文件可以看到,实际上dbc文件是一个可以进行语义解析的文本. ...
- Simulink建模:一阶滤波模型
本文研究一阶滤波算法的Simulink模型及其代码生成. 文章目录 1 一阶滤波算法 2 Simulink建模 2.1 对公式的理解 2.2 建模过程 2.3 模型配置 3 模型更新及代码生成 3.1 ...
- 多模分频器原理及simulink建模仿真
多模分频器及simulink仿真分析 一.多模分频器简介 1.1 双模分频器和计数器实现多模分频器 1.2 2\3分频单元实现多模分频器 二. 多模分频器simulink建模仿真 2.1 双模分频器与 ...
- Simulink建模:PID控制模型
本文研究PID控制的Simulink模型实现及其代码生成. 文章目录 1 PID控制 2 Simulink建模 2.1 对公式的理解 2.2 建模过程 2.3 模型配置 3 模型更新及代码生成 3.1 ...
- 二相混合式步进电机开环细分控制simulink建模仿真含模型文件
目录 细分原理 二相混合式步进电机电磁转矩方程 对Te方程简单的理解 细分控制的推导 细分系统总体图 正弦电流的仿真simulink实现 关于PWM电流控制(或SVPWM控制) 关于模型中如何控制细分 ...
- Simulink建模:如何学习Simulink建模
本文介绍博主自己学习Simulink建模的方法.后续博客都会按照本文中的思路来记录博主学习的过程. 文章目录 1 Simulink建模的分类 1.1 连续模型建模 1.2 物理模型建模 1.3 控制算 ...
- SVPWM原理(五段式七段式)及其Simulink建模
文章目录 SVPWM原理 逆变电路 扇区划分 矢量合成 作用时间求解 切换时间求解 Simulink模型建立 坐标变换 扇区判断 算法 模型 作用时间计算 各个扇区切换点时间计算 调制波产生 整体模型 ...
- 【更新中…】Matlab simulink建模与仿真
本文为学习笔记,视频来源:https://www.bilibili.com/video/BV1L7411a7uL Matlab simulink建模与仿真 1 初始simulink 1.1 simul ...
最新文章
- @async 没有异步_spring boot使用@Async异步任务
- oracle中的decode的使用
- 10月25日lol服务器维护,《LOL》lol10月25日停机维护到什么时候 10.25维护结束时间...
- 09丨缓存异常:如何解决缓存和数据库的数据不一致问题
- 【CF487E】Tourists【圆方树】【树链剖分】【multiset】
- 阿里云服务器由于被检测到对外攻击,已阻断该服务器对其它服务器端口的访问...
- Unity Text 插入图片
- vue练习之vue+cnode api
- 如何拿到半数面试公司Offer——我的Python求职之路
- oracle raise默认作用,Oracle:使用RAISE_APPLICATION_ERROR的情况是什么?
- 二手青春——代码之路1
- LINUX SHELL判断文件、目录是否存在
- python数据挖掘课后题答案_中国大学MOOC《数据挖掘与python实践》章节答案
- BIOS和UEFI的区别
- 2017 多校4 Wavel Sequence
- 女生可以做软件测试吗?
- DZZOffice(大桌子)企业文档协同平台教程系列(三)——ONLYOFFICE社区版部署、配置
- 搜狗校招编程题-建房子
- Matlab工具箱标定和校正鱼眼镜头
- Android今日头条的适配
热门文章
- 4G全网通模块-MSM8953核心板 (Cortex-A53架构)
- 7-3 选民投票 (8 分)编程统计候选人的得票数。有若干位候选人(n<=10),候选人姓名从键盘输入(候选人姓名不区分大小写,姓名最长为9个字节),若干位选民,选民每次输入一个得票的候选人的名字(
- 假期打卡(尽力为之)
- GAMES101-现代计算机图形学学习笔记(作业03)
- 零基础编程——块语言编程游戏攻略之捉虫篇
- ctfshow BJDCTF2020 encode wp
- BCH DEVCON 黑客马拉松即将登陆旧金山
- BUFF80双模蓝牙5.2热插拔PCB
- Ubuntu14.04下安装Python开发工具Wing IDE
- 路灯发光二极管的选择