📄 dev103.c
字号:
if(p_asdu->type == ASDU64 && p_asdu->cot == 0x0c &&p_asdu->data[0] == dpi)
return TRUE;
else
return FALSE;
}
else
{
return FALSE;
}
}
}
else
return FALSE;
}
//===================================================================
/* 信号复归 */
BOOL c103_reset_signal(T_IED *p_ied)
{
T_C103_ASDU* p_asdu;
T_C103_FRAME t_frame;
/* 执行信号复归 */
p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
p_asdu->type =20;
p_asdu->vsq =0x81;
p_asdu->cot =20;
p_asdu->addr = (BYTE)p_ied->dev_data[0];
p_asdu->fun = (BYTE)p_ied->dev_type;
p_asdu->inf = 19;
p_asdu->data[0] =0x01;
p_asdu->data[1] =m_c103_rii++;
t_frame.type = FRAME_T_VOL;
t_frame.contral = 0x53; //发送/确认
t_frame.address = (BYTE)p_ied->dev_data[0];
t_frame.len =10;
t_frame.endbyte =0x16;
if (c103_serial_com(p_ied, &t_frame, 1))
{
if (t_frame.type ==0x10 && (t_frame.contral &0xF0) ==0x20 && t_frame.address ==p_ied->dev_data[0])
{
c103_request_first(p_ied);
}
p_asdu =(T_C103_ASDU *)&m_rx_buf[6];
if ( (t_frame.contral &0x0F) == 0 && p_asdu->cot == 20 && p_asdu->inf == 19)
{
return true;
}
}
else
return false;
}
//===================================================================
/* 时间服务 */
BOOL c103_set_clock(T_IED *p_ied, const T_DATE *p_date)
{
T_C103_ASDU* p_asdu;
T_C103_FRAME t_frame;
/* 时间同步报文 */
p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
p_asdu->type =6;
p_asdu->vsq =0x81;
p_asdu->cot =8;
p_asdu->addr = 0xFF;
p_asdu->fun =255;
p_asdu->inf =0;
p_asdu->data[0] =LOBYTE(p_date->msec);
p_asdu->data[1] =HIBYTE(p_date->msec);
p_asdu->data[2] =p_date->minute;
p_asdu->data[3] =p_date->hour;
p_asdu->data[4] =((p_date->week << 5) & 0xE0) | (p_date->day & 0x1F);
p_asdu->data[5] =p_date->month;
p_asdu->data[6] =p_date->year - 2000;
t_frame.type = FRAME_T_VOL;
t_frame.contral = 0x44; //发送/无回答
t_frame.address = 0xFF;
t_frame.len =15;
t_frame.endbyte =0x16;
m_c103_fcb[p_ied->dev_id] =0x20;
c103_serial_com(p_ied, &t_frame, 0);
SYS_Set_Clock(p_date);
return TRUE;
}
//===================================================================
/* 协议初始化 */
static BOOL c103_initialize()
{
T_UART_CONFIG config;
STATUS status;
if (m_dev_port == UART_PORT_A)
{
config =g_sys_config.uart_a;
}
else if (m_dev_port == UART_PORT_B)
{
config =g_sys_config.uart_b;
}
else
{
return FALSE;
}
config.pcb =c103_check_packet;
if ( !UART_Open(m_dev_port, &config) )
{
return FALSE;
}
NU_Create_Semaphore(&m_com_lock, "COM_LOCK", 1, NU_FIFO);
status =NU_Create_Task(&m_c103_task, "TASK_C103", task_c103, 0, NU_NULL,
m_c103_stack, 0x2000, 10, 0, NU_PREEMPT, NU_START);
return (status == NU_SUCCESS);
}
//===================================================================
/* 设备初始化 */
static BOOL c103_open_ied(T_IED *p_ied)
{
return true;
}
//===================================================================
/* 设备描述表 */
BOOL c103_get_List(T_IED *p_ied, T_LIST* p_list)
{
int i;
for(i=0;i<g_c103_code_size;i++)
{
if(p_ied->user_defined_1==g_c103_code[i].dev_type)
{
switch(p_list->l_type)
{
case LIST_T_SET:
{
p_list->l_ptr = g_c103_code[i].p_setting;
p_list->l_size = g_c103_code[i].w_setting;
return true;
}
case LIST_T_EVENT:
{
p_list->l_ptr = g_c103_code[i].p_event;
p_list->l_size = g_c103_code[i].w_even;
return true;
}
case LIST_T_ALARM:
{
p_list->l_ptr = g_c103_code[i].p_alarm;
p_list->l_size = g_c103_code[i].w_alarm;
return true;
}
return false;
}
}
}
return false; //hu?
}
//===================================================================
/* 取103条目号 */
static WORD C103_Get_Code(T_IED* p_ied, T_LIST* p_list, WORD code)
{
if(c103_get_List(p_ied,p_list))
{
switch(p_list->l_type)
{
case LIST_T_EVENT:
{
int i;
T_EVENT_ENTRY* p_event = (T_EVENT_ENTRY*) p_list->l_ptr;
for(i = 0; i< p_list->l_size; i++)
{
if(p_event[i].e_key == code)
return i+1;
}
}
case LIST_T_ALARM:
{
int i;
T_ALARM_ENTRY* p_alarm = (T_ALARM_ENTRY*) p_list->l_ptr;
for(i = 0; i< p_list->l_size; i++)
{
if(p_alarm[i].e_key == code)
return i+1;
}
}
case LIST_T_SET:
{
int i;
T_SET_ENTRY* p_set = (T_SET_ENTRY*) p_list->l_ptr;
for(i = 0; i< p_list->l_size; i++)
{
if(p_set[i].e_key == code)
return i+1;
}
}
}
}
return 0;
}
//===================================================================
/* 103设备服务接口 */
BOOL c103_service(T_IED *p_ied, T_MESSAGE *p_msg)
{
BOOL ret_code =FALSE;
/* [初始化部分] */
switch(p_msg->m_type)
{
case MSG_T_INIT:
/* 初始化协议 */
return c103_initialize();
case MSG_T_OPEN:
/* 初始化设备 */
return c103_open_ied((T_IED *)(p_msg->m_data));
default:
break;
}
//设备操作接口部分
DEV_LOCK_COM();
switch(p_msg->m_type)
{
case MSG_T_LIST:
if(p_msg->m_flag == MSG_F_READ)
{
ret_code = c103_get_List(p_ied, (T_LIST*) p_msg->m_data);
}
break;
case MSG_T_SET:
if(p_msg->m_flag == MSG_F_READ)
{
ret_code = c103_get_setting(p_ied, (T_SET *)p_msg->m_data);
}
break;
case MSG_T_ZONE:
if(p_msg->m_flag == MSG_F_READ)
{
ret_code = c103_get_zone(p_ied, (WORD *)p_msg->m_data);
}
break;
case MSG_T_SFC:
if(p_msg->m_flag == MSG_F_READ)
{
ret_code = c103_get_sfc(p_ied);
}
break;
case MSG_T_CTRL:
if(p_msg->m_flag == MSG_F_CHECK)
{
ret_code = c103_check_control(p_ied, (WORD) p_msg->m_data);
}
if (p_msg->m_flag == MSG_F_WRITE)
{
ret_code = c103_remote_control(p_ied, (WORD) p_msg->m_data);
}
break;
case MSG_T_SIGNAL:
/* 信号复归 */
if(p_msg->m_flag == MSG_F_WRITE)
{
ret_code = c103_reset_signal(p_ied);
}
break;
case MSG_T_ANALOG:
if(p_msg->m_flag == MSG_F_READ)
{
ret_code = c103_get_analog(p_ied, (T_CHANNEL *)p_msg->m_data);
}
break;
case MSG_T_CLOCK:
// 广播对时
if(p_msg->m_flag == MSG_F_WRITE)
{
ret_code = c103_set_clock(p_ied, (T_DATE *)p_msg->m_data);
}
break;
default:
break;
}
//开放通讯资源
DEV_UNLOCK_COM();
return ret_code;
}
//===================================================================
//复位通信单元
BOOL c103_reset_cu(T_IED* p_ied)
{
T_C103_FRAME t_frame;
t_frame.type =FRAME_T_CON;
t_frame.contral =0x40; //复位通信单元
t_frame.address = (BYTE)p_ied->dev_data[0];
t_frame.endbyte =0x16;
m_c103_fcb[p_ied->dev_id] =0x20; //使帧计数位常为0
if(c103_serial_com_init(p_ied, &t_frame,1))
{
if((t_frame.contral &0x0F) == 0) //确认响应
{
if((t_frame.contral &0x20) != 0) //判别响应帧
{
return c103_request_first(p_ied);
}
else
{
return c103_request_second(p_ied); //请求二级用户数据
}
}
}
else
return false;
}
//===================================================================
/* 复位帧计数位 */
BOOL c103_reset_fcb(T_IED* p_ied)
{
T_C103_FRAME t_frame;
t_frame.type =FRAME_T_CON;
t_frame.contral =0x47; //复位帧计数位
t_frame.address = (BYTE)p_ied->dev_data[0];
t_frame.endbyte =0x16;
m_c103_fcb[p_ied->dev_id] =0x20; //使帧计数位常为0
if (c103_serial_com(p_ied, &t_frame, 1))
{
if ( (t_frame.contral &0x0F) == 0 ) //确认响应
{
if ( (t_frame.contral &0x20) != 0)//判别响应帧
{
return c103_request_first(p_ied);
}
else
{
return c103_request_second(p_ied); //请求二级用户数据
}
}
}
else
return false; //hu
}
//===================================================================
//总查询
BOOL c103_request_gi(T_IED* p_ied) //asdu07
{
T_C103_FRAME t_frame;
T_C103_ASDU* p_asdu;
p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
p_asdu->type =7;
p_asdu->vsq =0x81;
p_asdu->cot =9;
p_asdu->addr = (BYTE)p_ied->dev_data[0];
p_asdu->fun =C103_FUN_GLB;
p_asdu->inf =0;
p_asdu->data[0] =m_c103_sn++;
t_frame.type =FRAME_T_VOL;
t_frame.address = (BYTE)p_ied->dev_data[0];
t_frame.len =9;
t_frame.contral =0x53; //发送/确认
t_frame.endbyte =0x16;
if(c103_serial_com_init(p_ied, &t_frame,1))
{
if((t_frame.contral&0x0F)==0)
{
//确认响应
if((t_frame.contral&0x20)!=0)
{
//判别响应帧
return c103_request_first(p_ied);
}
else
{
return c103_request_second(p_ied); //请求二级用户数据
}
}
}
else
return false;
}
//===================================================================
/* 上电初始化 */
BOOL c103_device_initialize(T_IED* p_ied)
{
//复位通信单元
if(!c103_reset_cu(p_ied))
return false;
//复位帧计数位
/*
if(!c103_reset_fcb(p_ied))
{
return false;
}
*/
if(!c103_request_gi(p_ied) ) //总查询
{
return false;
}
return true;
}
//===================================================================
/* module's task */
VOID task_c103(UNSIGNED argc, VOID *argv)
{
T_IED *p_ied;
T_DI yx;
p_ied = DEV_First_IED();
DEV_LOCK_COM();
//每次上电初始化遥信库,否则召唤全遥信可能出错
yx.di_num=64;
yx.di_val[0]=yx.di_val[1]=0;
INF_Set_Di(p_ied->dev_id,&yx);
//复归链路并进行总召唤
c103_device_initialize(p_ied);
DEV_UNLOCK_COM();
loop:
p_ied =DEV_First_IED();
//如果初始化装置成功.则进行2级数据的访问,否则继续初始化
DEV_LOCK_COM();
if(p_ied->dev_flag == DEV_F_ONLINE)
c103_request_second(p_ied);
else
c103_device_initialize(p_ied);
DEV_UNLOCK_COM();
goto loop;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -