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

📄 103.c

📁 南瑞继保串口103源码共享
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************************/
/*																			*/
/*           版权 (c) 2000-2010 国电南京自动化股份有限公司					*/
/*																			*/
/****************************************************************************/
/****************************************************************************/
/*	文件名							版本									*/
/*																			*/
/*  103.c	                        1.02									*/
/*																			*/
/*  概述:																	*/
/*																			*/
/*		南瑞继保串口103主站侧规约													*/
/*																			*/
/*	历史纪录:																*/
/*																			*/
/*	 名字				日期					注释						*/
/*																			*/
/*  郑小军			 2001-10-15				创建初始化版本1.00				*/
/*  郑小军			 2002-04-02				修改遥测(DWORD->WORD)			*/
/*				      2002-10-15				更新版本1.1					*/
/****************************************************************************/
#include "typedef.h"
#include "generic.h"
#include "inforec.h"
#include "dev_mng.h"
#include "103.h"
//#include "telnet.h"

#define UART_RCV_SIZE 250

static WORD flag;
static BYTE scn;

BYTE sbuf[UART_PACKET_SIZE];
BYTE last_cmd;
WORD last_id;
WORD tot_leng;
BYTE dznumber;
BYTE list_num;
BYTE a;           //fun     
BYTE b;           //inf
BYTE c;           //dcc      
BYTE ctrl_no1;     //b
BYTE d;           
BYTE e;
BYTE count;

T_SET rsetbuf;
T_SET wsetbuf;
T_LIST list;
T_MEASURE measure;
T_SFC sfc;
T_DI di;
T_ANALOG_ENTRY *p_analog_list;
T_SET_ENTRY *p_set_list;
T_SFC_ENTRY *p_sfc_list;

extern T_IED g_ied_list[];
extern WORD g_ied_num;

/*   串口设置   */
extern BYTE uart_port;

/*	数据库句柄  */
static HANDLE hand;

/*   串口任务   */
static  BYTE	  STACK_SERIAL[0x2000];
static  NU_TASK   nuTask_Serial;

/* 数据接受处理函数 */
void Serial_Interpret(const BYTE* rbuf,BYTE uart_port)
{
	BYTE byDevAddr;
	BYTE i;
	WORD Dev_Num;

	Dev_Num = Get_Device_Number();
	for (i = 1;i <= Dev_Num;i++)
	{
		byDevAddr = ID_to_Addr(i);
		switch (rbuf[0])
		{
		case FRAME_T_CON:
			if (rbuf[2] == byDevAddr)
			{
				Ack_Staid(rbuf,byDevAddr,uart_port);
				return;
			}
			break;
		case FRAME_T_VOL:
			if (rbuf[5] == byDevAddr || rbuf[5] == 0xff)
			{
				Ack_Changeable(rbuf,byDevAddr,uart_port);
				return;
			}
			break;
		default:
			return;
		}
	}
}

