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

📄 232demo.cpp

📁 完整的c程序
💻 CPP
字号:
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include "Etr232i.h"
#include "rs232x3.h"
#include "Eta102.h"

#define COM_NUM COM3
#define LOOP 4
const double dTimeVal=0.01;
double dValue[4]={0.0,0.0,0.0,0.0};
double dOldError=0.0;
double dError=0.0;
double tsamp=1;
double olddOut=0.0;
int spp=0;
unsigned char InStr[256];
unsigned char OutStr[132];
int count;
struct PLCDATA
{
	unsigned int DREG[500];
	unsigned int XREG[6];
	unsigned int YREG[6];
	unsigned int MREG[80];
}plc_dat;

int DATA[4][30];

int *pIWet,*pIVol;
int FindTable(int vol,int *table)
{
	int i=0;
	while((i<21)&&(vol>=table[i]))
	{
		i++;
	}
	return i;
}
int Wetzh(int vol,int *vtb,int *wtb)
{
	int wet=0,indx;
	float temp,temp1;
	indx=FindTable(vol,vtb);
	temp=vol-vtb[indx-1];
	temp1=wtb[indx]-wtb[indx-1];
	temp=temp*temp1;
	temp1=vtb[indx]-vtb[indx-1];
	temp=temp/temp1;
	wet=temp+wtb[indx-1];
	return wet;

}
// return = 0: data is unavailable
//        > 0: data is available, and in pDat
int RS232GetData( int PortNum, char* pDat, int len )
{
	int i, i1;
	clock_t start, end;
	start = end = clock();
	for( i=0; i<len; )
	{
		i1 = GetInputData( PortNum );
		end = clock( );
		if( i1!=-1 )
		{
			start = end;
			pDat[i] = (char)i1;
			i++;
		}
		if( (end-start)>2 )
			break;
	}
	return i;
}

int RS232SendData( int PortNum, char* pDat, int len )
{
	int i;
	for( i=0; i<len; i++ )
	   PutOutputData( PortNum, pDat[i] );
	StartSend( PortNum );
	return 0;
}
unsigned int AsciiToHex(unsigned char Ascii)
{
	unsigned int hex;
	hex=(Ascii>0x39)?Ascii-0x41+0xa:Ascii-0x30;
	return hex;
}
unsigned char HexToAscii(unsigned char hex)
{
	unsigned char Ascii;
	Ascii=(hex<10)?hex+0x30:hex+0x41-0xa;
	return Ascii;
}


unsigned int GetAddress()
{
	unsigned i;
	i=(AsciiToHex(InStr[2])<<12)|(AsciiToHex(InStr[3])<<8)
		|(AsciiToHex(InStr[4])<<4)|AsciiToHex(InStr[5]);
	return i;
}
unsigned int GetBitAddress()
{
	unsigned int i,j=0;
	i=(AsciiToHex(InStr[4])<<12)|(AsciiToHex(InStr[5])<<8)
		|(AsciiToHex(InStr[2])<<4)|AsciiToHex(InStr[3]);

	if((i>=0x400)&&(i<0x500))
		j=i-0x0400;
	if((i>=0x500)&&(i<0x800))
		j=i-0x0500;
	if(i>=0x0800)
		j=i-0x0800;
	return j;
}

unsigned int GetREGBitAddress()
{
	unsigned int i,j=0;
	i=(AsciiToHex(InStr[4])<<12)|(AsciiToHex(InStr[5])<<8)
		|(AsciiToHex(InStr[2])<<4)|AsciiToHex(InStr[3]);
	if((i>=0x400)&&(i<0x500))
		j=1;
	if((i>=0x500)&&(i<0x800))
		j=2;
	if(i>=0x0800)
		j=3;
	return j;

}

int GetDataNum(unsigned char *InpDat)
{
	int num=0,i;
	i=AsciiToHex(InpDat[6])<<4;
	num=AsciiToHex(InpDat[7]);
	num=(i|num)/2;
	return num;
}

