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

📄 mgt100.c

📁 南瑞动控继电保护装置MGT100系列串口103规约上位机通讯程序 基于LINUX
💻 C
📖 第 1 页 / 共 2 页
字号:
void  SendASDU7(unsigned char Port,unsigned char ASDU_TYP)//ADSU7总召唤
{
	unsigned char *pTx = DevPort[Port]->txbuf;
	unsigned char SendASDU_Length;
	unsigned char	i;
	
	SendASDU_Length=9;
	
	*pTx++ = 0x68;
	*pTx++ = 0x09;
	*pTx++ = 0x09;
	*pTx++ = 0x68;
	*pTx++ = m_Control[DevPort[Port]->Rtu_Adr] | 0x03;//发送确认帧传送数据	
	m_Control[DevPort[Port]->Rtu_Adr] = m_Control[DevPort[Port]->Rtu_Adr] ^ 0x20;	
	*pTx++ = DevPort[Port]->Rtu_Adr;
	*pTx++ = ASDU_TYP;
	*pTx++ = 0x81;
	*pTx++ = 0x09;
	*pTx++ = DevPort[Port]->Rtu_Adr;
	*pTx++ = 0xff;//GLB 全局功能 FUN
	*pTx++ = 0x00;//扫描序号	   INF
	m_nSCN[DevPort[Port]->Rtu_Adr]=(m_nSCN[DevPort[Port]->Rtu_Adr]+1)%256;
	*pTx++ = m_nSCN[DevPort[Port]->Rtu_Adr];//扫描序号
	*pTx++ = AddSum(DevPort[Port]->txbuf,SendASDU_Length,0);
	*pTx++ = 0x16;
	ClearCom(Port);	
	WriteCom(Port,pTx-DevPort[Port]->txbuf);
	ReceiveASDU_Data_Analys(Port,0);
}

void  SendASDU20(unsigned char Port,unsigned char ASDU_TYP)//LED复位
{
	unsigned char *pTx = DevPort[Port]->txbuf;
	unsigned char SendASDU_Length;
	SendASDU_Length=10;
	*pTx++ = 0x68;
	*pTx++ = 0x0a;
	*pTx++ = 0x0a;
	*pTx++ = 0x68;
	*pTx++ = 0x43;
	*pTx++ = DevPort[Port]->Rtu_Adr;
	*pTx++ = 0x14;
	*pTx++ = 0x81;
	*pTx++ = 0x14;
	*pTx++ = DevPort[Port]->Rtu_Adr;
	*pTx++ = 0xff;
	*pTx++ = 0x13;
	*pTx++ = 0x02;
	*pTx++ = 0x00;
	*pTx++ = AddSum(DevPort[Port]->txbuf,SendASDU_Length,0);;//
	*pTx++ = 0x16;
	ClearCom(Port);	
	WriteCom(Port,pTx-DevPort[Port]->txbuf);
}

