01--背景
自打Deepseek上线以来,风靡全球,我也在本地接入了deepseek,之前一直想把故障码循环显示专项这个功能做进软件内,因为当前有个项目对观测量的支持非常有限,因为使用的是CAN报文。
观测量预估:
CAN的标准帧长度为111bit,如果周期为10ms,那么1s报文发送100次,波特率为500K bits/s
那么单帧负载率= 111bit*100次/500k =2.22% ,10ms信号观测数量=100/2.22≈45个
2ms单帧负载率=2.22%*5 = 11.1% 2ms信号观测数量=100/11.1 ≈9个
而一个软件有成百上千的观测量,仅仅这点观测量还不足以做全一个观测环境,这样会导致分析问题时所采集的数据总会丢三落四,效率低下。
而这个功能,最起码可以把一些布尔量集合起来,循环展示,通过State的变化去推断信号是什么时候置位的,什么时候又Reset了,关键是一个信号可以代替十几个信号,对变量的空间节省也非常有作用,为什么叫故障码循环显示专项呢?因为该功能对置位的故障码更为有效,有时候发现不对劲了只要把该信号调出来,看看到底哪些故障置位了即可去找对应的应对方法。
现在目前的问题是,在之前的博客中
故障码循环显示专项_simulink持续显示错误代码-CSDN博客
虽然已经通过建模实现了该功能,并且经过几次调试解决了已知的bug,但是最后在软件集成的时候还是出现了问题,那就是我们所用的某个模块(find模块)不支持代码生成功能,由于公司的MATLAB为正版软件,某些功能没有购买,或是版本不支持等
如下图,变步长信号不支持生成代码
![](https://i-blog.csdnimg.cn/direct/385d6947de8b4bebac7b306991ca8084.png)
02--交互
所以我就在想,能不能避开find模块,find模块的作用就是把非0信号的索引找出来组合成一个数组。
于是就这个问题我问了Deepseek,以下是我们交互的内容:
我是这么问的:
![](https://i-blog.csdnimg.cn/direct/530f77b0276a459195a13fdaa173e1a8.png)
Deepseek第一次回答:
![](https://i-blog.csdnimg.cn/direct/5b237b37c11c4fbfa20380a57ee424a6.png)
![](https://i-blog.csdnimg.cn/direct/d0899298367648a78ff8a4a4750928e4.png)
![](https://i-blog.csdnimg.cn/direct/69ae880fca9f4b30ba2e8b01a3e9ef94.png)
明显没有说完,我让他说下一段:
![](https://i-blog.csdnimg.cn/direct/79c7c09afa0a4103bb1eed25c3db500a.png)
Deepseek第2次回答:
![](https://i-blog.csdnimg.cn/direct/9bb1f361cd944dd9bfb253870ea4c53a.png)
![](https://i-blog.csdnimg.cn/direct/6f73233e4b9a4b7ab27a526e2906bda7.png)
于是我拿Deepseek写的MATLAB Function代码直接使用了,发现报错,我把报错发给了他
![](https://i-blog.csdnimg.cn/direct/ca4b27d6b70c4290a745b5aec34dc0de.png)
Deepseek第3次回答:
![](https://i-blog.csdnimg.cn/direct/5e8c9e64760943a890920c70cafc79f8.png)
![](https://i-blog.csdnimg.cn/direct/a0855b56884b474ebad1384819d5e5c8.png)
![](https://i-blog.csdnimg.cn/direct/8aa3c38ae3554753add30e2b83242dd6.png)
拿去用之后继续报错,有点不想指望他了
![](https://i-blog.csdnimg.cn/direct/cec51eacc4094843a586ef699c60b1ee.png)
Deepseek第4次回答
![](https://i-blog.csdnimg.cn/direct/4637c3c7a6fd4036a244e7a9f09132d3.png)
![](https://i-blog.csdnimg.cn/direct/52ffd6354cf543fc9356cd3c81d54e1e.png)
没说完就给停了
![](https://i-blog.csdnimg.cn/direct/0454120727284671afd663824760107e.png)
Deepseek第5次回答:
![](https://i-blog.csdnimg.cn/direct/c569139bcceb4c3f98802ed2c4ae2b19.png)
![](https://i-blog.csdnimg.cn/direct/08eedaa811b04f848dd99ce30340f53f.png)
拿这次的代码去使用,居然不报错了成功了
![](https://i-blog.csdnimg.cn/direct/6fb0a319b6414a29828fd72781968f80.png)
03--模型功能实现
![](https://i-blog.csdnimg.cn/direct/cf4bf11c7ee14d7e88477bc72bd0b5ad.png)
放大下面:
![](https://i-blog.csdnimg.cn/direct/52ea5792666c487a9d9c8c7e7f881948.png)
上图,find模块会直接找到对应置位的索引,索引由1开始
而下面先把标志位与索引位置映射好,然后通过MATLAB Function函数,只把大于0的信号重新拼接成数组
MATLAB Function 函数:
function y = filter_elements(u)
% 将输入转为列向量(确保所有维度一致)
u_col = u(:); % 转为列向量
% 预分配(列向量)
max_size = length(u_col);
temp = zeros(max_size, 1); % 改为列向量预分配
% 筛选条件(示例:元素 >0)
count = 0;
for i = 1:length(u_col)
if u_col(i) >0
count = count + 1;
temp(count) = u_col(i);
end
end
% 输出为列向量:直接截取有效部分(保持列方向)
y = temp(1:count);
end
变量设置:
![](https://i-blog.csdnimg.cn/direct/3f42b16fea964034a95a92f4499930c4.png)
![](https://i-blog.csdnimg.cn/direct/0b258572d6e54b2d9ad022791ecc31de.png)
运行仿真:
结果相等均为1,4,5
![](https://i-blog.csdnimg.cn/direct/2c10d12543d54a07bcfe4045f84cd561.png)
移植该功能去生成代码:
非常可惜!没有绕过这个变步长信号的使用,因为MATLAB Function内变量y勾选了变步长,仍然无法支持,跟用了Find的结果一样
![](https://i-blog.csdnimg.cn/direct/d9f8f421d91741df924e63976fa103b2.png)
虽然最后仍然没有在这个事情上得到帮助,但是Deepseek的出现无疑对后续的建模,策略开发有非常好的指导意义。