📄 232demo.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 + -