void  SendASDU64(unsigned char Port,unsigned char ASDU_TYP,unsigned char CHSdata,unsigned char EXCdata)//ADSU64发送遥控命令
{
	unsigned char *pTx = DevPort[Port]->txbuf;
	unsigned char SendASDU_Length;
	SendASDU_Length=10;
	
	*pTx++ = 0x68;//遥控选择
	*pTx++ = 0x0a;
	*pTx++ = 0x0a;
	*pTx++ = 0x68;
	*pTx++ = m_Control[DevPort[Port]->Rtu_Adr] | 0x03;;//发送确认帧传送数据	
	m_Control[DevPort[Port]->Rtu_Adr] = m_Control[DevPort[Port]->Rtu_Adr] ^ 0x20;	
	*pTx++ = DevPort[Port]->Rtu_Adr;
	*pTx++ = ASDU_TYP;//64
	*pTx++ = 0x81;
	*pTx++ = 0x0c;
	*pTx++ = DevPort[Port]->Rtu_Adr;
	*pTx++ = 0x01;//GLB 全局功能 FUN
	*pTx++ = 0x30;//扫描序号	 	 INF
	// m_RII=(m_RII+1)%256;
	*pTx++ = CHSdata;//遥控选择分合命令
	*pTx++ = 0x00;//
	*pTx++ = AddSum(DevPort[Port]->txbuf,SendASDU_Length,0);
	*pTx++ = 0x16;
	ClearCom(Port);	
	WriteCom(Port,pTx-DevPort[Port]->txbuf);
	ReceiveASDU_Data_Analys(Port,0);
	
	usleep(200000);		
	ClearCom(Port);	
	pTx = DevPort[Port]->txbuf;	
	*pTx++ = 0x68;//遥控执行
	*pTx++ = 0x0a;
	*pTx++ = 0x0a;
	*pTx++ = 0x68;
	*pTx++ = m_Control[DevPort[Port]->Rtu_Adr] | 0x03;;//发送确认帧传送数据	
	m_Control[DevPort[Port]->Rtu_Adr] = m_Control[DevPort[Port]->Rtu_Adr] ^ 0x20;	
	*pTx++ = DevPort[Port]->Rtu_Adr;
	*pTx++ = ASDU_TYP;//64
	*pTx++ = 0x81;
	*pTx++ = 0x0c;
	*pTx++ = DevPort[Port]->Rtu_Adr;
	*pTx++ = 0x01;//GLB 全局功能	FUN
	*pTx++ = 0x30;//扫描序号	    INF
	*pTx++ = EXCdata;//遥控执行分合命令
	*pTx++ = 0x00;//
	*pTx++ = AddSum(DevPort[Port]->txbuf,SendASDU_Length,0);
	*pTx++ = 0x16;
	ClearCom(Port);	
	WriteCom(Port,pTx-DevPort[Port]->txbuf);
	ReceiveASDU_Data_Analys(Port,0);
}

void ReceiveASDU1(struct Master_Data *p_dst,unsigned char*pRx)//解析故障告警
{
	struct	RtuSOE	SoeTmp;
	unsigned char FUNCode,INFNum;
	FUNCode=pRx[4+6];
	INFNum =pRx[5+6];
	long buff1=pRx[16]*256+pRx[15];
	
	SoeTmp.Adr 								 = p_dst->Addr;		//装置地址
	SoeTmp.Code 							 = INFNum+80;//事件类型(加上80,可以在CSU配置点表的原SOE事件后直接添加)
	SoeTmp.Status 						 = 0x55;
	SoeTmp.Rtutime.Year 			 = t_data.year-2000;	//动作时间:年
	SoeTmp.Rtutime.Month 			 = t_data.mon;	//动作时间:月
	SoeTmp.Rtutime.Day 				 = t_data.day;	//动作时间:日
	SoeTmp.Rtutime.Hour 			 = pRx[18];;	//动作时间:时
	SoeTmp.Rtutime.Minute 		 = (pRx[17]&0x3f);	//动作时间:分
	SoeTmp.Rtutime.Second= buff1;	//动作时间:秒
	SoeTmp.Rtutime.MilliSecondL= (unsigned char)(buff1%256);	//动作时间:毫秒L
	SoeTmp.Rtutime.MilliSecondH= (unsigned char)(buff1/256);	//动作时间:毫秒H
	SoeTmp.Data[0] 						 = 0x00;//动作值L
	SoeTmp.Data[1] 						 = 0x00;//动作值H
	IncEvnFlag();//事件记录计数器计数
	WriteEvent(&SoeTmp);	//记录保护事件记录
	Alarm_ck(1);//启动报警接点
}

