⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 103.c

📁 南瑞继保串口103源码共享
💻 C
📖 第 1 页 / 共 3 页
字号:
				*apack++ = 10;
				*apack++ = 1;
				*apack++ = 1;
				*apack++ =((BYTE) (sfc.sfc_val[0] >> i)&0x00000001) + 1;
				if(i == 31)
				{
					sfc.sfc_val[0] = sfc.sfc_val[1];
				}
			}
			wLen = apack - crc;
			*apack++ = Makecrc(crc,wLen);
			*apack++ = 0x16;
			wLen = apack - sbuf;
			tot_leng = wLen;
			UART_Write(uart_port,sbuf,wLen);
			return;
		}

		//检查是否要传送保护定值 asdu10
		if (flag == FLAG_READ_SET)
		{
			BYTE data_leng,i;

			apack = sbuf;
			*apack++ = 0x68;
			apack++;
			apack++;
			*apack++ = 0x68;
			crc = apack;
			*apack++ = 0x28;
			*apack++ = byDevAddr;
			*apack++ = 0x0a;
			*apack++ = 0x81;
			*apack++ = 0x2a;
			*apack++ = byDevAddr;
			*apack++ = 0xFE;
			*apack++ = 0xf1;
			*apack++ = 0x00;
			data_leng = 9;
			ngd = rsetbuf.set_num;
			if(ngd > 20)
			{
				ngd = ngd | 0x80;
			}
			*apack++ = (BYTE) ngd;
			data_leng++;
			i = 0;
			while (i < 20)
			{
				if (dznumber < rsetbuf.set_num)
				{
					*apack++ = 0x04;//定值组号
					data_leng++;
					*apack++ = dznumber + 1;//条目号
					data_leng++;
					*apack++ = 0x01;//描述类别
					data_leng++;
					switch (rsetbuf.set_val[dznumber].type)
					{
					case SET_T_UINT:
						*apack++ = 0x24;//ASCII码 四方
						*apack++ = 0x02;
						*apack++ = 0x01;
						*apack++ = (BYTE) rsetbuf.set_val[dznumber].un_val.u_val;
						*apack++ = (BYTE) (rsetbuf.set_val[dznumber].un_val.u_val >> 8);
						dznumber++;
						data_leng += 5;
						break;
					case SET_T_FLOAT:
						*apack++ = 0x07;//float
						*apack++ = 0x04;
						*apack++ = 0x01;
						*apack++ = *((BYTE *)&rsetbuf.set_val[dznumber].un_val.f_val + 3);
						*apack++ = *((BYTE *)&rsetbuf.set_val[dznumber].un_val.f_val + 2);
						*apack++ = *((BYTE *)&rsetbuf.set_val[dznumber].un_val.f_val + 1);
						*apack++ = *(BYTE *)&rsetbuf.set_val[dznumber].un_val.f_val;
						dznumber++;
						data_leng += 7;
						break;
					}
					i++;
				}
				else
				{
					break;
				}
			}

			//超过20项定值分帧发		
			sbuf[1] = data_leng;
			sbuf[2] = data_leng;
			if (dznumber != rsetbuf.set_num)
			{
				sbuf[13] = (i | 0x80);
				sbuf[4] = 0x28;
			}
			else
			{
				sbuf[13] = (i | 0x00);
				sbuf[4] = 0x08;
				flag = 0;
			}
			wLen = data_leng;
			*apack++ = Makecrc(crc,wLen);
			*apack++ = 0x16;
			wLen = data_leng + 6;
			tot_leng = wLen;
			UART_Write(uart_port,sbuf,wLen);
			return;
		}
	//检查压板是否有变位信息
		bSFCC = INF_Search_SFCC(hand,dev_id);
		if (bSFCC == 1)
		{
			        //INF_Record_SFCC(&p_sfcc);
				INF_Get_SFCC(hand,dev_id,&p_sfcc);
				
				apack = sbuf;
				*apack++ = 0x68;
				*apack++;
				*apack++;
				*apack++ = 0x68;
				crc = apack;
				bSFCC = INF_Search_SFCC(hand,dev_id);
				if (bSFCC == 1)
				{
					*apack++ = 0x28;
				}
				else
				{
					*apack++ = 0x08;
				}
				*apack++ = byDevAddr;
				*apack++ = 0x01;
				*apack++ = 0x81;
				*apack++ = 1;
				*apack++ = byDevAddr;
				*apack++ = Get_Fun(dev_id);//Fun
				*apack++ = (BYTE)p_sfcc.e_code + SFC_BEGIN ;//条目号
				*apack++ = (BYTE)p_sfcc.e_state + 1;
				*apack++ = (BYTE)pEvent.e_date.msec;
				*apack++ = (BYTE) (pEvent.e_date.msec >> 8);
				*apack++ = pEvent.e_date.minute;
				*apack++ = pEvent.e_date.hour;
				*apack++ = 0;
				wLen = apack - crc;
				sbuf[1] = (BYTE)wLen;
				sbuf[2] = (BYTE)wLen;
				*apack++ = Makecrc(crc,wLen);
				*apack++ = 0x16;
				wLen = apack - sbuf;
				tot_leng = wLen;
				UART_Write(uart_port,sbuf,wLen);
				return;
		}	
		
		//回答无所响应数据报文
		apack = sbuf;
		*apack++ = 0x10;
		crc = apack;
		*apack++ = 0x09;
		*apack++ = byDevAddr;
		*apack++ = Makecrc(crc,2);
		*apack++ = 0x16;
		wLen = apack - sbuf;
		tot_leng = wLen;
		UART_Write(uart_port,sbuf,wLen);
		break;
	case 0x0b:
		//检查开入量是否有变化&&检查是否要传送保护定植&&检查是否有保护事件发生
		bDI = INF_Search_Dic(hand,dev_id);
		bEvent = INF_Search_Event(hand,dev_id);
		bAlarm = INF_Search_Alarm(hand,dev_id);
		bSFCC  = INF_Search_SFCC(hand,dev_id);
		if (bDI||bEvent||bAlarm||bSFCC)
		{
			//符合上述条件,置有一类数据标志
			BYTE *crc;

			apack = sbuf;
			*apack++ = 0x10;
			crc = apack;
			*apack++ = 0x29;
			*apack++ = byDevAddr;
			*apack++ = Makecrc(crc,2);
			*apack++ = 0x16;
			wLen = apack - sbuf;
			tot_leng = wLen;
			UART_Write(uart_port,sbuf,wLen);
			return;
		}

		bMeasure = INF_Search_Overline(hand,dev_id);
		dev_fun = Get_Fun(dev_id);
		//是否要传送遥测值 ASDU50
		if(bMeasure == 1)
		{
			BYTE i;

			apack = sbuf;
			*apack++ = 0x68;
			*apack++;
			*apack++;
			*apack++ = 0x68;
			crc = apack;
			*apack++ = 0x08;
			*apack++ = byDevAddr;
			*apack++ = 0x32;   //9;
			INF_Get_Measure(dev_id,&measure);
			*apack++ = measure.ms_num; //0x0a;
			*apack++ = 2;
			*apack++ = byDevAddr;
			*apack++ = Get_Fun(dev_id);//FUN
			*apack++ = MEA_BEGIN;//inf
			//INF_Get_Measure(dev_id,&measure);
			for(i = 0;i < measure.ms_num;i++)
			{
				*apack++ = (BYTE)(measure.ms_val[i]);
				*apack++ = (BYTE)(measure.ms_val[i] >> 8);
			}
			wLen = apack - crc;
			sbuf[1] = (BYTE)wLen;
			sbuf[2] = (BYTE)wLen;
			*apack++ = Makecrc(crc,wLen);
			*apack++ = 0x16;
			wLen = apack - sbuf;
			tot_leng = wLen;
			UART_Write(uart_port,sbuf,wLen);
			return;
		}
		else
		{
			//回答无二类数据报文
			apack = sbuf;
			*apack++ = 0x10;
			crc = apack;
			*apack++ = 0x09;
			*apack++ = byDevAddr;
			*apack++ = Makecrc(crc,2);
			*apack++ = 0x16;
			wLen = apack - sbuf;
			tot_leng = wLen;
			UART_Write(uart_port,sbuf,wLen);
			break;
		}
	}
}

