什么是状态机,状态机就是状态转移图,我们把系统表现的行为,描述成几种状态,系统的行为就是在几种状态中相互转移,而状态转移需要触发条件。比如人有三个状态:健康,生病,恢复。触发条件有:受凉、吃药、休息等。
为什么需要状态机呢,笔者个人认为第一点应该是基于安全考虑,确保系统的状态能够被用户明确知道,第二点,是状态机,能够根据用户的指令,代替用户完成繁琐的操作,这是因为状态机能够根据触发条件自行判断、操作,比如并网,用户可以直接给状态机输入一个指令,然后状态机就会自动控制接触器动作,PWM动作等,让整个逆变器在安全情况下,并入电网。
对于一般的逆变器的状态机可以分为测试模式,正常模式。
测试模式逆变器的状态:故障状态、复位状态、准备就绪状态。
正常模式逆变器的状态:故障状态、复位状态、准备就绪状态、预充电状态、运行状态。
触发条件:交流接触器状态、预充电接触器状态、系统故障字、系统复位字、直流电压采集值、用户给定的指令。
整个逆变器的状态机可以用下面的框图表示:
从框图来看状态机,还是比较容易理解的,但具体落实到代码上,如何实现。其实代码可以分为这个三个部分:输入、处理、输出。
输入即是状态机的触发条件,处理即是系统状态转移的过程,输出即是系统的动作。
我们可以用一个函数来实现状态机的触发条件。
void StateMachine_Input(StMaInput *K)
{
if( DiHandle.bit.DI4 != 0) //交流接触器
{
K->bit.AcBreakerSt = 1;
}
else
{
K->bit.AcBreakerSt = 0;
}
if(DiHandle.bit.DI6 != 0)//预充电接触器
{
K->bit.ChargeSwitchSt = 1;
}
else
{
K->bit.ChargeSwitchSt = 0;
}
if( SysFaultReg.all != 0) //系统故障字
{
K->bit.SysFault = 1;
}
else
{
K->bit.SysFault = 0;
}
if(SystemReset != 0) //系统复位字
{
K->bit.SysReset = 1;
}
else
{
K->bit.SysReset = 0;
}
if(AdcFilter.Udc > UdcChargeValue) //直流电压采样值
{
K->bit.ChargeFinishFlag = 1;
}
}
用户指令,单独用个函数实现,因为这是用户设定当前系统的模式,高于一般的状态机触发条件。
void StateMachine_UserOrder( void )
{
Uint16 StopOrder;
if(gvar[cpu1_group8_14].Typ.ul != 0) //急停与关机按钮屏蔽
{
StopOrder = 0;
}
else
{
if((DiHandle.bit.DI8 != 0) || (DiHandle.bit.DI3 == 0)) //停机按钮或者急停时,关机
{
StopOrder = 1;
}
else
{
StopOrder = 0;
}
}
if( StopOrder != 0)
{
gvar[cpu1_group4_2].Typ.ul = 1; //停机命令
StM.UiStamp = Hvdc_UI_STOP;//停机命令
}
else
{
switch(gvar[cpu1_group4_2].Typ.ul) //在系统硬件无异常情况下,用户输入指令
{
case 0:;
break;
case 1:
{
StM.UiStamp = Hvdc_UI_STOP;//停机命令
}
break;
case 2:
{
StM.UiStamp = Hvdc_UI_RUN; //运行命令
}
break;
case 3:
{
StM.UiStamp = Hvdc_UI_Test; //测试命令
}
break;
default:
gvar[cpu1_group4_2].Typ.ul = 1; //命令异常
break;
}
}
}
笔者将系统的每个状态,用一个函数表示。在这些函数中,状态机自行按照触发条件,控制接触器动作、PWM动作。
void StateMachine_Manage(HvdcConsole *V)
{
StateMachine_Input( &V->Input); //触发条件输入
switch(V->MainState)
{
case HVDC_Fault_St: //故障状态
StateMachine_FaultHandle(V);
break;
case HVDC_Reset_St: //复位状态
StateMachine_ResetHandle(V);
break;
case HVDC_NormalRun_St: //正常运行状态
StateMachine_NormalRunHandle(V);
break;
case HVDC_Ready_ST: //准备就绪待机状态
StateMachine_ReadyHandle(V);
break;
case HVDC_Charge_ST: //预充电状态
StateMachine_ChargeHandle(V);
break;
default:
V->MainNextState= HVDC_Fault_St; //状态机模式切换异常
StateMachine_FaultHandle(V);
break;
}
}
状态机的输出,即是系统发生的动作,这些动作比较多,比如开或关接触器,释放或闭锁PWM,系统模式切换指令。由多个函数实现这些功能,这里就不依次列举了。