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

📄 com_232.c

📁 232串口通讯的驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
	TDATE tmpDate;
	BYTE* pt;
	DWORD tmp;
	if( !Is_Local( _g_dDiValue ) )
	{
		Send15();
		return;
	}

	//如果 N!=7,报文格式错误!
	pt =sBuf+3;
	if(*pt >= 8)
	{
		//tmp:=dTCounter的暂存值
		//如果tmp!=dTCounter,中间被中断服务打断,需重新赋值
		do
		{
			WORD v,w;
			tmp=dTCounter;
			pt=sBuf+4;
			tmpDate.wYear=*pt++;
			tmpDate.wYear+=((WORD)*pt++)*256;
			tmpDate.byMon=*pt++;
			tmpDate.byDay=*pt++;
			tmpDate.byHour=*pt++;
			tmpDate.byMin=*pt++;
			w=*pt++;
			w+=((WORD)*pt)*256;
			v=(WORD)(dTCounter&0x0ffffL)-wFrameCounter;
			if( w+v > 0xfffd)
			{
				w=0xfffd;
			}
			else
			{
				w+=v;
			}
			tmpDate.wMs=w;
		}
		while(tmp != dTCounter); //若dTcounter变位则重新设置一次

		pt=sBuf;
		if(*pt == byCpuN)            //
		{
			SYS_Set_Clock(&tmpDate,TRUE);     //zym add 2003.4.3
			Send11();  //非广播地址则回答11报文
		}
	}
	else
	{
		pt=sBuf;
		if(*pt != 0xff)
		{
			Send15(); //命令错误,对于非广播报文则回答15报文
		}
	}
}

//82:读取日历时钟
void ReplyCmd82(BYTE *sBuf,WORD wFrameCounter)
{
	Send11();
}

//83:配置信息确认
void ReplyCmd83(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt;
	DWORD parm;
	pt=sBuf+3;
	if(*pt++ != 1)
	{
		Send15();
	}
	else
	{
		parm=*pt;
		CommTask(0x84,9,parm);
	}
}

//84:读取配置信息
void ReplyCmd84(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt;
	int task;
	DWORD parm;
	pt=sBuf+3;
	if(*pt++ != 2)
	{
		Send15();
		return;
	}
	else
	{
		task=*pt++;    //COMMAND
		parm=*pt++;    //RI
		CommTask(0x84,task,parm);
	}
}

//85:复位信号
void ReplyCmd85(BYTE *sBuf,WORD wFrameCounter)
{
	Send16();
}

//86:确认事件/SOE
void ReplyCmd86(BYTE *sBuf,WORD wFrameCounter)
{
	extern TDICHGMESSAGE tDiMsg;
	BYTE *pt=sBuf+3;
	int id;
	if(*pt++ != 2)
	{
		Send15();  //N!=2,报文错误,返回否定回答
	}
	switch( *pt++ ) 
	{
	case 1:	//17报文指定的事件
		id =*pt;
		if(id > EVTRECORD_NUMBER-1)
		{
			//告警、呼唤事件
			id -=EVTRECORD_NUMBER;
			if(id < ALMRECORD_NUMBER)
			{
			}
			else
			{
				id -= ALMRECORD_NUMBER;
				if(id < EVENTCOPY_NUMBER )
				{

				}
			}
		}
		else
		{
			//动作事件
		}
		break;
	case 3:  //18报文指定的SOE
		id =*pt;
		if(id < SOERECORD_NUMBER)
		{
		}
		break;
	case 4:  //18报文指定的一般开入量变位
		id =*pt;
		if(id < DIRECORD_NUMBER)
		{
		}
		break;
	}
}

//89:标志集读取确认
void ReplyCmd89(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt=sBuf+3;
	if(*pt++ != 3)
	{
		Send15();
	}
	else
	{
		DWORD parm;
		parm=(DWORD)(*pt++);
		parm+=((DWORD)(*pt++)<<8);
		parm+=((DWORD)(*pt)<<16);
		CommTask(0x8A,19,parm);
	}
}

//8A:指定报告的读取标志集
void ReplyCmd8A(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt=sBuf+3;
	if(*pt++ != 4)
	{
		Send15();
	}
	else
	{
		int task;
		DWORD parm;
		task=(int)(*pt++);
		parm=(DWORD)(*pt++);
		parm+=((DWORD)(*pt++)<<8);
		parm+=((DWORD)(*pt)<<16);
		CommTask(0x8A,task,parm);
	}
}

//8B:删除报告
void ReplyCmd8B(BYTE *sBuf,WORD wFrameCounter)
{
	//插入删除报告程序
	Send16();
}

//复制事故报告
void ReplyCmd8C(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt=sBuf+3;
	if(*pt++ != 3)
	{
		Send15();
	}
	else
	{
		int task;
		DWORD parm;
		task=(int)(*pt++);      // COMMAND
		parm=*pt++;             // RI/LOBYTE(报告号)
		parm+=(((DWORD)*pt)<<8);// HIBYTE(报告号)
		CommTask(0x8c,task,parm);
	}
}

//应答录波数据读取确认
void ReplyCmd8E(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt=sBuf+3;
	if(*pt++ != 4)
	{
		Send15();
	}
	else
	{
		DWORD parm;
		parm=*pt++;
		parm+=((DWORD)*pt++<<8);
		parm+=((DWORD)*pt++<<16);
		parm+=((DWORD)*pt<<24);
		CommTask(0x8F,19,parm);
	}
}

//读取扰动记录表/扰动记录(录波数据)
void ReplyCmd8F(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt=sBuf+3;
	if(*pt++ != 4)
	{
		Send15();
	}
	else
	{
		int task;
		DWORD parm;
		task=(int)(*pt++);         // COMMAND
		parm=*pt++;                // RPTN(L)
		parm+=(((DWORD)*pt++)<<8); // RPTN(H)
		parm+=(((DWORD)*pt++)<<16);// FAN/RI
		CommTask(0x8F,task,parm);
	}
}

//读取采样值
void ReplyCmd90(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt=sBuf+3;
	if(*pt++ != 3)
	{
		Send15();
	}
	else
	{
		int task;
		DWORD parm;
		task=(int)(*pt++);       // COMMAND
		parm=*pt++;              // RI/FAN/RPTN(L)
		parm+=(((DWORD)*pt)<<8); // RPTN(H)
		CommTask(0x90,task,parm);
	}
}

//采样值传输确认
void ReplyCmd91(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt=sBuf+3;
	if(*pt++ != 1)
	{
		Send15();
	}
	else
	{
		DWORD parm;
		parm=*pt;
		CommTask(0x90,19,parm);
	}
}

//读取开入量
void ReplyCmd92(BYTE *sBuf,WORD wFrameCounter)
{
	DWORD di;
	BYTE  *cpAck;
	cpAck=caAckBuf;
	*cpAck++=3+3+5;
	*cpAck++=byDst;
	*cpAck++=byCpuN;
	*cpAck++=0x22;
	*cpAck++=3+3;
	*cpAck++=RELAY_TYPE_LO;
	*cpAck++=RELAY_TYPE_HI;
	*cpAck++=DI_NUMBER;
	di=_g_dDiValue;
	*cpAck++=(BYTE)di;
	*cpAck++=(BYTE)(di>>8);
	*cpAck++=(BYTE)(di>>16);
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);
}

//读取整定值
void ReplyCmd93(BYTE *sBuf,WORD wFrameCounter)
{
	WORD bn;
	BYTE *pt;
	pt=sBuf+3;
	if(*pt != 1)
	{
		Send15();
	}
	else
	{
		pt++;
		bn=*pt;
		Send23(bn);
	}
}

//下发整定值
void ReplyCmd94(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt,*pt1;
	int i;

	if( !Is_Local( _g_dDiValue ) )
	{
		Send15();
		return;
	}

	pt=sBuf+3;
	if( (*pt++ != SET_NUMBER*3+2) ||
		(*pt++ != RELAY_TYPE_LO ) || (*pt++ != RELAY_TYPE_HI ))
	{
		Send15();
		return;
	}

	pt1=caSetBuf;
	for(i=SET_NUMBER*3; i > 0; i--)
	{
		*pt1++=*pt++;
	}
	//计算 crc-16
	CrcMake( caSetBuf, SET_NUMBER*3 );

	//插入定值合理性校验

	pt=caAckBuf,pt1=caSetBuf;
	*pt++=(BYTE)(SET_NUMBER*3+7);
	*pt++=byDst;
	*pt++=byCpuN;
	*pt++=0x23;
	*pt++=(BYTE)(SET_NUMBER*3+2);
	*pt++=RELAY_TYPE_LO;
	*pt++=RELAY_TYPE_HI;
	for(i=SET_NUMBER*3; i > 0; i--)
	{
		*pt++=*pt1++;
	}

	tCmd.byCmd=0x94;
	tCmd.byStatus=RES_SET_READY;
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);
}

//固化整定值
void ReplyCmd95(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt;
	int iSec;

	if( !Is_Local( _g_dDiValue ) )
	{
		Send15();
		return;
	}

	if((tCmd.byCmd != 0x94) || (tCmd.byStatus != RES_SET_READY))
	{
		tCmd.byCmd=0x95;
		tCmd.byStatus=RES_SET_CHKFAIL;
		Send25(tCmd.byStatus);
		return;
	}
	tCmd.byCmd=0x95;
	pt=sBuf+3;
	if(*pt != 1)
	{
		//N!=1,报文格式错误
		tCmd.byStatus=RES_CMD_INVALID;
		Send25(tCmd.byStatus);
		return;
	}

	pt++;
	iSec=*pt;
	if (SET_Write_Set(caSetBuf,(BYTE)iSec) == TRUE)
		tCmd.byStatus =RES_SET_WROK;
	else 
		tCmd.byStatus =RES_SET_WRFAIL;

	Send25(tCmd.byStatus);
}

//96:读取当前运行定值区
void ReplyCmd96(BYTE *sBuf,WORD wFrameCounter)
{
	extern TSECTIONINFO tSecInfo;
	BYTE *cpAck;
	if( g_tSysErr.bErr[EV_SETERR] )
	{
		Send25(RES_SET_INVALID);
	}
	else
	{
		cpAck=caAckBuf;
		*cpAck++=6;
		*cpAck++=byDst;
		*cpAck++=byCpuN;
		*cpAck++=0x20;
		*cpAck++=1;
		*cpAck++=tSecInfo.byCurSec;
		MakeCs(caAckBuf);
		SciPutn(caAckBuf);
	}
}

//97:查询操作结果
void ReplyCmd97(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt;
	pt =sBuf+3;
	if(*pt++ != 1)
	{
		Send15();
	}
	else if(tCmd.byCmd != *pt)
	{
		Send16();     //找不到指定操作
	}
	else
	{
		Send25(tCmd.byStatus);
	}
}

//预发遥控命令
void ReplyCmd98(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt,*cpAck;
	pt =sBuf+3;

	if( !Is_Local( _g_dDiValue ) )
	{
		Send15();
		return;
	}

	if(*pt++ != 3)
	{
		Send15();
		return;
	}
	//记录开出传动命令参数
	//返回26报文供主站校验
	cpAck =caTmpBuf;
	*cpAck++=*pt++;
	*cpAck++=*pt++;
	*cpAck++=*pt++;
	cpAck=caAckBuf;
	pt =caTmpBuf;
	*cpAck++=8;
	*cpAck++=byDst;
	*cpAck++=byCpuN;
	*cpAck++=0x26;
	*cpAck++=3;
	*cpAck++=*pt++;
	*cpAck++=~*pt++;
	*cpAck++=~*pt++;
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);
	//设置通讯命令状态
	tCmd.wDelay =0;
	tCmd.byCmd =0x98;
	tCmd.byStatus =RES_RMT_READY;
}

//99:遥控命令
void ReplyCmd99(BYTE *sBuf,WORD wFrameCounter)
{
	extern TSECTIONINFO tSecInfo;
	TSECTIONINFO tTempSecInfo;
	BYTE *pt,b1,b2,b3;

	if( !Is_Local( _g_dDiValue ) )
	{
		Send15();
		return;
	}

	//校验命令长度
	pt=sBuf+3;
	if(*pt++ != 3)
	{
		Send15();
		return;
	}
	//校验命令序列
	if((tCmd.byCmd != 0x98) || (tCmd.byStatus != RES_RMT_READY))
	{
		tCmd.byCmd=0x99;
		tCmd.byStatus=RES_RMT_CHKFAIL;
		Send25(tCmd.byStatus);
		return;
	}
  
	tCmd.byCmd=0x99;
	//校验命令参数
	b1=*pt++;//command
	b2=*pt++;//object
	b3=*pt++;//code
	pt=caTmpBuf;
	if((*pt++ != b1) || (*pt++ != (BYTE)~b2) || (*pt != (BYTE)~b3))
	{
		tCmd.byStatus=RES_RMT_CHKFAIL;
		Send25(tCmd.byStatus);
		return;
	}
	//执行相应的遥控命令
	switch(b1)
	{
	case 1:	//切换运行定值区
		if(b2 > SEC_NUMBER-1)     //校验定值区号的合法性
		{
			tCmd.byStatus=RES_RMT_NUMERR;
			Send25(tCmd.byStatus);
			return;
		}
		else if(b3 != 0x5A)       //校验操作代码
		{
			tCmd.byStatus=RES_RMT_CODERR;
			Send25(tCmd.byStatus);
			return;
		}

		if (SET_Switch_Zone(b2) == TRUE)
			tCmd.byStatus =RES_RMT_OK;
		else
			tCmd.byStatus =RES_RMT_FAIL;
		Send25(tCmd.byStatus);
		break;

	case 2:	//遥控软压板
		//校验遥控压板编号的合法性
		if((b2 > FUNCTION_CONTROL_NUMBER)|| (b2==0))  //
		{
			tCmd.byStatus=RES_RMT_NUMERR;
			Send25(tCmd.byStatus);
			return;
		}
		else if((b3 != 0x5A) && (b3 != 0xA5)) //校验操作代码   将"||"改为"&&"
		{
			tCmd.byStatus=RES_RMT_CODERR;
			Send25(tCmd.byStatus);
			return;
		}
		// 取当前运行状态
		tTempSecInfo =tSecInfo;
		if(b3 == 0x5A)
		{
			// 遥控投压板
			tTempSecInfo.dFunctionControl&=~((DWORD)0x1<<(b2-1));
			tTempSecInfo.dFunctionControlRev=~(tTempSecInfo.dFunctionControl);
			if( !FM_Write_Set_Head((BYTE*)&tTempSecInfo) )
			{
				tCmd.byStatus=RES_RMT_FAIL;
				Send25(tCmd.byStatus);
				return;	
			}
			if( !FM_Read_Set_Head( (BYTE*)&tTempSecInfo ) )
			{
				tCmd.byStatus=RES_RMT_FAIL;
				Send25(tCmd.byStatus);
				return;
			}
		}
		else
		{
			// 遥控切压板
			tTempSecInfo.dFunctionControl|=(DWORD)0x1 << (b2-1);
			tTempSecInfo.dFunctionControlRev=~(tTempSecInfo.dFunctionControl);
			if(!FM_Write_Set_Head((BYTE*)&tTempSecInfo))
			{
				tCmd.byStatus=RES_RMT_FAIL;
				Send25(tCmd.byStatus);
				return;	
			}
			if( !FM_Read_Set_Head((BYTE*)&tTempSecInfo) )
			{
				tCmd.byStatus=RES_RMT_FAIL;
				Send25(tCmd.byStatus);
				return;
			}
		}
		tSecInfo=tTempSecInfo;
		tCmd.byStatus=RES_RMT_OK;
		Send25(tCmd.byStatus);

⌨️ 快捷键说明

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