本文研究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建模:位运算相关推荐

  1. ANPC仿真模型,有源中点钳位三电平逆变器,基于MATLAB Simulink建模仿真

    ANPC仿真模型,有源中点钳位三电平逆变器,基于MATLAB Simulink建模仿真. 具备三种ANPC调制方法,包含中点平衡SVPWM控制算法. 仿真模型使用MATLAB 2017b搭建 ID:2 ...

  2. python调用simulink_使用Python从dbc文件中提取simulink建模数据定义

    使用dbc文件建模完成CAN通讯是一种比较高效的开发模式,不过在建模的过程中dbc文件中描述的数据需要自己去定义.使用文本编辑工具打开dbc文件可以看到,实际上dbc文件是一个可以进行语义解析的文本. ...

  3. Simulink建模:一阶滤波模型

    本文研究一阶滤波算法的Simulink模型及其代码生成. 文章目录 1 一阶滤波算法 2 Simulink建模 2.1 对公式的理解 2.2 建模过程 2.3 模型配置 3 模型更新及代码生成 3.1 ...

  4. 多模分频器原理及simulink建模仿真

    多模分频器及simulink仿真分析 一.多模分频器简介 1.1 双模分频器和计数器实现多模分频器 1.2 2\3分频单元实现多模分频器 二. 多模分频器simulink建模仿真 2.1 双模分频器与 ...

  5. Simulink建模:PID控制模型

    本文研究PID控制的Simulink模型实现及其代码生成. 文章目录 1 PID控制 2 Simulink建模 2.1 对公式的理解 2.2 建模过程 2.3 模型配置 3 模型更新及代码生成 3.1 ...

  6. 二相混合式步进电机开环细分控制simulink建模仿真含模型文件

    目录 细分原理 二相混合式步进电机电磁转矩方程 对Te方程简单的理解 细分控制的推导 细分系统总体图 正弦电流的仿真simulink实现 关于PWM电流控制(或SVPWM控制) 关于模型中如何控制细分 ...

  7. Simulink建模:如何学习Simulink建模

    本文介绍博主自己学习Simulink建模的方法.后续博客都会按照本文中的思路来记录博主学习的过程. 文章目录 1 Simulink建模的分类 1.1 连续模型建模 1.2 物理模型建模 1.3 控制算 ...

  8. SVPWM原理(五段式七段式)及其Simulink建模

    文章目录 SVPWM原理 逆变电路 扇区划分 矢量合成 作用时间求解 切换时间求解 Simulink模型建立 坐标变换 扇区判断 算法 模型 作用时间计算 各个扇区切换点时间计算 调制波产生 整体模型 ...

  9. 【更新中…】Matlab simulink建模与仿真

    本文为学习笔记,视频来源:https://www.bilibili.com/video/BV1L7411a7uL Matlab simulink建模与仿真 1 初始simulink 1.1 simul ...

最新文章

  1. @async 没有异步_spring boot使用@Async异步任务
  2. oracle中的decode的使用
  3. 10月25日lol服务器维护,《LOL》lol10月25日停机维护到什么时候 10.25维护结束时间...
  4. 09丨缓存异常:如何解决缓存和数据库的数据不一致问题
  5. 【CF487E】Tourists【圆方树】【树链剖分】【multiset】
  6. 阿里云服务器由于被检测到对外攻击,已阻断该服务器对其它服务器端口的访问...
  7. Unity Text 插入图片
  8. vue练习之vue+cnode api
  9. 如何拿到半数面试公司Offer——我的Python求职之路
  10. oracle raise默认作用,Oracle:使用RAISE_APPLICATION_ERROR的情况是什么?
  11. 二手青春——代码之路1
  12. LINUX SHELL判断文件、目录是否存在
  13. python数据挖掘课后题答案_中国大学MOOC《数据挖掘与python实践》章节答案
  14. BIOS和UEFI的区别
  15. 2017 多校4 Wavel Sequence
  16. 女生可以做软件测试吗?
  17. DZZOffice(大桌子)企业文档协同平台教程系列(三)——ONLYOFFICE社区版部署、配置
  18. 搜狗校招编程题-建房子
  19. Matlab工具箱标定和校正鱼眼镜头
  20. Android今日头条的适配

热门文章

  1. 4G全网通模块-MSM8953核心板 (Cortex-A53架构)
  2. 7-3 选民投票 (8 分)编程统计候选人的得票数。有若干位候选人(n<=10),候选人姓名从键盘输入(候选人姓名不区分大小写,姓名最长为9个字节),若干位选民,选民每次输入一个得票的候选人的名字(
  3. 假期打卡(尽力为之)
  4. GAMES101-现代计算机图形学学习笔记(作业03)
  5. 零基础编程——块语言编程游戏攻略之捉虫篇
  6. ctfshow BJDCTF2020 encode wp
  7. BCH DEVCON 黑客马拉松即将登陆旧金山
  8. BUFF80双模蓝牙5.2热插拔PCB
  9. Ubuntu14.04下安装Python开发工具Wing IDE
  10. 路灯发光二极管的选择