📄 mainu.cpp
字号:
//---------------------------------------------------------------------------
#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 + -