标题:
工控中用RS485总线读取PLC采样单元单片机源代码
[打印本页]
作者:
MGJSW
时间:
2018-11-14 16:42
标题:
工控中用RS485总线读取PLC采样单元单片机源代码
本项目主要用到了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
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1