//可变帧长报文的处理
void Ack_Changeable(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{
	switch(rbuf[6])
	{
	case 0x06:
		ASDU06(rbuf,byDevAddr,uart_port);//对时
		return ;
	case 0x07:
		ASDU07(rbuf,byDevAddr,uart_port);//总查询
		return ;
	case 0x0a:
//		ASDU10(rbuf,byDevAddr,uart_port);//通用分类数据
		return ;
	case 0x14:
		ASDU20(rbuf,byDevAddr,uart_port);//一般命令(复归保护信号)
		return;
	case 0x15:
		ASDU21(rbuf,byDevAddr,uart_port);//通用分类命令
		return ;
	case 0x40:
	        ASDU64(rbuf,byDevAddr,uart_port);//遥控
	        return;
	case 0x58:
	        ASDU88(rbuf,byDevAddr,uart_port);//遥脉量上送
	        return;        
	default:
		return ;
	}
}

//固定帧长报文的处理
void Ack_Staid(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{
	BYTE	*crc;
	BYTE	*apack;
	BYTE	dev_fun;
	T_EVENT pEvent;
	T_DIC	pDIC;
	T_DATE	t_date;
	T_SFCC p_sfcc;
	BOOL	bDI,bEvent,bMeasure,bAlarm,bSFCC;
	WORD	wLen;
	WORD	ngd;
	WORD	dev_id;

	dev_id = Addr_to_ID(byDevAddr);
	if (rbuf[1] == last_cmd && dev_id == last_id)
	{
		//将上次报文重发
		wLen = tot_leng;
		UART_Write(uart_port,sbuf,wLen);
		return;
	}
	last_cmd = rbuf[1];
	last_id = dev_id;
	switch(rbuf[1]&0x0f)
	{
	case 0x00:
		//复位通信单元
		memset(sbuf, 0, UART_RCV_SIZE);
		flag = FLAG_RESET_CU;
		sbuf[0] = 0x10;
		sbuf[1] = 0x20;
		sbuf[2] = byDevAddr;
		wLen = 2;
		sbuf[3] = Makecrc(&sbuf[1],wLen);
		sbuf[4] = 0x16;
		wLen = 5;
		tot_leng = wLen;
		UART_Write(uart_port,sbuf,wLen);
		break;
	case 0x07:
		//复位帧计数位
		flag = FLAG_RESET_FCB;
		sbuf[0] = 0x10;
		sbuf[1] = 0x20;
		sbuf[2] = byDevAddr;
		wLen = 2;
		sbuf[3] = Makecrc(&sbuf[1],wLen);
		sbuf[4] = 0x16;
		wLen = 5;
		tot_leng = wLen;
		UART_Write(uart_port,sbuf,wLen);
		break;
	case 0x0a:
		if (flag == FLAG_RESET_CU)
		{
			//回答复位通信单元报文
			ASDU05(rbuf,byDevAddr,uart_port);
			flag = FLAG_POWER_ON;
			return;
		}
		if (flag == FLAG_RESET_FCB)
		{
			//回答复位帧计数报文
			ASDU05(rbuf,byDevAddr,uart_port);
			flag = FLAG_POWER_ON;
			return;
		}
		if (flag == FLAG_POWER_ON)
		{
			ASDU05(rbuf,byDevAddr,uart_port);
			flag = 0x00;
			return;
		}

                //检查是否遥控选择发生
                if (flag == FLAG_YK_CHK)
		{
			        flag = 0x00;
			        apack = sbuf;
                    if(DEV_Check_Control(dev_id, ctrl_no1) ==1)
		    {
				*apack++ = 0x68;
				*apack++ = 0x0a;
				*apack++ = 0x0a;
				*apack++ = 0x68;
				crc = apack;
				*apack++ = 0x08;
				*apack++ = byDevAddr;
				*apack++ = 0x40;
				*apack++ = 0x01;   //VSQ
				*apack++ = 0x0c;   //cot
				*apack++ = byDevAddr;
				*apack++ = a;      //fun
				*apack++ = b;      //inf
				*apack++ = c;      //dcc
				*apack++ = 0x00;   //RII
				wLen = apack - crc;
				*apack++ = Makecrc(crc,wLen);
				*apack++ = 0x16;
				wLen = apack - sbuf;
				tot_leng = wLen;
				UART_Write(uart_port,sbuf,wLen);
				return;
	             }
	                        
				
                 }
		
		  //检查是否遥控执行发生
                if (flag == FLAG_YK_DO)
                {			     
			        flag = 0x00;
			        apack = sbuf;
	              if(DEV_Remote_Control(dev_id, ctrl_no1) == 1)
			  {
				*apack++ = 0x68;
				*apack++ = 0x0a;
				*apack++ = 0x0a;
				*apack++ = 0x68;
				crc = apack;
				*apack++ = 0x08;
				*apack++ = byDevAddr;
				*apack++ = 0x40;
				*apack++ = 0x01;   //VSQ
				*apack++ = 0x0c;   //cot
				*apack++ = byDevAddr;
				*apack++ = a;      //fun
				*apack++ = b;      //inf
				*apack++ = c;      //dcc
				*apack++ = 0x00;   //RII
				wLen = apack - crc;
				*apack++ = Makecrc(crc,wLen);
				*apack++ = 0x16;
				wLen = apack - sbuf;
				tot_leng = wLen;
				UART_Write(uart_port,sbuf,wLen);
				return;
			  }
			  
				
		  }
		
		  //检查是否遥控撤消发生
                if (flag == FLAG_YK_UNDO)
		{
			        flag = 0x00;
			        apack = sbuf;
				*apack++ = 0x68;
				*apack++ = 0x0a;
				*apack++ = 0x0a;
				*apack++ = 0x68;
				crc = apack;
				*apack++ = 0x08;
				*apack++ = byDevAddr;
				*apack++ = 0x40;
				*apack++ = 0x01;   //VSQ
				*apack++ = 0x0c;   //cot
				*apack++ = byDevAddr;
				*apack++ = a;      //fun
				*apack++ = b;      //inf
				*apack++ = c;      //dcc
				*apack++ = 0x00;   //RII
				wLen = apack - crc;
				*apack++ = Makecrc(crc,wLen);
				*apack++ = 0x16;
				wLen = apack - sbuf;
				tot_leng = wLen;
				UART_Write(uart_port,sbuf,wLen);
				return;
		}

		//检查是否总查询发生
		if (flag == FLAG_POLLING)
		{
			//asdu01回答全遥信
			ASDU44(rbuf,byDevAddr,uart_port);
			//flag = FLAG_POLLING_END;
			return;
		}

		//总查询的终止
		if (flag == FLAG_POLLING_END)
		{
			ASDU08(rbuf,byDevAddr,uart_port);
			return;
		}

		//检查遥信变位
		bDI = INF_Search_Dic(hand,dev_id);
		if (bDI)
		{
				INF_Get_Dic(hand, dev_id, &pDIC);
				apack = sbuf;
				*apack++ = 0x68;
				*apack++ = 0x20;
				*apack++ = 0x20;
				*apack++ = 0x68;
				crc = apack;
				if(! INF_Search_Dic(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;
				SYS_Get_Clock(&t_date);
				*apack++ = (BYTE)t_date.msec;
				*apack++ = (BYTE)(t_date.msec >> 8);
				*apack++ = t_date.minute;
				*apack++ = t_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);
				return;
		}

		//检查是否有保护事件发生
		bEvent = INF_Search_Event(hand,dev_id);
		if (bEvent)
		{
				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)
		{
				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;
		}

		//传送描述表
		if (flag == FLAG_READ_LIST)
		{
			BYTE i;
			BYTE ginl;
			BYTE data_leng;

			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 = 0x0a;
			*apack++ = (BYTE)list.l_size;
			switch(list.l_type)
			{
			case LIST_T_ANALOG:
//				p_analog_list = (T_ANALOG_ENTRY *) list.l_ptr;
				ginl = 0x01;
				break;
			case LIST_T_SET:
//				p_set_list = (T_SET_ENTRY *) list.l_ptr;
				ginl = 0x04;
				break;
			case LIST_T_SFC:
//				p_sfc_list = (T_SFC_ENTRY *) list.l_ptr;
				ginl = 0x06;
				break;
			}
			i = 0;
			while(i < 10)
			{
				if(list_num < list.l_size)
				{
					*apack++ = ginl;
					*apack++ = list_num + 1;
					*apack++ = 10;
					*apack++ = 1;
					*apack++ = 16;
					*apack++ = 1;
					data_leng += 6;
					if(list.l_type == LIST_T_ANALOG)
					{
						memcpy(apack, p_analog_list->name,16);
						apack += 16;
						data_leng += 16;
						list_num ++;
						p_analog_list++;
					}
					if(list.l_type == LIST_T_SET)
					{
						memcpy(apack, p_set_list->name,16);
						apack += 16;
						data_leng += 16;
						list_num ++;
						p_set_list++;
					}
					if(list.l_type == LIST_T_SFC)
					{
						memcpy(apack, p_sfc_list->name,16);
						apack += 16;
						data_leng += 16;
						list_num ++;
						p_sfc_list++;
					}
					i++;
				}
				else
					break;
			}

			//超过10项分帧发送
			sbuf[1] = data_leng;
			sbuf[2] = data_leng;
			
			if (list_num != list.l_size)
			{
				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;
		}
		
		//是否传送遥信量
		if(flag == FLAG_READ_DI)
		{
			BYTE i;

			flag = 0x00;
			apack = sbuf;
			*apack++ = 0x68;
			apack++;
			apack++;
			*apack++ = 0x68;
			crc = apack;
			*apack++ = 0x08;
			*apack++ = byDevAddr;
			*apack++ = 0x0a;
			*apack++ = 0x81;
			*apack++ = 0x2a;
			*apack++ = byDevAddr;
			*apack++ = 0xFE;
			*apack++ = 0xf1;
			*apack++ = 0x00;
			*apack++ = (BYTE) di.di_num;
			for(i = 0;i< (di.di_num + 31)/32;i++)
			{
				*apack++ = 0x07;//遥信组
				*apack++ = i + 1;
				*apack++ = 1;
				*apack++ = 7;
				*apack++ = 4;
				*apack++ = 1;
				*apack++ = *((BYTE *)&di.di_val[i] + 3);
				*apack++ = *((BYTE *)&di.di_val[i] + 2);
				*apack++ = *((BYTE *)&di.di_val[i] + 1);
				*apack++ = *((BYTE *)&di.di_val[i]);
			}
			wLen = apack - crc;
			sbuf[1] = wLen + 2;
			sbuf[2] = wLen + 2;
			*apack++ = Makecrc(crc,wLen);
			*apack++ = 0x16;
			wLen = apack - sbuf;
			tot_leng = wLen;
			UART_Write(uart_port,sbuf,wLen);
			return;
		}

		//是否要传送遥测值
		if(flag == FLAG_READ_MEASURE)
		{
			BYTE i;

			flag = 0x00;
			apack = sbuf;
			*apack++ = 0x68;
			apack++;
			apack++;
			*apack++ = 0x68;
			crc = apack;
			*apack++ = 0x08;
			*apack++ = byDevAddr;
			*apack++ = 0x0a;
			*apack++ = 0x81;
			*apack++ = 0x2a;
			*apack++ = byDevAddr;
			*apack++ = 0xFE;
			*apack++ = 0xf1;
			*apack++ = 0x00;
			*apack++ = (BYTE) measure.ms_num;
			for(i = 0;i< measure.ms_num;i++)
			{
				*apack++ = 0x01;//遥测组
				*apack++ = i + 1;
				*apack++ = 1;
				*apack++ = 7;
				*apack++ = 2;
				*apack++ = 1;
				*apack++ = (BYTE)(measure.ms_val[i]);
				*apack++ = (BYTE)(measure.ms_val[i] >> 8);
			}
			wLen = apack - crc;
			sbuf[1] = wLen + 2;
			sbuf[2] = wLen + 2;
			*apack++ = Makecrc(crc,wLen);
			*apack++ = 0x16;
			wLen = apack - sbuf;
			tot_leng = wLen;
			UART_Write(uart_port,sbuf,wLen);
			return;
		}

		//检查是否要传送软压板
		if(flag == FLAG_READ_SFC)
		{
			BYTE i;

			flag = 0x00;
			apack = sbuf;
			*apack++ = 0x68;
			apack++;
			apack++;
			*apack++ = 0x68;
			crc = apack;
			*apack++ = 0x08;
			*apack++ = byDevAddr;
			*apack++ = 0x0a;
			*apack++ = 0x81;
			*apack++ = 0x2a;
			*apack++ = byDevAddr;
			*apack++ = 0xFE;
			*apack++ = 0xf1;
			*apack++ = 0x00;
			*apack++ = (BYTE) sfc.sfc_num;
			for(i = 0;i< sfc.sfc_num;i++)
			{
				*apack++ = 0x06;//压板组
				*apack++ = i + 1;
				*apack++ = 1;

⌨️ 快捷键说明

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