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

📄 modbus0.c

📁 我用ARM写的一些东西
💻 C
字号:
/******************************************************************************************


									TX0,RX0 Used Asigned 485


********************************************************************************************/


#include "config.h"
 
//unsigned char CmdBuf[10];
extern unsigned char X4Dat[65];
extern unsigned char X3Dat[100];
extern uint8 RecDat0[20];
extern uint8	X0Dat[5];
extern uint8 TureBdTmp;
extern uint16 StartTm;
extern uint16 WindowsFg;

extern uint16 TpumSpeed;
extern float TpumVaccum;
extern float LeakBase;
extern uint8 LeakExp;
extern uint8 CalBase  ;
extern uint8 CalExp	  ;	
extern uint8 Volum;

extern uint8  AlarmBase;
extern uint8  AlarmExp;
extern uint8  DecPort;
unsigned char OutBuf0[50];
uint8 SavePar0;
extern int8 RecLen0;
extern unsigned char const auchCRCHi[];
extern unsigned  char const auchCRCLo[] ;

extern void Delay(void);


extern unsigned short CRC(unsigned char dat[] , unsigned short usDataLen);

void SendX340(unsigned int Add,unsigned int Num1,uint8 Dat[])
{
	unsigned char i,Len;
	unsigned int CrcTmp;
	OutBuf0[0]=0x01;
	OutBuf0[1]=RecDat0[1];
	OutBuf0[2]=Num1*2;
		
	for(i=0;i<Num1*2;i++)
	{
		//OutBuf[i+3]=Dat[Add*2+i];	
		//OutBuf[i+4]=Dat[Add*2+i+1] ;
		OutBuf0[i+3]=Dat[Add*2+i];	

	}
	Len=i+3;

	CrcTmp=CRC(OutBuf0,Len);
	
	OutBuf0[Len+1]=CrcTmp&0x00ff;
	OutBuf0[Len]=(CrcTmp>>8)&0x00ff;

	Delay();
	for(i=0;i<Len+2;i++)
	{

		U0THR =OutBuf0[i];
		while ((U0LSR & 0x20) == 0);	// 等待数据发送完毕
	}
	Delay();	
}

void SendX010(unsigned int Add,unsigned int Num1,uint8 Dat[])
{
	unsigned char i,Len;
	unsigned int CrcTmp;
	OutBuf0[0]=0x01;
	OutBuf0[1]=RecDat0[1];
	OutBuf0[2]=Num1*2;
		
	for(i=0;i<Num1*2;i++)
	{
		//OutBuf[i+3]=Dat[Add*2+i];	
		//OutBuf[i+4]=Dat[Add*2+i+1] ;
		OutBuf0[i+3]=Dat[Add*2+i];	

	}
	Len=i+3;

	CrcTmp=CRC(OutBuf0,Len);
	
	OutBuf0[Len+1]=CrcTmp&0x00ff;
	OutBuf0[Len]=(CrcTmp>>8)&0x00ff;

	Delay();
	for(i=0;i<Len+2;i++)
	{

		U0THR =OutBuf0[i];
		while ((U0LSR & 0x20) == 0);	// 等待数据发送完毕
	}
	Delay();	
}


void SetResp0(unsigned int Add,unsigned int Num1)
{
	unsigned char i,Len;
	unsigned int CrcTmp;
	OutBuf0[0]=0x01;
	OutBuf0[1]=RecDat0[1];
	OutBuf0[2]=Add>>8&0x00ff;
	OutBuf0[3]=Add&0x00ff;
	//OutBuf[4]=RecDat[4];
	//OutBuf[5]=RecDat[5];

	for(i=0;i<Num1*2;i++)
	{
		//OutBuf[i+4]=X4Dat[Add*2+i];	
		//OutBuf[i+5]=X4Dat[Add*2+i+1] ;
		OutBuf0[i+4]=X4Dat[Add*2+i];	
	}
	//i=1;
	Len=i+4;

	CrcTmp=CRC(OutBuf0,Len);
	OutBuf0[Len+1]=CrcTmp&0x00ff;
	OutBuf0[Len]=(CrcTmp>>8)&0x00ff;
	Delay();
	for(i=0;i<Len+2;i++)
	{
		U0THR =OutBuf0[i];
		while ((U0LSR & 0x20) == 0);	// 等待数据发送完毕
	}
	Delay();	
}

void RespX010(unsigned int Add)
{
	unsigned char i,Len;
	unsigned int CrcTmp;
	OutBuf0[0]=0x01;
	OutBuf0[1]=RecDat0[1];
	OutBuf0[2]=Add>>8&0x00ff;
	OutBuf0[3]=Add&0x00ff;
	OutBuf0[4]=RecDat0[4];
	OutBuf0[5]=RecDat0[5];

	//for(i=0;i<Num1*2;i++)
	//{
		//OutBuf[i+4]=X4Dat[Add*2+i];	
		//OutBuf[i+5]=X4Dat[Add*2+i+1] ;
		//OutBuf[i+4]=X4Dat[Add*2+i];	
	//}
	//i=1;
	Len=6;

	CrcTmp=CRC(OutBuf0,Len);
	OutBuf0[Len+1]=CrcTmp&0x00ff;
	OutBuf0[Len]=(CrcTmp>>8)&0x00ff;
	Delay();
	for(i=0;i<Len+2;i++)
	{
		U0THR =OutBuf0[i];
		while ((U0LSR & 0x20) == 0);	// 等待数据发送完毕
	}
	Delay();	
}

		
void MbusDel0(void)
{
	uint8 i,CmdAdd,Num;
	float TmpVcm;
	if((RecLen0>0)||RecLen0>6)
	{
		
		for(i=RecLen0;i>0;i--)
		{
			//CmdBuf[i-1]=RecDat[i-1];
		}
		//CrcRes= CRC(RecDat,RecLen-2);
		if ((RecDat0[RecLen0-2]*256+RecDat0[RecLen0-1])==CRC(RecDat0,RecLen0-2) )//Cmd Right
		{
			if (RecDat0[0]==0x1)//设备号为1
			{
				switch(RecDat0[1])
				{
					case 1:
						CmdAdd=RecDat0[2]*256+RecDat0[3];
						Num=(RecDat0[4]*256+RecDat0[5])/16;
						SendX340(CmdAdd,Num,X0Dat);						
					break;
					case 2:
					break;
					case 3:
						//X4Dat[61]=TureBdTmp;
						//X4Dat[60]=BdTmp/256;
						X4Dat[0]=AlarmBase/256;
						X4Dat[1]=AlarmBase;
						X4Dat[2]=AlarmExp/256;
						X4Dat[3]=AlarmExp;
						
						X4Dat[4]=Volum/256;
						X4Dat[5]=Volum;
						X4Dat[6]=Unit/256;
						X4Dat[7]=Unit%256;
						
						X4Dat[8]=CalBase/256;
						X4Dat[9]=CalBase;
						X4Dat[10]=CalExp/256;;
						X4Dat[11]=CalExp;
						
						X4Dat[12]=DecPort/256;;
						X4Dat[13]=DecPort;
						
						X4Dat[16]=VacumUnit/256;
						X4Dat[17]=VacumUnit%256;

						X4Dat[18]=FltMod/256;
						X4Dat[19]=FltMod%256;
						
						X4Dat[38]=RunHour/256;
						X4Dat[39]=RunHour%256;
						X4Dat[40]=0;
						X4Dat[41]=0;
						X4Dat[42]=RunMin/256;
						X4Dat[43]=RunMin%256;
						X4Dat[44]=0;
						X4Dat[45]=0;
						X4Dat[46]=ErrTimes/256;
						X4Dat[47]=ErrTimes%256;
						X4Dat[48]=0;
						X4Dat[49]=0;																														
						
						CmdAdd=RecDat0[2]*256+RecDat0[3];
						Num=RecDat0[4]*256+RecDat0[5];
						SendX340(CmdAdd,Num,X4Dat);

					break;
					case 4:
						X3Dat[0]=WindowsFg/256;
						X3Dat[1]=WindowsFg%256;
						
						X3Dat[2]=StartTm/256;
						X3Dat[3]=StartTm%256;
						
						X3Dat[4]=CalTm/256;
						X3Dat[5]=CalTm%256;
						
					

						X3Dat[8]=(int16)(LkPtVaccumMain) /256;
						X3Dat[9]=(int16)(LkPtVaccumMain) % 256;

						X3Dat[10]=(int16)(TpumVaccumMain)/256;
						X3Dat[11]=(int16)(TpumVaccumMain)%256;
						
						
						TmpVcm=LkPtVaccum;
						i=0;
						if((LkPtVaccum<10)&&(LkPtVaccum!=0))
						{
							X3Dat[16]=0;//检漏口压力符号
							X3Dat[17]=1;//负号
														
							while(TmpVcm<10)
							{
								TmpVcm=TmpVcm*10;
								i++;
							}

							X3Dat[12]=(int8)(TmpVcm)/256;
							X3Dat[13]=(int8)(TmpVcm)%256;	

							X3Dat[14]=(int8)(i-1) /256;
							X3Dat[15]=(int8)(i-1) % 256;
							
						}
						else if((LkPtVaccum>=100))
						{
							X3Dat[16]=0;//检漏口压力符号
							X3Dat[17]=0;//+号
														
							while((uint32)(TmpVcm)>=100)
							{
								TmpVcm=TmpVcm/10;
								i++;
							}

							X3Dat[12]=(int8)(TmpVcm)/256;
							X3Dat[13]=(int8)(TmpVcm)%256;	
													
							X3Dat[14]=(int8)(i+1) /256;
							X3Dat[15]=(int8)(i+1) % 256;						
						}
						
						
						TmpVcm=TpumVaccum;
						i=0;
						if((TpumVaccum<10)&&(TpumVaccum!=0))
						{
							X3Dat[26]=0;//压力符号
							X3Dat[27]=1;//负号
														
							while(TmpVcm<10)
							{
								TmpVcm=TmpVcm*10;
								i++;
							}

							X3Dat[22]=(int8)(TmpVcm)/256;
							X3Dat[23]=(int8)(TmpVcm)%256;	
													
							X3Dat[24]=(int8)(i-1) /256;
							X3Dat[25]=(int8)(i-1) % 256;
						}
						else  if((TpumVaccum>=100))
						{
							X3Dat[26]=0;//压力符号
							X3Dat[27]=0;//+号
														
							while((uint32)(TmpVcm)>=100)
							{
								TmpVcm=TmpVcm/10;
								i++;
							}

							X3Dat[22]=(int8)(TmpVcm)/256;
							X3Dat[23]=(int8)(TmpVcm)%256;	
													
							X3Dat[24]=(int8)(i+1) /256;
							X3Dat[25]=(int8)(i+1) % 256;						
						}		
												

						X3Dat[18]=(int8)(LeakBase)/256;
						X3Dat[19]=(int8)(LeakBase)%256;
						
						X3Dat[20]=LeakExp/256;
						X3Dat[21]=LeakExp%256;
						
						
						X3Dat[30]=(uint16)(RemCal)/256;
						X3Dat[31]=(uint16)(RemCal)%256;
						X3Dat[32]=0;
						X3Dat[33]=0;														
 
						X3Dat[34]=StartBar/256;
						X3Dat[35]=StartBar%256;
						
 
						X3Dat[36]=DxCurent/256;
						X3Dat[37]=DxCurent%256;
						
						X3Dat[38]=TrapCurent/256;
						X3Dat[39]=TrapCurent%256;
						
						X3Dat[40]=SigVol/256;
						X3Dat[41]=SigVol%256;
						
						
					
						X3Dat[42]=LkVol/256;
						X3Dat[43]=LkVol%256;
						
						X3Dat[44]=PumVol/256;
						X3Dat[45]=PumVol%256;
						
						X3Dat[46]=0;
						X3Dat[47]=0;
						
						X3Dat[48]=TureBdTmp/256;
						X3Dat[49]=TureBdTmp%256;

						X3Dat[50]=AmpRate/256;
						X3Dat[51]=AmpRate%256;

						X3Dat[52]=Xx/256;
						X3Dat[53]=Xx%256;
						
						X3Dat[54]=0;
						X3Dat[55]=(int8)(MsOk&1);
						X3Dat[56]=0;
						X3Dat[57]=(int8)(TmpOk&1);
						X3Dat[58]=0;
						if((IO0PIN&Var1)==0)
							X3Dat[59]=0;
						else
							X3Dat[59]=1;
								
						X3Dat[60]=0;
						if((IO0PIN&Var2)==0)
							X3Dat[61]=0;
						else
							X3Dat[61]=1;							

						X3Dat[62]=0;
						if((IO0PIN&Var3)==0)
							X3Dat[63]=0;
						else
							X3Dat[63]=1;
							
						X3Dat[64]=0;
						if((IO0PIN&Var4)==0)
							X3Dat[65]=0;
						else
							X3Dat[65]=1;
							
						X3Dat[66]=0;
						if((IO1PIN&Var5)==0)
							X3Dat[67]=0;
						else
							X3Dat[67]=1;						

						X3Dat[68]=0;
						if((IO0PIN&Var6)==0)
							X3Dat[69]=0;
						else
							X3Dat[69]=1;
							

							X3Dat[70]=0;
							X3Dat[71]=(int8)(Zeroing&0x01);
																																																
						CmdAdd=RecDat0[2]*256+RecDat0[3];
						Num=RecDat0[4]*256+RecDat0[5];
						SendX340(CmdAdd,Num,X3Dat);	
										
					break;
					case 5:
						CmdAdd=RecDat0[2]*256+RecDat0[3];
						
						if (RecDat0[4]==0xff)
							X0Dat[CmdAdd/8]=X0Dat[CmdAdd/8]|(1<<(CmdAdd%8));
						else
							X0Dat[CmdAdd/8]=X0Dat[CmdAdd/8]&(~(1<<(CmdAdd%8)));	
						RespX010(CmdAdd);
				
					break;
					case 6:
						X4Dat[61]=TureBdTmp;
						//X4Dat[60]=BdTmp/256;
						CmdAdd=RecDat0[2]*256+RecDat0[3];
						Num=RecDat0[4]*256+RecDat0[5];
						SendX340(CmdAdd,Num,X4Dat);					
					break;
					case 16:
					


						
						CmdAdd=RecDat0[2]*256+RecDat0[3];
						Num=RecDat0[4]*256+RecDat0[5];
						
						for(i=0;i<Num*2;i++)
						{
							X4Dat[CmdAdd*2+i]=RecDat0[7+i];
							//X4Dat[CmdAdd*2]=RecDat[7];
							//X4Dat[CmdAdd*2+1]=RecDat[8];
						}
						
						AlarmBase=256*X4Dat[0]+X4Dat[1];
						AlarmExp =256*X4Dat[2]+X4Dat[3];
						Volum    =256*X4Dat[4]+X4Dat[5];	
						Unit	 =256*X4Dat[6]+X4Dat[7];	
						CalBase  =256*X4Dat[8]+X4Dat[9];
						CalExp  =256*X4Dat[10]+X4Dat[11];
						
						DecPort  =256*X4Dat[12]+X4Dat[13];
						VacumUnit=256*X4Dat[16]+X4Dat[17];
						FltMod   =256*X4Dat[18]+X4Dat[19];
						SavePar0=1;
	
						SetResp0(CmdAdd,Num);
					break;
					default:
					 RecLen0=0;
					break;

				}
			}	
		}
		else
		{
			RecLen0=0;
			
		}

		RecLen0=0;
		
	}
	else if(RecLen0<6)
	{
		RecLen0=0;
}
}

⌨️ 快捷键说明

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