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

📄 c103_485.c

📁 以太网103转四方串口103,以太网103转四方串口103
💻 C
📖 第 1 页 / 共 2 页
字号:
	p_asdu->data[12] = *p_buf103++;
	//拷贝厂家和版本信息
	data_len = 19;
	send_var_packet(byDevAddr, control, data_len);
}

//时钟同步
void Reply_Asdu06(BYTE *m_rx_buf, BYTE byDevAddr)
{
	BYTE	*pt;
	BYTE	*p_buf103 = buf103;

	pt = m_rx_buf + 12;
	*p_buf103++ = *pt++;//msl
	*p_buf103++ = *pt++;//msh
	*p_buf103++ = (*pt++)&0x3f;//min
	*p_buf103++ = (*pt++)&0x1f;//hours
	*p_buf103++ = ((*pt)>>5)&0x07;//weeks
	*p_buf103++ = (*pt++)&0x1f;//date
	*p_buf103++ = (*pt++)&0x0f;//mon
	*p_buf103++ = ((*pt++)&0x7f);//year
	Set103_clock(p_buf103, byDevAddr);
	return;
}

//总查询
void Reply_Asdu07(BYTE *m_rx_buf,BYTE byDevAddr)
{
	BYTE	f_ctrl;

	//置总查询标志
	flag = FLAG_POLLING;
	scn = m_rx_buf[12];
	Get103_Din_Data(buf103, byDevAddr);
	CLC_Get_Current_Time(&polling_time);
	f_ctrl = 0x20;
	send_fix_packet(byDevAddr, f_ctrl);
	return;
}

//总查询的终止
void Reply_Asdu08(BYTE * m_rx_buf, BYTE byDevAddr)
{
	BYTE	wLen;
	T_103_ASDU *p_asdu = (T_103_ASDU *)&m_tx_buf[6];

	p_asdu->type = 8;
	p_asdu->vsq = 0x81;
	p_asdu->cot = 10;
	p_asdu->addr = byDevAddr;
	p_asdu->fun = 0xff;
	p_asdu->inf = 0;
	p_asdu->data[0] = scn;
	wLen = 7;

	send_var_packet(byDevAddr, 0, wLen);
	return;
}

