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

📄 mainu.cpp

📁 这是个16路采集器的上位机源码。该套程序是由C++builder开发的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "MainU.h"
#include "WelcomeU.h"
#include "SetU.h"
#include "BaobiaoSetU.h"
#include "PasswordU.h"
#include "PasswordSetU.h"
#include "chaxunU.h"
#include "uInputID.h"
#include "mp411.h"
#include "DelDatabase.h"
#include "AboutU.h"
#pragma link "mp411.lib"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"


TMainFrm *MainFrm;
//------------自写函数----------
//线程,用于将数据保存到数据库中
DWORD WINAPI SaveData(LPVOID lparam)
{  TMainFrm *pfrm=(TMainFrm *)lparam;
   int i=pfrm->BufCount;
   CoInitialize(NULL);
   pfrm->ADOTable1->Open();
   pfrm->ADOTable1->Last();
   for( ;i>0;i--)
   { pfrm->ADOTable1->Append();
     pfrm->ADOTable1->FieldByName("datetime")->AsDateTime=pfrm->Buffer[pfrm->tou].shijian;
     for(int j=0;j<16;j++)
      if(pfrm->box[j]->Checked)
       { pfrm->ADOTable1->FieldByName("chx"+AnsiString(j+1))->AsString=pfrm->Buffer[pfrm->tou].dianya[j];
         pfrm->ADOTable1->FieldByName("chy"+AnsiString(j+1))->AsString=pfrm->Buffer[pfrm->tou].jiexi[j];
       } //end for(j)
     pfrm->tou++;
     if(pfrm->tou>=BUFSIZE)   pfrm->tou=0;
   } //end for(i)
   pfrm->ADOTable1->Close();
   CoUninitialize();
   pfrm->CountFlag=true;
   return 0;
}
//---------------------------------------------------------------------------
DWORD WINAPI beep(LPVOID lparam)
{
   Beep(5000,5000);
}
//---------------------------------------------------------
__fastcall TMainFrm::TMainFrm(TComponent* Owner)
        : TForm(Owner)
{
   edt[0]=Edit1;
   edt[1]=Edit2;
   edt[2]=Edit3;
   edt[3]=Edit4;
   edt[4]=Edit5;
   edt[5]=Edit6;
   edt[6]=Edit7;
   edt[7]=Edit8;
   edt[8]=Edit9;
   edt[9]=Edit10;
   edt[10]=Edit11;
   edt[11]=Edit12;
   edt[12]=Edit13;
   edt[13]=Edit14;
   edt[14]=Edit15;
   edt[15]=Edit16;
   edt[16]=Edit17;
   edt[17]=Edit18;
   edt[18]=Edit19;
   edt[19]=Edit20;
   edt[20]=Edit21;
   edt[21]=Edit22;
   edt[22]=Edit23;
   edt[23]=Edit24;
   edt[24]=Edit25;
   edt[25]=Edit26;
   edt[26]=Edit27;
   edt[27]=Edit28;
   edt[28]=Edit29;
   edt[29]=Edit30;
   edt[30]=Edit31;
   edt[31]=Edit32;
   box[0]=CheckBox1;
   box[1]=CheckBox2;
   box[2]=CheckBox3;
   box[3]=CheckBox4;
   box[4]=CheckBox5;
   box[5]=CheckBox6;
   box[6]=CheckBox7;
   box[7]=CheckBox8;
   box[8]=CheckBox9;
   box[9]=CheckBox10;
   box[10]=CheckBox11;
   box[11]=CheckBox12;
   box[12]=CheckBox13;
   box[13]=CheckBox14;
   box[14]=CheckBox15;
   box[15]=CheckBox16;
   line[0]=Series1;
   line[1]=LineSeries1;
   line[2]=LineSeries2;
   line[3]=LineSeries3;
   line[4]=LineSeries4;
   line[5]=LineSeries5;
   line[6]=LineSeries6;
   line[7]=LineSeries7;
   line[8]=LineSeries8;
   line[9]=LineSeries9;
   line[10]=LineSeries10;
   line[11]=LineSeries11;
   line[12]=LineSeries12;
   line[13]=LineSeries13;
   line[14]=LineSeries14;
   line[15]=LineSeries15;
   danwei[0]=Label2;
   danwei[1]=Label7;
   danwei[2]=Label10;
   danwei[3]=Label12;
   danwei[4]=Label14;
   danwei[5]=Label16;
   danwei[6]=Label18;
   danwei[7]=Label20;
   danwei[8]=Label22;
   danwei[9]=Label24;
   danwei[10]=Label26;
   danwei[11]=Label28;
   danwei[12]=Label30;
   danwei[13]=Label32;
   danwei[14]=Label34;
   danwei[15]=Label36;
  // hComm=LoadLibrary("mp411.dll");
   count=-1;
   this->Left=0;
   this->Top=0;
   for(int i=0;i<16;i++)
    {
      min[i]="0";
      max[i]="5";
      //SetVal[i]="90";
      //ReSetVal[i]="88";
      jixianzhi[i]="5";
      danwei[i]->Caption="温度(℃)";
      dianyafanwei[i]=0;
    }
   StatusBar1->Panels->Items[3]->Text="    停止采集数据";
   hDevice=INVALID_HANDLE_VALUE;

   //读取密码文件
   AnsiString FileName="pas.pak";
   infile.clear();
   infile.open(FileName.c_str(),fmOpenRead);
   if(infile)
   {  infile>>enpassword>>password;
      //解密
      for(unsigned int i=0;i<StrLen(password);i++)
         password[i]+=(-1-i);
   }
   else
   {
     Application->MessageBox("文件pas.pak丢失!","错误!",MB_ICONERROR);
     this->Close();
   }
   infile.close();
   //读取set值
   FileName="set.dat";
   infile.clear();
   char Strdanwei[16][30];
   char Strmin[16][20],Strmax[16][20],Strjixianzhi[16][20];
   /*******自定义数组,用来存入输入的输出值和恢复值,xp,11-11***********/
   char StrVal_SetVal[16][20],StrVal_ReSetVal[16][20];
   /********************************************************************/
   infile.open(FileName.c_str(),fmOpenRead);
   //if(!infile.eof())
   // {
    for(int i=0;i<16;i++)
    {
          infile>>Strmin[i];
          infile>>Strmax[i];
          /*******用来初始化时读入入输入的输出值和恢复值,xp,11-11***********/
          infile>>StrVal_SetVal[i];
          infile>>StrVal_ReSetVal[i];
          /*******************************************************/
          infile>>Strjixianzhi[i];
          infile>>Strdanwei[i];
          infile>>dianyafanwei[i];
         // if(infile.eof()) break;
          danwei[i]->Caption=AnsiString(Strdanwei[i])+"    ";
          min[i]=AnsiString(Strmin[i]);
          max[i]=AnsiString(Strmax[i]);
          /*******读出已存的输入的输出值和恢复值,xp,11-11***********/
          SetVal[i]=AnsiString(StrVal_SetVal[i]);
          ReSetVal[i]=AnsiString(StrVal_ReSetVal[i]);
          /*********************************************************/
          jixianzhi[i]=AnsiString(Strjixianzhi[i]);
    }
       unsigned int shijian;
       infile>>shijian;
       Timer2->Interval=shijian;

   // }
   infile.close();
   //密码验证
   //if(enpassword=='1')
   // { Application->CreateForm(__classid(TPasswordFrm), &PasswordFrm);
    //  PasswordFrm->Show();
   // }
   //欢迎窗口
   Application->CreateForm(__classid(TWelcomeFrm), &WelcomeFrm);
   WelcomeFrm->Show();
    this->PageControl1->ActivePage = TabSheet1;   // by fang 08.1.10
    AdoDir = GetCurrentDir() + "\\data.mdb";      // by fang 08.1.11
    start= Now();                                 // by fang 08.1.11
    end  = Now();                                 // by fang 08.1.11
     //读设备号文件    by fang 2008.1.28
   FileName="ps.pak";
   char tempID[17];
   infile.clear();
   infile.open(FileName.c_str());
   if(infile)
      infile>>IDFlag >>tempID;
   infile.close();
   DeviceID = AnsiString(tempID);
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::FormClose(TObject *Sender, TCloseAction &Action)
{ //添加对话框
  if(Timer2->Enabled)
  { if(Application->MessageBox("当前正在采集数据,确实要退出吗?","提示",MB_OKCANCEL+MB_ICONWARNING)==IDOK)
    {  Button5Click(Sender);
       while(!CountFlag)
       Sleep(10);
    }
    else
    { Action=caNone;
      return;
    }
  }
   MP411_CloseDevice(hDevice);
 /*  FARPROC lpFarProc;
  if(hComm!=NULL)
   { lpFarProc=GetProcAddress(hComm,"MP411_CloseDevice");
      if(lpFarProc==NULL)
       { ShowMessage("CloseUSBDev Error");  return ; }
      else
       { MP411_CloseDevice=(long __stdcall (__cdecl*)(HANDLE hDevice))lpFarProc;
         MP411_CloseDevice(hDevice);
       }
   }
  else
    ShowMessage("lib error");
  FreeLibrary("mp411.dll");   */
  //写入set
  outfile.clear();
  AnsiString FileName="set.dat";
  outfile.open(FileName.c_str());
  for(int i=0;i<16;i++)
  { outfile<<min[i].c_str()<<endl;
    outfile<<max[i].c_str()<<endl;
    /*******写入输入的输出值和恢复值到指定的外部文件,xp,11-11***********/
    outfile<<SetVal[i].c_str()<<endl;
    outfile<<ReSetVal[i].c_str()<<endl;
    /*******************************************************************/
    outfile<<jixianzhi[i].c_str()<<endl;
    outfile<<danwei[i]->Caption.c_str()<<endl;
    outfile<<dianyafanwei[i]<<endl;
  }
  unsigned int shijian;
  shijian=Timer2->Interval;
  outfile<<shijian<<endl;
  outfile.close();
  WelcomeFrm->Close();

}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::Timer1Timer(TObject *Sender)
{
   this->StatusBar1->Panels->Items[2]->Text="当前时间"+DateTimeToStr(Now());
   if(hDevice==INVALID_HANDLE_VALUE)
    { /* FARPROC lpFarProc;
       if(hComm!=NULL)
        { lpFarProc=GetProcAddress(hComm,"MP411_OpenDevice");
           if(lpFarProc==NULL)
            {ShowMessage("OpenUSBDev Error");  return ;}
           else
            { MP411_OpenDevice=(HANDLE __stdcall (__cdecl*)(long dev_num))lpFarProc;
              hDevice=MP411_OpenDevice(0);
            }
         }
       else
          ShowMessage("lib error");  */
      hDevice=MP411_OpenDevice(0);    
    }
   else
    this->StatusBar1->Panels->Items[1]->Text="   当前状态:设备正常连接";
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::Button1Click(TObject *Sender)
{
   Application->CreateForm(__classid(TSetFrm), &SetFrm);
   SetFrm->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::Timer2Timer(TObject *Sender)
{count++;
 for(int i=1;i<=16;i++)
  if(box[i-1]->Checked)
  {switch(dianyafanwei[i-1])
    { case 0: data[i-1]=MP411_AD(hDevice, i-1, 0, 0, 10);
              dianyazhi[i-1]=FormatFloat("0.000",data[i-1]*5000.0/4095.0);
              jiexizhi[i-1]=FormatFloat("0.000",StrToFloat(min[i-1])+data[i-1]/4095.0*(StrToFloat(max[i-1])-StrToFloat(min[i-1])+StrToFloat(jixianzhi[i-1])));
              /********用于比较指定的输出值和恢复值与解析值的关系,xp,11-12*****/
              if((jiexizhi[i-1]>SetVal[i])&&(jiexizhi[i-1]>ReSetVal[i]))
              {
                /***********用于DA输出模式的选择和输出相应结果并报警,xp,11-13******/
                MP411_DA_Mode(hDevice,0,0);         //输出范围是0-10V时,DA0.1通道的相应值设为0
                MP411_DA_Data(hDevice,0,data[i-1]);
                /***************此处创建单独线程用来报警,xp,11-13***************/
                CreateThread(NULL,0,beep,this,0,NULL);
                /***************************************************************/
                //Beep(5000,5000);   报警函数
                /******************************************************************/
              }
              /****************************************************************/
               break;
      case 1: data[i-1]=MP411_AD(hDevice, i-1, 1, 0, 10);
              dianyazhi[i-1]=FormatFloat("0.000",data[i-1]*10000.0/4095.0);
              jiexizhi[i-1]=FormatFloat("0.000",StrToFloat(min[i-1])+data[i-1]/4095.0*(StrToFloat(max[i-1])-StrToFloat(min[i-1])+StrToFloat(jixianzhi[i-1])));
               /********用于比较指定的输出值和恢复值与解析值的关系,xp,11-12*****/
              if((jiexizhi[i-1]>SetVal[i])&&(jiexizhi[i-1]>ReSetVal[i]))
              {
                /***********用于DA输出模式的选择和输出相应结果并报警,xp,11-13******/
                MP411_DA_Mode(hDevice,0,0);      //输出范围是0-10V时,DA0.1通道的相应值设为0
                MP411_DA_Data(hDevice,0,data[i-1]);
                /***************此处创建单独线程用来报警,xp,11-13***************/
                CreateThread(NULL,0,beep,this,0,NULL);
                /***************************************************************/
                //Beep(5000,5000);   报警函数
                /******************************************************************/
              }
              /****************************************************************/
               break;
      case 2: data[i-1]=MP411_AD(hDevice, i-1, 2, 0, 10);
              dianyazhi[i-1]=FormatFloat("0.000",(data[i-1]-2048)*5000.0/2048.0);
              jiexizhi[i-1]=FormatFloat("0.000",StrToFloat(min[i-1])+data[i-1]/4095.0*(StrToFloat(max[i-1])-StrToFloat(min[i-1])+StrToFloat(jixianzhi[i-1])));
               /********用于比较指定的输出值和恢复值与解析值的关系,xp,11-12*****/
              if((jiexizhi[i-1]>SetVal[i])&&(jiexizhi[i-1]>ReSetVal[i]))
              {
                /***********用于DA输出模式的选择和输出相应结果并报警,xp,11-13******/
                MP411_DA_Mode(hDevice,1,1);    //输出范围是+/-5V时,DA0.1通道的相应值设为1
                MP411_DA_Data(hDevice,0,data[i-1]);
                /***************此处创建单独线程用来报警,xp,11-13***************/
                CreateThread(NULL,0,beep,this,0,NULL);
                /***************************************************************/
                //Beep(5000,5000);   报警函数
                /******************************************************************/
              }
              /****************************************************************/
               break;
      case 3: data[i-1]=MP411_AD(hDevice, i-1, 0, 0, 10);
              dianyazhi[i-1]=FormatFloat("0.000",data[i-1]*5000.0/4095.0);
              jiexizhi[i-1]=FormatFloat("0.000",StrToFloat(min[i-1])+(data[i-1]-819.0)/3276.0*(StrToFloat(max[i-1])-StrToFloat(min[i-1])+StrToFloat(jixianzhi[i-1])));
               /********用于比较指定的输出值和恢复值与解析值的关系,xp,11-12*****/
              if((jiexizhi[i-1]>SetVal[i])&&(jiexizhi[i-1]>ReSetVal[i]))
              {
               /***********用于DA输出模式的选择和输出相应结果并报警,xp,11-13******/
                MP411_DA_Mode(hDevice,0,0);      //输出范围是0-10V时,DA0.1通道的相应值设为0
                MP411_DA_Data(hDevice,0,data[i-1]);
                /***************此处创建单独线程用来报警,xp,11-13***************/
                CreateThread(NULL,0,beep,this,0,NULL);
                /***************************************************************/
                //Beep(5000,5000);     报警函数
                /******************************************************************/
              }
              /****************************************************************/
              break; //by fang 2008.1.11
      default: ShowMessage("gain值超出范围");
     }//end switch
   edt[2*i-2]->Text=dianyazhi[i-1];
   edt[2*i-1]->Text=jiexizhi[i-1];
   //这里删除
   if(line[i-1]->Count()>500)  line[i-1]->Delete(count%500);
   line[i-1]->AddXY(count,jiexizhi[i-1].ToDouble(),"",line[i-1]->SeriesColor);
  }
   if(S4->Checked)
   {
     wei++;
   if(wei>=BUFSIZE) wei=0;
   Buffer[wei].shijian=Now();
   for(int i=0;i<16;i++)
    if(box[i]->Checked)
     { Buffer[wei].dianya[i]=dianyazhi[i];
       Buffer[wei].jiexi[i]=jiexizhi[i];
     }
   if(CountFlag)  //如果有线程,不进行此操作
   { BufCount=wei-tou+1;
     if(BufCount<0) BufCount+=BUFSIZE;
     if(BufCount>=BUFSIZE/2) //启动线程
     { CountFlag=false;
       CreateThread(NULL,0,SaveData,this,0,NULL);
     }
   }
  }//end for
}
//---------------------------------------------------------------------------
AnsiString __fastcall TMainFrm::EncryptID(AnsiString RealID)     //加密
{
   AnsiString  RealChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";  //
   AnsiString  MapChar  = "KDOIEHNBMVLAPQJFUYRGZTWSCX";  //加密映射字符
   AnsiString  EncryptID="",BaseStr="",IDChar="";
   //int CharNum ;   //所用字符的个数
   int seq_index;
   int BasePos = 10,OffsetPos,temp;//基位置,位置偏移量
   int realPos;
  
   //CharNum = RealChar.Length();   //所用字符的个数

   //加密
   //以第10个字符为基准进行偏移加密
   BaseStr   = RealID.SubString(BasePos,1);
   OffsetPos = RealChar.Pos(BaseStr);

   //第一步:先得到各字符在MapChar中对应的字符,基位字符不变
   //第二步:进行偏移加密  基位字符不变
   for (int i = 1; i<=16;i++)
   {
     //先得到RealID字符在 RealChar中的位置
      IDChar = RealID.SubString(i,1);
      realPos = RealChar.Pos(IDChar);
      //得到映射字符
       if (i == BasePos)
           EncryptID +=  RealID.SubString(BasePos,1);
       else
       {
           temp = realPos + OffsetPos;
           if (temp>26)
               temp -= 26;
           EncryptID +=  MapChar.SubString(temp, 1);
       }
   }
   return   EncryptID;
}
//------------------------------------------------------------------------------
void __fastcall TMainFrm::Button4Click(TObject *Sender)
{   wei=-1;
    tou=0;
    CountFlag=true;

⌨️ 快捷键说明

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