void	ReceiveASDU15(struct Master_Data *p_dst,unsigned char *pRx)
{	
	int i;
	for(i=0;i<10;i++)
	{
		*(&p_dst->Yc_Analog.Yc1+i)=MEA(*(pRx+6+6+2*i),*(pRx+6+7+2*i));
		//printf("(&p_dst->Yc_Analog.Yc1+i)=%x\n",*(&p_dst->Yc_Analog.Yc1+i));
	}

	if(!((*(pRx+32))&0x01))	{p_dst->Yx_State.Kr1  = 0;}//分
  else 							  {p_dst->Yx_State.Kr1  = 1;}//合  
  if(!((*(pRx+32))&0x02))	{p_dst->Yx_State.Kr2  = 0;}//分
  else							 	{p_dst->Yx_State.Kr2  = 1;}//合  	
  if(!((*(pRx+32))&0x04))	{p_dst->Yx_State.Kr3  = 0;}//分
  else							 	{p_dst->Yx_State.Kr3  = 1;}//合 
  if(!((*(pRx+32))&0x08))	{p_dst->Yx_State.Kr4  = 0;}//分
  else							 	{p_dst->Yx_State.Kr4  = 1;}//合  	
  if(!((*(pRx+32))&0x10))	{p_dst->Yx_State.Kr5  = 0;}//分
  else							 	{p_dst->Yx_State.Kr5  = 1;}//合
  if(!((*(pRx+32))&0x20))	{p_dst->Yx_State.Kr6 = 0;}//分
  else							 	{p_dst->Yx_State.Kr6 = 1;}//合  
  if(!((*(pRx+32))&0x40))	{p_dst->Yx_State.Kr7  = 0;}//分
  else							 	{p_dst->Yx_State.Kr7  = 1;}//合 
  if(!((*(pRx+32))&0x80))	{p_dst->Yx_State.Kr8  = 0;}//分
  else							 	{p_dst->Yx_State.Kr8  = 1;}//合
  
  if(!((*(pRx+33))&0x01))	{p_dst->Yx_State.Kr9  = 0;}//分
  else							 	{p_dst->Yx_State.Kr9  = 1;}//合 
  if(!((*(pRx+33))&0x02))	{p_dst->Yx_State.Kr10  = 0;}//分
  else							 	{p_dst->Yx_State.Kr10  = 1;}//合   
  if(!((*(pRx+33))&0x04))	{p_dst->Yx_State.Kr11  = 0;}//分
  else							 	{p_dst->Yx_State.Kr11  = 1;}//合 
  if(!((*(pRx+33))&0x08))	{p_dst->Yx_State.Kr12  = 0;}//分
  else							 	{p_dst->Yx_State.Kr12  = 1;}//合  	
  if(!((*(pRx+33))&0x10))	{p_dst->Yx_State.Kr13 = 0;}//分
  else							 	{p_dst->Yx_State.Kr13 = 1;}//合
  if(!((*(pRx+33))&0x20))	{p_dst->Yx_State.Kr14 = 0;}//分
  else							 	{p_dst->Yx_State.Kr14 = 1;}//合 
  if(!((*(pRx+33))&0x40))	{p_dst->Yx_State.Kr15 = 0;}//分
  else							 	{p_dst->Yx_State.Kr15 = 1;}//合 
  if(!((*(pRx+33))&0x80))	{p_dst->Yx_State.Kr16 = 0;}//分
  else							 	{p_dst->Yx_State.Kr16 = 1;}//合
	
}

void	ReceiveASDU41(struct Master_Data *p_dst,unsigned char *pRx)//单点信息开关变位(突变)
{
	unsigned char FUNCode;
	FUNCode=pRx[4+6];
	switch(FUNCode)
	{
		case 1://遥信的功能码		FUN=1
			switch(pRx[5+6])// INF
			{
				case 149:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr1=1;
						else p_dst->Yx_State.Kr1=0; 
					break;
				case 150:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr2=1;
						else 	p_dst->Yx_State.Kr2=0;
					break;
				case 151:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr3=1;
						else 	p_dst->Yx_State.Kr3=0;
					break;
				case 152:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr4=1;
						else 	p_dst->Yx_State.Kr4=0;
					break;
				case 153:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr5=1;
						else 	p_dst->Yx_State.Kr5=0;
					break;
				case 154:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr6=1;
						else 	p_dst->Yx_State.Kr6=0;
					break;
				case 155:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr7=1;
						else 	p_dst->Yx_State.Kr7=0;
					break;
				case 156:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr8=1;
						else 	p_dst->Yx_State.Kr8=0;
					break;
				case 157:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr9=1;
						else 	p_dst->Yx_State.Kr9=0;
					break;
				case 158:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr10=1;
						else 	p_dst->Yx_State.Kr10=0;
					break;
				case 159:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr11=1;
						else 	p_dst->Yx_State.Kr11=0;
					break;
				case 160:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr12=1;
						else 	p_dst->Yx_State.Kr12=0;
					break;
				case 161:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr13=1;
						else 	p_dst->Yx_State.Kr13=0;
					break;
				case 162:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr14=1;
						else 	p_dst->Yx_State.Kr14=0;
					break;
				case 163:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr15=1;
						else 	p_dst->Yx_State.Kr15=0;
					break;
				case 164:
					if(pRx[12]&0x01) p_dst->Yx_State.Kr16=1;
						else 	p_dst->Yx_State.Kr16=0;
					break;			
				default:
				break;
			}
	}
}