void ASDU05(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
	BYTE *pt;
	BYTE *crc;
	BYTE inf;
	WORD wLen;
	WORD dev_id;
	BYTE cot,control;

	pt = sbuf;
	*pt++ = 0x68;
	*pt++;
	*pt++;
	*pt++ = 0x68;
	crc = pt;
	switch(flag)
	{
	case FLAG_RESET_CU:
		control = 0x28;
		cot = 0x04;
		inf = 0x03;
		break;
	case FLAG_RESET_FCB:
		control = 0x28;
		cot = 0x03;
		inf = 0x02;
		break;
	default:
		control = 0x08;
		cot = 0x05;
		inf = 0x04;
		break;
	}
	*pt++ = control;
	*pt++ = byDevAddr;
	*pt++ = 0x05;
	*pt++ = 0x81;
	*pt++ = cot;
	*pt++ = byDevAddr;
	dev_id = Addr_to_ID(byDevAddr);
	*pt++ = Get_Fun(dev_id);
	*pt++ = inf;
	*pt++ = 0x03;
	//拷贝厂家和版本信息
	*pt++ = 'S';
	*pt++ = 'A';
	*pt++ = 'C';
	*pt++ = '1';
	*pt++ = '0';
	*pt++ = '3';
	*pt++ = '.';
	*pt++ = 'V';
	*pt++ = '2';
	*pt++ = '.';
	*pt++ = '0';
	*pt++ = '1';
	//拷贝厂家和版本信息
	wLen = pt - crc;
	sbuf[1] = (BYTE)wLen;
	sbuf[2] = (BYTE)wLen;
	*pt++ =Makecrc(crc,wLen);
	*pt++ = 0x16;
	wLen = pt - sbuf;
	tot_leng = wLen;
	UART_Write(uart_port,sbuf,wLen);
}

