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

📄 com_232.c

📁 232串口通讯的驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
	BYTE *pt,*cpAck;

	pt =sBuf+3;
	if((*pt++ != 4) || (*pt++ != 1))
	{
		Send15();
		return;
	}
	
	wRptN =pt[0] + pt[1]*256;
	pHead =FM_Search_Report(wRptN);
	if((pHead == 0) || !FM_LOCK_FLASH())
	{
		Send19();
		return;
	}
	cpAck =caAckBuf;
	*cpAck++=SET_NUMBER*3+5+5;
	*cpAck++=byDst;
	*cpAck++=byCpuN;
	*cpAck++=0x45;
	*cpAck++=SET_NUMBER*3+5;
	*cpAck++=RELAY_TYPE_LO;
	*cpAck++=RELAY_TYPE_HI;
	*cpAck++=(BYTE)wRptN;
	*cpAck++=(BYTE)(wRptN >> 8);
	pt =(BYTE *)(FM_Align64k(pHead) + pHead->dSetAddr);
	//including settings' zone.
	for (i =0; i < (SET_NUMBER*3 + 1); i++)
	{
		*cpAck++ =*pt++; 
	}
	FM_UNLOCK_FLASH();
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);
}

//下传及固化逻辑定值命令的响应函数
#define RES_RECEIVE_READY    0x5A
#define RES_RECEIVE_OK       0xA5
#define RES_RECEIVE_COMPLETE 0xAA

//B5:准备发送逻辑定值
void ReplyCmdB5(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt, *cpAck;
	pt =sBuf+3;
	if(*pt++ != 68)
	{
		Send15();
	}
	else
	{
		//拷贝逻辑定值描述
		memcpy(&m_logic_head.type[0], pt, 32);
		pt +=32;
		memcpy(&m_logic_head.code[0], pt, 32);
		pt +=32;
		m_logic_head.size =MAKEWORD(pt[0], pt[1]);
		m_logic_head.crc  =MAKEWORD(pt[2], pt[3]);
		//保存逻辑定值长度
		pTmpLogBuf=caTmpLogBuf;
		*pTmpLogBuf++=*pt++;
		*pTmpLogBuf++=*pt;
		cpAck=caAckBuf;
		*cpAck++=5;
		*cpAck++=byDst;
		*cpAck++=byCpuN;
		*cpAck++=0x50;
		*cpAck++=0;
		MakeCs(caAckBuf);
		SciPutn(caAckBuf);
		//设置通讯命令状态
		tCmd.wDelay=0;
		tCmd.byCmd=0xB5;
		tCmd.byStatus=RES_RECEIVE_READY;
	}
	return;
}

//B6:下传逻辑定值
void ReplyCmdB6(BYTE *sBuf,WORD wFrameCounter)
{
	static WORD wTotalNum;
	static BYTE byRI;
	BYTE *pt,Rnum;
	BYTE *cpAck;
	WORD i;
	//起始帧
	if((tCmd.byCmd == 0xB5) && (tCmd.byStatus == RES_RECEIVE_READY))
	{
		pt=sBuf+4;
		if(*pt != 1)
		{
			Send15();
			return;
		}
		else
		{
			//接收长度计数器及接收返回码初始化
			wTotalNum=0;
			byRI=0;	  
		}
	}
	pt =sBuf+3;
	Rnum =*pt++;
	if(*pt != (byRI+1))
	{
		Send15();
		return;
	}
	byRI =*pt++;
	Rnum-=1;
	wTotalNum +=Rnum;
	//接收数据
	for(; Rnum > 0; Rnum--)
	{
		*pTmpLogBuf++ =*pt++;
	}
	cpAck=caAckBuf;
	*cpAck++=6;
	*cpAck++=byDst;
	*cpAck++=byCpuN;
	*cpAck++=0x51;
	*cpAck++=1;
	*cpAck++=byRI;
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);

	//设置通讯命令状态
	tCmd.wDelay=0;
	tCmd.byCmd=0xB6;
	pt=caTmpLogBuf;
	i=(WORD)*pt++;
	i+=((WORD)*pt)*256;
	if(i == wTotalNum) 
	{
		tCmd.byStatus=RES_RECEIVE_COMPLETE;
	}
	else 
	{
		tCmd.byStatus=RES_RECEIVE_OK;
	}
	return;
}

