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

📄 com_232.c

📁 232串口通讯的驱动
💻 C
📖 第 1 页 / 共 4 页
字号:

		GL_Fill_Forms( pGDRun, pRunSet );
		break;

	case 4:
		if((b3 == 0xA5) || (b3 == 0x5A))
		{
			if(b3 == 0xA5)
			{
				//退出测试模式
			}
			else
			{
				//进入测试模式
			}
			tCmd.byStatus=RES_RMT_OK;
			Send25(tCmd.byStatus);
		}
		else
		{
			//命令无效
			tCmd.byStatus=RES_RMT_CODERR;
			Send25(tCmd.byStatus);
		}
		break;
	default:
		tCmd.byStatus=RES_RMT_CMDERR;
		Send25(tCmd.byStatus);
	}
}

//预发开出传动命令
void ReplyCmd9A(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt,*cpAck;

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

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

}

//9B:开出传动命令
void ReplyCmd9B(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt,b1,b2,b3;

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

	pt=sBuf+3;
	if(*pt++ != 3) //校验命令长度,N=3
	{
		Send15();
		return;
	}
	//校验命令序列
	if((tCmd.byCmd != 0x9a) || (tCmd.byStatus != RES_DO_READY))
	{
		tCmd.byCmd=0x9b;
		tCmd.byStatus=RES_DO_CHKFAIL;
		Send25(tCmd.byStatus);
		return;
	}

	tCmd.byCmd=0x9b;
	//校验命令参数
	b1=*pt++; //类型
	b2=*pt++; //对象号
	b3=*pt++; //操作代码
	pt=caTmpBuf;
	if((*pt++ != b1) || (*pt++ != (BYTE)~b2) || (*pt != (BYTE)~b3))
	{
		tCmd.byStatus=RES_DO_CHKFAIL;
		Send25(tCmd.byStatus);
		return;
	}
	else if(b1 != 0x5a)
	{
		tCmd.byStatus=RES_DO_CMDERR;
		Send25(tCmd.byStatus);
		return;
	}

	if((b2 == 0xff) || (b2 == DO_FG))
	{
		extern  volatile DWORD dTCounter;
		DWORD TempT;
		b2 =DO_FG;
		_RstAllDo();
		Digital_Out((WORD)b2|DO_PASSWORD);
		MM_Do_Indicator((BYTE)b2);
		TempT=dTCounter;
		while((dTCounter-TempT) < 25); //延时25ms
		_RstAllDo();
		tCmd.byStatus=RES_DO_OK;
		Send25(tCmd.byStatus);
		return;
	}
	else if(b2 > (DOTAB_NUM-1) || b2 < 1)
	{
		tCmd.byStatus=RES_DO_NUMERR;
		Send25(tCmd.byStatus);
		return;
	}
  
	//Do that operation(assert or reset)
	switch(b3)
	{
	case 0xa5:	//assert
		Digital_Out((WORD)b2|DO_PASSWORD);
		MM_Do_Indicator((BYTE)b2);
		tCmd.byStatus=RES_DO_OK;
		Send25(tCmd.byStatus);
		break;
	case 0xa3:	//reset
		Digital_Back_Out(b2|DO_PASSWORD);
		tCmd.byStatus=RES_DO_OK;
		Send25(tCmd.byStatus);
		break;
	default:
		tCmd.byStatus=RES_DO_CODERR;
		Send25(tCmd.byStatus);
	}
}

//读取有效定值区
void ReplyCmd9C(BYTE *sBuf,WORD wFrameCounter)
{
	extern TSECTIONINFO tSecInfo;
	BYTE *cpAck,*pt;
	int i,k;
	cpAck=caAckBuf;
	k=0;
	pt=(BYTE *)(&tSecInfo.szSections[0]);
	for(i=SEC_NUMBER; i > 0; i--,pt++)
	{
		if((*pt) == 1)
		{
			k++;
		}
	}
	if((k != tSecInfo.byValidNum) || (k > SEC_NUMBER))
	{
		k=0;
	}
	*cpAck++=(BYTE)(k+7);
	*cpAck++=byDst;
	*cpAck++=byCpuN;
	*cpAck++=0x1E;
	*cpAck++=(BYTE)(k+2);
	*cpAck++=RELAY_TYPE_LO;
	*cpAck++=RELAY_TYPE_HI;
	pt=(BYTE *)(&tSecInfo.szSections[0]);
	for(i=0; i < SEC_NUMBER; i++,pt++)
	{
		if((*pt) == 1)
		{
			*cpAck++=(BYTE)i;
			k--;
		}
	}
  
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);
}

//9E:读内存单元
void ReplyCmd9E(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt;
	pt=sBuf+3;
	if(*pt != 5)
	{
		Send15();
	}
	else
	{
		pt=sBuf+8;
		tMemRdWr.byLen=*pt--;
		tMemRdWr.dAddr=((DWORD)(*pt--))*256;
		tMemRdWr.dAddr+=(DWORD)(*pt--);
		tMemRdWr.dAddr=tMemRdWr.dAddr*256+(*pt--);
		tMemRdWr.byType=*pt;
		Send2E();
	}
}

//9F:写内存单元
void ReplyCmd9F(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE c,*pt,*pt1;
	pt=sBuf+8;
	tMemRdWr.byLen=*pt--;
	tMemRdWr.dAddr=((DWORD)(*pt--))*256;
	tMemRdWr.dAddr+=(DWORD)(*pt--);
	tMemRdWr.dAddr=tMemRdWr.dAddr*256+(*pt--);
	tMemRdWr.byType=*pt;
	if(tMemRdWr.byLen > 0xf0)
	{
		Send15();
		return;
	}
	switch(tMemRdWr.byType)
	{
	case 1:	//RAM
		pt=(BYTE *)tMemRdWr.dAddr,pt1=sBuf+9;
		c=tMemRdWr.byLen;
		while(c)
		{
			*pt=*pt1,c--;
			if(*pt++ != *pt1++) break;
		}
		if(c)
			Send25(RES_MEM_WRFAIL);
		else
			Send25(RES_MEM_OK);
		break;

	case 3:	//Flash RAM
		Send25(RES_MEM_WRFAIL);  //Memory update failure(No Flash RAM)
		break;
	case 4:	//EPROM
		Send25(RES_MEM_WRFAIL);  //Memory update failure(EPROM cann't be modified)
		break;
	default:
		Send25(RES_CMD_INVALID); //Invalid command
	}
}

//A0:读取有效值和相位角
void ReplyCmdA0(BYTE *sBuf,WORD wFrameCounter)
{
	Send30(sBuf);
}

//A1:读取增益系数
void ReplyCmdA1(BYTE *sBuf,WORD wFrameCounter)
{
	extern short iaFactors[];
	BYTE *pt;
	WORD i;
	DWORD dw;
	pt=sBuf+4;
	i=(WORD)(*pt);
	//ff=所有通道
	if(i == 0xff)
	{
		pt=caAckBuf,i=AI_NUMBER*2;
		*pt++=(BYTE)(i+5);
		*pt++=byDst,*pt++=byCpuN;
		*pt++=0x31;
		*pt++=(BYTE)i;
		for(i=0;i<AI_NUMBER;i++)
		{
			//8=0x4000*0.0005
			dw=HexFix(((((DWORD)iaFactors[i])+8)<<16)/0x4000L)>>4;
			//x.xyy format
			*pt++=(BYTE)dw;
			*pt++=(BYTE)(dw>>8);
		}
	}
	//指定的一个通道
	else
	{
		if(i > AI_NUMBER || i < 1)
		{
			Send25(RES_CHN_INVALID);
			return;
		}
		pt=caAckBuf;
		*pt++=7;
		*pt++=byDst,*pt++=byCpuN;
		*pt++=0x31;
		*pt++=2;
		//8=0x4000*0.0005
		dw=HexFix(((((DWORD)iaFactors[i-1])+8)<<16)/0x4000L)>>4;
		//x.xyy format
		*pt++=(BYTE)dw;
		*pt++=(BYTE)(dw>>8);
	}
  
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);
}

//A2:设置模拟量通道的增益系数
//  允许范围是0.95<f<1.05
void ReplyCmdA2(BYTE *sBuf,WORD wFrameCounter)
{
	extern short iaFactors[];
	BYTE *pt;
	int i;
	WORD ch;
	DWORD dw;
	pt=sBuf+3;
	//i=N
	i =*pt++;
	//N=3,指定通道的增益系数
	if(i == 3)
	{
		//校验通道号
		ch=*pt++;
		if(ch < 1 || ch > AI_NUMBER)
		{
			Send25(RES_CHN_INVALID);
			return;
		}

		dw=*pt++;
		dw+=((DWORD)*pt)<<8;
		i=(short)((FixHex(dw<<4)*0x4000L)>>16);
		if(i < iFacMinVal || i > iFacMaxVal)
		{
			Send25(RES_CHN_FAIL);
			return;
		}
		iaFactors[ch-1]=(short)i;
		if( FAC_Write_Factors() )
		{
			Send25(RES_CHN_OK);
		}
		else
		{
			Send25(RES_CHN_FAIL);
		}
		return;
	}
	//ff=所有通道 N=通道数*2+1
	if(i == AI_NUMBER*2+1)
	{
		//通道号=ff?
		if(*pt++ != 0xff)
		{
			Send25(RES_CHN_INVALID);
			return;
		}
		for(ch =0; ch < AI_NUMBER; ch++)
		{
			dw =((DWORD)*pt++) & 0x0ffL;
			dw+=(((DWORD)*pt++) << 8) & 0x0ffffL;
			i =(short)((FixHex(dw << 4)*0x4000L) >> 16);
			if(i < iFacMinVal || i > iFacMaxVal)
			{
				//增益系数超范围,重新读取增益系数
				FAC_Read_Factors();
				Send25(RES_CHN_FAIL);
				return;
			}
			else
			{
				iaFactors[ch]=(short)i;
			}
		}
		if(FAC_Write_Factors())
		{
			Send25(RES_CHN_OK);
		}
		else
		{
			Send25(RES_CHN_FAIL);
		}
		return;
	}
	//返回通道号无效
	Send25(RES_CHN_INVALID);
}

//应答压板操作确认
void ReplyCmdA3(BYTE *sBuf,WORD wFrameCounter)
{
	Send16();
}

//A4:读取内部定值信息,返回34报文
void ReplyCmdA4(BYTE *sBuf,WORD wFrameCounter)
{
	int i,k;
	int n;
	BYTE *cpAck;

	//校验报文格式
	cpAck=sBuf+3;
	if(*cpAck++!=2)
	{
		Send15();
		return;
	}
	else if(*cpAck++!=0xa4)
	{
		Send15();
		return;
	}
	//起始序号
	k=((int)(*cpAck))*10;

	if(k>=CSTSET_NUMBER)
	{
		k=0;
		n=0;
	}
	else if(k+10 >= CSTSET_NUMBER)
	{
		n=CSTSET_NUMBER-k;
	}
	else
	{
		n=10;
	}

	cpAck=caAckBuf;
	*cpAck++=(BYTE)(n*22+2+5);
	*cpAck++=byDst;
	*cpAck++=byCpuN;
	*cpAck++=0x34;
	*cpAck++=(BYTE)(n*22+2);//N
	*cpAck++=(BYTE)k;       //第一个信息元素序号
	*cpAck++=(BYTE)n;		  //本次发送的信息数目
	while(n > 0)
	{
		//n个信息元素
		//每个信息元素的定义为:
		//    定值名称(16字节)
		//    最小值(3字节)
		//    最大值(3字节)
		BYTE *pt;
		TSETVAL *psv;
		pt=(BYTE *)tCstSetTable[k].szName;
		for(i=16; i > 0; i--)
		{
		  *cpAck++=*pt++;
		}
		psv=(TSETVAL *)cpAck;
		*psv++=tCstSetTable[k].tMin;
		*psv++=tCstSetTable[k].tMax;
		cpAck=(BYTE *)psv;
		k++;
		n--;
	}
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);
}

//A5:读取内部定值
void ReplyCmdA5(BYTE *sBuf,WORD wFrameCounter)
{
	int i;
	BYTE *cpAck,*pt;
	//校验报文格式
	cpAck=sBuf+3;
	if(*cpAck++ != 1)
	{
		Send15();
		return;
	}
	else if(*cpAck != 0xa5)
	{
		Send15();
		return;
	}

	SET_Read_Cstset(caCstSetBuf);
	pt=caCstSetBuf;
	cpAck=caAckBuf;
	*cpAck++=(BYTE)(CSTSET_NUMBER*3+7);
	*cpAck++=byDst;
	*cpAck++=byCpuN;
	*cpAck++=0x35;
	*cpAck++=(BYTE)(CSTSET_NUMBER*3+2);
	*cpAck++=RELAY_TYPE_LO;
	*cpAck++=RELAY_TYPE_HI;
	for(i=CSTSET_NUMBER*3; i > 0; i--)
	{
		*cpAck++=*pt++;
	}
	MakeCs(caAckBuf);
	SciPutn(caAckBuf);
}

//A6:设置内部定值
void ReplyCmdA6(BYTE *sBuf,WORD wFrameCounter)
{
	BYTE *pt,*cp;
	int i;

	SET_Read_Cstset(caCstSetBuf);
	pt=sBuf+3;
	i=*pt;
	if(i != CSTSET_NUMBER*3+2)
	{
		Send15();    //报文格式错误
	}
	pt =sBuf+6;
	cp =caCstSetBuf;
	for(i =CSTSET_NUMBER*3; i > 0; i--)
	{
		*cp++=*pt++;
	}
	if ( !FM_Write_Cstset( caCstSetBuf ) )
	{
		Send25(RES_CSTSET_FAIL);	//设置内部定值失败
	}
	else if(SET_Switch_Runset() != TRUE)
	{
		Send25(RES_CSTSET_FAIL);
	}
	else
	{
		Send25(RES_CSTSET_OK);
	}
}

//读取扰动数据
void ReplyCmdAE(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(0xAF,19,parm);
	}
}

//读取扰动记录表/扰动记录(录波数据)
void ReplyCmdAF(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(0xAF,task,parm);
	}
}

//CMD_AA:读取采样值
void ReplyCmdAA(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(0xAA,task,parm);
	}
}

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

//读取报告中的整定值
void ReplyCmdB0(BYTE *sBuf,WORD wFrameCounter)
{
	int  i;
	WORD wRptN;
	FM_REPORT_HEADER *pHead;

⌨️ 快捷键说明

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