/*

//回答总查询 送全遥信 单点信息0——OFF,1——ON   //ASDU40
void ASDU40(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
	BYTE *pt;
	BYTE *crc;
	BYTE count,i;
	WORD wLen;
	WORD dev_id;

	count = di.di_num + sfc.sfc_num;
	dev_id = Addr_to_ID(byDevAddr);
	flag = 0x00;
	pt = sbuf;
	*pt++ = 0x68;
	*pt++;
	*pt++;
	*pt++ = 0x68;
	crc = pt;
	*pt++ = 0x28;
	*pt++ = byDevAddr;
	*pt++ = 0x28;
	*pt++ = count;
	*pt++ = 0x09;//传送原因
	*pt++ = byDevAddr;
	*pt++ = Get_Fun(dev_id);//FUN
	for(i = 0;i < di.di_num ;i++)
	{
		*pt++ = (BYTE) ((di.di_val[0] >> i) & 0x01);
		if(i == 31) di.di_val[0] = di.di_val[1];
	}
	for(i = 0;i < sfc.sfc_num ;i++)
	{
		*pt++ = (BYTE) ((sfc.sfc_val[0] >> i) & 0x01);
		if(i == 31) sfc.sfc_val[0] = sfc.sfc_val[1];
	}
	wLen = pt - crc;
	sbuf[1] = (BYTE)wLen;
	sbuf[2] = (BYTE)wLen;
	*pt++ = Makecrc(crc,wLen);
	*pt++ = 0x16;
	wLen = pt - sbuf;
	tot_leng = wLen;
	UART_Write(uart_port,sbuf,wLen);
}

*/
//回答总查询
void ASDU44(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
	BYTE *pt;
	BYTE *crc;
	BYTE i;
	WORD wLen;
	WORD dev_id;

	dev_id = Addr_to_ID(byDevAddr);
	flag = FLAG_POLLING_END;
	pt = sbuf;
	*pt++ = 0x68;
	*pt++;
	*pt++;
	*pt++ = 0x68;
	crc = pt;
	*pt++ = 0x28;
	*pt++ = byDevAddr;
	*pt++ = 0x2c;
	*pt++ = 0x02;     //信息组数
	*pt++ = 0x09;     //传送原因
	*pt++ = byDevAddr;
	*pt++ = Get_Fun(dev_id); //FUN
	*pt++ = 0xb0;            //起始inf
	*pt++ = 0x00;
	*pt++ = 0x00;
	*pt++ = ((di.di_val[0]) & 0xff);
	*pt++ = ((di.di_val[0] >>8) & 0xff);
	*pt++ = 0x00;
	*pt++ = 0x00;
	*pt++ = 0x00;            //QDS
	*pt++ = ((di.di_val[0] >>16) & 0xff);
	*pt++ = ((di.di_val[0] >>24) & 0xff);
	*pt++ = 0x00;
	*pt++ = scn;
	wLen = pt - crc;
	sbuf[1] = (BYTE)wLen;
	sbuf[2] = (BYTE)wLen;
	*pt++ = Makecrc(crc,wLen);
	*pt++ = 0x16;
	wLen = pt - sbuf;
	tot_leng = wLen;
	UART_Write(uart_port,sbuf,wLen);
	return;
}

void ASDU01(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
	BYTE *pt;
	BYTE *crc;
	WORD wLen;
	WORD dev_id;
	T_DATE tdate;
	BYTE temp;

	pt = sbuf;
	*pt++ = 0x68;
	*pt++;
	*pt++;
	*pt++ = 0x68;
	crc = pt;
	if(count == di.di_num + sfc.sfc_num - 1)
	{
		*pt++ = 8;
		flag = FLAG_POLLING_END;
		
	}
	else
	{
		*pt++ =0x28;
	}
	*pt++ = byDevAddr;
	dev_id = Addr_to_ID(byDevAddr);
	*pt++ = 0x01;
	*pt++ = 0x81;
	*pt++ = 0x09;//传送原因
	*pt++ = byDevAddr;
	*pt++ = Get_Fun(dev_id);//FUN
	 temp = sfc.sfc_num;
	if(count <= sfc.sfc_num + di.di_num)
	{
		if(count < sfc.sfc_num)
		{
			*pt++ = SFC_BEGIN + count;//inf
			*pt++ =((BYTE) (sfc.sfc_val[0] >> count)&0x00000001) + 1;
		}
		if(count >= sfc.sfc_num)
		{
			*pt++ = DIC_BEGIN + count - sfc.sfc_num + 1;
			*pt++ =((BYTE) (di.di_val[0] >> (count-temp))&0x00000001) + 1;
		}
		if(count == 47)
		{
			di.di_val[0] = di.di_val[1];
		}
	}
	count ++;
	DEV_Get_Clock(dev_id, &tdate);
	*pt++ = (BYTE)tdate.msec;
	*pt++ = (BYTE)(tdate.msec >> 8);
	*pt++ = tdate.minute;
	*pt++ = tdate.hour;
	wLen = pt - crc;
	sbuf[1] = (BYTE)wLen;
	sbuf[2] = (BYTE)wLen;
	*pt++ = Makecrc(crc,wLen);
	*pt++ = 0x16;
	wLen = pt - sbuf;
	tot_leng = wLen;
	UART_Write(uart_port,sbuf,wLen);
}

//时钟同步
void ASDU06(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
	const BYTE* pt;
	BYTE Msl,Msh;
	T_DATE tdate;

	pt = rbuf + 12;
	Msl = *pt++;//msl
	Msh = *pt++;//msh
	tdate.msec = MAKEWORD(Msl,Msh);
	tdate.minute = (*pt++)&0x3f;//min
	tdate.hour = (*pt++)&0x1f;//hours
	tdate.week = ((*pt)>>5)&0x07;//weeks
	tdate.day = (*pt++)&0x1f;//date
	tdate.month = (*pt++)&0x0f;//mon
	tdate.year = ((*pt++)&0x7f) + 2000;//year
	DEV_Set_Clock(SYS_IED_ANY,&tdate);
	SYS_Set_Clock(&tdate);
	return;
}