int GetSum(char *pOutDat,int len)
{
	unsigned int sum=0;
	for(int i=1;i<len;i++)
		sum+=pOutDat[i];
	pOutDat[len]=HexToAscii((sum>>4)&0x0f);
	pOutDat[len+1]=HexToAscii(sum&0x0f);
	pOutDat[len+2]='\0';
	return 0;
}
int ReadDREG(int Addr,int len)
{
	int iAdd=(Addr-0x1000)/2;
	OutStr[0]=0x02;
	for(int i=0;i<len;i++)
	{
		OutStr[i*4+1]=HexToAscii((plc_dat.DREG[iAdd+i]&0x00F0)>>4);
		OutStr[i*4+2]=HexToAscii((plc_dat.DREG[iAdd+i]&0x000F));
		OutStr[i*4+3]=HexToAscii((plc_dat.DREG[iAdd+i]&0xF000)>>12);
		OutStr[i*4+4]=HexToAscii((plc_dat.DREG[iAdd+i]&0x0F00)>>8);
	}
	OutStr[len*4+1]=0x03;
	GetSum(OutStr,len*4+2);
	return len;
}
int WriteDREG(int Addr,int len)
{
	int iAdd=(Addr-0x1000)/2;
	for(int i=0;i<len;i++)
	{
		plc_dat.DREG[iAdd+i]=(AsciiToHex(InStr[8+i*4])<<4)|(AsciiToHex(InStr[9+i*4]))
				|(AsciiToHex(InStr[10+i*4])<<12)|(AsciiToHex(InStr[11+i*4])<<8);

	}
	return 0;
}
int ReadMREG(int Addr,int len)
{
	int iAdd=(Addr-0x100)/2;
	OutStr[0]=0x02;
	for(int i=0;i<len;i++)
	{
		OutStr[i*2+1]=HexToAscii((plc_dat.MREG[iAdd+i]&0x00F0)>>4);
		OutStr[i*2+2]=HexToAscii((plc_dat.MREG[iAdd+i]&0x000F));
		OutStr[i*2+3]=HexToAscii((plc_dat.MREG[iAdd+i]&0xF000)>>12);
		OutStr[i*2+4]=HexToAscii((plc_dat.MREG[iAdd+i]&0x0F00)>>8);
	}
	OutStr[len*4+1]=0x03;
	GetSum(OutStr,len*4+2);
	return len;
}
int ReadXREG(int Addr,int len)
{
	int iAdd=(Addr-0x0080)/2;
	OutStr[0]=0x02;
	for(int i=0;i<len;i++)
	{
		OutStr[i*2+1]=HexToAscii((plc_dat.XREG[iAdd+i]&0x00F0)>>4);
		OutStr[i*2+2]=HexToAscii((plc_dat.XREG[iAdd+i]&0x000F));
		OutStr[i*2+3]=HexToAscii((plc_dat.XREG[iAdd+i]&0xF000)>>12);
		OutStr[i*2+4]=HexToAscii((plc_dat.XREG[iAdd+i]&0x0F00)>>8);
	}
	OutStr[len*4+1]=0x03;
	GetSum(OutStr,len*4+2);
	return len;
}