//通用分类数据
void Reply_Asdu10(BYTE* m_rx_buf,BYTE byDevAddr)
{
	BYTE	inf;
	BYTE	ginl;
	BYTE	ginh;
	BYTE	set_zone;
	BYTE	*pt;
	T_103_ASDU *p_asdu = (T_103_ASDU *) &m_tx_buf[6];
	T_103_DATA *p_rec = (T_103_DATA *) &p_asdu->data[2];

	inf = m_rx_buf[11];//信息序号
	ngd = m_rx_buf[13];//通用分类数据集
	ginl = m_rx_buf[14];//组号
	ginh = m_rx_buf[15];//条目号
	switch(inf)
	{
	case 249://带确认的写条目
		switch(ginl)
		{
		case 0x03://遥控
			buf103[0] = p_rec->ginh;	//条目
			buf103[1] = p_rec->data[0];	//值
			if(Set103_Select_Dout(buf103, byDevAddr))
			{
				Send_Confirm(m_rx_buf, byDevAddr, 0x2c, inf, 0x08);
			}
			else
			{
				Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
			}
			return;
		case 0x04://定值
			Get103_Set_Setting(buf103, byDevAddr, &m_rx_buf[6]);
			pt = setzone_buf + (byDevAddr - SYC_MMI_Config.sy_add) * 2;
			if (*pt++ == VALID)
			{
				set_zone = *pt;
				if (Set103_Preset_Setting(buf103, byDevAddr, set_zone))
				{
					Send_Confirm(m_rx_buf, byDevAddr, 0x2c, inf, 0x08);
				}
				else
				{
					Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
				}
			}
			else
			{
				Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
			}
			return;
		case 0x05://定值区
			switch (ginh)
			{
			case 0x01://当前定值区
				set_zone = p_rec->data[0];//读取当前定值区
				if(SYC_CPU_Status[byDevAddr - SYC_MMI_Config.sy_add].sy_valid_section[set_zone]!=0)
				{
					Send_Confirm(m_rx_buf, byDevAddr, 0x2c, inf, 0x08);
				}
				else
				{
					Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
				}
				return;
			case 0x02://运行定值区
				set_zone = p_rec->data[0];//读取当前定值区
				buf103[0] = set_zone;
				if(Set103_Premodify_Setzone(buf103, byDevAddr))
				{
					Send_Confirm(m_rx_buf, byDevAddr, 0x2c, inf, 0x08);
				}
				else
				{
					Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
				}
				return;
			}
		case 0x06://软压板
			buf103[0] = p_rec->ginh;
			buf103[1] = p_rec->data[0];
			if(Set103_Select_Softsw(buf103, byDevAddr))
			{
				Send_Confirm(m_rx_buf, byDevAddr, 0x2c, inf, 0x08);
			}
			else
			{
				Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
			}
			return;
		default:
			break;
		}
		break;
	case 250://带执行的写条目
		switch(ginl)
		{
		case 0x03://遥控
			buf103[0] = p_rec->ginh;	//条目
			buf103[1] = p_rec->data[0];	//值
			if(Set103_Control_Dout(buf103, byDevAddr))
			{
				Send_Confirm(m_rx_buf, byDevAddr, 0x28, inf, 0x08);
			}
			else
			{
				Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
			}
			return;
		case 0x04://定值
			Get103_Set_Setting(buf103, byDevAddr, &m_rx_buf[6]);
			pt = setzone_buf + (byDevAddr - SYC_MMI_Config.sy_add) * 2;
			if (*pt == VALID)
			{
				*pt++ = INVALID;		//将此区域置为无效
				set_zone = *pt;
				if (Set103_Set_Setting(buf103, byDevAddr, set_zone))
				{
					Send_Confirm(m_rx_buf, byDevAddr, 0x28, inf, 0x08);
				}
				else
				{
					Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
				}
			}
			else
			{
					Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
			}
			return;
		case 0x05://定值区
			switch (ginh)
			{
			case 0x01://当前定值区
				set_zone = p_rec->data[0];//读取当前定值区
				if(SYC_CPU_Status[byDevAddr - SYC_MMI_Config.sy_add].sy_valid_section[set_zone]!=0)
				{
					pt = setzone_buf + (byDevAddr - SYC_MMI_Config.sy_add) * 2;
					*pt++ = VALID;
					*pt = m_tx_buf[19];
					Send_Confirm(m_rx_buf, byDevAddr, 0x28, inf, 0x08);
				}
				else
				{
					Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
				}
				return;
			case 0x02://运行定值区
				set_zone = p_rec->data[0];//读取当前定值区
				buf103[0] = set_zone;
				if(Set103_Modity_Setzone(buf103, byDevAddr))
				{
					Send_Confirm(m_rx_buf, byDevAddr, 0x28, inf, 0x08);
				}
				else
				{
					Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
				}
				return;
			}
		case 0x06://软压板
			buf103[0] = p_rec->ginh;
			buf103[1] = p_rec->data[0];
			if(Set103_Control_Softsw(buf103, byDevAddr))
			{
				Send_Confirm(m_rx_buf, byDevAddr, 0x2c, inf, 0x08);
			}
			else
			{
				Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
			}
			return;
		}
		break;
	case 251://写条目停止
		break;
	}
}

//复归保护信号inf = 19 , cot = 20 
void Reply_Asdu20(BYTE *m_rx_buf,BYTE byDevAddr)
{
	BYTE	cot;
	BYTE	inf;

	cot = m_rx_buf[8];
	inf = m_rx_buf[11];
	if(cot == 20 && inf == 19)
	{
		KEC_Send_Reset_Signal();
		NU_Release_Semaphore(&KEC_SEMA_Reset_Key);
	}
	return;
}

void Reply_Asdu21(BYTE *m_rx_buf,BYTE byDevAddr)
{
	BYTE	inf;
	BYTE	ginl;
	BYTE	ginh;
	BYTE	kod;
	BYTE	f_ctrl;
	BYTE	set_zone;

	inf = m_rx_buf[11];		//信息序号
	ngd = m_rx_buf[13];		//通用分类数据集
	ginl = m_rx_buf[14];	//组号
	ginh = m_rx_buf[15];	//条目号
	kod = m_rx_buf[16];		//类型描述
	rii = m_rx_buf[12];		//返回标志
	switch(inf)
	{
	case 241://读一个组的全部条目的值和属性
		switch(kod)
		{
		case 1://实际值
			switch(ginl)
			{
			case 4://定值
				if(Get_Runing_Setzone(buf103, byDevAddr))
				{
					set_zone = buf103[7];//定值区号
					Get103_Set_Fact_Data(buf103, byDevAddr, set_zone);
					flag = FLAG_GENERAL_READ;
					byte_send = 0;
					number_send = 0;
					f_ctrl = 0x20;
					send_fix_packet(byDevAddr, f_ctrl);
					return;
				}
				else
				{
					flag = 0x00;
					f_ctrl = 0x09;
					send_fix_packet(byDevAddr, f_ctrl);
					return;
				}
			case 0x01://遥测
				Get103_Mea_Data(buf103, byDevAddr);	//读取保护测量值
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			case 0x05://定值区号
				Get_Runing_Setzone(buf103, byDevAddr);
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			case 0x06://软压板
				Get103_Softsw_Data(buf103, byDevAddr);//读取软压板
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			case 0x07://遥信量
				Get103_Din_Data(buf103, byDevAddr);	//读取开入量
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			}
		case 2://缺省值
			switch (ginl)
			{
			case 1:
			case 2:
			case 3:
			case 5:
			case 6:
			case 7:
				return;
			case 4://定值
				Get103_Set_Default_Data(buf103, byDevAddr);
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			default:
				return;
			}
		case 3://量程
			switch (ginl)
			{
			case 1:
				Get103_Mea_Range_Desc(buf103, byDevAddr);
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			case 4:
				Get103_Set_Range_Desc(buf103, byDevAddr);
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			case 2:
			case 3:
			case 5:
			case 6:
			case 7:
				return;
			default:
				return;
			}
		case 5://精度
			switch (ginl)
			{
			case 1:
				Get103_Mea_Precision_Desc(buf103, byDevAddr);
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			case 4:
				Get103_Mea_Precision_Desc(buf103, byDevAddr);
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			case 2:
			case 3:
			case 5:
			case 6:
			case 7:
				return;
			default:
				return;
			}
			break;
		case 9://量纲
			switch (ginl)
			{
			case 1://遥测
				Get103_Mea_Dim_Desc(buf103, byDevAddr);
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			case 4://定值
				Get103_Set_Dim_Desc(buf103, byDevAddr);
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			case 2:
			case 3:
			case 5:
			case 6:
			case 7:
				return;
			default:
				return;
			}
			break;
		case 10://描述表
			switch(ginl)
			{
			case 1://遥测组
				Get103_Mea_Desc(buf103, byDevAddr);
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			case 3://遥控组
				Get103_Dout_Desc(buf103, byDevAddr);
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			case 4://定值组
				Get103_Set_Desc(buf103, byDevAddr);
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			case 6://软压板
				Get103_Softsw_Desc(buf103, byDevAddr);
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			case 7://遥信组
				Get103_Din_Desc(buf103, byDevAddr);
				flag = FLAG_GENERAL_READ;
				byte_send = 0;
				number_send = 0;
				f_ctrl = 0x20;
				send_fix_packet(byDevAddr, f_ctrl);
				return;
			}
			break;
		}
	case 244://读单个条目的值或属性
		return;
	default:
		return;
	}
}