//B7:固化逻辑定值
void ReplyCmdB7(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt;
	WORD wLen;
	//校验命令长度
	pt=sBuf+3;
	if(*pt++ != 0)
	{
		tCmd.byCmd=0xB7;
		tCmd.byStatus=RES_LOG_CODERR;
		Send25(tCmd.byStatus);
		return;
	}
	//校验命令序列
	if((tCmd.byCmd != 0xB6) || (tCmd.byStatus != RES_RECEIVE_COMPLETE))
	{
		tCmd.byCmd=0xB7;
		tCmd.byStatus=RES_LOG_CODERR;
		Send25(tCmd.byStatus);
		return;
	}
	else
	{
		tCmd.byCmd=0xB7;
	}
	//逻辑定值CRC校验
	pt=caTmpLogBuf;
	wLen  = (WORD)*pt++;
	wLen +=((WORD)*pt++)*256;
	if ( !CrcOk( pt, wLen-2 ) )
	{
		tCmd.byStatus=RES_LOG_CHKFAIL;
		Send25(tCmd.byStatus);
		return;
	}

	//执行固化命令
	if ( !FM_Write_Logic(caTmpLogBuf, &m_logic_head) )
	{
		tCmd.byStatus=RES_LOG_WRFAIL;
		Send25(tCmd.byStatus);
		return;
	}
	//重新读回再进行校验
	if ( !FM_Read_Logic(caTmpLogBuf) )
	{
		tCmd.byStatus=RES_LOG_WRFAIL;
		Send25(tCmd.byStatus);
		return;
	}

	if( !GL_Convert_Logic_Set(caTmpLogBuf, pRunSet) || !GL_Toggle_Logic_Set() ) 
	{
		tCmd.byStatus=RES_LOG_CHKFAIL;
		Send25(tCmd.byStatus);
		return;
	}
  
	tCmd.byStatus=RES_LOG_WROK;
	Send25(tCmd.byStatus);
	return;
}

//测量值报文发送查询
#define T_MEASENDINTERVAL 10000
void SendMeasures()
{
	static  DWORD dwSendTime =0;
	TMEAVAL tMeaSend;
	BYTE  *cpAck;
	WORD  nChannel;
	DWORD dwValue;
	long  lAngle;

	if((DWORD)(dTCounter-dwSendTime) < T_MEASENDINTERVAL)
	{
		return;
	}
	dwSendTime =dTCounter;
	tMeaSend =*ptMea;
	cpAck =caAckBuf;
	*cpAck++=(BYTE)8*6+1+5;
	*cpAck++=DESTADDR;
	*cpAck++=byCpuN;
	*cpAck++=0x32;
	*cpAck++=(BYTE)8*6+1;
	//属性值
	*cpAck++=1;	
	for(nChannel =0; nChannel < AI_NUMBER; nChannel++)
	{
		switch(nChannel)
		{
		case SAM_IA://Ia
		case SAM_IB://Ib
		case SAM_IC://Ic
		case SAM_UA://Ua
		case SAM_UB://Ub
		case SAM_UC://Uc
			dwValue =_MulFac2(tMeaSend.lrms[nChannel],0x10000L,tMeaRelayTab[nChannel].dKBL);
			lAngle  =tMeaSend.lAng[nChannel]-tMeaSend.lAng[SAM_UA];	//以Ua的相位角作参考量
			break;
		default:
			continue;
		}
		*cpAck++=(BYTE)dwValue;
		*cpAck++=(BYTE)(dwValue >> 8);
		*cpAck++=(BYTE)(dwValue >> 16);
		*cpAck++=(BYTE)(dwValue >> 24);
		while(lAngle < -(180*65536L))
		{
			lAngle +=(360*65536L);
		}
		while(lAngle > (180*65536L))
		{
			lAngle -=(360*65536L);
		}
		*cpAck++=(BYTE)lAngle;
		*cpAck++=(BYTE)(lAngle >> 8);
		*cpAck++=(BYTE)(lAngle >> 16);
		*cpAck++=(BYTE)(lAngle >> 24);
	}
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);
}

//主动上送事件报告
void SendPolling()
{
	static DWORD dPrevCounter=0;

	if((DWORD)(dTCounter-dPrevCounter) < 400)
		return;
	else
		dPrevCounter= dTCounter;
	//发送SOE区的报文
	if( INF_Search_Soe( & m_232SoePos )== true )
	{
		TSOERECORD* pSoe= INF_Get_Soe( m_232SoePos );
		if( pSoe != 0 )
		{
			SendSoe( pSoe );
			m_232SoePos= INF_Next_Soe_Index( m_232SoePos );
			return;
		}
	}
	//发送复制事件区的报文
	if( INF_Search_Event_Copy( & m_232EventCopyPos )== true )
	{
		TEVENTRECORD* pEvent= INF_Get_Event_Copy( m_232EventCopyPos );
		if( pEvent != 0 )
		{
			SendEventCopy( pEvent );
			m_232EventCopyPos= INF_Next_Event_Copy_Index( m_232EventCopyPos );
			return;
		}
	}
	//发送事件区的报文
	if (INF_Search_Event( & m_232EventPos ) == true)
	{
		TEVENTRECORD* pEvent= INF_Get_Event( m_232EventPos );
		if (pEvent != 0)
		{
			if (pEvent->tEvent.wCode != EV_TIMEFLAG)
			{
				SendEvent( pEvent );
			}
			m_232EventPos =INF_Next_Event_Index(m_232EventPos);
			return;
		}
	}
	//发送告警区的报文	
	if( INF_Search_Alarm( & m_232AlarmPos )== true )
	{
		TEVENTRECORD* pAlarm= INF_Get_Alarm( m_232AlarmPos );
		if( pAlarm != 0 )
		{
			SendAlarm( pAlarm );
			m_232AlarmPos= INF_Next_Alarm_Index( m_232AlarmPos );
			return;
		}
	}
	//发送DI区的报文	
	if( INF_Search_Di( & m_232DiPos )== true )
	{
		TSOERECORD* pDi= INF_Get_Di( m_232DiPos );
		if( pDi != 0 )
		{
			SendDi( pDi );
			m_232DiPos= INF_Next_Di_Index( m_232DiPos );
			return;
		}
	}
}

void SendSoe( TSOERECORD* pSoeRecord )
{
	extern BYTE caAckBuf[];
	BYTE *cpAck,byFtype=0;
	WORD w;

	byFtype=0;		// SOE: 0 ; 开入量: 1
	w=11;

	cpAck=caAckBuf;

	*cpAck++=(BYTE)(w+5);//Length
	*cpAck++=DESTADDR;   //Destinate
	*cpAck++=byCpuN;	 //Source
	*cpAck++=0x18;		 //TYPE
	*cpAck++=(BYTE)w;    //N
	*cpAck++=pSoeRecord->byCot;  //COT
	*cpAck++=byFtype;	 //FTYPE(SOE/DI)

	*cpAck++=RELAY_TYPE_LO;  //CPUN
	*cpAck++=RELAY_TYPE_HI;


	*cpAck++=pSoeRecord->tSoe.tTime.byHour;
	*cpAck++=pSoeRecord->tSoe.tTime.byMin;
	*cpAck++=(BYTE)pSoeRecord->tSoe.tTime.wMs;
	*cpAck++=(BYTE)(pSoeRecord->tSoe.tTime.wMs>>8);

	*cpAck++=pSoeRecord->tSoe.byDiNo;
	*cpAck++=pSoeRecord->tSoe.byDiq;

	*cpAck=(BYTE) m_232SoePos;
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);
}

