MW22-02A/APP/Service/service_statusmonitor.c

1525 lines
48 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "ptz_header_file.h"
#include "service_statusmonitor.h"
#include "agent_hyt.h"
#include "service_selfcheck.h"
extern void ptz_uart_dev_send(device_handle device, void *data, int len);
static char max_temperature_fault;
//温度、电压、电流故障检测
static char ptz_temp_volt_current_fault_detect_task()
{//只报故障,不做响应
static unsigned short int time_ms;
time_ms ++;
if(time_ms < 1000)
{
return 1;
}
else
{
time_ms = 0;
}
//一般温度故障,用于故障回传
if(g_ptz.temperature > PTZ_TEMP_DETECT_MAX || g_ptz.temperature < PTZ_TEMP_DETECT_MIN )
{
g_ptz.fault_detect.temperature_fault = FAULT;
}
else
{
g_ptz.fault_detect.temperature_fault = NO_FAULT;
}
//极限温度故障用于限制云台功能控制超过温度阈值10℃有效此时云台不能正常工作
if(g_ptz.temperature > (PTZ_TEMP_DETECT_MAX + 10.0) || g_ptz.temperature < (PTZ_TEMP_DETECT_MIN - 10.0) )
{
max_temperature_fault = FAULT;
ptz_hori_stop(PTZ_HORI_STOP_TIME);
ptz_vert_stop(PTZ_VERT_STOP_TIME);
}
else
{
max_temperature_fault = NO_FAULT;
}
if(g_ptz.Voltage >= PTZ_VOLT_DETECT_MAX )//|| g_ptz.Voltage <= PTZ_VOLT_DETECT_MIN //防止断电故障回传
{
g_ptz.fault_detect.voltage_fault = FAULT;
}
else
{
g_ptz.fault_detect.voltage_fault = NO_FAULT;
}
if(g_ptz.electric_current >= PTZ_CURRENT_DETECT)
{
g_ptz.fault_detect.electric_current_fault = FAULT;//如果电流故障应该停止电机转动
ptz_hori_stop(PTZ_HORI_STOP_TIME);
ptz_vert_stop(PTZ_VERT_STOP_TIME);
}
else
{
g_ptz.fault_detect.electric_current_fault = NO_FAULT;
}
return 1;
}
#ifdef PTZ_PHOTOELECTRIC_SWITCH
static char ptz_vert_sw12_fault_detect_task()//水平光电开关故障监测
{//故障停止垂直电机,不回传
static unsigned char num;
if(g_ptz.vert_ps_sw1_state == PS_COVER && g_ptz.vert_ps_sw2_state == PS_COVER)//如果SW1和SW2同时被遮挡
{
num ++;
}
else
{
num = 0;
g_ptz.fault_detect.vert_sw1_fault = NO_FAULT;
g_ptz.fault_detect.vert_sw2_fault = NO_FAULT;
}
if(num >= 200)//防止num无限制增加
{
num = 100;
}
if(num >= 50)
{
g_ptz.fault_detect.vert_sw1_fault = FAULT;
g_ptz.fault_detect.vert_sw2_fault = FAULT;
}
if(g_ptz.fault_detect.vert_sw1_fault == FAULT || g_ptz.fault_detect.vert_sw2_fault == FAULT)
{
if(g_ptz.vert_start_stop_set == PTZ_VERT_START)
{
ptz_vert_stop(0);
}
}
return 0;
}
#endif
#ifdef PTZ_BLDC_MOTOR
//电机霍尔故障检测
static void ptz_motor_hall_fault_detect_task()
{
static unsigned char time_count;
static unsigned short int time_ms;
time_ms ++;
if(time_ms < 1000)
{
return;
}
else
{
time_ms = 0;
}
time_count ++;
if(time_count >= 5)
{
if(abs(g_ptz.hori_l6235d.l6235d_hall_h1_count - g_ptz.hori_l6235d.l6235d_hall_h2_count) >= PTZ_HALL_DETECT
||abs(g_ptz.hori_l6235d.l6235d_hall_h1_count - g_ptz.hori_l6235d.l6235d_hall_h3_count) >= PTZ_HALL_DETECT
||abs(g_ptz.hori_l6235d.l6235d_hall_h2_count - g_ptz.hori_l6235d.l6235d_hall_h3_count) >= PTZ_HALL_DETECT)
{
g_ptz.fault_detect.hori_hall_fault = FAULT;
ptz_hori_stop(0);
}
else
{
g_ptz.fault_detect.hori_hall_fault = NO_FAULT;
}
if(abs(g_ptz.vert_l6235d.l6235d_hall_h1_count - g_ptz.vert_l6235d.l6235d_hall_h2_count) >= PTZ_HALL_DETECT
||abs(g_ptz.vert_l6235d.l6235d_hall_h1_count - g_ptz.vert_l6235d.l6235d_hall_h3_count) >= PTZ_HALL_DETECT
||abs(g_ptz.vert_l6235d.l6235d_hall_h2_count - g_ptz.vert_l6235d.l6235d_hall_h3_count) >= PTZ_HALL_DETECT)
{
g_ptz.fault_detect.vert_hall_fault = FAULT;
ptz_vert_stop(0);
}
else
{
g_ptz.fault_detect.vert_hall_fault = NO_FAULT;
}
// g_ptz.hori_l6235d.l6235d_hall_h1_count = 0;
// g_ptz.hori_l6235d.l6235d_hall_h2_count = 0;
// g_ptz.hori_l6235d.l6235d_hall_h3_count = 0;
// //g_ptz.hori_l6235d.l6235d_hall_h123_count = 0;
//
// g_ptz.vert_l6235d.l6235d_hall_h1_count = 0;
// g_ptz.vert_l6235d.l6235d_hall_h2_count = 0;
// g_ptz.vert_l6235d.l6235d_hall_h3_count = 0;
// //g_ptz.vert_l6235d.l6235d_hall_h123_count = 0;
time_count = 0;
}
//防止数据超限溢出
if(g_ptz.hori_l6235d.l6235d_hall_h1_count >= UNSIGNED_INT_MAX_VALUE)
{
g_ptz.hori_l6235d.l6235d_hall_h1_count = 0;
}
if(g_ptz.hori_l6235d.l6235d_hall_h2_count >= UNSIGNED_INT_MAX_VALUE)
{
g_ptz.hori_l6235d.l6235d_hall_h2_count = 0;
}
if(g_ptz.hori_l6235d.l6235d_hall_h3_count >= UNSIGNED_INT_MAX_VALUE)
{
g_ptz.hori_l6235d.l6235d_hall_h3_count = 0;
}
if(g_ptz.vert_l6235d.l6235d_hall_h1_count >= UNSIGNED_INT_MAX_VALUE)
{
g_ptz.vert_l6235d.l6235d_hall_h1_count = 0;
}
if(g_ptz.vert_l6235d.l6235d_hall_h2_count >= UNSIGNED_INT_MAX_VALUE)
{
g_ptz.vert_l6235d.l6235d_hall_h2_count = 0;
}
if(g_ptz.vert_l6235d.l6235d_hall_h3_count >= UNSIGNED_INT_MAX_VALUE)
{
g_ptz.vert_l6235d.l6235d_hall_h3_count = 0;
}
}
//电机转动卡死故障检测
static char ptz_motor_rotate_fault_detect_task()
{
static char hori_rotate_fault_num;
static char vert_rotate_fault_num;
static char hori_rotate_fault_step;
static float hori_angle_a;
static float hori_angle_b;
static char vert_rotate_fault_step;
static float vert_angle_a;
static float vert_angle_b;
static unsigned short int time_ms;
time_ms ++;
//垂直
if(g_ptz.vert_start_stop_set == PTZ_VERT_STOP)
{
vert_rotate_fault_step = 0;//关闭判断
vert_rotate_fault_num = 0;
}
//水平
if(g_ptz.hori_start_stop_set == PTZ_HORI_STOP)
{
hori_rotate_fault_step = 0;//关闭判断
hori_rotate_fault_num = 0;
}
if(time_ms < 1000)
{
return 1;
}
else
{
time_ms = 0;
}
//垂直
switch(vert_rotate_fault_step)
{
case 0:
if(g_ptz.vert_start_stop_set == PTZ_VERT_START)
{
vert_rotate_fault_num = 0;
vert_angle_a = g_ptz.vert_as5047d.as5047d_ptz_angle_actual;
vert_rotate_fault_step = vert_rotate_fault_step + 1; //启动判断
}
break;
case 1://开始判断云台转动是否异常
vert_angle_b = g_ptz.vert_as5047d.as5047d_ptz_angle_actual;
if(g_ptz.vert_direction_actual == PTZ_VERT_DIR_UP)
{
//转动正常情况
if(vert_angle_b > vert_angle_a &&
vert_angle_b - vert_angle_a >= PTZ_VERT_MIN_SPEED * PTZ_VERT_BIG_GEAR_RATIO * 2)
{//只有有一次转动正常,说明转动就是正常的
vert_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.vert_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
if(g_ptz.vert_pid.PidUT_float >= PTZ_VERT_VOLTAGE_LEVEL)
{
vert_rotate_fault_num ++;
}
}
}
else//g_ptz.vert_direction_actual == PTZ_VERT_DIR_DOWN
{
//转动正常情况
if(vert_angle_a > vert_angle_b &&
vert_angle_a - vert_angle_b >= PTZ_VERT_MIN_SPEED * PTZ_VERT_BIG_GEAR_RATIO * 2)
{//只有有一次转动正常,说明转动就是正常的
vert_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.vert_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
if(g_ptz.vert_pid.PidUT_float >= PTZ_VERT_VOLTAGE_LEVEL)
{
vert_rotate_fault_num ++;
}
}
}
if(vert_rotate_fault_num >= ROTATE_FAULT_MAX_NUM)//连续转动异常,则转动异常
{
vert_rotate_fault_num = 0;
//关闭所有云台自动扫描模式
g_preset_bit_scan.state = PRESET_BIT_SCAN_CLOSE_A;
g_area_scan.state = AREA_SCAN_CLOSE_A;
//云台直接刹车
ptz_hori_stop(0);
ptz_vert_stop(0);
//电机转动故障
g_ptz.fault_detect.vert_rotate_fault = FAULT;
}
vert_angle_a = vert_angle_b;
break;
}
/*************************************************************/
switch(hori_rotate_fault_step)
{
case 0:
if(g_ptz.hori_start_stop_set == PTZ_HORI_START)
{
hori_rotate_fault_num = 0;
hori_angle_a = g_ptz.hori_as5047d.as5047d_ptz_angle_actual;
hori_rotate_fault_step = hori_rotate_fault_step + 1; //启动判断
}
break;
case 1://开始判断云台转动是否异常
hori_angle_b = g_ptz.hori_as5047d.as5047d_ptz_angle_actual;
if(g_ptz.hori_self_check == PTZ_HORI_SELF_CHECK_END)
{//如果水平自检是完成了的
if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT)
{
//转动正常情况
if((hori_angle_b > hori_angle_a && //转动距离要大于最小速度转动距离0.5倍,要小于最大转速转动距离的2倍
hori_angle_b - hori_angle_a > PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2 &&
hori_angle_b - hori_angle_a < PTZ_HORI_MAX_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 12)
||
(hori_angle_a > hori_angle_b &&
hori_angle_b + g_ptz.hori_as5047d.as5047d_ptz_angle_max - hori_angle_a > PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2 &&
hori_angle_b + g_ptz.hori_as5047d.as5047d_ptz_angle_max - hori_angle_a < PTZ_HORI_MAX_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 12) )
{//只有有一次转动正常,说明转动就是正常的
hori_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.hori_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
if(g_ptz.hori_pid.PidUT_float >= PTZ_HORI_VOLTAGE_LEVEL)
{
hori_rotate_fault_num ++;
}
}
}
else//g_ptz.hori_direction_actual == PTZ_HORI_DIR_LEFT
{
//转动正常情况
if((hori_angle_b < hori_angle_a && //转动距离要大于最小速度转动距离0.5倍,要小于最大转速转动距离的2倍
hori_angle_a - hori_angle_b > PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2 &&
hori_angle_a - hori_angle_b < PTZ_HORI_MAX_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 12)
||
(hori_angle_a < hori_angle_b &&
hori_angle_a + g_ptz.hori_as5047d.as5047d_ptz_angle_max - hori_angle_b > PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2 &&
hori_angle_a + g_ptz.hori_as5047d.as5047d_ptz_angle_max - hori_angle_b < PTZ_HORI_MAX_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 12) )
{//只有有一次转动正常,说明转动就是正常的
hori_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.hori_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
if(g_ptz.hori_pid.PidUT_float >= PTZ_HORI_VOLTAGE_LEVEL)
{
hori_rotate_fault_num ++;
}
}
}
}
else
{//如果水平自检没完成
if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT)
{
//转动正常情况
if(hori_angle_b > hori_angle_a &&
hori_angle_b - hori_angle_a >= PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2)
{//只有有一次转动正常,说明转动就是正常的
hori_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.hori_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
if(g_ptz.hori_pid.PidUT_float >= PTZ_HORI_VOLTAGE_LEVEL)
{
hori_rotate_fault_num ++;
}
}
}
else//g_ptz.hori_direction_actual == PTZ_HORI_DIR_LEFT
{
//转动正常情况
if(hori_angle_a > hori_angle_b &&
hori_angle_a - hori_angle_b >= PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2)
{//只有有一次转动正常,说明转动就是正常的
hori_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.hori_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
if(g_ptz.hori_pid.PidUT_float >= PTZ_HORI_VOLTAGE_LEVEL)
{
hori_rotate_fault_num ++;
}
}
}
}
if(hori_rotate_fault_num >= ROTATE_FAULT_MAX_NUM)//连续转动异常,则转动异常
{
hori_rotate_fault_num = 0;
//关闭所有云台自动扫描模式
g_preset_bit_scan.state = PRESET_BIT_SCAN_CLOSE_A;
g_area_scan.state = AREA_SCAN_CLOSE_A;
//云台直接刹车
ptz_hori_stop(0);
ptz_vert_stop(0);
//电机转动故障
g_ptz.fault_detect.hori_rotate_fault = FAULT;
}
hori_angle_a = hori_angle_b;
break;
}
// if(g_ptz.fault_detect.hori_rotate_fault == FAULT ||
// g_ptz.fault_detect.vert_rotate_fault == FAULT)
// {
// g_ptz.fault_detect.fault = FAULT;
// }
// else
// {
// g_ptz.fault_detect.fault = NO_FAULT;
// }
return 1;
}
#endif
#ifdef PTZ_STEP_MOTOR
//电机转动卡死故障检测
static char ptz_motor_rotate_fault_detect_task()
{
static char hori_rotate_fault_num;
static char vert_rotate_fault_num;
static char hori_rotate_fault_step;
static float hori_angle_a;
static float hori_angle_b;
static char vert_rotate_fault_step;
static float vert_angle_a;
static float vert_angle_b;
static unsigned short int time_ms;
time_ms ++;
if(time_ms < 1000)
{
return 1;
}
else
{
time_ms = 0;
}
if(g_ptz.vert_start_stop_set == PTZ_VERT_STOP)
{
vert_rotate_fault_step = 0;//关闭判断
vert_rotate_fault_num = 0;
}
//垂直
switch(vert_rotate_fault_step)
{
case 0:
if(g_ptz.vert_start_stop_set == PTZ_VERT_START)
{
vert_rotate_fault_num = 0;
vert_angle_a = g_ptz.vert_as5047d.as5047d_ptz_angle_actual;
vert_rotate_fault_step = vert_rotate_fault_step + 1; //启动判断
}
break;
case 1://开始判断云台转动是否异常
vert_angle_b = g_ptz.vert_as5047d.as5047d_ptz_angle_actual;
if(g_ptz.vert_direction_actual == PTZ_VERT_DIR_UP)
{
//转动正常情况
if(vert_angle_b > vert_angle_a &&
vert_angle_b - vert_angle_a >= PTZ_VERT_MIN_SPEED * PTZ_VERT_BIG_GEAR_RATIO * 2)
{//只有有一次转动正常,说明转动就是正常的
vert_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.vert_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
vert_rotate_fault_num ++;
}
}
else//g_ptz.vert_direction_actual == PTZ_VERT_DIR_DOWN
{
//转动正常情况
if(vert_angle_a > vert_angle_b &&
vert_angle_a - vert_angle_b >= PTZ_VERT_MIN_SPEED * PTZ_VERT_BIG_GEAR_RATIO * 2)
{//只有有一次转动正常,说明转动就是正常的
vert_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.vert_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
vert_rotate_fault_num ++;
}
}
if(vert_rotate_fault_num >= ROTATE_FAULT_MAX_NUM)//连续转动异常,则转动异常
{
vert_rotate_fault_num = 0;
//关闭所有云台自动扫描模式
g_preset_bit_scan.state = PRESET_BIT_SCAN_CLOSE_A;
g_area_scan.state = AREA_SCAN_CLOSE_A;
//云台直接刹车
ptz_hori_stop(PTZ_HORI_STOP_TIME);
ptz_vert_stop(PTZ_VERT_STOP_TIME);
//电机转动故障
g_ptz.fault_detect.vert_rotate_fault = FAULT;
}
vert_angle_a = vert_angle_b;
break;
}
/*************************************************************/
//水平
if(g_ptz.hori_start_stop_set == PTZ_HORI_STOP)
{
hori_rotate_fault_step = 0;//关闭判断
hori_rotate_fault_num = 0;
}
switch(hori_rotate_fault_step)
{
case 0:
if(g_ptz.hori_start_stop_set == PTZ_HORI_START)
{
hori_rotate_fault_num = 0;
hori_angle_a = g_ptz.hori_as5047d.as5047d_ptz_angle_actual;
hori_rotate_fault_step = hori_rotate_fault_step + 1; //启动判断
}
break;
case 1://开始判断云台转动是否异常
hori_angle_b = g_ptz.hori_as5047d.as5047d_ptz_angle_actual;
if(g_ptz.hori_self_check == PTZ_HORI_SELF_CHECK_END)
{//如果水平自检是完成了的
if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT)
{
//转动正常情况
if((hori_angle_b > hori_angle_a && //转动距离要大于最小速度转动距离0.5倍,要小于最大转速转动距离的2倍
hori_angle_b - hori_angle_a > PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2 &&
hori_angle_b - hori_angle_a < PTZ_HORI_MAX_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 12)
||
(hori_angle_a > hori_angle_b &&
hori_angle_b + g_ptz.hori_as5047d.as5047d_ptz_angle_max - hori_angle_a > PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2 &&
hori_angle_b + g_ptz.hori_as5047d.as5047d_ptz_angle_max - hori_angle_a < PTZ_HORI_MAX_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 12) )
{//只有有一次转动正常,说明转动就是正常的
hori_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.hori_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
hori_rotate_fault_num ++;
}
}
else//g_ptz.hori_direction_actual == PTZ_HORI_DIR_LEFT
{
//转动正常情况
if((hori_angle_b < hori_angle_a && //转动距离要大于最小速度转动距离0.5倍,要小于最大转速转动距离的2倍
hori_angle_a - hori_angle_b > PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2 &&
hori_angle_a - hori_angle_b < PTZ_HORI_MAX_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 12)
||
(hori_angle_a < hori_angle_b &&
hori_angle_a + g_ptz.hori_as5047d.as5047d_ptz_angle_max - hori_angle_b > PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2 &&
hori_angle_a + g_ptz.hori_as5047d.as5047d_ptz_angle_max - hori_angle_b < PTZ_HORI_MAX_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 12) )
{//只有有一次转动正常,说明转动就是正常的
hori_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.hori_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
hori_rotate_fault_num ++;
}
}
}
else
{//如果水平自检没完成
if(g_ptz.hori_direction_actual == PTZ_HORI_DIR_RIGHT)
{
//转动正常情况
if(hori_angle_b > hori_angle_a &&
hori_angle_b - hori_angle_a >= PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2)
{//只有有一次转动正常,说明转动就是正常的
hori_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.hori_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
hori_rotate_fault_num ++;
}
}
else//g_ptz.hori_direction_actual == PTZ_HORI_DIR_LEFT
{
//转动正常情况
if(hori_angle_a > hori_angle_b &&
hori_angle_a - hori_angle_b >= PTZ_HORI_MIN_SPEED * PTZ_HORI_BIG_GEAR_RATIO * 2)
{//只有有一次转动正常,说明转动就是正常的
hori_rotate_fault_num = 0;
//电机转动没有故障
g_ptz.fault_detect.hori_rotate_fault = NO_FAULT;
}
else//转动异常情况
{
hori_rotate_fault_num ++;
}
}
}
if(hori_rotate_fault_num >= ROTATE_FAULT_MAX_NUM)//连续转动异常,则转动异常
{
hori_rotate_fault_num = 0;
//关闭所有云台自动扫描模式
g_preset_bit_scan.state = PRESET_BIT_SCAN_CLOSE_A;
g_area_scan.state = AREA_SCAN_CLOSE_A;
//云台直接刹车
ptz_hori_stop(PTZ_HORI_STOP_TIME);
ptz_vert_stop(PTZ_VERT_STOP_TIME);
//电机转动故障
g_ptz.fault_detect.hori_rotate_fault = FAULT;
}
hori_angle_a = hori_angle_b;
break;
}
// if(g_ptz.fault_detect.hori_rotate_fault == FAULT ||
// g_ptz.fault_detect.vert_rotate_fault == FAULT)
// {
// g_ptz.fault_detect.fault = FAULT;
// }
// else
// {
// g_ptz.fault_detect.fault = NO_FAULT;
// }
return 1;
}
#endif
//故障代码自动回传
static char ptz_fault_return_task()
{
static unsigned short int time_ms;
time_ms ++;
if(time_ms < 1000)
{
return 1;
}
else
{
time_ms = 0;
}
//水平转动故障回传
if(g_ptz.fault_detect.hori_rotate_fault == FAULT &&
g_ptz.cmd_save.cmd_data_udp_flag == 1)
{
ptz_send_fault_state(PTZ_UDP,HORI_ROT);
}
//垂直转动故障回传
if(g_ptz.fault_detect.vert_rotate_fault == FAULT &&
g_ptz.cmd_save.cmd_data_udp_flag == 1)
{
ptz_send_fault_state(PTZ_UDP,VERT_ROT);
}
//温度故障回传
if(g_ptz.fault_detect.temperature_fault == FAULT &&
g_ptz.cmd_save.cmd_data_udp_flag == 1)
{
ptz_send_fault_state(PTZ_UDP,WORK_TEMP);
}
//电压故障回传
if(g_ptz.fault_detect.voltage_fault == FAULT &&
g_ptz.cmd_save.cmd_data_udp_flag == 1)
{
ptz_send_fault_state(PTZ_UDP,WORK_VOLT);
}
//工作电流故障回传
if(g_ptz.fault_detect.electric_current_fault == FAULT
&& g_ptz.cmd_save.cmd_data_udp_flag == 1)
{
ptz_send_fault_state(PTZ_UDP,WORK_ELECTRIC_CURRENT);
}
//水平hall故障回传
if(g_ptz.fault_detect.hori_hall_fault == FAULT &&
g_ptz.cmd_save.cmd_data_udp_flag == 1)
{
ptz_send_fault_state(PTZ_UDP,HORI_HALL);
}
//垂直hall故障回传
if(g_ptz.fault_detect.vert_hall_fault == FAULT &&
g_ptz.cmd_save.cmd_data_udp_flag == 1)
{
ptz_send_fault_state(PTZ_UDP,VERT_HALL);
}
return 1;
}
static char ptz_fault_detect_task()
{
while(1)
{
//电机转动卡死故障
ptz_motor_rotate_fault_detect_task();
//温度电压电流故障
ptz_temp_volt_current_fault_detect_task();
//电机hall故障
#ifdef PTZ_BLDC_MOTOR
ptz_motor_hall_fault_detect_task();
#endif
//故障回传
ptz_fault_return_task();
//光电开关故障,,光电开关不能故障回传,因为断电时会检测到故障
ptz_vert_sw12_fault_detect_task();
if(g_ptz.fault_detect.hori_rotate_fault == FAULT ||
g_ptz.fault_detect.vert_rotate_fault == FAULT ||
max_temperature_fault == FAULT)//温度超过阈值10℃触发总故障
{//总故障
g_ptz.fault_detect.fault = FAULT;
}
else
{
g_ptz.fault_detect.fault = NO_FAULT;
}
OSTimeDlyHMSM(0u, 0u, 0u, 1u);
}
}
//#define TASK_FAULT_DETECT_PRIO 19u
//#define TASK_FAULT_DETECT_STK_SIZE 100u
static OS_STK task_fault_detect_stk[TASK_FAULT_DETECT_STK_SIZE];
static void creat_task_fault_detect(void)
{
CPU_INT08U task_err;
CPU_INT08U name_err;
task_err = OSTaskCreateExt((void (*)(void *)) ptz_fault_detect_task,
(void *) 0,
(OS_STK *)&task_fault_detect_stk[TASK_FAULT_DETECT_STK_SIZE - 1],
(INT8U ) TASK_FAULT_DETECT_PRIO,
(INT16U ) TASK_FAULT_DETECT_PRIO,
(OS_STK *)&task_fault_detect_stk[0],
(INT32U ) TASK_FAULT_DETECT_STK_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
#if (OS_TASK_NAME_EN > 0)
OSTaskNameSet(TASK_FAULT_DETECT_PRIO, "ptz_fault_detect_task", &name_err);
#endif
if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) {
pdebug(DEBUG_LEVEL_INFO,"create ptz_fault_detect_task success...\n\r");
} else {
pdebug(DEBUG_LEVEL_FATAL,"create ptz_fault_detect_task failed...\n\r");
}
}
void init_status_monitor_module()
{
creat_task_fault_detect();
}
void ptz_send_fault_state(char dev, unsigned char FaultState)
{
unsigned char buff[7];
unsigned short int buf;
if(g_ptz.cmd_save.cmd_data_flag == 1)//云台接收过指令,有故障主动回传的目标才能主动回传
{
//水平转动状态
if(FaultState == HORI_ROT || FaultState == ALL_FAULT_STATE)
{
memset(buff, 0, sizeof(buff));
buff[0] = 0xff;
buff[1] = g_ptz.address;
buff[2] = HORI_ROT;
buff[3] = g_ptz.fault_detect.hori_rotate_fault;
if(g_ptz.hori_direction_set == PTZ_HORI_DIR_RIGHT)
{//转动方向
buff[4] = PTZ_RIGHT;
}
else
{
buff[4] = PTZ_LEFT;
}
buff[5] = g_ptz.hori_start_stop_set;//电机是处于转动状态还是刹车状态
buff[6] = MotorCalPelcoDSUM(buff, sizeof(buff));
switch(dev)
{
case PTZ_UDP:
send_udp_data_aim(buff, sizeof(buff),
(struct sockaddr*)&g_ptz.cmd_save.cmd_from, g_ptz.cmd_save.cmd_fromlen);
break;
case PTZ_UART_422:
ptz_uart_dev_send(uart_422_handle, buff, sizeof(buff));
break;
case PTZ_UART_485:
ptz_uart_dev_send(uart_485_handle, buff, sizeof(buff));
break;
}
}
#ifdef PTZ_BLDC_MOTOR
//水平霍尔状态
if(FaultState == HORI_HALL || FaultState == ALL_FAULT_STATE)
{
memset(buff, 0, sizeof(buff));
buff[0] = 0xff;
buff[1] = g_ptz.address;
buff[2] = HORI_HALL;
buff[3] = g_ptz.fault_detect.hori_hall_fault;
buff[6] = MotorCalPelcoDSUM(buff, sizeof(buff));
switch(dev)
{
case PTZ_UDP:
send_udp_data_aim(buff, sizeof(buff),
(struct sockaddr*)&g_ptz.cmd_save.cmd_from, g_ptz.cmd_save.cmd_fromlen);
break;
case PTZ_UART_422:
ptz_uart_dev_send(uart_422_handle, buff, sizeof(buff));
break;
case PTZ_UART_485:
ptz_uart_dev_send(uart_485_handle, buff, sizeof(buff));
break;
}
}
#endif
//垂直转动状态
if(FaultState == VERT_ROT || FaultState == ALL_FAULT_STATE)
{
memset(buff, 0, sizeof(buff));
buff[0] = 0xff;
buff[1] = g_ptz.address;
buff[2] = VERT_ROT;
buff[3] = g_ptz.fault_detect.vert_rotate_fault;
if(g_ptz.vert_direction_set == PTZ_VERT_DIR_UP)
{//转动方向
buff[4] = PTZ_UP;
}
else
{
buff[4] = PTZ_DOWN;
}
buff[5] = g_ptz.vert_start_stop_set;//电机是处于转动状态还是刹车状态
buff[6] = MotorCalPelcoDSUM(buff, sizeof(buff));
switch(dev)
{
case PTZ_UDP:
send_udp_data_aim(buff, sizeof(buff),
(struct sockaddr*)&g_ptz.cmd_save.cmd_from, g_ptz.cmd_save.cmd_fromlen);
break;
case PTZ_UART_422:
ptz_uart_dev_send(uart_422_handle, buff, sizeof(buff));
break;
case PTZ_UART_485:
ptz_uart_dev_send(uart_485_handle, buff, sizeof(buff));
break;
}
}
#ifdef PTZ_BLDC_MOTOR
//垂直霍尔状态
if(FaultState == VERT_HALL || FaultState == ALL_FAULT_STATE)
{
memset(buff, 0, sizeof(buff));
buff[0] = 0xff;
buff[1] = g_ptz.address;
buff[2] = VERT_HALL;
buff[3] = g_ptz.fault_detect.vert_hall_fault;
buff[6] = MotorCalPelcoDSUM(buff, sizeof(buff));
switch(dev)
{
case PTZ_UDP:
send_udp_data_aim(buff, sizeof(buff),
(struct sockaddr*)&g_ptz.cmd_save.cmd_from, g_ptz.cmd_save.cmd_fromlen);
break;
case PTZ_UART_422:
ptz_uart_dev_send(uart_422_handle, buff, sizeof(buff));
break;
case PTZ_UART_485:
ptz_uart_dev_send(uart_485_handle, buff, sizeof(buff));
break;
}
}
#endif
//当前工作温度WorkTemp
if(FaultState == WORK_TEMP || FaultState == ALL_FAULT_STATE)
{
memset(buff, 0, sizeof(buff));
buf = (unsigned short int)(g_ptz.temperature * 100 + 0.5);
buff[0] = 0xff;
buff[1] = g_ptz.address;
buff[2] = WORK_TEMP;
buff[3] = g_ptz.fault_detect.temperature_fault;
buff[4] = (unsigned char)(buf >> 8);
buff[5] = (unsigned char)(buf & 0x00ff);
buff[6] = MotorCalPelcoDSUM(buff, sizeof(buff));
switch(dev)
{
case PTZ_UDP:
send_udp_data_aim(buff, sizeof(buff),
(struct sockaddr*)&g_ptz.cmd_save.cmd_from, g_ptz.cmd_save.cmd_fromlen);
break;
case PTZ_UART_422:
ptz_uart_dev_send(uart_422_handle, buff, sizeof(buff));
break;
case PTZ_UART_485:
ptz_uart_dev_send(uart_485_handle, buff, sizeof(buff));
break;
}
}
//当前工作电压
if(FaultState == WORK_VOLT || FaultState == ALL_FAULT_STATE)
{
memset(buff, 0, sizeof(buff));
buf = (unsigned short int)(g_ptz.Voltage * 100 + 0.5);
buff[0] = 0xff;
buff[1] = g_ptz.address;
buff[2] = WORK_VOLT;
buff[3] = g_ptz.fault_detect.voltage_fault;
buff[4] = (unsigned char)(buf >> 8);
buff[5] = (unsigned char)(buf & 0x00ff);
buff[6] = MotorCalPelcoDSUM(buff, sizeof(buff));
switch(dev)
{
case PTZ_UDP:
send_udp_data_aim(buff, sizeof(buff),
(struct sockaddr*)&g_ptz.cmd_save.cmd_from, g_ptz.cmd_save.cmd_fromlen);
break;
case PTZ_UART_422:
ptz_uart_dev_send(uart_422_handle, buff, sizeof(buff));
break;
case PTZ_UART_485:
ptz_uart_dev_send(uart_485_handle, buff, sizeof(buff));
break;
}
}
//当前工作电流
if(FaultState == WORK_ELECTRIC_CURRENT || FaultState == ALL_FAULT_STATE)
{
memset(buff, 0, sizeof(buff));
buf = (unsigned short int)(g_ptz.electric_current * 100 + 0.5);
buff[0] = 0xff;
buff[1] = g_ptz.address;
buff[2] = WORK_ELECTRIC_CURRENT;
buff[3] = g_ptz.fault_detect.electric_current_fault;
buff[4] = (unsigned char)(buf >> 8);
buff[5] = (unsigned char)(buf & 0x00ff);
buff[6] = MotorCalPelcoDSUM(buff, sizeof(buff));
switch(dev)
{
case PTZ_UDP:
send_udp_data_aim(buff, sizeof(buff),
(struct sockaddr*)&g_ptz.cmd_save.cmd_from, g_ptz.cmd_save.cmd_fromlen);
break;
case PTZ_UART_422:
ptz_uart_dev_send(uart_422_handle, buff, sizeof(buff));
break;
case PTZ_UART_485:
ptz_uart_dev_send(uart_485_handle, buff, sizeof(buff));
break;
}
}
//当前辅助开关状态
if(FaultState == CAMERA_POWER || FaultState == ALL_FAULT_STATE)
{
memset(buff, 0, sizeof(buff));
buff[0] = 0xff;
buff[1] = g_ptz.address;
buff[2] = CAMERA_POWER;
buff[3] = g_ptz.power.aux_switch_3;//可见光相机
buff[4] = g_ptz.power.aux_switch_4;//红外相机
buff[6] = MotorCalPelcoDSUM(buff, sizeof(buff));
switch(dev)
{
case PTZ_UDP:
send_udp_data_aim(buff, sizeof(buff),
(struct sockaddr*)&g_ptz.cmd_save.cmd_from, g_ptz.cmd_save.cmd_fromlen);
break;
case PTZ_UART_422:
ptz_uart_dev_send(uart_422_handle, buff, sizeof(buff));
break;
case PTZ_UART_485:
ptz_uart_dev_send(uart_485_handle, buff, sizeof(buff));
break;
}
}
//垂直光电开关状态
if(FaultState == VERT_PHOTOELECT_SWITCH || FaultState == ALL_FAULT_STATE)
{
memset(buff, 0, sizeof(buff));
buff[0] = 0xff;
buff[1] = g_ptz.address;
buff[2] = VERT_PHOTOELECT_SWITCH;
buff[4] = g_ptz.fault_detect.vert_sw1_fault;//光电开关1
buff[5] = g_ptz.fault_detect.vert_sw2_fault;//光电开关2
buff[6] = MotorCalPelcoDSUM(buff, sizeof(buff));
switch(dev)
{
case PTZ_UDP:
send_udp_data_aim(buff, sizeof(buff),
(struct sockaddr*)&g_ptz.cmd_save.cmd_from, g_ptz.cmd_save.cmd_fromlen);
break;
case PTZ_UART_422:
ptz_uart_dev_send(uart_422_handle, buff, sizeof(buff));
break;
case PTZ_UART_485:
ptz_uart_dev_send(uart_485_handle, buff, sizeof(buff));
break;
}
}
}
}
///指令是否能够执行判断函数
PtzCmdType ptz_cmd_execute_judge()
{
PtzCmdType cmd;
//云台处于继电器调试状态
if(g_ptz.ptz_motor_relay_state == PTZ_RELAY_ON)
{
cmd.manual_control = CMD_ALLOW;//手动控制,包括上下左右等方向控制
cmd.manual_stop = CMD_ALLOW;//手动停止指令
cmd.preset_bit_set = CMD_NOT_ALLOW;//预置位设置
cmd.preset_bit_del = CMD_NOT_ALLOW;//预置位删除
cmd.preset_bit_call = CMD_NOT_ALLOW;//预置位调用
cmd.preset_bit_scan_start = CMD_NOT_ALLOW;//预置位扫描启动
cmd.preset_bit_scan_pause = CMD_NOT_ALLOW;//预置位扫描暂停
cmd.preset_bit_scan_recovery = CMD_NOT_ALLOW;//预置位扫描恢复
cmd.preset_bit_scan_close = CMD_NOT_ALLOW;//预置位扫描关闭
cmd.area_set = CMD_NOT_ALLOW;//区域数据设置
cmd.area_scan_start = CMD_NOT_ALLOW;//区域扫描启动
cmd.area_scan_pause = CMD_NOT_ALLOW;//区域扫描暂停
cmd.area_scan_recovery = CMD_NOT_ALLOW;//区域扫描恢复
cmd.area_scan_close = CMD_NOT_ALLOW;//区域扫描关闭
cmd.set_zero = CMD_NOT_ALLOW;
return cmd;
}
//云台还处于自检状态
if(g_ptz.hori_self_check != PTZ_HORI_SELF_CHECK_END ||
g_ptz.vert_self_check != PTZ_VERT_SELF_CHECK_END)
{
cmd.manual_control = CMD_NOT_ALLOW;//手动控制,包括上下左右等方向控制
cmd.manual_stop = CMD_NOT_ALLOW;//手动停止指令
cmd.preset_bit_set = CMD_NOT_ALLOW;//预置位设置
cmd.preset_bit_del = CMD_NOT_ALLOW;//预置位删除
cmd.preset_bit_call = CMD_NOT_ALLOW;//预置位调用
cmd.preset_bit_scan_start = CMD_NOT_ALLOW;//预置位扫描启动
cmd.preset_bit_scan_pause = CMD_NOT_ALLOW;//预置位扫描暂停
cmd.preset_bit_scan_recovery = CMD_NOT_ALLOW;//预置位扫描恢复
cmd.preset_bit_scan_close = CMD_NOT_ALLOW;//预置位扫描关闭
cmd.area_set = CMD_NOT_ALLOW;//区域数据设置
cmd.area_scan_start = CMD_NOT_ALLOW;//区域扫描启动
cmd.area_scan_pause = CMD_NOT_ALLOW;//区域扫描暂停
cmd.area_scan_recovery = CMD_NOT_ALLOW;//区域扫描恢复
cmd.area_scan_close = CMD_NOT_ALLOW;//区域扫描关闭
cmd.set_zero = CMD_NOT_ALLOW;
return cmd;
}
//云台处于故障状态
if(g_ptz.fault_detect.fault == FAULT)
{
cmd.manual_control = CMD_NOT_ALLOW;//手动控制,包括上下左右等方向控制
cmd.manual_stop = CMD_ALLOW;//手动停止指令
cmd.preset_bit_set = CMD_NOT_ALLOW;//预置位设置
cmd.preset_bit_del = CMD_NOT_ALLOW;//预置位删除
cmd.preset_bit_call = CMD_NOT_ALLOW;//预置位调用
cmd.preset_bit_scan_start = CMD_NOT_ALLOW;//预置位扫描启动
cmd.preset_bit_scan_pause = CMD_NOT_ALLOW;//预置位扫描暂停
cmd.preset_bit_scan_recovery = CMD_NOT_ALLOW;//预置位扫描恢复
cmd.preset_bit_scan_close = CMD_NOT_ALLOW;//预置位扫描关闭
cmd.area_set = CMD_NOT_ALLOW;//区域数据设置
cmd.area_scan_start = CMD_NOT_ALLOW;//区域扫描启动
cmd.area_scan_pause = CMD_NOT_ALLOW;//区域扫描暂停
cmd.area_scan_recovery = CMD_NOT_ALLOW;//区域扫描恢复
cmd.area_scan_close = CMD_NOT_ALLOW;//区域扫描关闭
cmd.set_zero = CMD_NOT_ALLOW;
return cmd;
}
//云台处于预置位扫描状态
if(g_preset_bit_scan.state >= PRESET_BIT_SCAN_START &&
g_preset_bit_scan.state <= PRESET_BIT_SCAN_START + 4)
{
cmd.manual_control = CMD_NOT_ALLOW;//手动控制,包括上下左右等方向控制
cmd.manual_stop = CMD_NOT_ALLOW;//手动停止指令
cmd.preset_bit_set = CMD_NOT_ALLOW;//预置位设置
cmd.preset_bit_del = CMD_NOT_ALLOW;//预置位删除
cmd.preset_bit_call = CMD_NOT_ALLOW;//预置位调用
cmd.preset_bit_scan_start = CMD_ALLOW;//预置位扫描启动
cmd.preset_bit_scan_pause = CMD_ALLOW;//预置位扫描暂停
cmd.preset_bit_scan_recovery = CMD_NOT_ALLOW;//预置位扫描恢复
cmd.preset_bit_scan_close = CMD_ALLOW;//预置位扫描关闭
cmd.area_set = CMD_ALLOW;//区域数据设置
cmd.area_scan_start = CMD_NOT_ALLOW;//区域扫描启动
cmd.area_scan_pause = CMD_NOT_ALLOW;//区域扫描暂停
cmd.area_scan_recovery = CMD_NOT_ALLOW;//区域扫描恢复
cmd.area_scan_close = CMD_NOT_ALLOW;//区域扫描关闭
cmd.set_zero = CMD_NOT_ALLOW;
return cmd;
}
//云台处于预置位扫描暂停状态
if(g_preset_bit_scan.state == PRESET_BIT_SCAN_PAUSE_A ||
g_preset_bit_scan.state == PRESET_BIT_SCAN_PAUSE_B)
{
// if(g_preset_bit_scan.state == PRESET_BIT_SCAN_PAUSE_A)
// {
// cmd.manual_control = CMD_NOT_ALLOW;//手动控制,包括上下左右等方向控制
// cmd.manual_stop = CMD_NOT_ALLOW;//手动停止指令
//
// cmd.preset_bit_set = CMD_NOT_ALLOW;//预置位设置
// cmd.preset_bit_del = CMD_NOT_ALLOW;//预置位删除
// cmd.preset_bit_call = CMD_NOT_ALLOW;//预置位调用
//
// cmd.preset_bit_scan_start = CMD_NOT_ALLOW;//预置位扫描启动
// cmd.preset_bit_scan_pause = CMD_NOT_ALLOW;//预置位扫描暂停
// cmd.preset_bit_scan_recovery = CMD_NOT_ALLOW;//预置位扫描恢复
// cmd.preset_bit_scan_close = CMD_NOT_ALLOW;//预置位扫描关闭
//
// cmd.area_set = CMD_ALLOW;//区域数据设置
// cmd.area_scan_start = CMD_NOT_ALLOW;//区域扫描启动
// cmd.area_scan_pause = CMD_NOT_ALLOW;//区域扫描暂停
// cmd.area_scan_recovery = CMD_NOT_ALLOW;//区域扫描恢复
// cmd.area_scan_close = CMD_NOT_ALLOW;//区域扫描关闭
//
// cmd.set_zero = CMD_NOT_ALLOW;
// }
//if(g_preset_bit_scan.state == PRESET_BIT_SCAN_PAUSE_B)
cmd.manual_control = CMD_ALLOW;//手动控制,包括上下左右等方向控制
cmd.manual_stop = CMD_ALLOW;//手动停止指令
cmd.preset_bit_set = CMD_ALLOW;//预置位设置
cmd.preset_bit_del = CMD_ALLOW;//预置位删除
cmd.preset_bit_call = CMD_ALLOW;//预置位调用
cmd.preset_bit_scan_start = CMD_ALLOW;//预置位扫描启动
cmd.preset_bit_scan_pause = CMD_NOT_ALLOW;//预置位扫描暂停
cmd.preset_bit_scan_recovery = CMD_ALLOW;//预置位扫描恢复
cmd.preset_bit_scan_close = CMD_ALLOW;//预置位扫描关闭
cmd.area_set = CMD_ALLOW;//区域数据设置
cmd.area_scan_start = CMD_NOT_ALLOW;//区域扫描启动
cmd.area_scan_pause = CMD_NOT_ALLOW;//区域扫描暂停
cmd.area_scan_recovery = CMD_NOT_ALLOW;//区域扫描恢复
cmd.area_scan_close = CMD_NOT_ALLOW;//区域扫描关闭
cmd.set_zero = CMD_NOT_ALLOW;
return cmd;
}
if(g_preset_bit_scan.state == PRESET_BIT_SCAN_RECOVERY)//预置位扫描恢复状态中
{
cmd.manual_control = CMD_NOT_ALLOW;//手动控制,包括上下左右等方向控制
cmd.manual_stop = CMD_NOT_ALLOW;//手动停止指令
cmd.preset_bit_set = CMD_NOT_ALLOW;//预置位设置
cmd.preset_bit_del = CMD_NOT_ALLOW;//预置位删除
cmd.preset_bit_call = CMD_NOT_ALLOW;//预置位调用
cmd.preset_bit_scan_start = CMD_ALLOW;//预置位扫描启动
cmd.preset_bit_scan_pause = CMD_NOT_ALLOW;//预置位扫描暂停
cmd.preset_bit_scan_recovery = CMD_NOT_ALLOW;//预置位扫描恢复
cmd.preset_bit_scan_close = CMD_ALLOW;//预置位扫描关闭
cmd.area_set = CMD_ALLOW;//区域数据设置
cmd.area_scan_start = CMD_NOT_ALLOW;//区域扫描启动
cmd.area_scan_pause = CMD_NOT_ALLOW;//区域扫描暂停
cmd.area_scan_recovery = CMD_NOT_ALLOW;//区域扫描恢复
cmd.area_scan_close = CMD_NOT_ALLOW;//区域扫描关闭
cmd.set_zero = CMD_NOT_ALLOW;
return cmd;
}
if(g_area_scan.state >= AREA_SCAN_START && //云台处于区域扫描状态
g_area_scan.state < AREA_SCAN_PAUSE_A)
{
cmd.manual_control = CMD_NOT_ALLOW;//手动控制,包括上下左右等方向控制
cmd.manual_stop = CMD_NOT_ALLOW;//手动停止指令
cmd.preset_bit_set = CMD_ALLOW;//预置位设置
cmd.preset_bit_del = CMD_ALLOW;//预置位删除
cmd.preset_bit_call = CMD_NOT_ALLOW;//预置位调用
cmd.preset_bit_scan_start = CMD_NOT_ALLOW;//预置位扫描启动
cmd.preset_bit_scan_pause = CMD_NOT_ALLOW;//预置位扫描暂停
cmd.preset_bit_scan_recovery = CMD_NOT_ALLOW;//预置位扫描恢复
cmd.preset_bit_scan_close = CMD_NOT_ALLOW;//预置位扫描关闭
cmd.area_set = CMD_NOT_ALLOW;//区域数据设置
cmd.area_scan_start = CMD_NOT_ALLOW;//区域扫描启动
cmd.area_scan_pause = CMD_ALLOW;//区域扫描暂停
cmd.area_scan_recovery = CMD_NOT_ALLOW;//区域扫描恢复
cmd.area_scan_close = CMD_ALLOW;//区域扫描关闭
cmd.set_zero = CMD_NOT_ALLOW;
return cmd;
}
if(g_area_scan.state >= AREA_SCAN_PAUSE_A && //云台处于区域扫描暂停状态
g_area_scan.state <= AREA_SCAN_PAUSE_B)
{
if(g_area_scan.state == AREA_SCAN_PAUSE_A)
{
cmd.manual_control = CMD_NOT_ALLOW;//手动控制,包括上下左右等方向控制
cmd.manual_stop = CMD_NOT_ALLOW;//手动停止指令
cmd.preset_bit_set = CMD_ALLOW;//预置位设置
cmd.preset_bit_del = CMD_ALLOW;//预置位删除
cmd.preset_bit_call = CMD_NOT_ALLOW;//预置位调用
cmd.preset_bit_scan_start = CMD_NOT_ALLOW;//预置位扫描启动
cmd.preset_bit_scan_pause = CMD_NOT_ALLOW;//预置位扫描暂停
cmd.preset_bit_scan_recovery = CMD_NOT_ALLOW;//预置位扫描恢复
cmd.preset_bit_scan_close = CMD_NOT_ALLOW;//预置位扫描关闭
cmd.area_set = CMD_NOT_ALLOW;//区域数据设置
cmd.area_scan_start = CMD_NOT_ALLOW;//区域扫描启动
cmd.area_scan_pause = CMD_NOT_ALLOW;//区域扫描暂停
cmd.area_scan_recovery = CMD_NOT_ALLOW;//区域扫描恢复
cmd.area_scan_close = CMD_NOT_ALLOW;//区域扫描关闭
cmd.set_zero = CMD_NOT_ALLOW;
}
if(g_area_scan.state == AREA_SCAN_PAUSE_B)
{
cmd.manual_control = CMD_ALLOW;//手动控制,包括上下左右等方向控制
cmd.manual_stop = CMD_ALLOW;//手动停止指令
cmd.preset_bit_set = CMD_ALLOW;//预置位设置
cmd.preset_bit_del = CMD_ALLOW;//预置位删除
cmd.preset_bit_call = CMD_ALLOW;//预置位调用
cmd.preset_bit_scan_start = CMD_NOT_ALLOW;//预置位扫描启动
cmd.preset_bit_scan_pause = CMD_NOT_ALLOW;//预置位扫描暂停
cmd.preset_bit_scan_recovery = CMD_NOT_ALLOW;//预置位扫描恢复
cmd.preset_bit_scan_close = CMD_NOT_ALLOW;//预置位扫描关闭
cmd.area_set = CMD_NOT_ALLOW;//区域数据设置
cmd.area_scan_start = CMD_ALLOW;//区域扫描启动
cmd.area_scan_pause = CMD_NOT_ALLOW;//区域扫描暂停
cmd.area_scan_recovery = CMD_ALLOW;//区域扫描恢复
cmd.area_scan_close = CMD_ALLOW;//区域扫描关闭
cmd.set_zero = CMD_NOT_ALLOW;
}
return cmd;
}
if(g_area_scan.state >= AREA_SCAN_RECOVERY &&//云台处于预置位扫描恢复阶段
g_area_scan.state <= AREA_SCAN_RECOVERY + 1)
{
cmd.manual_control = CMD_NOT_ALLOW;//手动控制,包括上下左右等方向控制
cmd.manual_stop = CMD_NOT_ALLOW;//手动停止指令
cmd.preset_bit_set = CMD_ALLOW;//预置位设置
cmd.preset_bit_del = CMD_ALLOW;//预置位删除
cmd.preset_bit_call = CMD_NOT_ALLOW;//预置位调用
cmd.preset_bit_scan_start = CMD_NOT_ALLOW;//预置位扫描启动
cmd.preset_bit_scan_pause = CMD_NOT_ALLOW;//预置位扫描暂停
cmd.preset_bit_scan_recovery = CMD_NOT_ALLOW;//预置位扫描恢复
cmd.preset_bit_scan_close = CMD_NOT_ALLOW;//预置位扫描关闭
cmd.area_set = CMD_NOT_ALLOW;//区域数据设置
cmd.area_scan_start = CMD_ALLOW;//区域扫描启动
cmd.area_scan_pause = CMD_NOT_ALLOW;//区域扫描暂停
cmd.area_scan_recovery = CMD_NOT_ALLOW;//区域扫描恢复
cmd.area_scan_close = CMD_ALLOW;//区域扫描关闭
cmd.set_zero = CMD_NOT_ALLOW;
return cmd;
}
//其他正常状态
cmd.manual_control = CMD_ALLOW;//手动控制,包括上下左右等方向控制
cmd.manual_stop = CMD_ALLOW;//手动停止指令
cmd.preset_bit_set = CMD_ALLOW;//预置位设置
cmd.preset_bit_del = CMD_ALLOW;//预置位删除
cmd.preset_bit_call = CMD_ALLOW;//预置位调用
cmd.preset_bit_scan_start = CMD_ALLOW;//预置位扫描启动
cmd.preset_bit_scan_pause = CMD_NOT_ALLOW;//预置位扫描暂停
cmd.preset_bit_scan_recovery = CMD_NOT_ALLOW;//预置位扫描恢复
cmd.preset_bit_scan_close = CMD_NOT_ALLOW;//预置位扫描关闭
cmd.area_set = CMD_ALLOW;//区域数据设置
cmd.area_scan_start = CMD_ALLOW;//区域扫描启动
cmd.area_scan_pause = CMD_NOT_ALLOW;//区域扫描暂停
cmd.area_scan_recovery = CMD_NOT_ALLOW;//区域扫描恢复
cmd.area_scan_close = CMD_NOT_ALLOW;//区域扫描关闭
cmd.set_zero = CMD_ALLOW;
return cmd;
}
//云台工作模式判断
PtzWorkMode ptz_work_mode_judge()
{
PtzWorkMode mode;
//云台还处于自检状态
if(g_ptz.hori_self_check != PTZ_HORI_SELF_CHECK_END ||
g_ptz.vert_self_check != PTZ_VERT_SELF_CHECK_END)
{
mode.mode = SELF_CHECKING;
mode.data_a = g_ptz.hori_self_check;
mode.data_b = g_ptz.vert_self_check;
return mode;
}
//云台处于故障状态
if(g_ptz.fault_detect.fault == FAULT)
{
if(g_ptz.fault_detect.hori_rotate_fault == FAULT)
{//只是水平电机无法转动
mode.mode = MOTOR_HORI_CANNOT_ROT;
}
if(g_ptz.fault_detect.vert_rotate_fault == FAULT)
{//只是水平电机无法转动
mode.mode = MOTOR_VERT_CANNOT_ROT;
}
if(g_ptz.fault_detect.vert_rotate_fault == FAULT && //两个电机都无法转动
g_ptz.fault_detect.hori_rotate_fault == FAULT)
{
mode.mode = MOTOR_HOVE_CANNOT_ROT;
}
mode.data_a = g_ptz.hori_start_stop_set;
mode.data_b = g_ptz.vert_start_stop_set;
return mode;
}
//云台处于预置位扫描状态
if(g_preset_bit_scan.state >= PRESET_BIT_SCAN_START &&
g_preset_bit_scan.state <= PRESET_BIT_SCAN_START + 4)
{
mode.mode = PP_SCANING;
mode.data_a = g_preset_bit_scan.state;
mode.data_b = g_preset_bit_scan.actual_num;
return mode;
}
//云台处于预置位扫描暂停状态
if(g_preset_bit_scan.state == PRESET_BIT_SCAN_PAUSE_A ||
g_preset_bit_scan.state == PRESET_BIT_SCAN_PAUSE_B)
{
mode.mode = PP_PAUSING;
mode.data_a = g_preset_bit_scan.state;
mode.data_b = g_preset_bit_scan.actual_num;
return mode;
}
if(g_preset_bit_scan.state == PRESET_BIT_SCAN_RECOVERY)//预置位扫描恢复状态中
{
mode.mode = PP_RECOING;
mode.data_a = g_preset_bit_scan.state;
mode.data_b = g_preset_bit_scan.actual_num;
return mode;
}
if(g_area_scan.state >= AREA_SCAN_START && //云台处于区域扫描状态
g_area_scan.state < AREA_SCAN_PAUSE_A)
{
mode.mode = AREA_SCANING;
mode.data_a = g_area_scan.state;
mode.data_b = g_area_scan.actual_num;
return mode;
}
if(g_area_scan.state >= AREA_SCAN_PAUSE_A && //云台处于区域扫描暂停状态
g_area_scan.state <= AREA_SCAN_PAUSE_B)
{
mode.mode = AREA_PAUSING;
mode.data_a = g_area_scan.state;
mode.data_b = g_area_scan.actual_num;
return mode;
}
if(g_area_scan.state >= AREA_SCAN_RECOVERY &&//云台处于预置位扫描恢复阶段
g_area_scan.state <= AREA_SCAN_RECOVERY + 1)
{
mode.mode = AREA_RECOING;
mode.data_a = g_area_scan.state;
mode.data_b = g_area_scan.actual_num;
return mode;
}
//其他正常状态
mode.mode = OTHER_MODE;
mode.data_a = g_ptz.hori_start_stop_set;
mode.data_b = g_ptz.vert_start_stop_set;
return mode;
}
//发送云台当前的工作模式
void ptz_send_work_mode(char dev)
{
unsigned char work_mode[7] = {0xff,0x00,0x00,0x00,0x00,0x00,0x00};
PtzWorkMode ptz_mode;
ptz_mode = ptz_work_mode_judge();
work_mode[1] = g_ptz.address;
work_mode[2] = 0xe0;
work_mode[3] = ptz_mode.mode;
work_mode[4] = ptz_mode.data_a;
work_mode[5] = ptz_mode.data_b;
work_mode[6] = MotorCalPelcoDSUM(work_mode,sizeof(work_mode));
ptz_send_data(dev,work_mode, sizeof(work_mode));
}