int ReadYREG(int Addr,int len)
{
	int iAdd=(Addr-0x00A0)/2;
	OutStr[0]=0x02;
	for(int i=0;i<len;i++)
	{
		OutStr[i*2+1]=HexToAscii((plc_dat.YREG[iAdd+i]&0x00F0)>>4);
		OutStr[i*2+2]=HexToAscii((plc_dat.YREG[iAdd+i]&0x000F));
		OutStr[i*2+3]=HexToAscii((plc_dat.YREG[iAdd+i]&0xF000)>>12);
		OutStr[i*2+4]=HexToAscii((plc_dat.YREG[iAdd+i]&0x0F00)>>8);
	}
	OutStr[len*4+1]=0x03;
	GetSum(OutStr,len*4+2);
	return len;
}
void ProcessReadBuf()
{
	char cmd;
	unsigned int addr=0;
	int i1,dlen;
	FILE *file_plc;
	i1 = RS232GetData( COM_NUM, InStr, 256 );
		if( i1>=5 )
		{
			cmd=InStr[1];

			switch(cmd)
			{
				case 0x30:
					addr=GetAddress();
					if((addr>=0x0080)&&(addr<0x00A0))
					{
					dlen=ReadXREG(addr,GetDataNum(InStr));
					RS232SendData(COM_NUM,OutStr,dlen*4+4);
					}

					if((addr>=0x00A0)&&(addr<0x100))
					{
					dlen=ReadYREG(addr,GetDataNum(InStr));
					RS232SendData(COM_NUM,OutStr,dlen*4+4);
					}

					if((addr>=0x0100)&&(addr<0x1000))
					{
					dlen=ReadMREG(addr,GetDataNum(InStr));
					RS232SendData(COM_NUM,OutStr,dlen*4+4);
					}

					if(addr>=0x1000)
					{
					dlen=ReadDREG(addr,GetDataNum(InStr));
					RS232SendData(COM_NUM,OutStr,dlen*4+4);
					}
					break;
				case 0x31:
					addr=GetAddress();
					WriteDREG(addr,GetDataNum(InStr));
					OutStr[0]=0x06;
					RS232SendData(COM_NUM,OutStr,1);
					file_plc=fopen("plc.dat","w+b");
					fwrite(&plc_dat,sizeof(PLCDATA),1,file_plc);
					fclose(file_plc);
					break;
				case 0x37:
					addr=GetREGBitAddress();
					switch(addr)
					{
						case 0:
						case 1:
							//OutStr[0]=0x06;
							//RS232SendData(COM_NUM,OutStr,1);
							break;
						case 2:
							dlen=GetBitAddress();
							plc_dat.YREG[dlen/16]=plc_dat.YREG[dlen/16]|(1<<dlen);

							break;
						case 3:
							dlen=GetBitAddress();
							plc_dat.MREG[dlen/16]=plc_dat.MREG[dlen/16]|(1<<dlen);

							break;
					}
					OutStr[0]=0x06;
					RS232SendData(COM_NUM,OutStr,1);
					file_plc=fopen("plc.dat","w+b");
					fwrite(&plc_dat,sizeof(PLCDATA),1,file_plc);
					fclose(file_plc);
					break;
				case 0x38:
					addr=GetREGBitAddress();
					switch(addr)
					{
						case 0:
						case 1:
							//OutStr[0]=0x06;
							//RS232SendData(COM_NUM,OutStr,1);
							break;
						case 2:
							dlen=GetBitAddress();
							plc_dat.YREG[dlen/16]=plc_dat.YREG[dlen/16]&~(1<<dlen);

							break;
						case 3:

							dlen=GetBitAddress();

							plc_dat.MREG[dlen/16]=plc_dat.MREG[dlen/16]&~(1<<dlen);
							break;
					}
					OutStr[0]=0x06;
					RS232SendData(COM_NUM,OutStr,1);
					file_plc=fopen("plc.dat","w+b");
					fwrite(&plc_dat,sizeof(PLCDATA),1,file_plc);
					fclose(file_plc);
					break;

			}

		}
}
double PIDControl(double sv,double pv,double Kp,double Ki,double Kd)
{
	double dOut;
	dError=pv-sv;
	dValue[0]=Kp*dError;
	if(dError>30.0) dOldError=0;
	if(dError<-30.0) dOldError=0;
	dValue[3]=dValue[3]+dOldError;
	if(Ki<=0.0) Ki=999999;
	dValue[1]=Kp*tsamp/Ki*dValue[3];
	if(dValue[1]>3095.0) {dValue[1]=3095.0;dValue[3]=dValue[3]-dOldError;}
	if(dValue[1]<-3095.0) {dValue[1]=-3095.0;dValue[3]=dValue[3]-dOldError;}
	dValue[2]=Kp/tsamp*Kd*(dError-dOldError);
	dOut=dValue[0]+dValue[1]+dValue[2]+1000;
	dOldError=dError;
	if(dOut>4095.0)dOut=4095.0;
	if(dOut<0.0)dOut=0.0;
	ReloadWDT( );
	return dOut;
}
int main(void )
{
	int  i,slen,j=0;
	count=0;
	int x1,y1,ck;
	unsigned char abyte=8;
	FILE *file_plc;
	char cbuf[256];
	int len,ActIdx;
	long ad=0,tmp=0,tmp1;
	float Zi,out;
	double Pi;
	unsigned int DA;
	double DA1=0,da2=0,DA3=0;
	FILE *fp;
	char *pStr;
	SetWDT(255);
	file_plc=fopen("plc.dat","rb");
	if(file_plc==NULL)
	{
	file_plc=fopen("plc.dat","w+b");
		
	for(i=0;i<500;i++)
	{
		plc_dat.DREG[i]=0;
	}
	for(i=0;i<80;i++)
	{
		plc_dat.MREG[i]=0;
	}
	for(i=0;i<6;i++)
	{
		plc_dat.XREG[i]=0;
	}
	for(i=0;i<6;i++)
	{
		plc_dat.YREG[i]=0;
	}
	fwrite(&plc_dat,sizeof(PLCDATA),1,file_plc);

	}
	rewind(file_plc);
	fread(&plc_dat,sizeof(PLCDATA),1,file_plc);
	fclose(file_plc);

	
	fp = fopen("tbl.dat", "rt" );
	for( ActIdx = 0;ActIdx<4 ; ActIdx++)
	{

		pStr = fgets( cbuf, 256, fp );
		if( pStr == NULL ) break;		// EOF encountered
		sscanf(cbuf,"%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",&DATA[ActIdx][0],
			&DATA[ActIdx][1],&DATA[ActIdx][2],&DATA[ActIdx][3],
			&DATA[ActIdx][4],&DATA[ActIdx][5],&DATA[ActIdx][6],
			&DATA[ActIdx][7],&DATA[ActIdx][8],&DATA[ActIdx][9],
			&DATA[ActIdx][10],&DATA[ActIdx][11],
			&DATA[ActIdx][12],&DATA[ActIdx][13],&DATA[ActIdx][14],
			&DATA[ActIdx][15],&DATA[ActIdx][16],&DATA[ActIdx][17],
			&DATA[ActIdx][18],&DATA[ActIdx][19],&DATA[ActIdx][20],
			&DATA[ActIdx][21],&DATA[ActIdx][22],&DATA[ActIdx][23],
			&DATA[ActIdx][24],&DATA[ActIdx][25],&DATA[ActIdx][26],
			&DATA[ActIdx][27],&DATA[ActIdx][28],&DATA[ActIdx][29]);
		
	}
	fclose(fp);

	GPIODirCfg( 0 );
	GPIOWrite(0x08);
	pIVol=&DATA[3][0];
	pIWet=&DATA[2][0];
	InitUART( COM_NUM, 12,2 );
	InstallISR( COM_NUM );

	for( ; ; )
	{		
		ProcessReadBuf();
		tmp=GetDigitVolt(0,1000);
		Zi=(float)(int)plc_dat.DREG[3];
		Zi=Zi/1000.0+1.0;
		tmp1+=tmp;
		j++;
		ReloadWDT( );
		ck=1;
		if(j>=LOOP)
		{
			ad=tmp1/LOOP;
			tmp1=0;
			j=0;
			ReloadWDT( );

	
		
		if((ad<17)&&((abyte&0x08)==0x08))
		{
			abyte&=0xF7;
			abyte|=0x10;
			GPIOWrite(abyte);
			pIVol=&DATA[1][0];
			pIWet=&DATA[0][0];
			ck=0;
		}
		if(((ad<=6)||(ad>3421))&&((abyte&0x10)==0x10))
		{
			abyte&=0xEF;
			abyte|=0x08;
			GPIOWrite(abyte);
			pIVol=&DATA[3][0];
			pIWet=&DATA[2][0];	
			ck=0;
		}
		if(ck)
			plc_dat.DREG[0]=(int)((float)Wetzh(ad,pIVol,pIWet)*Zi);
		x1=plc_dat.DREG[1]-plc_dat.DREG[2];
		if(plc_dat.DREG[0]<x1)
		{
			abyte&=0xF9;
			abyte|=0x01;
			GPIOWrite(abyte);
		}
		y1=plc_dat.DREG[1]+plc_dat.DREG[2];
		if(plc_dat.DREG[0]>y1)
		{
			abyte&=0xFC;
			abyte|=0x04;
			GPIOWrite(abyte);
		}
		if((x1<=plc_dat.DREG[0])&&(plc_dat.DREG[0]<=y1))
		{
			abyte&=0xFA;
			abyte|=0x02;
			GPIOWrite(abyte);
		}
		plc_dat.YREG[0]=abyte;
		}
		DA1=DA1+(double)(int)plc_dat.DREG[0];
		da2=da2+1;
		if(da2>9) {
		DA3=DA1/10;
		Pi=PIDControl((double)(int)plc_dat.DREG[1],DA3,
			(double)(int)plc_dat.DREG[4],(double)(int)plc_dat.DREG[5],(double)(int)plc_dat.DREG[6]/100.0);
		DA=(unsigned int)Pi;
		WriteDA(DA,1);
		WriteDA(DA,2);
		ReloadWDT( );
		DA1=0;
		da2=0;}

	}

      UninstallISR( COM_NUM );

	return 0;
}

⌨️ 快捷键说明

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