void ExeOperate(unsigned char Port)//检查端口是否有遥控/复位命令
{
	unsigned char	*p_YkId = &Yk_Id[Port].Yk1;
	unsigned char	CHSdata,EXCdata;
	int i,num;
	
	DevPort[Port]->Cmd_Doing = 1; 	 
	if(DevPort[Port]->Fg_Flag)						// 复归操作		
  {             		    	
    if(DevPort[Port]->Rtu_Adr == DevPort[Port]->Fg_Adr)			
		{
		  SendASDU20(Port,20);//发复归		   	
    	DevPort[Port]->Fg_Ok = 2;
    	Rst_Cmd_Data(Port,Cmd_Fg);					//清复归标志	
    }
   }
	
	if(DevPort[Port]->Yk_Flag)	// 遥控操作		
	{
		if(DevPort[Port]->Rtu_Adr == DevPort[Port]->Yk_Adr)	
		{	
			num = Calculate_YkNum(Port);//计算需遥控开关的数目
			for(i=0;i<num;i++)
   		{
   			if(!(*p_YkId++))    			  
     			continue; 
     		if(DevPort[Port]->Yk_Num != (i+1))	//如果开关序号不匹配则继续循环
     			continue;						
				if(DevPort[Port]->Yk_Data == 1)
					{					
						CHSdata=0x81;	//选择分
						EXCdata=0x01; //执行分
					}	
				if(DevPort[Port]->Yk_Data == 2)
					{
						CHSdata=0x82; //选择合
						EXCdata=0x02; //执行合
					}
					
				SendASDU64(Port,64,CHSdata,EXCdata);//发遥控命令						
				Rst_Cmd_Data(Port,Cmd_Yk);//清遥控标志					
			}
		}	
	}
	return;
}

//求带品质描述的遥测值
int MEA(unsigned char Data0,unsigned char Data1)
{
	int temp1;
	int D16;
	int Val;
	
	D16=Data1&0x80;
	temp1=(Data1<<8)+Data0;
	temp1=(temp1>>3);
	if(D16==0)
	{
		Val=temp1;
	}
	else
	{
		temp1=temp1|0xe000;
		Val=temp1;
	}	
	return Val;
}

//创建上传量,填写参数以备在后台中有选择性地上传所要的量
void  mgt100Creat_Data(unsigned char Port)
{
  struct  YcData_Id   *pIdYc = &Yc_Id[Port];
  struct  YxData_Id   *pIdYx = &Yx_Id[Port];
  struct  YkData_Id   *pIdYk = &Yk_Id[Port];
  struct	FgData_Id		*pIdFg = &Fg_Id[Port];
    
  //创建遥控数据
  CreatData(&pIdYk->Yk1);
  
  //创建复归量用于复归
  CreatData(&pIdFg->Fg);
  
  //创建遥测数据
  CreatData(&pIdYc->Yc1);
	CreatData(&pIdYc->Yc2);
	CreatData(&pIdYc->Yc3);
	CreatData(&pIdYc->Yc4);
	CreatData(&pIdYc->Yc5);
	CreatData(&pIdYc->Yc6);
	CreatData(&pIdYc->Yc7);
	CreatData(&pIdYc->Yc8);
	CreatData(&pIdYc->Yc9);
	CreatData(&pIdYc->Yc10);
  //创建遥信数据
  CreatData(&pIdYx->Kr1);// 断路器位置 
  CreatData(&pIdYx->Kr2);// 开入1
  CreatData(&pIdYx->Kr3);// 开入2
  CreatData(&pIdYx->Kr4);// 开入3
  CreatData(&pIdYx->Kr5);// 开入4
  CreatData(&pIdYx->Kr6);// 开入5
  CreatData(&pIdYx->Kr7);// 开入6
  CreatData(&pIdYx->Kr8);// 开入7
  CreatData(&pIdYx->Kr9);// 开入8
  CreatData(&pIdYx->Kr10);// 开入9
  CreatData(&pIdYx->Kr11);//
  CreatData(&pIdYx->Kr12);//
  CreatData(&pIdYx->Kr13);//
  CreatData(&pIdYx->Kr14);//
  CreatData(&pIdYx->Kr15);//
  CreatData(&pIdYx->Kr16);// 开入16  
}

⌨️ 快捷键说明

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