#include <stdio.h> #include <stdlib.h> #include <math.h> #include "5510drv.h" /*************************************/ unsigned int Gsz[14],Jsz[13],Zqll_k;//调节参数读写 //unsigned int CJz[8];测量I/O点数 unsigned int CJz[15];//测量参数模拟量批量只读 unsigned char YSCBZ[6];//硬手操参数开关量批量只读 //给水阀减温水阀门软手操unsigned int Pgsl[5],Pzql[5],Gsfk_z,Jsfk_z,Gslc; unsigned int Pgsl[5],Pzql[5],gsi,jsi,Gsfk_z,Jsfk_z,GF_RK,YF_RK,GZ_RK1,GZ_RK2,Gslc; unsigned char Ygs,Yjs,YGF,YYF,YGZ1,YGZ2;//硬手操标记只读 unsigned char Rgs,Rjs,RGF,RYF,RGZ1,RGZ2;//软手操标记只写 unsigned char Wgs,Wjs,Wgf,Wyf,Wrs;//参数写入标记只写 /***********LQ's DEFINE START**********/ #define UINT_TYPE 1 #define UCHAR_TYPE 2 #define LOCAL_PLC_ID 0x02 #define BROADCAST_ID 0x0f //static int com_base = 0x3f8; //unsigned char RecDone = 0, SendDone = 0; //unsigned char RecByte; unsigned char count; unsigned char RecBuffer[40], SendBuffer[40]; unsigned char RecByteCount, SendByteCount; char RecPacketLength, SendPacketLength; char StartChannel = 0, EndChannel = 0, ChannelTotal = 1; unsigned char DataSegLength; unsigned char PacketDataType; unsigned char Read_Write_Flag; /*0: read command packet; 1: write command packet*/ /*unsigned int testarray[7]; */ union Data_i /*unsigned int data*/ { unsigned int i_data; unsigned char byte[2]; }data_i[20]; unsigned char data_c[20];//用于保存转换后的unsigned char类型 char DataSeg[60]; /*************LQ's DEFINE END**********/ /*************LQ's FUNCTION START*******/ unsigned char CheckID (unsigned char CheckByte) { char PlcID; char Command; PlcID = CheckByte >> 4; Command = CheckByte & 0x0f; if ((PlcID == LOCAL_PLC_ID) || ((PlcID == BROADCAST_ID))//&& (Command == 0x03 || Command == 0x04))) { return 1; /*the right packet or broadcast packet*/ } return 0; } char CalcPacketLength (unsigned char CommandType, unsigned char ChannelNum) { char Length; char RealChannelNum; if (((CommandType & 0x0f) == 0x01)||((CommandType & 0x0f) == 0x02)) //读取开关量或者测量数据都用计算通道 { StartChannel = ChannelNum >> 4; EndChannel = ChannelNum & 0x0f; ChannelTotal = RealChannelNum = (EndChannel - StartChannel + 1); if (ChannelTotal < 0) { return -1; } } else { ChannelTotal = RealChannelNum = 1; /*it's single channel when the command is write float value*/ } switch (CommandType & 0x0f) { case 0x01: case 0x02: case 0x05: Length = 4; /*read command packet*/ break; case 0x03: Length = 4 + RealChannelNum * 2; /*write command packet(unsigend int)*/ break; case 0x04: Length = 4 + RealChannelNum; /*write command packet(unsigned char)*/ break; case 0x06: Length = 4 + RealChannelNum * 2; /*write command packet(float)*/ break; } return Length; } unsigned char RecData (void) { unsigned char RecDone = 0; unsigned char RecByte; unsigned char ByteCount = 1; char PacketLength = 4; unsigned char InterruptFlag; RecByte = com_rx(); //outportb(com_base + 5, 0x00); //if (RecByte != NULL); printf("%x ", RecByte); if (RecByte != '\0' && RecByte == '@') { /*还要加点预防读数据漏字节,读不够包长的处理措施*/ RecBuffer[0] = RecByte; while (ByteCount < PacketLength) { //InterruptFlag = inportb(com_base + 5); //InterruptFlag = InterruptFlag & 0x01; if (com_rx_empty() != TRUE) { RecByte = com_rx(); //outportb(com_base + 5, 0x00); /* printf("%x ", RecByte);*/ if (ByteCount == 1) if (!CheckID(RecByte)) return RecDone; if (ByteCount == 2) { PacketLength = CalcPacketLength(RecBuffer[1], RecByte); if (PacketLength == -1) { return RecDone; } /*printf(" %x ", PacketLength);*/ } RecBuffer[ByteCount++] = RecByte; } } RecPacketLength = PacketLength; /* printf("\n");*/ RecDone = 1; } return RecDone; } /*verify the content of packet whether is right*/ unsigned char VerifyPacket(unsigned char PacketLength) { unsigned char CheckSum = 0; unsigned char i; for (i = 0; i < PacketLength - 1; i++) { CheckSum += RecBuffer[i]; } if(CheckSum == RecBuffer[PacketLength - 1]) { return 1; } else { return 0; } } /*生成出错应答数据包*/ void CreateErrReplyPacket(void) { SendBuffer[0] = '!'; SendBuffer[1] = RecBuffer[1] | 0x08; SendPacketLength = 2; } void GetData(void) { char i, j; if (ChannelTotal > 1) { if (PacketDataType == UINT_TYPE) for (i = StartChannel, j = 0; i <= EndChannel; i++, j++) { //testarray[i] = (unsigned int)CJz[i]; data_i[j].i_data = CJz[i]; } else if (PacketDataType == UCHAR_TYPE)//开关量硬手操,只读 for (i = StartChannel, j = 0; i <= EndChannel; i++, j++) { //testarray[i] = (unsigned int)CJz[i]; data_c[0] = YSCBZ[i]; } } else { if (PacketDataType == UINT_TYPE) { if (RecBuffer[2] >= 50 && RecBuffer[2] <= 63) { data_i[0].i_data = Gsz[RecBuffer[2] - 50]; } else if (RecBuffer[2] >= 70 && RecBuffer[2] <= 82) { data_i[0].i_data = Jsz[RecBuffer[2] - 70]; } else if (PacketDataType == UCHAR_TYPE)//参数修改标志开关量,读写;不用 { //data_c[0] = } } } } void SetData(void) { unsigned int iTemp; switch (PacketDataType) { case UCHAR_TYPE: switch(RecBuffer[2] & 0xff) { case 0x00: Rgs = RecBuffer[3] & 0xff; break; case 0x01: Rjs = RecBuffer[3] & 0xff; break; case 0x02: Wgs = RecBuffer[3] & 0xff; break; case 0x03: Wjs = RecBuffer[3] & 0xff; break; case 0x04: Wgf = RecBuffer[3] & 0xff; break; case 0x05: Wyf = RecBuffer[3] & 0xff; break; case 0x06: Wrs = RecBuffer[3] & 0xff; break; case 0x07: RGF = RecBuffer[3] & 0xff; break; case 0x08: RYF = RecBuffer[3] & 0xff; break; case 0x09: RGZ1 = RecBuffer[3] & 0xff; break; case 0x0A: RGZ2 = RecBuffer[3] & 0xff; break; } break; case UINT_TYPE: iTemp = RecBuffer[3]; iTemp <<= 8; iTemp |= (unsigned int)RecBuffer[4]; if (RecBuffer[2] >= 20 && RecBuffer[2] <= 22) { switch(RecBuffer[2]) { case 20: Zqll_k = iTemp; break; case 21: Gsfk_z = iTemp; break; case 22: Jsfk_z = iTemp; break; case 23: GF_RK = iTemp; break; case 24: YF_RK = iTemp; break; case 25: GZ_RK1 = iTemp; break; case 26: GZ_RK2 = iTemp; break; } } else if (RecBuffer[2] >= 50 && RecBuffer[2] <= 63) { Gsz[RecBuffer[2] - 50] = iTemp; } else if (RecBuffer[2] >= 70 && RecBuffer[2] <= 82) { Jsz[RecBuffer[2] - 70] = iTemp; } break; } } void AnalysePacket(void) { switch(RecBuffer[1] & 0x0f) /*switch by command type*/ { case 0x01: /*read AI channel value(unsigned int)*/ Read_Write_Flag = 0; PacketDataType = UINT_TYPE; GetData(); break; case 0x02: /*read switch channel value(unsigned char)*/ Read_Write_Flag = 0; PacketDataType = UCHAR_TYPE; GetData(); break; case 0x03: /*write AI channel value(unsigned int)*/ Read_Write_Flag = 1; PacketDataType = UINT_TYPE; SetData(); break; case 0x04: /*write switch channel value(unsigned char)*/ Read_Write_Flag = 1; PacketDataType = UCHAR_TYPE; SetData(); break; case 0x05: /*read AI channel value(float)*/ Read_Write_Flag = 0; PacketDataType = UINT_TYPE; GetData(); break; //case 0x06: /*write AI channel value(float)*/ //Read_Write_Flag = 1; //PacketDataType = FLOAT_TYPE; //break; } } /*convert the collected data with org. type to the byte type, and then push them into the array of dataseg */ void ConvertData(unsigned char DataType) { unsigned char i, j; unsigned char bcount = 0; switch(DataType) { //case FLOAT_TYPE: /*when the org. type of the data is float(4 bytes)*/ //for (i = 0; i < DataLength; i++) // for (j = 0; j < 4; j++) // DataSeg[count++] = data_f[i].byte[3 - j]; //break; //case FLOAT_TYPE: case UINT_TYPE : /*when the org. type of the data is unsigned int(2 bytes)*/ for (i = 0; i < ChannelTotal; i++) for (j = 0; j < 2; j++) DataSeg[bcount++] = data_i[i].byte[1 - j]; break; case UCHAR_TYPE: /*when the org. type of the data is unsigned char(1 byte)*/ for (i = 0; i < ChannelTotal; i++) DataSeg[bcount++] = data_c[i]; break; } DataSegLength = bcount - 1; } void CreateNormalReplyPacket(unsigned char read_write_flag) { //char TmpByte; char i; /*the reply packet for write command packet*/ SendBuffer[0] = '!'; SendBuffer[1] = RecBuffer[1]; SendPacketLength = 2; /* printf(" read_write_flag = %c", !read_write_flag?'r':'w');*/ if (!read_write_flag) { ConvertData(PacketDataType); SendBuffer[2] = RecBuffer[2]; /*put data into packet*/ for (i = 0; i < DataSegLength + 1; i++) { SendBuffer[3 + i] = DataSeg[i]; } /*calculate the check sum and put it into packet*/ SendBuffer[4 + DataSegLength] = 0; for (i = 0; i < 4 + DataSegLength ; i++) { SendBuffer[4 + DataSegLength] += SendBuffer[i]; } SendPacketLength = 5 + DataSegLength; } } void SendData(void) { unsigned char i; /*printf("\nSendPacketLength = %x\n", SendPacketLength);*/ for (i = 0; i < SendPacketLength; i++) { com_tx(SendBuffer[i]); while(!com_tx_empty()); /*printf("%x ", SendBuffer[i]);*/ } /* SendDone = 1; */ /*printf("\n");*/ } /*串口通讯主循环*/ void EnterCommLoop(void) { //count = 0; while (RecData()) { if (!VerifyPacket(RecPacketLength)) { /*printf("%c", '%');*/ CreateErrReplyPacket(); } else { AnalysePacket(); CreateNormalReplyPacket(Read_Write_Flag); } SendData(); } } void InitCom(void) { //int CommStatus; com_install(1); //CommStatus = com_485_install(); //if (CommStatus != 0) // printf("The 485 com port has been installed!"); com_set_format(8, 0, 1); com_set_speed((unsigned long)38400); //com_flush_tx(); /*清空发送缓冲区*/ //com_flush_rx(); /*清空接收缓冲区*/ } /*************LQ's FUNCTION END*********/ main() { unsigned char t_idx,m,n; Timer_Init(); LED_init(); Init5017H(0); InitCom(); t_idx=Timer_Set(100); /*set time 100ms */ while(1) { while(tmArriveCnt[t_idx]==0) /* 100ms? */ { EnterCommLoop(); /*communication*/ } /*************** 100ms ***************/ Timer_Reset(t_idx); /* reset time */ if((n==0)&&(YGS==0||YJWS==0||YGF==0||YYF==0||YGZ1==0||YGZ2==0)) for(m=0;m<15;m++) {CJZ[m]=2048;n=0;}//所有的测量值都统一 YGS=YJWS=YGF=YYF=YGZ1=YGZ2=1;//设为硬手操1打开,不可写 if(RGF==1){CJZ[12]=CYSW=GF_RK;YGF=0;}//如果PC软手操打开,硬手操关闭 if(RYF==1){CJZ[13]=CYST=YF_RK;YYF=0;} if(RGZ1==1){CJZ[8]=GZF1=GZ_RK1;YGZ1=0;} if(RGZ2==1){CJZ[9]=GZF2=GZ_RK2;YGZ2=0;} if(Rgs==1){CJZ[0]=gsi=Gsfk_z;YGS=0;} if(Rjs==1){CJZ[1]=jsi=Jsfk_z;YJWS=0;} if((n==0)&&(Wgs==0||Wjs==0||Wgf==0||Wyf==0||Wrs==0)) //传送调解参数,没有写入标记 { for(m=0;m<14;m++) {Gsz[m]=100; Jsz[m]=100; } } } } ...
http://www.hackchina.com/r/95026/mysql_version.h__html