void SendEvent( TEVENTRECORD* pEvent )
{
	extern BYTE caAckBuf[];
	BYTE *cpAck,byFtype=0;
	bool bPar;
	WORD w;

	byFtype=1;

	//是否带参数
	if(pEvent->tEvent.tParm.byParmType == EVTPARM_INVALID)
	{
		bPar=false;
		w=14;
	}
	else
	{
		bPar=true;
		w=23;
	}

	cpAck=caAckBuf;

	*cpAck++=(BYTE)(w+5);//Length
	*cpAck++=DESTADDR;   //Destinate
	*cpAck++=byCpuN;	 //Source
	*cpAck++=0x17;		 //TYPE
	*cpAck++=(BYTE)w;    //N
	*cpAck++=pEvent->byCot;  //COT
	*cpAck++=byFtype;	 //FTYPE(动作/告警)

	*cpAck++=RELAY_TYPE_LO;  //CPUN
	*cpAck++=RELAY_TYPE_HI;

	w=pEvent->tEvent.wRptNo; //Ntag
	*cpAck++=(BYTE)w;
	*cpAck++=(BYTE)(w>>8);

	*cpAck++=pEvent->tEvent.byWavNo;		 //Ftag
	*cpAck++=pEvent->tEvent.tEvtDate.byHour; //Hour
	*cpAck++=pEvent->tEvent.tEvtDate.byMin;  //Minute
	w=pEvent->tEvent.tEvtDate.wMs;			 //Ms
	*cpAck++=(BYTE)w;
	*cpAck++=(BYTE)(w>>8);

	w=pEvent->tEvent.wCode;  //Event code
	*cpAck++=(BYTE)w;
	*cpAck++=(BYTE)(w>>8);
	//Parameter
	if(bPar)
	{
		int i;
		BYTE *pt;
		pt=(BYTE *)(&pEvent->tEvent.tParm);
		for(i =0; i < sizeof(pEvent->tEvent.tParm); i++)
		{
			// 删除由字对齐产生的多余字节
			if(i == 1)
			{
				pt++;
				continue;
			}
			*cpAck++=*pt++;
		}
	}
	*cpAck=(BYTE) m_232EventPos;
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);
}

void SendAlarm( TEVENTRECORD* pEvent )
{
	extern BYTE caAckBuf[];
	BYTE *cpAck,byFtype=0;
	bool bPar;
	WORD w;

	byFtype=2;		// 告警

	//是否带参数
	if(pEvent->tEvent.tParm.byParmType == EVTPARM_INVALID)
	{
		bPar=false;
		w=14;
	}
	else
	{
		bPar=true;
		w=23;
	}

	cpAck=caAckBuf;

	*cpAck++=(BYTE)(w+5);//Length
	*cpAck++=DESTADDR;   //Destinate
	*cpAck++=byCpuN;	 //Source
	*cpAck++=0x17;	     //TYPE
	*cpAck++=(BYTE)w;    //N
	*cpAck++=pEvent->byCot;  //COT
	*cpAck++=byFtype;	 //FTYPE(动作/告警)

	*cpAck++=RELAY_TYPE_LO;  //CPUN
	*cpAck++=RELAY_TYPE_HI;

	w=pEvent->tEvent.wRptNo; //Ntag
	*cpAck++=(BYTE)w;
	*cpAck++=(BYTE)(w>>8);

	*cpAck++=pEvent->tEvent.byWavNo;  //Ftag
	*cpAck++=pEvent->tEvent.tEvtDate.byHour;  //Hour
	*cpAck++=pEvent->tEvent.tEvtDate.byMin;  //Minute
	w=pEvent->tEvent.tEvtDate.wMs;	  //Ms
	*cpAck++=(BYTE)w;
	*cpAck++=(BYTE)(w>>8);

	w=pEvent->tEvent.wCode;  //Event code
	*cpAck++=(BYTE)w;
	*cpAck++=(BYTE)(w>>8);
	//Parameter
	if(bPar)
	{
		int i;
		BYTE *pt;
		pt=(BYTE *)(&pEvent->tEvent.tParm);
		for(i =0; i < sizeof(pEvent->tEvent.tParm); i++)
		{
			// 删除由字对齐产生的多余字节
			if(i == 1)
			{
				pt++;
				continue;
			}
			*cpAck++=*pt++;
		}
	}
	*cpAck=((BYTE) m_232AlarmPos)+EVTRECORD_NUMBER;
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);
}

void SendDi( TSOERECORD* pDiRecord )
{
	extern BYTE caAckBuf[];
	BYTE *cpAck,byFtype=0;
	WORD w;

	byFtype=1;		// SOE: 0 ; 开入量: 1
	w=11;

	cpAck=caAckBuf;

	*cpAck++=(BYTE)(w+5);//Length
	*cpAck++=DESTADDR;   //Destinate
	*cpAck++=byCpuN;	 //Source
	*cpAck++=0x18;		 //TYPE
	*cpAck++=(BYTE)w;    //N
	*cpAck++=pDiRecord->byCot;  //COT
	*cpAck++=byFtype;	 //FTYPE(SOE/DI)

	*cpAck++=RELAY_TYPE_LO;  //CPUN
	*cpAck++=RELAY_TYPE_HI;

	*cpAck++=pDiRecord->tSoe.tTime.byHour;
	*cpAck++=pDiRecord->tSoe.tTime.byMin;
	*cpAck++=(BYTE)pDiRecord->tSoe.tTime.wMs;
	*cpAck++=(BYTE)(pDiRecord->tSoe.tTime.wMs>>8);

	*cpAck++=pDiRecord->tSoe.byDiNo;
	*cpAck++=pDiRecord->tSoe.byDiq;

	*cpAck=(BYTE) m_232DiPos;
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);


}

void SendEventCopy( TEVENTRECORD* pEvent )
{
	extern BYTE caAckBuf[];
	BYTE *cpAck,byFtype=0;
	bool bPar;
	WORD w;

	byFtype=2;		// 告警

	//是否带参数
	if(pEvent->tEvent.tParm.byParmType == EVTPARM_INVALID)
	{
		bPar=false;
		w=14;
	}
	else
	{
		bPar=true;
		w=23;
	}

	cpAck=caAckBuf;

	*cpAck++=(BYTE)(w+5);//Length
	*cpAck++=DESTADDR;   //Destinate
	*cpAck++=byCpuN;	 //Source
	*cpAck++=0x17;	     //TYPE
	*cpAck++=(BYTE)w;    //N
	*cpAck++=pEvent->byCot;  //COT
	*cpAck++=byFtype;	 //FTYPE(动作/告警)

	*cpAck++=RELAY_TYPE_LO;  //CPUN
	*cpAck++=RELAY_TYPE_HI;

	w=pEvent->tEvent.wRptNo; //Ntag
	*cpAck++=(BYTE)w;
	*cpAck++=(BYTE)(w>>8);

	*cpAck++=pEvent->tEvent.byWavNo;  //Ftag
	*cpAck++=pEvent->tEvent.tEvtDate.byHour;  //Hour
	*cpAck++=pEvent->tEvent.tEvtDate.byMin;  //Minute
	w=pEvent->tEvent.tEvtDate.wMs;    //Ms
	*cpAck++=(BYTE)w;
	*cpAck++=(BYTE)(w>>8);

	w=pEvent->tEvent.wCode;  //Event code
	*cpAck++=(BYTE)w;
	*cpAck++=(BYTE)(w>>8);
	//Parameter
	if(bPar)
	{
		int i;
		BYTE *pt;
		pt=(BYTE *)(&pEvent->tEvent.tParm);
		for(i =0; i < sizeof(pEvent->tEvent.tParm); i++)
		{
			// 删除由字对齐产生的多余字节
			if(i == 1)
			{
				pt++;
				continue;
			}
			*cpAck++=*pt++;
		}
	}
	*cpAck=((BYTE) m_232EventCopyPos)+EVTRECORD_NUMBER+ALMRECORD_NUMBER;
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);
}

⌨️ 快捷键说明

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