有限状态机c语言实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

此前做过的小项目代码都是比较简单,简单的流水线似的逻辑就可以囊括所需要的功能;最近接触的电源项目,在正常的控制pwm输出之外,还需要各种辅助功能,比如过压保护,短路保护功能,温度监控,风扇控制等,就不能按照简单的顺序逻辑了;在该项目中就接触到了有限状态机的概念,虽然以往课堂上也接触过状态机,但都是仅存于认识,并没有深入理解,进到一线干活才会发现这些理论的实用性,所以本文将记录一下此次项目中有限状态机的c语言实现框架,方便以后取用。


一、有限状态机

有限状态机(Finite-state machine,FSM),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。通俗理解就是当前有有限个状态,但对于单核单线程而言,当前的工作状态只有一种,每一次工作状态的转移都需要一定的触发条件。

四、转态切换示意图

电压不正常
电压正常
电流不正常
电流正常
温度不正常
温度正常
电压不正常
电压正常
正常
Task_0_Initial_state
Task_TxRx_state
Task_1_SelfLock_detc
Task_2_Vin_detc
Task_3_Iin_detc
Task_4_Temprature_detc
Task_5_Vout_detc
Task_6_Soft_start

三、代码

1.使用枚举定义状态

代码如下:

/**********************系统任务**************************************/
typedef enum
{
 Task_0_Initial_state,   //初始状态
 Task_1_SelfLock_detc,   //自锁开关
 Task_2_Vin_detc,        //检测输入电压
 Task_3_Iin_detc,        //检测输入电流
 Task_4_Temprature_detc, //温度监测
 Task_5_Vout_detc,       //输出监控
 Task_6_Soft_start,      //开始缓启动
 Task_TxRx_state,        //通讯状态
 //......//可以继续定义其他状态
}System_Task;

首先定义好各种需要的状态,比如电源需要初始化状态,开关检测状态等;

2.swicth进行状态机的切换

代码如下:

void state_machine(void)  //状态机
{
	Next_State=Current_State=Task_0_Initial_state;
	while(1)
	{	 
		 Current_State=Next_State;
		 switch(Current_State)
			{
				case Task_0_Initial_state:
				{	 
                         Reset_VAR();	//复位初始化各种变量与标志
						 Next_State=Task_TxRx_state; //下一状态:与上位机进行通讯									
				}  break;
				case Task_TxRx_state://与上位机进行通讯		
				{	 	
					Next_State=Task_1_SelfLock_detc;//下一状态:检测自锁开关
				}  	break;
				case Task_1_SelfLock_detc://检测自锁开关
				{	 	
						Next_State=Task_2_Vin_detc; //下一状态:检测电压															
				}  
				break;									
				case Task_2_Vin_detc://检测输入电压
				{							
					if()//电压不正常
						Next_State=Task_0_Initial_state;//切换到初始化状态
						
					Next_State=Task_3_Iin_detc;//下一转态 :检测电流输入		
				}	break;
				case Task_3_Iin_detc : //检测输入过流保护,有待测试
				{	
					if()//电流不正常
						Next_State=Task_0_Initial_state;切换到初始化状态
					
					Next_State=Task_4_Temprature_detc;					
				} break;	
				case Task_4_Temprature_detc : //检测温度过高保护
				{
					if()//温度不正常
						Next_State=Task_0_Initial_state;切换到初始化状态			
																		
					Next_State=Task_5_Vout_detc;//下一转态 :检测电压输出
				} break;
				case Task_5_Vout_detc : //检测输出
				{
					if()//输出电压不正常
						Next_State=Task_0_Initial_state;切换到初始化状态	
																
					Next_State=Task_6_Soft_start;//下一转态 :缓启动															
				} break;									
				case Task_6_Soft_start ://缓启动
				{						
					Next_State=Task_TxRx_state;//下一转态 :与上位机通讯												
				} break;													
				default:          break;
			}
	}
}

这一段代码框架就是状态的切换过程,只要修改Next_State变量就可以实现下一个转态的切换,大概的逻辑流程首先进入初始化状态,初始化各种参数,比如PID参数等,然后就是检测开关是否开启,之后就是启动前的电压,电流,温度检测,只有当这些都正常才开启软启动开机,不然都会在出问题的那个状态态切换到初始化转态,重新进行各种判断,直到正常启动,此后就一直在正常工作的状态与通讯状态、电压电流检测状态之间进行切换。当然具体的状态切换可根据自己的项目进行修改。

总结

由于这是项目中第一次接触到的有限状态机概念,以前都是在课本上学习理论知识,对于其优点没有多大的体会,使用有限状态机思想编程的思想带来的体会就是:编程逻辑清晰了,改需求也容易多,只需要增删对应的状态就能达到增删项目的功能。本文也只是简单地记录了项目中使用过的有限状态机的基本框架,便于自己日后的使用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include int main() { int state_key = 1; //钥匙状态 为1时钥匙区有钥匙,为时钥匙区 无钥匙 int state_hold = 0; // 钥匙持有状态 为1时持有钥匙,为时 未持有钥匙 int state_door = 0; //门状态 0:关闭 1:打开 int state_lock = 1; //上锁状态 1:上锁 0:解锁 int order; // 用于存放用户输入指令 printf("this is a game.\n"); printf ("if you want to OPEN THE DOOR ,input 1\n"); printf ("if you want to CLOSE THE DOOR ,input 2\n"); printf ("if you want to LOCK THE DOOR ,input 3\n"); printf ("if you want to UNLOCK THE DOOR,input 4\n"); // printf ("if you want to LOCK THE DOOR ,input 5\n"); printf("please input the order\n"); while(1) { scanf("%d",&order); // if(order!=(1||2||3||4)) // { // printf("worng input ,please input again.\n"); // continue; // } switch(order) { case 1 : if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_door=1; break; case 2: if(state_door==0) { printf("the door has been closed before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_door=0; break; case 3: if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_lock=1; break ; case 4: if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==0) { printf("the door has not been lock\n"); break; } state_lock=0; break ; } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值