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

📄 485.c

📁 以太网103转四方串口103,以太网103转四方串口103
💻 C
📖 第 1 页 / 共 3 页
字号:
			wLen = data_leng;
			*apack++ = Makecrc(crc,wLen);
			*apack++ = 0x16;
			wLen = data_leng + 6;
			tot_leng = wLen;
			UART_Write(uart_port,sbuf,wLen);
			return;
		}

		//检查开入量是否有变化
		bDI = INF_Search_Soe(hand,dev_id);
		if (bDI == 1)
		{
				INF_Get_Soe(hand, dev_id, &pDIC);
				apack = sbuf;
				*apack++ = 0x68;
				*apack++ = 0x20;
				*apack++ = 0x20;
				*apack++ = 0x68;
				crc = apack;
				if(! INF_Search_Soe(hand,dev_id))
				{
					*apack++ = 0x08;
				}
				else
				{
					*apack++ = 0x28;
				}
				*apack++ = byDevAddr;
				*apack++ = 0x01;
				*apack++ = 0x81;
				*apack++ = 1;
				*apack++ = byDevAddr;
				*apack++ = Get_Fun(dev_id);
				*apack++ = (BYTE)pDIC.e_code + DIC_BEGIN;
				*apack++ = (BYTE)pDIC.e_state + 1;
				*apack++ = (BYTE)pDIC.e_date.msec;
				*apack++ = (BYTE)(pDIC.e_date.msec >> 8);
				*apack++ = pDIC.e_date.minute;
				*apack++ = pDIC.e_date.hour;
				*apack++ = 1;
				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);
		}

		//检查是否有保护事件发生 asdu1
		bEvent = INF_Search_Event(hand,dev_id);
		if (bEvent == 1)
		{
				INF_Get_Event(hand,dev_id,&pEvent);
				apack = sbuf;
				*apack++ = 0x68;
				*apack++;
				*apack++;
				*apack++ = 0x68;
				crc = apack;
				bEvent = INF_Search_Event(hand,dev_id);
				if (bEvent == 1)
				{
					*apack++ = 0x28;
				}
				else
				{
					*apack++ = 0x08;
				}
				*apack++ = byDevAddr;
				*apack++ = 0x01;
				*apack++ = 0x81;
				*apack++ = 1;
				*apack++ = byDevAddr;
				*apack++ = Get_Fun(dev_id);
				*apack++ = (BYTE)pEvent.e_code + EVT_BEGIN;//条目号
				*apack++ = (BYTE)pEvent.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;
		}

		//告警事件
		bAlarm = INF_Search_Alarm(hand,dev_id);
		if (bAlarm == 1)
		{
				INF_Get_Alarm(hand,dev_id,&pEvent);
				apack = sbuf;
				*apack++ = 0x68;
				*apack++;
				*apack++;
				*apack++ = 0x68;
				crc = apack;
				bEvent = INF_Search_Alarm(hand,dev_id);
				if (bEvent == 1)
				{
					*apack++ = 0x28;
				}
				else
				{
					*apack++ = 0x08;
				}
				*apack++ = byDevAddr;
				*apack++ = 0x01;
				*apack++ = 0x81;
				*apack++ = 1;
				*apack++ = byDevAddr;
				*apack++ = Get_Fun(dev_id);//Fun
				*apack++ = (BYTE)pEvent.e_code + ALA_BEGIN;//条目号
				*apack++ = (BYTE)pEvent.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_Soe(hand,dev_id);
		bEvent = INF_Search_Event(hand,dev_id);
		bAlarm = INF_Search_Alarm(hand,dev_id);
		if (bDI||bEvent||bAlarm == 1)
		{
			//符合上述条件,置有一类数据标志
			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);
		//是否要传送遥测值 ASDU9
		if(bMeasure == 1 && dev_fun == 242)
		{
			BYTE i;

			apack = sbuf;
			*apack++ = 0x68;
			*apack++;
			*apack++;
			*apack++ = 0x68;
			crc = apack;
			*apack++ = 0x08;
			*apack++ = byDevAddr;
			*apack++ = 9;
			*apack++ = 0x8a;
			*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 Ack_changjia(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
	BYTE *pt;
	BYTE *crc;
	BYTE inf;
	WORD wLen;
	WORD dev_id;
	BYTE con,control;

	pt = sbuf;
	*pt++ = 0x68;
	*pt++;
	*pt++;
	*pt++ = 0x68;
	crc = pt;
	if (powerflg == 0x33)
	{
		control = 0x28;
		con = 0x04;
		inf = 0x03;
	}
	else
	{
		control = 0x08;
		con = 0x05;
		inf = 0x04;
	}
	*pt++ = control;
	*pt++ = byDevAddr;
	*pt++ = 0x05;
	*pt++ = 0x81;
	*pt++ = con;
	*pt++ = byDevAddr;
	dev_id = Addr_to_ID(byDevAddr);
	*pt++ = Get_Fun(dev_id);
	*pt++ = inf;
	*pt++ = 0x03;
	//拷贝厂家和版本信息
	*pt++ = 'S';
	*pt++ = 'A';
	*pt++ = 'C';
	//拷贝厂家和版本信息
	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 Ack_asdu1(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
	BYTE *pt;
	BYTE *crc;
	WORD wLen;
	WORD dev_id;
	T_DATE tdate;

	pt = sbuf;
	*pt++ = 0x68;
	*pt++;
	*pt++;
	*pt++ = 0x68;
	crc = pt;
	if(count == di.di_num + sfc.sfc_num - 1)
	{
		*pt++ = 8;
		maskflg = 0x00;
	}
	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
	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;
			*pt++ =((BYTE) (di.di_val[0] >> count)&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 Lan_edit06(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 Lan_edit07(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{
	//总查询
	BYTE *crc;
	BYTE *pt;
	BOOL b_DI;
	BOOL b_SFC;
	WORD wLen;
	WORD dev_id;

	//置总查询标志
	maskflg = 0x33;
	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;
	byDevAddr = rbuf[4];
	*pt++ = 0x10;
	crc= pt;
	if(b_DI == 1 && b_SFC == 1)
	{
		*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 Lan_edit10(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) == 1)
				{
					cot = 44;
				}
				else
				{
					cot = 41;
				}
			}
			else
			{
				cot = 41;
			}
			wLen = rbuf[1];
			sbuf[0] = 0x68;
			sbuf[1] = (BYTE)wLen;
			sbuf[2] = (BYTE)wLen;
			sbuf[3] = 0x68;
			i = 4;
			memcpy(&sbuf[4] ,&rbuf[4] ,wLen);
			sbuf[4] = 0x00;
			sbuf[8] = cot;
			sbuf[sbuf[1] + 4] = Makecrc(&sbuf[4],sbuf[1]);
			sbuf[sbuf[1] + 5] = 0x16;
			wLen = sbuf[1] + 6;
			tot_leng = wLen;
			UART_Write(uart_port,sbuf,wLen);
			break;
		case 5://定值区
			set_no = rbuf[20];
			if (DEV_Check_Zone(dev_id ,set_no) == 1)
			{
				cot = 44;
			}
			else
			{
				cot = 41;
			}
			wLen = rbuf[1];
			sbuf[0] = 0x68;
			sbuf[1] = (BYTE)wLen;
			sbuf[2] = (BYTE)wLen;
			sbuf[3] = 0x68;
			i= 4;

⌨️ 快捷键说明

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