📄 motor_state_check.c
字号:
start_counter=0;
jitter_counter=0; //去抖定时器
startcount_permit=0;
}
}break;
case(0x02): //正运行态
{
//正转位置无效&&反转位置无效&&Imax<0.25In=正停车态
if((motor_positive_posit==0x00)&&(motor_negative_posit==0x00)&&(i_over<YX*In))
{
motor_state=0x03; //正停车态
start_counter=0;
startcount_permit=0;
err_state=0x00; //清报警继电器RL3
err_counter=0x00;
return;
}
//正转位置有效&&反转位置无效&&Imax>=0.25In=正转运行态
if((motor_positive_posit==0xff)&&(motor_negative_posit==0x00)&&(i_over>=YX*In))
{
motor_state=0x02; //正运行状态
start_counter=0;
startcount_permit=0;
if(err_counter>240) {err_state=0x00; err_counter=0x00;}//电机从异常运行态返回
else {err_state=0xaa; err_counter=0x00;}//电机一直处于正常运行态,计数器清零
return;
}
//======================================================================
//在以上状态以外的状态,电机异常运行
err_counter++;
if(err_counter>=240) //如果连续10个周波均出现辅助触点失灵的问题
{
err_state=0xff; //运行界面RUN to ERR,发告警信号,RL3
err_counter=241; //防止err_counter溢出,保持电机运行错误的标志,当电机进入正常态时返回
}
else
{
err_state=0xaa; //电机处于正常运行态
}
}break;
case(0x03): //正停车态
{
start_counter=start_counter+0.000833;
if(start_counter>=stop_time) //延时时间到,进入停止态
{
//正转位置无效&&Imax<0.1In=停止态
if((motor_positive_posit==0x00)&&(i_over<TC*In))
{
motor_state=0x00; //停止态
start_counter=0;
startcount_permit=0;
}
//正转位置无效&&0.1In<=Imax<0.25In=停车失败
else if((motor_positive_posit==0x00)&&(i_over>=TC*In)&&(i_over<YX*In))
{
motor_state=0x88; //停车错误态
start_counter=0;
start_fail=0x00; //启动失败清零
jitter_counter=0; //去抖定时器
}
else{//重新回到正运行态
motor_state=0x02; //正运行状态
start_counter=0;
startcount_permit=0;
if(err_counter>240) {err_state=0x00; err_counter=0x00;}//电机从异常运行态返回
else {err_state=0xaa; err_counter=0x00;}//电机一直处于正常运行态,计数器清零
return;
}
}
}break;
case(0xff): //反启动
{
//如果启动失败,不进行以下程序处理,知道启动失败的处理完成(start_fail==0x00)
if(start_fail==0xff) //启动失败,退RL2,投RL1
{
motor_state=0x00;
start_counter=0;
startcount_permit=0;
return; //返回
}
if(i_over<=YX*In) //如果Imax<=0.25In
{
jitter_counter=jitter_counter+0.000833; //去抖定时器
if(jitter_counter>=start_time) //如果一直小于0.25In,进入停止态
{
motor_state=0x00; //停止态
start_counter=0;
jitter_counter=0; //去抖定时器
startcount_permit=0;
start_fail=0xff; //启动失败,退RL2,投RL1
return;
}
}
else //如果Imax>0.25In,去抖时间置零
{
jitter_counter=0; //去抖定时器
}
start_counter=start_counter+0.000833; //延时833us
if(start_counter>=start_time)
{
motor_state=0xfe; //反运行态
start_fail=0x00; //启动失败清零
start_counter=0;
jitter_counter=0; //去抖定时器
startcount_permit=0;
}
}break;
case(0xfe): //反运行态
{
//反转位置无效&&正转位置无效&&Imax<0.25In=反停车态
if((motor_negative_posit==0x00)&&(motor_positive_posit==0x00)&&(i_over<YX*In))
{
motor_state=0xfd; //反停车态
start_counter=0;
startcount_permit=0;
err_state=0x00; //清报警继电器RL3
err_counter=0x00;
return;
}
//反转位置有效&&正转位置无效&&Imax>=0.25In=反转运行态
if((motor_negative_posit==0xff)&&(motor_positive_posit==0x00)&&(i_over>=YX*In))
{
motor_state=0xfe; //反运行状态
start_counter=0;
startcount_permit=0;
if(err_counter>240) {err_state=0x00; err_counter=0x00;}//电机从异常运行态返回
else {err_state=0xaa; err_counter=0x00;}//电机一直处于正常运行态,计数器清零
return;
}
//======================================================================
//在以上状态以外的状态,电机异常运行
err_counter++;
if(err_counter>=240) //如果连续10个周波均出现辅助触点失灵的问题
{
err_state=0xff; //运行界面RUN to ERR,发告警信号,RL3
err_counter=241; //防止err_counter溢出,保持电机运行错误的标志,当电机进入正常态时返回
}
else
{
err_state=0xaa; //电机处于正常运行态
}
}break;
case(0xfd): //反停车态
{
start_counter=start_counter+0.000833;
if(start_counter>=stop_time) //延时时间到,进入停止态
{
//反转位置无效&&Imax<0.1In=停止态
if((motor_negative_posit==0x00)&&(i_over<TC*In))
{
motor_state=0x00; //停止态
start_counter=0;
startcount_permit=0;
}
//反转位置无效&&0.1In<=Imax<0.25In=停车失败
else if((motor_negative_posit==0x00)&&(i_over>=TC*In)&&(i_over<YX*In))
{
motor_state=0x88; //停车错误态
start_counter=0;
start_fail=0x00; //启动失败清零
jitter_counter=0; //去抖定时器
}
else{//重新回到反运行态
motor_state=0xfe; //反运行状态
start_counter=0;
startcount_permit=0;
if(err_counter>240) {err_state=0x00; err_counter=0x00;}//电机从异常运行态返回
else {err_state=0xaa; err_counter=0x00;}//电机一直处于正常运行态,计数器清零
return;
}
}
}break;
case(0x88): //停车错误态
{
err_state=0xff; //报警继电器动作
if((i_over<TC*In)&&(motor_positive_posit==0x00)&&(motor_negative_posit==0x00))
{
motor_state=0x00; //停止态
err_state=0x00; //返回告警继电器
start_counter=0;
startcount_permit=0;
}
}break;
default: //如果不是以上集中状态,则重新判断电机所处的状态
{
Judge_MotorState_Double();
}
}
}
void Check_MotorState_Single(void) //检查电机状态
{
if(test_position==0xff){ //如果在试验状态下有开关位置,则电流置为额定值,这样方便调试
if((motor_positive_posit==0xff)||(motor_negative_posit==0xff))
i_over=In;
}
//motor_state
//0x00=停止,0x88=停车错误态(停车错误态的处理未写)
//0x01=正启动,0x02=正运行,0x03=正停车
switch(motor_state) //根据运行状态分别检查电机的运行情况
{
case(0x00): //停止
if(startmode==0){ //单向电平控制方式
//如果启动失败,不进行以下程序处理,直到启动失败的处理完成(start_fail==0x00)
if(start_fail==0xff) //启动失败,强行停车
{
motor_state=0x00;
startcount_permit=0;
start_counter=0;
jitter_counter=0; //去抖定时器
run_count_permit=0x00; //运行计数器屏蔽
return; //返回
}
//正转继电器有效&&正转位置有效=进入正启动态
if((run_count_permit==0x01)&&(motor_positive_posit==0xff)){
motor_state=0x01;
startcount_permit=0;
start_counter=0;
reset_change=1; //复位标志置1
start_fail=0x00; //启动失败清零
jitter_counter=0; //去抖定时器
run_count_permit=0x00; //运行计数器屏蔽
return;
}
//正转继电器有效&&正转位置无效=等待15秒看是否有位置,有就启动,无则返回继电器
if((run_count_permit==0x01)&&(motor_positive_posit==0x00)){
start_counter=start_counter+0.000833; //去抖定时器
if(start_counter>=15) run_count_permit=0xaa; //如果15秒钟内,开入还没有进入启动态,关闭该继电器
return; //直接返回
}
//正转继电器无效&&正转位置有效=停止错误态
if((run_count_permit==0x00)&&(motor_positive_posit==0xff)){
motor_state=0x88; //停止错误态
start_counter=0;
start_fail=0x00; //启动失败清零
jitter_counter=0; //去抖定时器
run_count_permit=0x00;//运行计数器屏蔽
}
//正转继电器无效&&正转位置无效&&Imax>=0.25In=停止错误态
if((run_count_permit==0x00)&&(motor_positive_posit==0x00)&&(i_over>=YX*In)){
motor_state=0x88; //停止错误态
start_counter=0;
start_fail=0x00; //启动失败清零
jitter_counter=0; //去抖定时器
run_count_permit=0x00;//运行计数器屏蔽
}
//正转继电器无效&&正转位置无效&&Imax<0.25In=停止态
if((run_count_permit==0x00)&&(motor_positive_posit==0x00)&&(i_over<YX*In))
{
motor_state=0x00;
start_counter=0;
start_fail=0x00; //启动失败清零
jitter_counter=0; //去抖定时器
run_count_permit=0x00; //运行计数器屏蔽
return;
}
}
else{ //单向脉冲控制方式
//如果启动失败,不进行以下程序处理,直到启动失败的处理完成(start_fail==0x00)
if(start_fail==0xff) //启动失败,强行停车
{
motor_state=0x00;
startcount_permit=0;
start_counter=0;
jitter_counter=0; //去抖定时器
run_count_permit=0x00; //运行计数器屏蔽
return; //返回
}
//正转位置有效=进入正启动态
if(motor_positive_posit==0xff){
motor_state=0x01;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -