📄 dev103.c
字号:
p_asdu->addr = p_ied->dev_id;//(BYTE)p_ied->dev_data[0];
p_asdu->fun =254;
p_asdu->inf =241;//241
p_asdu->data[0] =m_c103_rii++;
p_asdu->data[1] =1;//NOD
p_asdu->data[2] =ginl;
p_asdu->data[3] =ginh;
p_asdu->data[4] =kod;
for(i=0;i<3;i++)
{
t_frame.type = FRAME_T_VOL;
t_frame.contral = 0x53;
t_frame.address = p_ied->dev_id;//(BYTE)p_ied->dev_data[0];
t_frame.len =13;
t_frame.endbyte =0x16;
if(c103_serial_com(p_ied,&t_frame,1))
{
//注意通用分类读后必须请求一级数据
if(t_frame.type ==0x10 && m_rx_buf[1]==0x20)
{
if(c103_request_first(p_ied))
{
return true;
}
}
}
}
return false;
}
//===================================================================
/* 主站ASDU10带确认写一个(组/条目)的值 */
/* p_ied: 设备标识
ngd: 通用数据数目
*/
static BOOL c103_generic_ackwrite(T_IED *p_ied, BYTE ngd, BYTE len)
{
T_C103_FRAME t_frame;
T_C103_ASDU* p_asdu;
/* 加入ASDU10通用分类数据写报文头 */
p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
p_asdu->type =10;
p_asdu->vsq =0x81;
p_asdu->cot =40;
p_asdu->addr = (BYTE)p_ied->dev_data[0];
p_asdu->fun =254;
p_asdu->inf =249;
p_asdu->data[0] =m_c103_rii++;
p_asdu->data[1] =ngd;
/* 帧格式 */
t_frame.type = FRAME_T_VOL;
t_frame.contral = 0x53;
t_frame.address = (BYTE)p_ied->dev_data[0];
t_frame.len = len;
t_frame.endbyte =0x16;
if (c103_serial_com(p_ied, &t_frame, 1))
{
if (t_frame.type ==0x10 && t_frame.contral ==0x21
&& t_frame.address ==p_ied->dev_data[0]) //接收数据识别
{
c103_request_first(p_ied);
}
if (t_frame.type ==0x68 && t_frame.contral ==0
&& t_frame.address ==p_ied->dev_data[0])
{
p_asdu =(T_C103_ASDU *) &m_rx_buf[6];
/* 校验ASDU信息 */
if ((p_asdu->cot != 44) || (p_asdu->fun != 254) || (p_asdu->inf != 249))
{
return false;
}
return true;
}
}
else
return false;
}
//===================================================================
/* 主站ASDU10带执行写一个(组/条目)的值 */
/* p_ied: 设备标识
ngd: 通用数据数目
*/
static BOOL c103_generic_exewrite(T_IED *p_ied, BYTE ngd, BYTE len)
{
T_C103_FRAME t_frame;
T_C103_ASDU* p_asdu;
/* 加入ASDU10通用分类数据写报文头 */
p_asdu =(T_C103_ASDU *) &m_tx_buf[6];
p_asdu->type=10;
p_asdu->vsq =0x81;
p_asdu->cot =40;
p_asdu->addr= (BYTE)p_ied->dev_data[0];
p_asdu->fun =254;
p_asdu->inf =250;
p_asdu->data[0] =m_c103_rii++;
p_asdu->data[1] =ngd;
/* 帧格式 */
t_frame.type = FRAME_T_VOL;
t_frame.contral = 0x53;
t_frame.address = (BYTE)p_ied->dev_data[0];
t_frame.len = len;
t_frame.endbyte =0x16;
if (c103_serial_com(p_ied, &t_frame, 1))
{
if (t_frame.type ==0x10 && t_frame.contral ==0x21
&& t_frame.address ==p_ied->dev_data[0])
{
c103_request_first(p_ied);
}
if (t_frame.type ==0x68 && t_frame.contral ==0
&& t_frame.address ==p_ied->dev_data[0])
{
p_asdu =(T_C103_ASDU *)m_rx_buf[6];
/* 校验ASDU信息 */
if ((p_asdu->cot != 40) || (p_asdu->fun != 254) || (p_asdu->inf != 250))
{
return false;
}
return true;
}
}
else
return false;
}
//===================================================================
//保护采样通道值
BOOL c103_get_analog(T_IED *p_ied, T_CHANNEL *p_chn)
{
T_C103_ASDU *p_asdu;
BYTE i;
T_C103_DATA *p_rec;
// 解析数据
p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
if ( !c103_generic_read(p_ied, 0x09, 0x00, 0x01) )
{
return FALSE;
}
p_asdu =(T_C103_ASDU *) &m_rx_buf[6];
p_chn->chn_num =p_asdu->data[1];
if (p_chn->chn_num > SYS_MAX_CHANNEL)
{
p_chn->chn_num =SYS_MAX_CHANNEL;
}
p_rec =(T_C103_DATA *)&p_asdu->data[2];
for (i =0; i < p_chn->chn_num; i++)
{
if ((p_rec->ginh != 0x02) || (p_rec->kod != 0x01) || (p_rec->num != 1))
{
return FALSE;
}
if (p_rec->type == 0x40)
{
float f_val;
f_val = MAKEWORD(p_rec->data[0],p_rec->data[1]) /100.0;
p_chn->chn_val[i] =f_val;
}
else
{
p_chn->chn_val[i] =(float)p_rec->data[0];
}
p_rec =(T_C103_DATA *)((BYTE *)p_rec+6+p_rec->num*p_rec->size);
}
return TRUE;
}
//===================================================================
//选择当前操作定值区
static BOOL c103_select_zone(T_IED *p_ied, BYTE set_no)
{
BYTE len;
T_C103_ASDU *p_asdu;
T_C103_DATA *p_rec;
BYTE ngd =1;
p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
p_rec =(T_C103_DATA *)&p_asdu->data[2];
p_rec->ginh =0;
p_rec->ginl =2;
p_rec->kod =1;
p_rec->type =3;
p_rec->size =1;
p_rec->num =1;
p_rec->data[0] =set_no;
len =17;
if ( !c103_generic_exewrite(p_ied, ngd, len) )
{
return false;
}
p_asdu =(T_C103_ASDU *) &m_rx_buf[6];
p_rec =(T_C103_DATA *)&p_asdu->data[2];
if ((p_rec->ginh != 0) || (p_rec->ginl != 2) || (p_rec->kod != 1))
{
return false;
}
return (p_rec->data[0] == set_no);
}
//===================================================================
//定值类服务
BOOL c103_get_setting(T_IED *p_ied, T_SET *p_set)
{
T_C103_ASDU* p_asdu;
T_C103_DATA* p_rec;
BYTE i,j;
BYTE set_num;
BYTE flag_con;
BYTE ginh,ginl,kod;
ginh = 0x00;
ginl = p_ied->dev_data[1];
kod = 0x01;
p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
if(!c103_generic_read(p_ied, ginl, ginh, kod))
{
return FALSE;
}
//解析数据
p_set->set_num = 0;
do
{
p_asdu =(T_C103_ASDU *)&m_rx_buf[6];
set_num = p_asdu->data[1] & 0x3f;
p_set->set_num += set_num;
flag_con = p_asdu->data[1] & 0x80;//是否还有未上送完的数据
if (p_set->set_num >= SYS_MAX_SET)
{
p_set->set_num =SYS_MAX_SET;
flag_con = 0;
}
p_rec =(T_C103_DATA *)&p_asdu->data[2];
for (i =0; i < set_num; i++)
{
if((p_rec->ginh != 0x01) && (p_rec->kod != 0x01) || (p_rec->num != 1))
{
return false;
}
j=p_rec->ginl;//定值项序号
if (p_rec->type == 0x07)
{
float f_val;
gen_scan_float(p_rec->data, &f_val);//定值格式转换
p_set->set_val[j].type =SET_T_FLOAT;
p_set->set_val[j].un_val.f_val =f_val;
}
else
{
if (p_rec->size == 0x02)
{
p_set->set_val[j].type =SET_T_UINT;
p_set->set_val[j].un_val.u_val =MAKEWORD(p_rec->data[0],p_rec->data[1]);
}
else
{
p_set->set_val[j].type =SET_T_UINT;
p_set->set_val[j].un_val.u_val =p_rec->data[0];
}
}
p_rec =(T_C103_DATA *)((BYTE *)p_rec+6+p_rec->num*p_rec->size);
}
if(flag_con != 0)
{
c103_request_first( p_ied);
}
}while(flag_con != 0);
return true;
}
//===================================================================
BOOL c103_get_zone(T_IED *p_ied, WORD *p_set_no)
{
T_C103_ASDU *p_asdu;
T_C103_DATA *p_rec;
p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
if ( !c103_generic_read(p_ied, 0x02, 0x01, 0x01))
{
return false;
}
p_asdu =(T_C103_ASDU *)&m_rx_buf[6];
p_rec =(T_C103_DATA *)&p_asdu->data[2];
if ((p_rec->ginh != 0x00) || (p_rec->ginl != 0x03) || (p_rec->kod != 0x01))
{
return false;
}
*p_set_no =p_rec->data[0];
return true;
}
//===================================================================
//软压板类服务
BOOL c103_get_sfc(T_IED *p_ied)
{
T_C103_ASDU* p_asdu;
T_C103_DATA* p_rec;
T_SFC t_sfc;
BYTE i;
p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
if(!c103_generic_read(p_ied, 0x06, 0x00, 0x01))
{
return FALSE;
}
p_asdu =(T_C103_ASDU *)&m_rx_buf[6];
/* 解析数据 */
t_sfc.sfc_num =p_asdu->data[1];
if (t_sfc.sfc_num > SYS_MAX_SFC)
{
t_sfc.sfc_num =SYS_MAX_SFC;
}
p_rec =(T_C103_DATA *)&p_asdu->data[2];
for (i =1; i <= t_sfc.sfc_num; i++)
{
if ((p_rec->ginh != 0x03) || (p_rec->kod != 0x01) || (p_rec->num != 1))
{
return FALSE;
}
if ( (p_rec->data[0] /0x32) == 0x01 )
{
INF_Preset_SFC(&t_sfc, i, INF_S_ON);
}
else if ( (p_rec->data[0] /0x32) == 0x02 )
{
INF_Preset_SFC(&t_sfc, i, INF_S_OFF);
}
p_rec =(T_C103_DATA *)((BYTE *)p_rec+6+p_rec->num*p_rec->size);
}
INF_Set_SFC(p_ied->dev_id, &t_sfc);
return TRUE;
}
//===================================================================
//遥控类服务[最小遥控点号 =1]
BOOL c103_check_control(T_IED *p_ied, WORD ctrl_no)
{
T_C103_ASDU *p_asdu;
T_C103_FRAME t_frame;
BYTE ginl =(ctrl_no+1)/2;
BYTE dpi =((ctrl_no % 2) != 0)?0x01:0x02;
p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
p_asdu->type = ASDU64;
p_asdu->vsq = 0x01;
p_asdu->cot = 0x0c;
p_asdu->addr = (BYTE)p_ied->dev_data[0];
p_asdu->fun = CTRL_FIRST_FUN;
p_asdu->inf = CTRL_FIRST_INF + ginl;
p_asdu->data[0] = dpi|0x80;
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.address == p_ied->dev_data[0]&&(t_frame.contral &0x20) != 0)
{
if(c103_request_first(p_ied))
{
p_asdu =(T_C103_ASDU *)&m_rx_buf[6];
if(p_asdu->type == ASDU64 && p_asdu->cot == 0x0c &&p_asdu->data[0] == (dpi|0x80))
return TRUE;
else
return FALSE;
}
else
return FALSE;
}
else
{
if(c103_request_second(p_ied))
{
p_asdu =(T_C103_ASDU *)&m_rx_buf[6];
if(p_asdu->type == ASDU64 && p_asdu->cot == 0x0c &&p_asdu->data[0] == (dpi|0x80))
return TRUE;
else
return FALSE;
}
else
return FALSE;
}
}
else
return FALSE;
}
//===================================================================
BOOL c103_remote_control(T_IED *p_ied, WORD ctrl_no)
{
T_C103_FRAME t_frame;
T_C103_ASDU *p_asdu;
BYTE ginl =(ctrl_no+1)/2;
BYTE dpi =((ctrl_no % 2) != 0)?0x01:0x02;
p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
p_asdu->type = ASDU64;
p_asdu->vsq = 0x01;
p_asdu->cot = 0x0c;
p_asdu->addr = (BYTE)p_ied->dev_data[0];
p_asdu->fun = CTRL_FIRST_FUN;
p_asdu->inf = CTRL_FIRST_INF + ginl;
p_asdu->data[0] = dpi;
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.address == p_ied->dev_data[0])
{
if(c103_request_first(p_ied))
{
p_asdu =(T_C103_ASDU *)&m_rx_buf[6];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -