目的
- 电池管理系统中存在着数据本地存储的要求,保证控制器重新上电后能够根据存储器中的一些参数恢复控制状态,和信息的下电存储
- 1.继电器故障信息的存储。2. 系统性故障的存储。3.SOC、SOH相关信息的存储。4.均衡参数的存储。5.系统时间信息。6.出厂信息的存储。7.业务模块控制信息存储
结构
- 上软软件结构进行说明
实现
信号组装和解析
- 嵌入系统信号值类型一般采用基本类型也就是整数和浮点数,实现组装成数据块时(也就是定长无符号整数uint32数组),需要对信号值进行转换和拼接,最终放入数组中。
- 将数组划分为多个段 boolean、uint8、uint16、uint32,用于存放信号
- 根据信号的数值范围,确定所属的段。最终一个段内有0或多个信号
- 段内的一组信号进行排列组装(eg: 一个uint32 能够容纳32 个boolean数值范围的信号;u8、u16、u32 以此类推),需要记录信号的排列位置,读取时根据位置解析。
- 保存好信号排布的描述文件,模块实现过程中依赖此文件
读写控制
- 模块运行过程中内部的读写状态是互斥的。软件在上电的时候,会将EEFROM中的数据搬运到一块特定RAM空间中,后续将不会重新进行EEFROM——>RAM的搬运。存储模块在进行写数据时将会发生 特定RAM空间——>EEFROM动作。
- 这种特性也就意味着上电后,整个过程信号的输出值不会改变(读取完EEFROM后)
- 上电系统处于初始化阶段,模块处于读状态,使能解析模块开始解析数据块
- 模块读写状态互斥,初始化阶段模块不进入写状态
- 系统初始化完毕后,模块切换为写状态,解析模块停止使能维持上一时刻值。(整个上电循环系统只会出现一次初始化)
- 模块处于写状态下,当触发存储条件时,使能组装模块,并请求底软进行存储
注意事项
- 注意读写状态的互斥,虽然在系统初始化阶段存储器可能已经就绪,但是为了设计上的简单化。在整个系统初始化阶段不进行写请求。
- 基于数据块更新的策略也就以为着时一批信号的同时存储,在信号设计上要考虑打其他信号的存储需求,存入信号本身非期望的值(例如异常下电,存储中的值可能是信号的过程值,如果过程值是无效值那么会覆盖上一次下电时存储的有效值),设计上对于值是无效的过程需要进行逻辑上的防护避免这种过程的出现,其他信号会触发存储将 无效值信号进行存储
- 在处理存储需求时采用队列,用于应对连续触发存储条件的场景。底软在完成一次存储动作过程中无法响应存储需求,存储需求是串行处理的。如果底软实现了队列,那么上软只需要连续发送请求即可,如果底软没有做队列,那么上软就需要实现队列。当然上下都可以实现队列
- 信号的精度设置和偏移缩放运算
- 谨慎使用存储区域,一旦使用该区域将会永久使用(其他信号复用存在风险 ,因为区域存在旧信号值)
总结
- 主要从模块的结构、实现、注意事项三个方面说明了下存储模块的设计,这里只是简单的说明了下上软的实现方案,具体到如何保证存储的一致性和可靠性还有待研究讨论,对于上软和底软的交互受限于篇幅也没有说明,后面有机会会结合matlab单独出一期实现和讲解