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

📄 df_103.c

📁 东方电子700系统接入源代码,比较一下,就清楚如何利用该代码改写其他的接入代码了.
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************************/
/*									    */
/*           版权 (c) 2000-2010 国电南京自动化股份有限公司		    */
/*									    */
/****************************************************************************/
/****************************************************************************/
/*	文件名					                                                */
/*								                                            */
/*  DF_103.c	                        1.00		    		            */
/*									                                        */
/*  概述:								                                    */
/*									                                        */
/*	转接东方电子1700系统                                                    */
/*                                                                          */
/*  保护:PSL600,PST1200,PSL640及系列                                       */
/*                                                                          */
/*  任务:保护事件,告警事件,软压板,遥测,遥信,定值上送,远方投退压板    */
/*        远方修改定值,遥控跳合闸,通讯对时,远方复归保护信号               */
/*                                                                          */
/*	上行报文:                                                              */
/*     	保护事件,告警事件,遥信-----ASDU1                                  */
/*   	软压板-----------------------ASDU1(总查询,或压板变位遥信)          */
/*		总查询结束-------------------ASDU8                                  */
/*     	遥测-------------------------ASDU9(越限上送)                        */
/*      回答出厂信息-----------------ASDU5	                                */                
/*    	定值上送---------------------ASDU10(通用分类服务)                   */
/*      描述-------------------------ASDU10                                 */
/*  下行报文:                                                              */
/*      通讯对时---------------------ASDU6                                  */
/*      总查-------------------------ASDU8                                  */
/*      远方复归保护信号-------------ASDU20                                 */
/*      远方投退压板-----------------ASDU10                                 */
/*		远方遥控跳合闸---------------ASDU10                                 */
/*      远方修改定值-----------------ASDU10                                 */
/*		读取(定值、压板状态、遥信)---ASDU21			                        */
/*  XM修改:                                                                */
/*     1 遥测按高13位传                                                     */
/*     2 二级数据送遥信SOE,压板SOE,及全遥测                               */
/*     3 一级数据送全遥信,保护事件,告警的SOE                              */
/****************************************************************************/

#include "typedef.h"
#include "generic.h"
#include "inforec.h"
#include "dev_mng.h"
#include "DF_103.h"
//#include "telnet.h"
//#include  "cs8900.h"
//#include  "target"
//REM ZJH 2002/11/7
//#define UART_RCV_SIZE 250
//ADD ZJH 2002/11/7
#define UART_RCV_SIZE 300
//END ZJH 2001/11/7
static WORD flag[DEV_TYPE];
static BYTE scn;

BYTE sbuf[UART_PACKET_SIZE];
//REM ZJH 2002/11/7
//BYTE last_cmd;
//WORD last_id;
BYTE last_cmd[DEV_TYPE];
WORD last_id[DEV_TYPE];
//END ZJH 2001/11/7
WORD tot_leng;
BYTE dznumber;
BYTE list_num;
BYTE count,ACD;

T_SET rsetbuf;
T_SET wsetbuf;
T_LIST list;
T_MEASURE measure;
T_SFC sfc[DEV_TYPE];
T_DI di[DEV_TYPE];
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 ;
	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  pSFCC;
	BOOL	bDI,bEvent,bMeasure,bAlarm,bSFCC;
	WORD	wLen;
	WORD	ngd;
	WORD	dev_id;

	dev_id = Addr_to_ID(byDevAddr);
//REM ZJH 2002/11/7
//if (rbuf[1] == last_cmd && dev_id == last_id)
	if (rbuf[1] == last_cmd[dev_id-1] && dev_id == last_id[dev_id-1])
//END ZJH 2002/11/7
	{
		//将上次报文重发
		wLen = tot_leng;
		UART_Write(uart_port,sbuf,wLen);
		return;
	}
//REM ZJH 2002/11/7
//	last_cmd = rbuf[1];
//	last_id = dev_id;
    last_cmd[dev_id-1] = rbuf[1];
    last_id[dev_id-1] = dev_id;
//END ZJH 2002/11/7
	switch(rbuf[1]&0x0f)
	{
	case 0x00:
		//复位通信单元
		memset(sbuf, 0, UART_RCV_SIZE);
//REM ZJH 2002/11/7
//		flag = FLAG_RESET_CU;
        flag[dev_id-1] = FLAG_RESET_CU;
//END ZJH 2002/11/7
		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[dev_id-1] = 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[dev_id-1] == FLAG_RESET_CU)
		{
			//回答复位通信单元报文
			ASDU05(rbuf,byDevAddr,uart_port);
			flag[dev_id-1] = FLAG_POWER_ON;
			return;
		}
		if (flag [dev_id-1]== FLAG_RESET_FCB)
		{
			//回答复位帧计数报文
			ASDU05(rbuf,byDevAddr,uart_port);
			flag[dev_id-1]= FLAG_POWER_ON;
			return;
		}
		if (flag[dev_id-1] == FLAG_POWER_ON)
		{
			ASDU05(rbuf,byDevAddr,uart_port);
			flag[dev_id-1] = 0x00;
			return;
		}
		
		

		//检查是否总查询发生
		if (flag[dev_id-1] == FLAG_POLLING)
		{
			//REM ZJH 2002/11/7
			//asdu40回答全遥信
			ASDU40(rbuf,byDevAddr,uart_port);
			flag[dev_id-1] = FLAG_POLLING_OK;			
			//ASDU01(rbuf,byDevAddr,uart_port);
            //END ZJH 2002/11/7
			return;
		}
		
		if (flag[dev_id-1] == FLAG_POLLING_OK)
		{
		ACD=0;
	    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||bSFCC||bEvent||bAlarm) ACD=0x20;
		//检查是否有保护事件发生
		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);
				*apack++ = 0x08|ACD;
				*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;
				*apack++ = 0x08|ACD;				
				*apack++ = byDevAddr;
				*apack++ = 0x01;
				*apack++ = 0x81;
				*apack++ = 1;
				*apack++ = byDevAddr;
				*apack++ = Get_Fun(dev_id);//Fun
				switch(*(apack-1))              //广东钟村特别修改pst1260
	            {	             		
	             case 194:
	             if(((BYTE)pEvent.e_code>=0x14)&&((BYTE)pEvent.e_code<=0x18))	             
		         *apack++ = (BYTE)pEvent.e_code- 0x14;
		         else
		         *apack++ = (BYTE)pEvent.e_code + ALA_BEGIN;//条目号
		         break;
	             case 195:
	             if((BYTE)pEvent.e_code>=0x1f)
		         *apack++ = (BYTE)pEvent.e_code - 0x1f;
		         else
		         *apack++ = (BYTE)pEvent.e_code + ALA_BEGIN;//条目号		         
		         break;		
	             case 196:
	             if((BYTE)pEvent.e_code>=0x1f)
		         *apack++ = (BYTE)pEvent.e_code - 0x1f;
		         else
		         *apack++ = (BYTE)pEvent.e_code + ALA_BEGIN;//条目号
		         break;	
	             default:
		         *apack++ = (BYTE)pEvent.e_code + ALA_BEGIN;//条目号
		         break;
	            }
				*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(bEvent||bAlarm)
		{
		apack = sbuf;
		*apack++ = 0x10;
		crc = apack;
		*apack++ = 0x09|ACD;
		*apack++ = byDevAddr;
		*apack++ = Makecrc(crc,2);
		*apack++ = 0x16;
		wLen = apack - sbuf;
		tot_leng = wLen;
		UART_Write(uart_port,sbuf,wLen);
		return;
        }    
		
		{
			ASDU40(rbuf,byDevAddr,uart_port);			
			return;
		}
		
	    }
	
				
		//总查询的终止
		if (flag[dev_id-1] == FLAG_POLLING_END)
		{
			ASDU08(rbuf,byDevAddr,uart_port);
			return;
		}

			

		//传送描述表
		if (flag[dev_id-1] == 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[dev_id-1] = 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[dev_id-1] == FLAG_READ_DI)
		{
			BYTE i;

			flag[dev_id-1] = 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[dev_id-1].di_num;
			for(i = 0;i< (di[dev_id-1].di_num + 31)/32;i++)
			{
				*apack++ = 0x07;//遥信组
				*apack++ = i + 1;
				*apack++ = 1;
				*apack++ = 7;
				*apack++ = 4;
				*apack++ = 1;
				*apack++ = *((BYTE *)&di[dev_id-1].di_val[i] + 3);
				*apack++ = *((BYTE *)&di[dev_id-1].di_val[i] + 2);
				*apack++ = *((BYTE *)&di[dev_id-1].di_val[i] + 1);
				*apack++ = *((BYTE *)&di[dev_id-1].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[dev_id-1] == FLAG_READ_MEASURE)
		{
			BYTE i;

			flag[dev_id-1] = 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++ = LOBYTE(measure.ms_val[i]<<3);   //高13位
				*apack++ = HIBYTE(measure.ms_val[i]<<3);
			}
			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[dev_id-1] == FLAG_READ_SFC)
		{
			BYTE i;

			flag[dev_id-1] = 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[dev_id-1].sfc_num;
			for(i = 0;i< sfc[dev_id-1].sfc_num;i++)
			{
				*apack++ = 0x06;//压板组
				*apack++ = i + 1;
				*apack++ = 1;
				*apack++ = 10;
				*apack++ = 1;
				*apack++ = 1;
				*apack++ =((BYTE) (sfc[dev_id-1].sfc_val[0] >> i)&0x00000001) + 1;
				if(i == 31)
				{
					sfc[dev_id-1].sfc_val[0] = sfc[dev_id-1].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[dev_id-1] == FLAG_READ_SET)
		{
			BYTE data_leng,i;

⌨️ 快捷键说明

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