专栏
标签
状态机如何等效实现真值表功能
技术分享
发布于 2025-08-06 16:58:59
查看 10过去300天

问题描述

用户期望使用状态机实现真值表功能,根据输入的数值判断输出的状态。例如下面的示例。

示例描述

输入变量

1.车内温度(Temperature):精确到 1℃,取值范围 - 20℃至 50℃。
2.车外温度(ExternalTemp):精确到 1℃,取值范围 - 40℃至 60℃。
3.车内湿度(Humidity):以百分比表示,取值范围 0% 至 100%。
4.阳光强度(SunIntensity):分为 0(无阳光)、1(弱)、2(中)、3(强)。
5.车内人数(Occupants):取值范围 0 至 8 人。
6.用户设定温度(SetTemp):精确到 1℃,取值范围 16℃至 30℃。
7.用户设定风速(SetFanSpeed):分为 0(自动)、1(低)、2(中低)、3(中)、4(中高)、5(高)。
8.车辆行驶状态(DrivingStatus):0(停车)、1(低速行驶,车速 ≤ 30km/h)、2(中速行驶,30km/h <车速 ≤ 60km/h)、3(高速行驶,车速> 60km/h)。
9.空调模式选择(ACMode):0(制冷)、1(制热)、2(通风)。
10.自动模式开启(AutoMode):0(关闭)、1(开启)。

输出变量

1.压缩机工作状态(CompressorStatus):取值范围为 0(关闭)、1(开启)。该变量直接反映压缩机是否运行,0 表示压缩机处于停止状态,不进行制冷或制热的核心工作;1 表示压缩机启动,开始压缩制冷剂,实现制冷或制热循环。
2.风扇实际风速(FanSpeed):取值分为 1(低)、2(中低)、3(中)、4(中高)、5(高)。风速数值越大,意味着风扇运转速度越快,单位时间内输送的空气量越多,从而影响车内空气的循环速率和制冷制热效果的传播速度。例如,在高温需要快速降温时,可能会将风扇风速调至 4 或 5 档;而在温度适宜且追求安静时,可能设置为 1 或 2 档。
3.温度调节指令(TempAdjust):取值为 - 2(调低 2℃)、 - 1(调低 1℃)、0(不变)、1(调高 1℃)、2(调高 2℃)。这些取值用于指示空调系统对车内温度进行调整的方向和幅度。当车内温度高于期望温度时,可能会下达 - 1 或 - 2 的指令;当车内温度低于期望温度时,则可能下达 1 或 2 的指令;若温度合适,指令为 0。
4.湿度调节指令(HumidityAdjust):取值为 0(不调节)、1(除湿)、2(加湿,若有此功能)。0 表示当前车内湿度处于合适范围,无需进行额外调节;1 代表启动除湿功能,用于降低车内过高的湿度,提高车内舒适度;2 则在车辆配备加湿功能时,用于提升车内过低的湿度。
5.出风方向(AirFlowDirection):取值为 0(吹面部)、1(吹脚部)、2(吹挡风玻璃)、3(混合模式)。0 档时,空调出风口主要向车内人员的面部吹风,能快速调节人体感知温度;1 档使风主要吹向脚部,从下往上提升人体舒适度,尤其在制热时效果明显;2 档针对挡风玻璃吹风,常用于除雾、除霜等场景;3 档为混合模式,可同时向多个方向出风,满足不同乘客的需求。
6.循环模式(CirculationMode):取值为 0(外循环)、1(内循环)、2(自动循环)。0 档外循环时,车内空气与外界新鲜空气持续交换,可引入新鲜空气,降低车内异味和二氧化碳浓度;1 档内循环使车内空气在封闭空间内循环,能快速调节车内温度,但长时间使用可能导致空气不新鲜;2 档自动循环则根据车内空气质量、温度等因素自动切换内外循环模式。
7.节能模式启用(EcoMode):取值为 0(未启用)、1(启用)。0 表示空调系统以常规功率运行,追求最佳的制冷制热效果;1 代表开启节能模式,此时系统会优化运行参数,降低能耗,以节省车辆能源,如适当降低压缩机功率、调整风扇转速等,但可能会在一定程度上牺牲部分制冷制热效率。
8.快速调节模式启用(FastMode):取值为 0(未启用)、1(启用)。0 档下,空调系统按照正常的调节速度工作,注重舒适度和节能的平衡;1 档开启快速调节模式,系统会全力运行,如压缩机以最大功率工作、风扇调至最高速等,快速将车内温度、湿度等调节至设定状态,但会消耗更多能源。

