本項目主要用到了RS485總線讀取工業現場的PLC,包括吊機的主鉤吊取得重量,現場小車的位移,速度等等。本代碼僅供參考學習,禁止商用!
0.png (14.56 KB, 下載次數: 46)
下載附件
2018-11-14 18:19 上傳
單片機源程序如下:
- #include "STC15Fxxxx.H"
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <math.H>
- #include "MyTypedef.H"
- #include "eeprom.h"
- unsigned int CRC_16(unsigned int puiCRCWord, unsigned char pucChechingChar);
- void Uart1_Tx_str(unsigned char *ptr,unsigned char n);
- void Uart2_Tx_str(unsigned char *ptr,unsigned char n);
- void delay_ms(unsigned int x);
- void sys_ini(void);
- void fIntUart1Rev(void);
- void fIntUart2Rev(void);
- void readCS(void);
- void fCalHigh(void);
- bit Uart1_RxF,Uart2_RxF;
- bit B_TI,B_TI2,bFlag1s;
- unsigned char data Rx1count,wRx1TimeOut,Rx2count,wRx2TimeOut ;
- unsigned char volatile xdata RX1BUF[38]= {0};
- unsigned char volatile xdata RX2BUF[15]= {0};
- //unsigned char tmpbuf[10];
- xdata unsigned char E_buf[80],E_buf2[8];
- unsigned int Rs485Ledms,Rs485Led2ms,uiCountMs=0;
- xdata float gfCountH3,gfCountH1,gfCountY1,gfCountY2,gfCountX;
- xdata float gfLastHighH3,gfLastHighH1,gfLastHighY1,gfLastHighY2,gfLastHighX;
- idata float fXsValH3,fXsValH1,fXsValY1,fXsValY2,fXsValX; //修正系數
- idata float fIniValH3,fIniValH1,fIniValY1,fIniValY2,fIniValX; //初始值
- idata float fIniH3,fIniH1,fIniY1,fIniY2,fIniX; //始值高度
- bit bXsH3,bXsH1,bXsY1,bXsY2,bXsX;
- union
- {
- float fVal;
- uChar fToChar[4];
- } highH3,highH1,highY1,highY2,highX;
- union
- {
- float fVal;
- uChar fToChar[4];
- } SpeedH3,SpeedH1;
- union
- {
- float fVal;
- unsigned char ucChar[ 4];
- } fdat;
- float ftmp;
- char str[]="wangzugang";
- //*******************************************
- void main()
- {
- // unsigned char i,buf[5];
- unsigned char luc;
- //delay_ms(100);
-
- sys_ini();
- CON = 0;
- CON2 = 0;
- Rx1count=0;
- Rx2count=0;
- for( luc = 0; luc < 8; luc++)
- E_buf2[luc] = 0;
- readCS();
- fCalHigh();
- while(1)
- {
- if(bFlag1s)
- {
- fCalHigh();
- //計算起升速度
- ftmp = 60*(highH3.fVal - gfLastHighH3); //單位:米/分
- SpeedH3.fVal = ftmp;
- gfLastHighH3 = highH3.fVal;
-
- ftmp = 60*(highH1.fVal - gfLastHighH1); //單位:米/分
- SpeedH1.fVal = ftmp;
- gfLastHighH1 = highH1.fVal;
- bFlag1s=0;
- }
- if(Uart1_RxF==1)
- fIntUart1Rev();
- if(Uart2_RxF==1)
- fIntUart2Rev();
- }
- }
- /************************************************************
- crc16校驗程序:功能:接收字節crc校驗,返回校驗值
- unsigned int CRC_16(unsigned int puiCRCWord,unsigned char pucChechingChar)
- 形參: pucChechingChar 需要校驗數據
- puiCRCWord 校驗后的數據
- *************************************************************/
- unsigned int CRC_16(unsigned int puiCRCWord, unsigned char pucChechingChar)
- {
- unsigned char data luc;
- puiCRCWord ^= pucChechingChar;
- for( luc = 8; luc > 0; luc--)
- {
- if( puiCRCWord & 0x0001)
- {
- puiCRCWord >>= 1;
- puiCRCWord ^= 0xA001;
- }
- else
- {
- puiCRCWord >>= 1;
- }
- }
- return puiCRCWord;
- }
- //*******************************************
- void Time0Int( void ) interrupt 1
- {
- uiCountMs++;
- if(uiCountMs>50000)
- uiCountMs=0;
-
- if((uiCountMs%10000)==0)
- {
- bFlag1s=1;
- }
-
- if((wRx2TimeOut != 0)&&(Rx2count!=0))
- wRx2TimeOut --; //通信超時值
- else
- Rx2count=0;
- if((wRx1TimeOut != 0)&&(Rx1count!=0))
- wRx1TimeOut --; //通信超時值
- else
- Rx1count=0;
-
- if(Rs485Led==0)
- {
- Rs485Ledms++;
- if(Rs485Ledms>500)
- {
- Rs485Led=1 ;
- Rs485Ledms = 0;
- }
-
- }
- else
- Rs485Ledms = 0;
-
- if(Rs485Led2==0)
- {
- Rs485Led2ms++;
- if(Rs485Led2ms>500)
- {
- Rs485Led2=1 ;
- Rs485Led2ms = 0;
- }
-
- }
- else
- Rs485Led2ms = 0;
- }
- //*******************************************
- void Uart1int( void ) interrupt 4
- {
- if ( RI )
- {
- if(Rx1count==0)
- {
- if(SBUF==PLC_Adr) //
- {
- RX1BUF[Rx1count]=SBUF;
- Rx1count++;
- }
- else
- Rx1count=0;
- }
- else
- {
- RX1BUF[Rx1count]=SBUF;
- Rx1count++;
- if((Rx1count==37)&&(RX1BUF[1]==0x10))
- {
- Uart1_RxF=1;
- Rx1count=0;
- }
- if(Rx1count>37)
- Rx1count=0;
- }
- RI = 0;
- wRx1TimeOut=100;
- }
- if(TI)
- {
- TI = 0;
- B_TI = 1;
- }
- }
- //***********************************
- void sys_ini(void)
- {
- //初始T0
- TMOD = 0x00; //T0 Mode 0 ,16 Bit自動重裝
- TH0 = T100uS>>8; //初值
- TL0 = T100uS;
- ET0 = 1; //T0中斷允許
- TR0 = 1; //啟動T0
-
- //初始int0
- //TCON |= 0x01; //int0下降沿觸發
- //EX0 = 0;//EX0 = 1; //允許int0中斷
-
- //初始int0
- //IT1 = 1; //int1下降沿觸發
- //EX1 = 0;//EX1 = 1; //允許int1中斷
-
- //初始串行口1,2
- TL2 = (65536-(MAIN_Fosc/4/Baudrate1)); //設置波特率重裝值
- TH2 = (65536-(MAIN_Fosc/4/Baudrate1))>>8;
- //AUXR = 0X14; //T2為1T模式,并啟動定時器2
- AUXR = 0X14;
- AUXR |= 0X01; //選擇定時器2為串口1的波特率發生器
- SCON = 0x50; //mode 1, SM2=0, REN=1
- S2CON = 0x50;
- ES = 1; //使能串行1中斷
- IE2 |= 1; //允許串口2中斷
-
- EA = 1;
- // P3M1=0x00;
- // P3M0=0x00;
- }
- //***********************************
- void delay_ms(unsigned int x)
- {
- unsigned int i,j;
- i=0;
- for(i=0; i<x; i++)
- {
- j=108;
- ;
- while(j--)
- {
- ;
- }
- }
- }
- //***********************************
- void fIntUart1Rev(void)
- {
- uCharD luc;
- uIntD luiCRC16;
- xdata unsigned char lucBuffers[ 38]; //
- union
- {
- uInt liAddress;
- uChar IntToChar[ 2];
- } xdata AddressList;
- union
- {
- unsigned long ulVal;
- uChar ulToChar[4];
- } xdata ultmp;
- Uart1_RxF=0;
- for( luc = 0; luc < 38; luc++)
- lucBuffers[luc] = RX1BUF[luc];
- luiCRC16 = 0xFFFF;
- for( luc = 0; luc < 37; luc++)
- luiCRC16 = CRC_16( luiCRC16, lucBuffers[luc]);
- if( !luiCRC16 )
- {
- Rs485Led2 =~Rs485Led2;
- for( luc = 0; luc < 6; luc++)
- E_buf2[luc] = lucBuffers[7+luc];
-
- for( luc = 0; luc < 4; luc++)
- ultmp.ulToChar[luc] = lucBuffers[23+luc];
- gfCountH3 = (float)ultmp.ulVal;
-
- for( luc = 0; luc < 4; luc++)
- ultmp.ulToChar[luc] = lucBuffers[27+luc];
- gfCountH1 = (float)ultmp.ulVal;
-
- for( luc = 0; luc < 4; luc++)
- ultmp.ulToChar[luc] = lucBuffers[15+luc];
- gfCountY1 = (float)ultmp.ulVal;
-
- for( luc = 0; luc < 4; luc++)
- ultmp.ulToChar[luc] = lucBuffers[19+luc];
- gfCountY2 = (float)ultmp.ulVal;
-
- for( luc = 0; luc < 4; luc++)
- ultmp.ulToChar[luc] = lucBuffers[31+luc];
- gfCountX = (float)ultmp.ulVal;
-
- luiCRC16 = 0xFFFF;
- for( luc = 0; luc < 6; luc++)
- luiCRC16 = CRC_16( luiCRC16, lucBuffers[luc]);
- //放置CRC16校驗碼,低位在前,高位在后
- AddressList.liAddress = luiCRC16;
- lucBuffers[ 6] = AddressList.IntToChar[ 1];
- lucBuffers[ 7] = AddressList.IntToChar[ 0];
- Uart1_Tx_str(lucBuffers,8);
-
- }
- }
- //*******************************************
- void Uart2int( void ) interrupt 8
- {
- if ( RI2 )
- {
- if(Rx2count==0)
- {
- if(S2BUF==PlcCaiYang_Adr)
- {
- RX2BUF[Rx2count]=S2BUF;
- Rx2count++;
- }
- else
- Rx2count=0;
- }
- else
- {
- RX2BUF[Rx2count]=S2BUF;
- Rx2count++;
- if((Rx2count==8)&&(RX2BUF[1]==0x03))
- {
- Uart2_RxF=1;
- Rx2count=0;
- }
- if((Rx2count==13)&&(RX2BUF[1]==0x10))
- {
- Uart2_RxF=1;
- Rx2count=0;
- }
- if(Rx2count>13)
- Rx2count=0;
- }
- CLR_RI2();
- wRx2TimeOut=50;
- }
- if(TI2)
- {
- CLR_TI2();
- B_TI2 = 1;
- }
- }
- //**********************************************************
- ///*
- void Uart1_Tx_str(unsigned char *ptr,unsigned char n)
- {
- unsigned char data k;
- B_TI = 0;
- CON2 =1;
- for( k = 0; k < n; k++)
- {
- SBUF = *ptr++;
- while( !B_TI)
- {
- ;
- }
- B_TI = 0;
- }
- CON2 =0;
- }
- //*/
- //**********************************************************
- void Uart2_Tx_str(unsigned char *ptr,unsigned char n)
- {
- unsigned char data k;
- B_TI2 = 0;
- CON =1;
- for( k = 0; k < n; k++)
- {
- S2BUF = *ptr++;
- while( !B_TI2)
- {
- ;
- }
- B_TI2 = 0;
- }
- CON =0;
- }
- //***********************************************************
- void readCS(void)
- {
- unsigned char i,buf[5];
-
- //高度3
- for(i=0; i<5; i++) //讀取修正系數
- buf[i]=byte_read(0x0+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fXsValH3 = fdat.fVal;
- bXsH3=1;
- }
- else
- {
- bXsH3=0;
- }
-
- for(i=0; i<5; i++) //讀取初始值
- buf[i]=byte_read(0x0+5+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fIniValH3 = fdat.fVal;
- }
- else
- {
- fIniValH3=0;
- }
-
- for(i=0; i<5; i++) //讀取初始高度
- buf[i]=byte_read(0x0+10+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fIniH3 = fdat.fVal;
- }
- else
- {
- fIniH3=0;
- }
-
- //高度1
- for(i=0; i<5; i++) //讀取修正系數
- buf[i]=byte_read(0x10+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fXsValH1 = fdat.fVal;
- bXsH1=1;
- }
- else
- {
- bXsH1=0;
- }
-
- for(i=0; i<5; i++) //讀取初始值
- buf[i]=byte_read(0x10+5+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fIniValH1 = fdat.fVal;
- }
- else
- {
- fIniValH1=0;
- }
-
- for(i=0; i<5; i++) //讀取初始高度
- buf[i]=byte_read(0x10+10+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fIniH1 = fdat.fVal;
- }
- else
- {
- fIniH1=0;
- }
- /////////////////////////////////////
- //Y1
- for(i=0; i<5; i++) //讀取修正系數
- buf[i]=byte_read(0x20+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fXsValY1 = fdat.fVal;
- bXsY1=1;
- }
- else
- {
- bXsY1=0;
- }
-
- for(i=0; i<5; i++) //讀取初始值
- buf[i]=byte_read(0x20+5+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fIniValY1 = fdat.fVal;
- }
- else
- {
- fIniValY1=0;
- }
-
- for(i=0; i<5; i++) //讀取初始高度
- buf[i]=byte_read(0x20+10+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fIniY1 = fdat.fVal;
- }
- else
- {
- fIniY1=0;
- }
- /////////////////////////////////////
- //Y2
- for(i=0; i<5; i++) //讀取修正系數
- buf[i]=byte_read(0x30+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fXsValY2 = fdat.fVal;
- bXsY2=1;
- }
- else
- {
- bXsY2=0;
- }
-
- for(i=0; i<5; i++) //讀取初始值
- buf[i]=byte_read(0x30+5+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fIniValY2 = fdat.fVal;
- }
- else
- {
- fIniValY2=0;
- }
-
- for(i=0; i<5; i++) //讀取初始高度
- buf[i]=byte_read(0x30+10+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fIniY2 = fdat.fVal;
- }
- else
- {
- fIniY2=0;
- }
- /////////////////////////////////////
- //X
- for(i=0; i<5; i++) //讀取修正系數
- buf[i]=byte_read(0x40+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fXsValX = fdat.fVal;
- bXsX=1;
- }
- else
- {
- bXsX=0;
- }
-
- for(i=0; i<5; i++) //讀取初始值
- buf[i]=byte_read(0x40+5+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fIniValX = fdat.fVal;
- }
- else
- {
- fIniValX=0;
- }
-
- for(i=0; i<5; i++) //讀取初始高度
- buf[i]=byte_read(0x40+10+i);
- if(buf[0]==0)
- {
- for(i=0; i<4; i++)
- fdat.ucChar[i] = buf[i+1];
- fIniX = fdat.fVal;
- }
- else
- {
- fIniX=0;
- }
- }
- //***********************************************************
- //***********************************************************
- void fIntUart2Rev(void)
- {
- uCharD luc;
- uIntD luiCRC16;
- xdata unsigned char lucBuffers[40]; //
- union
- {
- uInt liAddress;
- uChar IntToChar[ 2];
- } data AddressList;
- Uart2_RxF=0;
-
- for( luc = 0; luc < 15; luc++)
- lucBuffers[luc] = RX2BUF[luc];
- if((lucBuffers[1]==0x03)&&(lucBuffers[0]==PlcCaiYang_Adr))
- {
- luiCRC16 = 0xFFFF;
- for( luc = 0; luc < 8; luc++)
- luiCRC16 = CRC_16( luiCRC16, lucBuffers[luc]);
- if( !luiCRC16 )
- {
- Rs485Led =~Rs485Led;
- if(lucBuffers[3]==1) //1為讀數據
- {
- lucBuffers[2]=34;
- for(luc=0; luc<6; luc++)
- lucBuffers[3+luc]=E_buf2[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[9+luc]=highH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[13+luc]=SpeedH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[17+luc]=highH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[21+luc]=SpeedH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[25+luc]=highY1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[29+luc]=highY2.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[33+luc]=highX.fToChar[luc];
- luiCRC16 = 0xFFFF;
- for( luc = 0; luc < 37; luc++)
- luiCRC16 = CRC_16( luiCRC16, lucBuffers[luc]);
- //放置CRC16校驗碼,低位在前,高位在后
- AddressList.liAddress = luiCRC16;
- lucBuffers[ 37] = AddressList.IntToChar[ 1];
- lucBuffers[ 38] = AddressList.IntToChar[ 0];
- Uart2_Tx_str(lucBuffers,39);
- return;
- }
- }
- }
- ///////////////////////////////////
- if((lucBuffers[1]==0x10)&&(lucBuffers[0]==PlcCaiYang_Adr))
- {
- luiCRC16 = 0xFFFF;
- for( luc = 0; luc < 13; luc++)
- luiCRC16 = CRC_16( luiCRC16, lucBuffers[luc]);
- if( !luiCRC16 )
- {
- Rs485Led =~Rs485Led;
- if(lucBuffers[3]==0x02) //2#小車起升高度H1初始值
- {
- for(luc=0; luc<80; luc++) //把參數區的數據讀出暫存
- E_buf[luc] = byte_read(luc);
- sector_erase(0x0000); // 扇區擦除,清空參數區的數據
- E_buf[0x10+5] = 0x0; //0x15單元清零表示高度H1初始值已經保存過
- fdat.fVal = gfCountH1; //把當前的值當初始值
- fIniValH1 = gfCountH1;
- for( luc = 0; luc < 4; luc++) //把初始值保存0x16,0x17,0x18,0x19
- E_buf[0x10+6+luc] = fdat.ucChar[luc];
- E_buf[0x10+10] = 0x0; //0x1A單元清零表示高度H1初高度已經保存過
- for( luc = 0; luc < 4; luc++) //把初高度保存0x1B,0x1C,0x1D,0x1E
- {
- E_buf[0x10+11+luc] = lucBuffers[luc+7];
- fdat.ucChar[luc] = lucBuffers[luc+7];
- }
- fIniH1 = fdat.fVal;
- for(luc=0; luc<80; luc++) //把暫存區的數據寫入參數區
- byte_program(0x0000+luc, E_buf[luc]);// 字節編程
- fCalHigh();
- /*
- lucBuffers[2]=26;
- for(luc=0; luc<6; luc++)
- lucBuffers[3+luc]=E_buf2[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[9+luc]=highH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[13+luc]=SpeedH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[17+luc]=highH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[21+luc]=SpeedH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[25+luc]=highY1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[29+luc]=highY2.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[33+luc]=highX.fToChar[luc];
- luiCRC16 = 0xFFFF;
- for( luc = 0; luc < 37; luc++)
- luiCRC16 = CRC_16( luiCRC16, lucBuffers[luc]);
- //放置CRC16校驗碼,低位在前,高位在后
- AddressList.liAddress = luiCRC16;
- lucBuffers[ 37] = AddressList.IntToChar[ 1];
- lucBuffers[ 38] = AddressList.IntToChar[ 0];
- Uart2_Tx_str(lucBuffers,39);
-
- return;
- */
- }
-
- if(lucBuffers[3]==0x03) //3為高度H1標定數據,
- {
- for( luc = 0; luc < 4; luc++)
- fdat.ucChar[luc] = lucBuffers[luc+7];
-
- if((gfCountH1 - fIniValH1)==0)
- fXsValH1 = ((fdat.fVal-fIniH1)/1.0);
- else
- fXsValH1 = ((fdat.fVal-fIniH1)/(gfCountH1 - fIniValH1));
-
- fdat.fVal = fXsValH1;
- bXsH1=1;
- for(luc=0; luc<80; luc++) //把參數區的數據讀出暫存
- E_buf[luc] = byte_read(luc);
- sector_erase(0x0000); // 扇區擦除,清空參數區的數據
- E_buf[0x10] = 0x0; //0x10單元清零表示高度H1標定數據已經保存過
- for( luc = 0; luc < 4; luc++) //把初始值保存0x11,0x12,0x13,0x14
- E_buf[0x10+1+luc] = fdat.ucChar[luc];
- for(luc=0; luc<80; luc++) //把暫存區的數據寫入參數區
- byte_program(0x0000+luc, E_buf[luc]);// 字節編程
- fCalHigh();
- /*
- lucBuffers[2]=26;
- for(luc=0; luc<6; luc++)
- lucBuffers[3+luc]=E_buf2[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[9+luc]=highH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[13+luc]=SpeedH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[17+luc]=highH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[21+luc]=SpeedH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[25+luc]=highY1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[29+luc]=highY2.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[33+luc]=highX.fToChar[luc];
- luiCRC16 = 0xFFFF;
- for( luc = 0; luc < 37; luc++)
- luiCRC16 = CRC_16( luiCRC16, lucBuffers[luc]);
- //放置CRC16校驗碼,低位在前,高位在后
- AddressList.liAddress = luiCRC16;
- lucBuffers[ 37] = AddressList.IntToChar[ 1];
- lucBuffers[ 38] = AddressList.IntToChar[ 0];
- Uart2_Tx_str(lucBuffers,39);
-
- return;
- */
- }
- //-------------------------------------------------------------------
- if(lucBuffers[3]==0x04) //1#小車起升高度H3初始值
- {
- for(luc=0; luc<80; luc++) //把參數區的數據讀出暫存
- E_buf[luc] = byte_read(luc);
- sector_erase(0x0000); // 扇區擦除,清空參數區的數據
- E_buf[0x0+5] = 0x0; //0x05單元清零表示高度H3初始值已經保存過
- fdat.fVal = gfCountH3; //把當前的值當初始值
- fIniValH3 = gfCountH3;
- for( luc = 0; luc < 4; luc++) //把初始值保存0x06,0x07,0x08,0x09
- E_buf[0x0+6+luc] = fdat.ucChar[luc];
- E_buf[0x0+10] = 0x0; //0x0A單元清零表示高度H3初高度已經保存過
- for( luc = 0; luc < 4; luc++) //把初高度保存0x0B,0x0C,0x0D,0x0E
- {
- E_buf[0x0+11+luc] = lucBuffers[luc+7];
- fdat.ucChar[luc] = lucBuffers[luc+7];
- }
- fIniH3 = fdat.fVal;
- for(luc=0; luc<80; luc++) //把暫存區的數據寫入參數區
- byte_program(0x0000+luc, E_buf[luc]);// 字節編程
- fCalHigh();
- /*
- lucBuffers[2]=26;
- for(luc=0; luc<6; luc++)
- lucBuffers[3+luc]=E_buf2[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[9+luc]=highH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[13+luc]=SpeedH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[17+luc]=highH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[21+luc]=SpeedH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[25+luc]=highY1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[29+luc]=highY2.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[33+luc]=highX.fToChar[luc];
- luiCRC16 = 0xFFFF;
- for( luc = 0; luc < 37; luc++)
- luiCRC16 = CRC_16( luiCRC16, lucBuffers[luc]);
- //放置CRC16校驗碼,低位在前,高位在后
- AddressList.liAddress = luiCRC16;
- lucBuffers[ 37] = AddressList.IntToChar[ 1];
- lucBuffers[ 38] = AddressList.IntToChar[ 0];
- Uart2_Tx_str(lucBuffers,39);
-
- return;
- */
- }
-
- if(lucBuffers[3]==0x05) //5為高度H3標定數據,
- {
- for( luc = 0; luc < 4; luc++)
- fdat.ucChar[luc] = lucBuffers[luc+7];
-
- if((gfCountH3 - fIniValH3)==0)
- fXsValH3 = ((fdat.fVal-fIniH3)/1.0);
- else
- fXsValH3 = ((fdat.fVal-fIniH3)/(gfCountH3 - fIniValH3));
-
- fdat.fVal = fXsValH3;
- bXsH3=1;
- for(luc=0; luc<80; luc++) //把參數區的數據讀出暫存
- E_buf[luc] = byte_read(luc);
- sector_erase(0x0000); // 扇區擦除,清空參數區的數據
- E_buf[0x0] = 0x0; //0x0單元清零表示高度H3標定數據已經保存過
- for( luc = 0; luc < 4; luc++) //把初始值保存0x11,0x12,0x13,0x14
- E_buf[0x0+1+luc] = fdat.ucChar[luc];
- for(luc=0; luc<80; luc++) //把暫存區的數據寫入參數區
- byte_program(0x0000+luc, E_buf[luc]);// 字節編程
- fCalHigh();
- /*
- lucBuffers[2]=26;
- for(luc=0; luc<6; luc++)
- lucBuffers[3+luc]=E_buf2[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[9+luc]=highH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[13+luc]=SpeedH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[17+luc]=highH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[21+luc]=SpeedH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[25+luc]=highY1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[29+luc]=highY2.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[33+luc]=highX.fToChar[luc];
- luiCRC16 = 0xFFFF;
- for( luc = 0; luc < 37; luc++)
- luiCRC16 = CRC_16( luiCRC16, lucBuffers[luc]);
- //放置CRC16校驗碼,低位在前,高位在后
- AddressList.liAddress = luiCRC16;
- lucBuffers[ 37] = AddressList.IntToChar[ 1];
- lucBuffers[ 38] = AddressList.IntToChar[ 0];
- Uart2_Tx_str(lucBuffers,39);
-
- return;
- */
- }
- //---------------------------------------------------------------------
- if(lucBuffers[3]==0x06) //1#小車起Y1初始值
- {
- for(luc=0; luc<80; luc++) //把參數區的數據讀出暫存
- E_buf[luc] = byte_read(luc);
- sector_erase(0x0000); // 扇區擦除,清空參數區的數據
- E_buf[0x20+5] = 0x0; //0x25單元清零表示高度Y1初始值已經保存過
- fdat.fVal = gfCountY1; //把當前的值當初始值
- fIniValY1 = gfCountY1;
- for( luc = 0; luc < 4; luc++) //把初始值保存0x26,0x27,0x28,0x29
- E_buf[0x20+6+luc] = fdat.ucChar[luc];
- E_buf[0x20+10] = 0x0; //0x2A單元清零表示高度Y1初高度已經保存過
- for( luc = 0; luc < 4; luc++) //把初高度保存0x2B,0x2C,0x2D,0x2E
- {
- E_buf[0x20+11+luc] = lucBuffers[luc+7];
- fdat.ucChar[luc] = lucBuffers[luc+7];
- }
- fIniY1 = fdat.fVal;
- for(luc=0; luc<80; luc++) //把暫存區的數據寫入參數區
- byte_program(0x0000+luc, E_buf[luc]);// 字節編程
- fCalHigh();
- /*
- lucBuffers[2]=26;
- for(luc=0; luc<6; luc++)
- lucBuffers[3+luc]=E_buf2[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[9+luc]=highH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[13+luc]=SpeedH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[17+luc]=highH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[21+luc]=SpeedH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[25+luc]=highY1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[29+luc]=highY2.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[33+luc]=highX.fToChar[luc];
- luiCRC16 = 0xFFFF;
- for( luc = 0; luc < 37; luc++)
- luiCRC16 = CRC_16( luiCRC16, lucBuffers[luc]);
- //放置CRC16校驗碼,低位在前,高位在后
- AddressList.liAddress = luiCRC16;
- lucBuffers[ 37] = AddressList.IntToChar[ 1];
- lucBuffers[ 38] = AddressList.IntToChar[ 0];
- Uart2_Tx_str(lucBuffers,39);
-
- return;
- */
- }
-
- if(lucBuffers[3]==0x07) //7為高度Y1標定數據,
- {
- for( luc = 0; luc < 4; luc++)
- fdat.ucChar[luc] = lucBuffers[luc+7];
-
- if((gfCountY1 - fIniValY1)==0)
- fXsValY1 = ((fdat.fVal-fIniY1)/1.0);
- else
- fXsValY1 = ((fdat.fVal-fIniY1)/(gfCountY1 - fIniValY1));
-
- fdat.fVal = fXsValY1;
- bXsY1=1;
- for(luc=0; luc<80; luc++) //把參數區的數據讀出暫存
- E_buf[luc] = byte_read(luc);
- sector_erase(0x0000); // 扇區擦除,清空參數區的數據
- E_buf[0x20] = 0x0; //0x20單元清零表示高度Y1標定數據已經保存過
- for( luc = 0; luc < 4; luc++) //把初始值保存0x21,0x2,0x23,0x24
- E_buf[0x20+1+luc] = fdat.ucChar[luc];
- for(luc=0; luc<80; luc++) //把暫存區的數據寫入參數區
- byte_program(0x0000+luc, E_buf[luc]);// 字節編程
- fCalHigh();
- /*
- lucBuffers[2]=26;
- for(luc=0; luc<6; luc++)
- lucBuffers[3+luc]=E_buf2[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[9+luc]=highH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[13+luc]=SpeedH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[17+luc]=highH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[21+luc]=SpeedH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[25+luc]=highY1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[29+luc]=highY2.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[33+luc]=highX.fToChar[luc];
- luiCRC16 = 0xFFFF;
- for( luc = 0; luc < 37; luc++)
- luiCRC16 = CRC_16( luiCRC16, lucBuffers[luc]);
- //放置CRC16校驗碼,低位在前,高位在后
- AddressList.liAddress = luiCRC16;
- lucBuffers[ 37] = AddressList.IntToChar[ 1];
- lucBuffers[ 38] = AddressList.IntToChar[ 0];
- Uart2_Tx_str(lucBuffers,39);
-
- return;
- */
- }
- //---------------------------------------------------------------------
- if(lucBuffers[3]==0x10) //大車X初始值
- {
- for(luc=0; luc<80; luc++) //把參數區的數據讀出暫存
- E_buf[luc] = byte_read(luc);
- sector_erase(0x0000); // 扇區擦除,清空參數區的數據
- E_buf[0x40+5] = 0x0; //0x45單元清零表示高度X初始值已經保存過
- fdat.fVal = gfCountX; //把當前的值當初始值
- fIniValX = gfCountX;
- for( luc = 0; luc < 4; luc++) //把初始值保存0x46,0x47,0x48,0x49
- E_buf[0x40+6+luc] = fdat.ucChar[luc];
- E_buf[0x40+10] = 0x0; //0x4A單元清零表示高度X初高度已經保存過
- for( luc = 0; luc < 4; luc++) //把初高度保存0x4B,0x4C,0x4D,0x4E
- {
- E_buf[0x40+11+luc] = lucBuffers[luc+7];
- fdat.ucChar[luc] = lucBuffers[luc+7];
- }
- fIniX = fdat.fVal;
- for(luc=0; luc<80; luc++) //把暫存區的數據寫入參數區
- byte_program(0x0000+luc, E_buf[luc]);// 字節編程
- fCalHigh();
- /*
- lucBuffers[2]=26;
- for(luc=0; luc<6; luc++)
- lucBuffers[3+luc]=E_buf2[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[9+luc]=highH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[13+luc]=SpeedH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[17+luc]=highH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[21+luc]=SpeedH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[25+luc]=highY1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[29+luc]=highY2.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[33+luc]=highX.fToChar[luc];
- luiCRC16 = 0xFFFF;
- for( luc = 0; luc < 37; luc++)
- luiCRC16 = CRC_16( luiCRC16, lucBuffers[luc]);
- //放置CRC16校驗碼,低位在前,高位在后
- AddressList.liAddress = luiCRC16;
- lucBuffers[ 37] = AddressList.IntToChar[ 1];
- lucBuffers[ 38] = AddressList.IntToChar[ 0];
- Uart2_Tx_str(lucBuffers,39);
-
- return;
- */
- }
-
- if(lucBuffers[3]==0x11) //11為高度X標定數據,
- {
- for( luc = 0; luc < 4; luc++)
- fdat.ucChar[luc] = lucBuffers[luc+7];
-
- if((gfCountX - fIniValX)==0)
- fXsValX = ((fdat.fVal-fIniX)/1.0);
- else
- fXsValX = ((fdat.fVal-fIniX)/(gfCountX - fIniValX));
-
- fdat.fVal = fXsValX;
- bXsX=1;
- for(luc=0; luc<80; luc++) //把參數區的數據讀出暫存
- E_buf[luc] = byte_read(luc);
- sector_erase(0x0000); // 扇區擦除,清空參數區的數據
- E_buf[0x40] = 0x0; //0x40單元清零表示高度X標定數據已經保存過
- for( luc = 0; luc < 4; luc++) //把初始值保存0x41,0x42,0x43,0x44
- E_buf[0x40+1+luc] = fdat.ucChar[luc];
- for(luc=0; luc<80; luc++) //把暫存區的數據寫入參數區
- byte_program(0x0000+luc, E_buf[luc]);// 字節編程
- fCalHigh();
- /*
- lucBuffers[2]=26;
- for(luc=0; luc<6; luc++)
- lucBuffers[3+luc]=E_buf2[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[9+luc]=highH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[13+luc]=SpeedH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[17+luc]=highH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[21+luc]=SpeedH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[25+luc]=highY1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[29+luc]=highY2.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[33+luc]=highX.fToChar[luc];
- luiCRC16 = 0xFFFF;
- for( luc = 0; luc < 37; luc++)
- luiCRC16 = CRC_16( luiCRC16, lucBuffers[luc]);
- //放置CRC16校驗碼,低位在前,高位在后
- AddressList.liAddress = luiCRC16;
- lucBuffers[ 37] = AddressList.IntToChar[ 1];
- lucBuffers[ 38] = AddressList.IntToChar[ 0];
- Uart2_Tx_str(lucBuffers,39);
-
- return;
- */
- }
- //---------------------------------------------------------------------
- if(lucBuffers[3]==0x08) //2#小車起Y2初始值
- {
- for(luc=0; luc<80; luc++) //把參數區的數據讀出暫存
- E_buf[luc] = byte_read(luc);
- sector_erase(0x0000); // 扇區擦除,清空參數區的數據
- E_buf[0x30+5] = 0x0; //0x35單元清零表示高度Y2初始值已經保存過
- fdat.fVal = gfCountY2; //把當前的值當初始值
- fIniValY2 = gfCountY2;
- for( luc = 0; luc < 4; luc++) //把初始值保存0x36,0x37,0x38,0x39
- E_buf[0x30+6+luc] = fdat.ucChar[luc];
- E_buf[0x30+10] = 0x0; //0x3A單元清零表示高度Y2初高度已經保存過
- for( luc = 0; luc < 4; luc++) //把初高度保存0x3B,0x3C,0x3D,0x3E
- {
- E_buf[0x30+11+luc] = lucBuffers[luc+7];
- fdat.ucChar[luc] = lucBuffers[luc+7];
- }
- fIniY2 = fdat.fVal;
- for(luc=0; luc<80; luc++) //把暫存區的數據寫入參數區
- byte_program(0x0000+luc, E_buf[luc]);// 字節編程
- fCalHigh();
- /*
- lucBuffers[2]=26;
- for(luc=0; luc<6; luc++)
- lucBuffers[3+luc]=E_buf2[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[9+luc]=highH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[13+luc]=SpeedH3.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[17+luc]=highH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[21+luc]=SpeedH1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[25+luc]=highY1.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[29+luc]=highY2.fToChar[luc];
- for(luc=0; luc<4; luc++)
- lucBuffers[33+luc]=highX.fToChar[luc];
- luiCRC16 = 0xFFFF;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
讀PLC采樣單元.rar
(119.14 KB, 下載次數: 32)
2018-11-14 16:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|