//请求扰动数据
void Reply_Asdu24(BYTE *m_rx_buf,BYTE byDevAddr)
{
	BYTE	too;

	acc = m_rx_buf[16];
	too = m_rx_buf[12];
	fan0 = m_rx_buf[14];
	fan1 = m_rx_buf[15];
	switch(too)
	{
	case 1:
		//故障的选择
		wave_flag = FLAG_SEND_DATA_READY;
		send_fix_packet(byDevAddr, 0x20);
		return;
	case 2:
		//请求扰动数据
		wave_flag = FLAG_SEND_STATE_READY;
		send_fix_packet(byDevAddr, 0x20);
		return;
	case 3:
		//终止扰动数据
		wave_flag = 0;
		send_fix_packet(byDevAddr, 0x08);
		return;
	case 8:
		//通道的请求
		wave_flag = FLAG_SEND_CHANEL_DATA;
		send_fix_packet(byDevAddr, 0x20);
		return;
	case 9:
		//通道的终止
		wave_flag = 0;
		send_fix_packet(byDevAddr, 0x08);
		return;
	case 16:
		//请求带标志的状态变位
		return;
	case 17:
		//终止带标志的状态变位
		return;
	case 24:
		//请求被记录的扰动表
		return;
	default:
		return;
	}
}

//扰动数据的认可
void Reply_Asdu25(BYTE *m_rx_buf,BYTE byDevAddr)
{
	BYTE	too;

	too = m_rx_buf[12];
	switch(too)
	{
	case 64:/*扰动数据传输成功*/
		wave_flag = FLAG_SEND_CHANEL_DATA;
		send_fix_packet(byDevAddr, 0x20);
		return;
	case 65:
		return;
	case 66:
		return;
	case 67:
		return;
	case 68:/*带标志的状态变位传输成功*/
		wave_flag = FLAG_SEND_CHANEL_READY;
		send_fix_packet(byDevAddr, 0x20);
		return;
	case 69:/*带标志的状态变位传输不成功*/
		wave_flag = 0;
		send_fix_packet(byDevAddr, 0x08);
		return;
	default:
		return;
	}

}

void send_channel(BYTE *m_rx_buf, BYTE byDevAddr, BYTE channels_count)
{
	Get103_channel_data(buf103, byDevAddr, fan0, fan1, acc, counter);

}

void Send_Confirm(BYTE *m_rx_buf, BYTE byDevAddr, BYTE cot, BYTE inf, BYTE f_ctrl)
{
	BYTE	*pr;
	BYTE	*pt;
	BYTE	num;
	BYTE	len;
	BYTE	count = 0;

	pr = m_rx_buf + 13;
	pt = &m_tx_buf[6];
	
	*pt++ = 10;				/*类型标识TYP*/
	*pt++ = 0x81;         		/*可变结构限定词VSQ*/
	*pt++ = cot;                	/*传送原因COT=42对通用数据分类读命令有效数据相应*/
	*pt++ = byDevAddr;         /*应用服务单元公用地址*/
	*pt++ = 0xfe;			/*功能类型FUN=GEN*/
	*pt++ = inf;                		/*信息序号INF*/
	*pt++ = m_rx_buf[12];	/*与主站命令中的返回信息标识符RII一致*/
	count += 7;

	if ((cot == 0x2a)||(cot == 0x28)||(cot == 0x2c))
	{
		num = *pr;
		*pt++ = *pr++;			//条目数目
		count++;
	}
	else
	{
		num = 0;
		*pt++ = 1;                  //?!
		*pt++ = m_rx_buf[14];
		*pt++ = 0;					//ginl;
		count += 3;
	}
	while (num>0, num--)
	{
		*pt++ = *pr++;				//ginh;
		*pt++ = *pr++;				//ginl++;
		*pt++ = *pr++;				//KOD=描述
		*pt++ = *pr++;				//数据类型
		len = *pr;
		*pt++ = *pr++;				//数据宽度
		len *= *pr;
		*pt++ = *pr++;               //数目及后续状态
		count += 6;
		while (len>0,len--)
		{
			*pt++ = *pr++;
			count++;
		}
	}
	send_var_packet(byDevAddr, f_ctrl, count);
}

/*****************************辅助处理函数************************************/
/* 计算校验和 */                                        
BYTE Makecrc(BYTE *str, WORD nSize)
{
	WORD	i;
	BYTE	J = 0;

	for (i = 0; i < nSize; i++)
	{
		J += str[i];
	}
	
	return J; 
}

⌨️ 快捷键说明

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