//总查询
void ASDU07(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{
	BYTE *crc;
	BYTE *pt;
	BOOL b_DI, b_SFC;
	WORD wLen;
	WORD dev_id;

	//置总查询标志
	flag = FLAG_POLLING;
	scn = rbuf[12];
	count = 0;
	dev_id = Addr_to_ID(byDevAddr);
	b_DI = INF_Get_Di(dev_id, &di);
	b_SFC = INF_Get_SFC(dev_id, &sfc);
	pt = sbuf;
	*pt++ = 0x10;
	crc= pt;
	if((b_DI | b_SFC))
	{
		*pt++ = 0x20;
	}
	else
	{
		*pt++ = 0x00;
	}
	*pt++ = rbuf[5];
	wLen = pt - crc;
	*pt++ = Makecrc(crc,wLen);
	wLen++;
	*pt++ = 0x16;
	wLen++;
	wLen++;
	tot_leng = wLen;
	NU_Sleep(20);
	UART_Write(uart_port,sbuf,wLen);
	return;
}

//总查询的终止
void ASDU08(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
	BYTE *pt;
	BYTE *crc;
	WORD wLen;

	pt = sbuf;
	flag = 0x00;
	*pt++ = 0x68;
	*pt++ = 0x09;
	*pt++ = 0x09;
	*pt++ = 0x68;
	crc = pt;
	*pt++ = 8;
	*pt++ = byDevAddr;
	*pt++ = 8;
	*pt++ = 0x81;
	*pt++ = 10;
	*pt++ = byDevAddr;
	*pt++ = 0xff;
	*pt++ = 0;
	*pt++ = scn;
	wLen = pt - crc;
	*pt++ = Makecrc(crc,wLen);
	*pt++ = 0x16;
	wLen = pt - sbuf;
	tot_leng = wLen;
	UART_Write(uart_port,sbuf,wLen);
	return;
}
//遥控过程
void ASDU64(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{ 
	BYTE dcc;
	BYTE *crc;
	WORD wLen;
	BYTE	*apack;
	
//	dcc = rbuf[12];
	c   = rbuf[12];
	a   = rbuf[10];  //fun
	b   = rbuf[11];  //inf
	ctrl_no1 = rbuf[11];
	d   = c&0x80;
	e   = c&0x40;
	if( (d == 0x80)&&(e == 0x00))   //遥控选择
	{
		flag = FLAG_YK_CHK;
	}
	if( (d == 0x00)&&(e == 0x00))   //遥控执行
	{
		flag = FLAG_YK_DO;
	}
	if( (d == 0x80)&&(e == 0x40))   //遥控撤消
	{
		flag = FLAG_YK_UNDO;
	}
	        apack = sbuf;
		*apack++ = 0x10;
		crc = apack;
		*apack++ = 0x20;
		*apack++ = byDevAddr;
		*apack++ = Makecrc(crc,2);
		*apack++ = 0x16;
		wLen = apack - sbuf;
		tot_leng = wLen;
		UART_Write(uart_port,sbuf,wLen);
		return;
}	        

/*		
//
void ASDU10(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{
	//通用分类数据
	BYTE inf;
	BYTE ginl;
	BYTE cot;
	BYTE ginh;
	BYTE ngd;
	const BYTE *pt;
	BYTE gdd;
	BYTE i;
	BYTE ctrl_no;
	BYTE sfc_no;
	BYTE tiaomu;
	WORD sfc_state;
	WORD wLen;
	WORD set_no;
	WORD dev_id;
	BOOL b_set_no;
	BOOL b_get_set;

	dev_id =Addr_to_ID(byDevAddr);
	inf = rbuf[11];//信息序号
	ngd = rbuf[13];
	ginl = rbuf[14];//组号
	ginh = rbuf[15];//条目号
	switch(inf)
	{
	case 249://带确认的写条目、处理该报文、返回该报文
		switch(ginl)
		{
		case 4://定值
			tiaomu = ginh;
			b_set_no = DEV_Get_Zone(dev_id, &set_no);
			b_get_set = DEV_Get_Setting(dev_id,set_no,&wsetbuf);
			if( b_set_no == 1 && b_get_set == 1)
			{
				pt = &rbuf[17];
				gdd = *pt++;
				pt++;//数据宽度
				pt++;//数目及后续状态
				for(i = 0;i < ngd;i ++)
				{
					switch(gdd)//gdd 通用分类数据描述:3——无符号整数,7——短实数
					{
					case 3:
						wsetbuf.set_val[tiaomu - 1].type = SET_T_UINT;
						wsetbuf.set_val[tiaomu - 1].un_val.u_val = MAKEWORD(*pt,*(pt + 1));
						pt += 3;
						tiaomu = *pt;
						pt += 2;
						gdd = *pt++;
						pt ++;
						break;
					case 7:
						wsetbuf.set_val[tiaomu - 1].type = SET_T_FLOAT;
						gen_scan_float(pt, &wsetbuf.set_val[tiaomu - 1].un_val.f_val);
						pt += 5;
						tiaomu = *pt;
						pt += 2;
						gdd = *pt++;
						pt ++;
						break;
					}
				}
				if(DEV_Check_Setting(dev_id,set_no,&wsetbuf))
				{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -