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

📄 df_103.c

📁 东方电子700系统接入源代码,比较一下,就清楚如何利用该代码改写其他的接入代码了.
💻 C
📖 第 1 页 / 共 3 页
字号:
			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;
			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 0x06://软压板
			sfc_no = ginh;
			sfc_state = rbuf[20] - 1;
			if (DEV_Check_SFC(dev_id,sfc_no,sfc_state) == 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;
			memcpy(&sbuf[4] ,&rbuf[4] ,wLen);
			sbuf[4] = 0x20; //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 0x03://遥控,3——遥跳,4——遥合
			ctrl_no = ginh;
			if(DEV_Check_Control(dev_id, ctrl_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;
			memcpy(&sbuf[4] ,&rbuf[4] ,wLen);
			sbuf[4] = 0x20;//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;
		}
		break;
	case 250://带执行的写条目
		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 6:
					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_Set_Setting(dev_id,set_no,&wsetbuf) == 1)
				{
					cot = 40;
				}
				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);
			return;
		case 0x05:
			set_no = rbuf[20];
			b_set_no = DEV_Set_Zone(dev_id ,set_no);
			if (b_set_no == 1)
			{
				cot = 40;
			}
			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 0x06://软压板
			sfc_no = ginh;
			sfc_state = rbuf[20] - 1;
			if(DEV_Set_SFC(dev_id,sfc_no,sfc_state) == 1)
			{
				cot = 40;
			}
			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 0x03://遥控
			ctrl_no = ginh;
			if(DEV_Remote_Control(dev_id, ctrl_no) == 1)
			{
				cot = 40;
			}
			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;
		}
		break;
	}
}

void ASDU20(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
	//复归保护信号inf = 19 , cot = 20 
	BYTE cot;
	BYTE inf;
	BYTE i;
	WORD Dev_Num;
	WORD dev_id;

	Dev_Num = Get_Device_Number();
	byDevAddr = rbuf[5];
	cot = rbuf[8];
	inf = rbuf[11];
	if(cot == 20 && inf == 19)
	{
		if(byDevAddr == 0xff)
		{
			for(i = 1;i <= Dev_Num;i ++)
			{
				DEV_Reset_Signal(i);
			}
			return;
		}
		dev_id = Addr_to_ID(byDevAddr);
		DEV_Reset_Signal(dev_id);
	}
}

void ASDU21(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{
	BYTE inf;
	BYTE ginl;
	BYTE ginh;
	BYTE ngd;
	BYTE kod;
	WORD wLen;
	WORD dev_id;
	T_SET *p_set;
	WORD set_no;

	inf = rbuf[11];//信息序号
	ngd = rbuf[13];
	ginl = rbuf[14];//组号
	ginh = rbuf[15];//条目号
	kod = rbuf[16];//类型描述
	switch(inf)
	{
	case 241://读一个组的全部条目的值和属性
		switch(kod)
		{
		case 1://实际值
			switch(ginl)
			{
			case 4://定值
				p_set = &rsetbuf;
				dev_id =Addr_to_ID(byDevAddr);
				DEV_Get_Zone(dev_id, &set_no);
				if(DEV_Get_Setting(dev_id,set_no,p_set) == 1)
				{
					flag[dev_id-1] = FLAG_READ_SET;
					dznumber = 0;
					sbuf[0] = 0x10;
					sbuf[1] = 0x20;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					NU_Sleep(20);
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
				else
				{
					flag[dev_id-1] = 0x00;
					sbuf[0] = 0x10;
					sbuf[1] = 0x09;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
			case 1://遥测
				dev_id = Addr_to_ID(byDevAddr);
				if(INF_Get_Measure(dev_id, &measure) == 1)
				{
					flag[dev_id-1] = FLAG_READ_MEASURE;
					sbuf[0] = 0x10;
					sbuf[1] = 0x20;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
				else
				{
					flag[dev_id-1] = 0x00;
					sbuf[0] = 0x10;
					sbuf[1] = 0x09;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
			case 0x06://软压板信息
				dev_id = Addr_to_ID(byDevAddr);
				if(INF_Get_SFC(dev_id,&sfc[dev_id-1]) == 1)
				{
					flag[dev_id-1] = FLAG_READ_SFC;
					sbuf[0] = 0x10;
					sbuf[1] = 0x20;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
				else
				{
					flag[dev_id-1] = 0x00;
					sbuf[0] = 0x10;
					sbuf[1] = 0x09;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
			case 0x07://遥信量信息
				dev_id = Addr_to_ID(byDevAddr);
				if(INF_Get_Di(dev_id,&di[dev_id-1]) == 1)
				{
					flag[dev_id-1] = FLAG_READ_DI;
					sbuf[0] = 0x10;
					sbuf[1] = 0x20;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
				else
				{
					flag[dev_id-1] = 0x00;
					sbuf[0] = 0x10;
					sbuf[1] = 0x09;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
			}
			break;
		case 10://描述表
			switch(ginl)
			{
			case 1://遥测组
				dev_id = Addr_to_ID(byDevAddr);
				if(DEV_Get_List(dev_id, LIST_T_ANALOG, &list) == 1)
				{
					flag[dev_id-1] = FLAG_READ_LIST;
					p_analog_list = (T_ANALOG_ENTRY *) list.l_ptr;
					list_num = 0;
					sbuf[0] = 0x10;
					sbuf[1] = 0x20;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
				else
				{
					flag[dev_id-1] = 0x00;
					sbuf[0] = 0x10;
					sbuf[1] = 0x09;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
			case 4://定值组
				dev_id = Addr_to_ID(byDevAddr);
				if(DEV_Get_List(dev_id, LIST_T_SET, &list) == 1)
				{
					flag[dev_id-1] = FLAG_READ_LIST;
					p_set_list = (T_SET_ENTRY *) list.l_ptr;
					list_num = 0;
					sbuf[0] = 0x10;
					sbuf[1] = 0x20;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
				else
				{
					flag[dev_id-1] = 0x00;
					sbuf[0] = 0x10;
					sbuf[1] = 0x09;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
			case 6://软压板
				dev_id = Addr_to_ID(byDevAddr);
				if(DEV_Get_List(dev_id, LIST_T_SFC, &list) == 1)
				{
					flag[dev_id-1] = FLAG_READ_LIST;
					p_sfc_list = (T_SFC_ENTRY *) list.l_ptr;
					list_num = 0;
					sbuf[0] = 0x10;
					sbuf[1] = 0x20;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
				else
				{
					flag[dev_id-1] = 0x00;
					sbuf[0] = 0x10;
					sbuf[1] = 0x09;
					sbuf[2] = byDevAddr;
					sbuf[3] = Makecrc(&sbuf[1],2);
					sbuf[4] = 0x16;
					wLen = 5;
					tot_leng = wLen;
					UART_Write(uart_port,sbuf,wLen);
					return;
				}
			}
			break;
		}
	}
}

/*******************************主站侧初始化***********************************/
/*	主站侧初始化 */
BOOL MST_Initialize()
{
	STATUS	status;
	T_UART_CONFIG  config;

	if (uart_port == UART_PORT_A)
	{
		config = g_sys_config.uart_a;
	}
	else
	{
		config = g_sys_config.uart_b;
	}

	config.pcb = 0;//check_packet 回调函数入口地址 如果为0表示自动判断每一帧是否结束

	if ( !UART_Open(uart_port, &config) )
	{
		return FALSE;
	}
	status=NU_Create_Task(&nuTask_Serial,"TASK_Serial",Task_Serial,0,NU_NULL,
	           	          STACK_SERIAL,0x2000,10,0,NU_PREEMPT,NU_START);
	return (status == true);
}

/*	 串口任务	*/
VOID Task_Serial(UNSIGNED argc, VOID *argv)
{
	BYTE  recv_buf[256];

	hand = INF_Open_Database();
//	sys_init_telnet();
LoopTask:
	if (UART_Read(uart_port, recv_buf, UART_WAIT_INF) != 0)
	{
		Serial_Interpret(recv_buf,uart_port);
	}
	goto LoopTask;
}

/*****************************辅助处理函数************************************/
/* 装置地址转换为设备编号 */
WORD Addr_to_ID(BYTE byDevAddr)
{
	BYTE i;

	for(i = 0;i <= g_ied_num - 1 ; i++)
	{
		if(g_ied_list[i].dev_data[5] == byDevAddr)
		{
			return g_ied_list[i].dev_id;
		}
	}
	return -1;
}

/* 设备地址转换为装置地址 */
BYTE ID_to_Addr(BYTE dev_id)
{
	BYTE i;

	for(i = 0;i <= g_ied_num - 1 ; i++)
	{
		if(g_ied_list[i].dev_id == dev_id)
		{
			return (BYTE) g_ied_list[i].dev_data[5];
		}
	}
	return -1;
}

/* 由装置地址获得功能类型 */
BYTE Get_Fun(WORD dev_id)
{
	BYTE i;

	for(i = 0;i <= g_ied_num - 1 ; i++)
	{
		if(g_ied_list[i].dev_id == dev_id)
		{
			return (BYTE) g_ied_list[i].dev_type;
		}
	}
	return -1;
}

/* 获得装置数目 */
WORD Get_Device_Number()
{
	return g_ied_num;
}

/* 计算校验和 */                                        
BYTE Makecrc(BYTE *str,WORD nSize)
{
	WORD  i;
	BYTE J;
	J=0;
	for(i=0;i < nSize;i++)
	{
		J+=str[i];
	}
	
	return J; 
}

/* 串口接受回调函数 */
WORD check_packet(const BYTE *p_data, WORD data_len)
{
	if(p_data[0] == 0x10)
	{
		if(data_len == 5 && p_data[4] == 0x16)
		{
			return UART_PKT_FIN;
		}
		return UART_PKT_CON;
	}
	if(p_data[0] == 0x68)
	{
		if(data_len == p_data[1] + 6)
		{
			return UART_PKT_FIN;
		}
		return UART_PKT_CON;
	}
	return UART_PKT_ERR;
}
/**********************************本文结束************************************************/

⌨️ 快捷键说明

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