01--背景
这篇博文之前在IT模型中的信号处理与优先级控制-优快云博客介绍过,其中有一个模块是counter up模块,这个是Simulink内自带的DSP系统内的模块
该封装子系统内部无法看到逻辑,因为引用的是s-function
之前在写这篇博文时--故障码循环显示时也是直接引用的,现在重新基于需求再搭建一次故障码循环展示模块
02--需求
当前置位的故障码在一个信号中以人为规定的时间进行循环显示
03--输入输出
输入:
①故障标志位 err_flg
②故障标志位对应的故障码 err_code
输出
①故障码循环显示信号 err_display
04--模型开发
假设某个微控制器有5个故障码,分别为15,27,36,42,59,其中故障码15,36,42对应标志位置1,15,36,42以每1000ms在一个信号上显示一次
新建空白模型,并设置好求解器时间,步长等
将输入的故障码及标志位搭建好
使用选择器模块,输入为故障码数组,索引为标志位置1对应的数组,要想单独找出标志位置1的数组,需要用到find模块
选择器是基于索引为1起始的,且索引为向量,大小为5个(5个故障码)
上面相当于已经把置位对应的故障码刷选出来了,下一步如何让其按照标定的时间进行循环显示
其实可以再拉一个选择器,让其输入为刚刚搭建的选择器的输出,索引为对应的置位的标志位索引的计数即可,上述例子中有3个故障进行了置位,那么就让索引从1,2,3(为什么索引不是0,1,2,是因为现在我们的选择器索引都是从1开始而不是0)进行循环即可
注意上述find模型索引也从1开始
用状态机搭建一个计数模块,即从1开始计数,每隔标定时间进行自增
模型运行后,初始化输出为1,大于标定设置时间跳转到累积模块,输出此时加1,经过一半的标定时间跳转到中间模块,在经历另外一半标定时间后跳回累积模块,此时因为进入条件为输出加1,此时输出为2,一直循环下去,直到reset置1后,输出清0,reset什么时候置1,那就是同时置位的故障码达到最大个数的时候。
示波器已经按照我们设定的时间在1,2,3中进行循环了
现在只需要再引入另外一个选择器就可以实现故障码循环显示了
上面常数100即为可标定的显示时间间隔
示波器输出
该模型放在资源中
------------------------------------------------补充------------------------------------------------------------------------
2024.12.30 上午
如果仿真到这里的同学会发现,如果故障码个数很多并且当前一直有不少于2个故障置位,那么上述模型确实不会有什么问题,但是如果只有一个故障置位,或者没有任何故障置位,模型会怎么样??报错!
只有1个故障置位,理论上就没有循环可言就应该显示一个故障就行了,而上述模型却不能完成这样的功能,因为,状态机的设置会导致选择器的输入只有一个故障码,而索引必须要有2个才能进行reset,这就导致选择器的输入个数与索引个数不匹配而报错。
当没有故障置位时呢?直接报错,因为状态机内初始化就是至少有一个索引了而输入什么都没有,这种情况需要引入If子系统把没有故障进行分离。
经过如下调整,已经能够覆盖所有当前故障的个数了
外观:
子系统内部:
状态机:
没有故障码时仿真结果:
故障码为1个时仿真结果:
故障码为5个时仿真结果:
---------------------------------------补充----------------------------------------------------------
2024.12.30 下午
经过仿真测试发现,上述更改的模型虽然已经能够支持需求,但是只能支持静态索引数是固定的值,即当有3个故障置位,但是在后续该3个故障置位不能发生改变,比如恢复了一个变成2个或者新增一个变成了4个,模型都会报错,原因还是因为索引和故障码不匹配,故引入如下逻辑:
引入条件u1和u2,u2和原来一样,u1若不等于u2说明故障有新增或者恢复,重新再走一遍子系统
但是注意,需要把if子系统内的保持held改成reset,不改会影响变量的索引从而报错
上述模型新增了显示状态量,只有当状态等于1时说明此刻有新增或恢复故障,0代表没有故障,2为维持
在跑一遍发现正常了,但是故障维持的标定时间只有在状态等于2时稳定的时候才有效了