真值表

1.png

案例说明

  • 高温多人强光行驶制冷场景:当车内温度大于 28℃,高于用户设定的温度 3℃以上,阳光强度大于中(2 级),车内人数大于 3 人,且车辆处于中速行驶(车速在 30km/h 到 60km/h 之间)状态,同时自动模式开启且选择制冷模式时,压缩机开启,风扇风速调至中高(4 档),温度调低 2℃,不调节湿度,出风方向吹面部,采用外循环,不启用节能模式,启用快速调节模式。
  • 低温停车制热场景:车外温度小于 5℃,车辆处于停车状态,自动模式开启且选择制热模式,用户设定温度为 18℃,此时压缩机开启,风扇风速调至中低(2 档),温度调高 1℃,不调节湿度,出风方向吹挡风玻璃,采用内循环,启用节能模式,不启用快速调节模式。
  • 用户手动设置场景:当自动模式关闭时,如用户设定风速为 1 档,车辆处于停车状态且选择通风模式,空调系统将按照用户设定的风速(1 档)运行,压缩机不工作,不进行温度和湿度调节,出风方向默认吹面部,采用外循环,不启用节能和快速调节模式。

模型搭建

1、新建状态机模型,对模型命名,点击确定,进入模型界面;

2.png
3.png
4.png

2、添加变量
a.双击chart模块,进入状态机,右键后,在弹出的菜单栏目中点击编辑状态机变量对输入输出进行编辑

5.png

b.点击添加变量

6.png

c.点击范围栏将其改为输入或输出变量,然后双击名称栏改变其命名,再更改类型为int32;

7.png

d.对于各子状态中要用到的变量,如果是全局变量,则在chart中声明,如下图;

8.png

e.如果是本地变量则在函数或状态中定义,这里是一个定义的子函数,输入x,返回y(单击函数名);

9.png

3、点击库浏览器打开sysblock/StateMachine,可以看到状态机的各个组件;

10.png

4、我们先使用State模块,单击上栏可以更改名字,单击下方空白栏可以填写程序;

11.png
12.png

5、按照第一行的真值表,我们对第一个函数进行赋值,同时可以使用DefultTransition模块激活该状态,en表示在第一次进入该状态后运行一次,du表示持续运行,ex表示在出该状态后运行;

13.png

6、然后编写第二个状态,并使用连接线连接,连接后会出现[true],单击修改[]中的量为判断量;这里改为[Temperature_local ==28]

14.png

7、重复上述步骤,最后状态结束于state1中

15.png

8、真值表第一条就写好了,我们可以回到主模块对其进行测试;

a.使用constant模块模拟输入(需要将constant中的函数类型改为int32);

16.png

b.使用mux模块集合输出;

c.使用display模块展示。

17.png

9、点击仿真开始仿真;

10、进入结果查看器,在菜单中点击表格,然后在左边栏中点击chart中的输出变量,可以看到我们需要的输出变量均已输出;

18.png

11、剩余真值表重复上述4-7步即可完成。

12、为了表示模型的易读性,我们这里并没有使用给单个状态连接太多的线,但是我们在写模型的时候可以这么做但是下述两种连接方式是等效的;

19.png
20.png

13、当然我们也可以使用另外的方式达到目的(真值表第7-8列的实现方式)

21.png

a.使用function模块来代替[AutoMode_local==1]这样的判断条件

b.在StateMachine中移出GraphFunction模块;

22.png

c.右键后打开if-else判断

23.png

d.在流程图模型中输入判断条件和执行的动作;

24.png

e.在AutoMode_state中引用该模块;x为我们的输入变量,y为我们的输出变量

25.png

所属专栏:Sysblock基础平台
产品信息:Sysblock 嵌入式代码生成工具
其他

全部回答

暂无数据
暂无数据
用户
和原帖交流更多问题细节吧,去
我要发帖 我要发帖
资料中心 资料中心
查看更多>
热门帖子 热门帖子
主要贡献者 主要贡献者
过去7天