Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
30.04.2019
Размер:
12.71 Кб
Скачать
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <math.h>
#include<iostream>
#include<fstream>
#include "MainForm.h"
#include "FuncEditor.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
#include <iomanip>

TForm1 *Form1;
fstream& operator<< (fstream &s, vector<double> &v){
        s << v.size() << "\t";
        for(vector<double>::iterator i = v.begin(); i != v.end(); i++){
//                s << precision(5) << width(10) << *i << "\t";
				s << setw(10) << fixed << *i << "\t";
        }
        s << endl;
        return s;
}
fstream& operator>> (fstream &s, vector<double> &v){
        size_t size;
        s >> size;
        v.resize(size);
        for(vector<double>::iterator i = v.begin(); i != v.end(); i++)
                s >> *i;
        return s;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
        fromAdder.Bind(PaintBox1);
	fromAdder.SetCaption("Сигнал на входе в объект E(t)");

        fromObject.Bind(PaintBox2);
	fromObject.SetCaption("Сигнал на выходе из объекта Y(t)");

	fromAdc.Bind(PaintBox3);
	fromAdc.SetType(TDSeries2::typeDiscontinuous);
	fromAdc.SetScale(CSpinEdit1->Value);
	fromAdc.SetCaption("Сигнал на выходе из АЦП Y*(t)");

        fromControlObject.Bind(PaintBox4);
	fromControlObject.SetType(TDSeries2::typeDiscontinuous);
	fromControlObject.SetScale(CSpinEdit1->Value);
	fromControlObject.SetCaption("Сигнал на выходе из регулятора");

	fromDac.Bind(PaintBox5);
	fromDac.SetCaption("Сигнал на выходе из ЦАП U(t)");

        toSystem.Bind(PaintBox0);
        toSystem.SetCaption("Входной сигнал X(t)");

        ComboBox1->ItemIndex=0;

        input.resize(100);
        input[0]=1;

        mainControls.resize(50);
        mainControls[0]=0.5;
        mainControls[1]=0.4;
        mainControls[2]=0.3;
        mainControls[3]=0.2;
        mainControls[4]=0.1;

        controlControls.resize(10);
        controlControls[0]=0.3;
        controlControls[0]=0.2;
        controlControls[0]=0.1;

        Process();
}
//---------------------------------------------------------------------------

void TForm1::Process() {
       mainAdder.releaseData();
       mainObject.releaseData();
       controlObject.releaseData();
       controlAdc.releaseData();
       controlDac.releaseData();

       mainAdder.releaseControls();
       mainObject.releaseControls();
       controlObject.releaseControls();

       mainObject.setTau(1);
       controlObject.setTau(CSpinEdit1->Value);
       controlAdc.setTau(CSpinEdit1->Value);
       controlDac.setTau(CSpinEdit1->Value);

       mainAdder.processData(input);

       mainObject.setControls(mainControls);
       controlObject.setControls(controlControls);

       for (int i=0; i<input.size(); i++) {
                mainObject.processData(mainAdder.getData());
                controlAdc.processData(mainObject.getData());
                if (controlAdc.isNew()) {
                        controlObject.processData(controlAdc.getData());
                };
                controlDac.processData(controlObject.getData());
                mainAdder.setControls(controlDac.getData());
                mainAdder.processData(input);
       }

       fromAdc.SetScale(CSpinEdit1->Value);
       fromControlObject.SetScale(CSpinEdit1->Value);
       fromAdc.SetLimit(input.size());
       fromControlObject.SetLimit(input.size());

       vector<double> adderData=mainAdder.getData();
       adderData.pop_back();
       vector<double> objectData=mainObject.getData();
       vector<double> adcData=controlAdc.getData();
       vector<double> cntrlObjectData=controlObject.getData();
       vector<double> dacData=controlDac.getData();

       toSystem.SetData(input);
       fromAdder.SetData(adderData);
       fromObject.SetData(objectData);
       fromAdc.SetData(adcData);
       fromControlObject.SetData(cntrlObjectData);
       fromDac.SetData(dacData);

       toSystem.Update();
       fromAdder.Update();
       fromObject.Update();
       fromAdc.Update();
       fromControlObject.Update();
       fromDac.Update();
}
void __fastcall TForm1::FuncHClick(TObject *Sender)
{
	FuncEditorForm->SetData(mainControls);
	FuncEditorForm->SetCaption("h(t) - объект");
	FuncEditorForm->SetType(TDSeries2::typeContinuous);
	FuncEditorForm->SetScale(1);
	
	if(FuncEditorForm->ShowModal() == mrOk){
		mainControls=FuncEditorForm->GetData();
		Process();
	};
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FuncQClick(TObject *Sender)
{
	FuncEditorForm->SetData(controlControls);
	FuncEditorForm->SetCaption("q(t) - регулятор");
	FuncEditorForm->SetType(TDSeries2::typeDiscontinuous);
	FuncEditorForm->SetScale(5);

	if(FuncEditorForm->ShowModal() == mrOk){
		 controlControls=FuncEditorForm->GetData();
		 Process();
	}
}
//---------------------------------------------------------------------------


void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
        if (Edit1->Text=="") {
                Edit1->Text=100;
        }
        switch ( ComboBox1->ItemIndex ) {
                case 0:
                         input.clear();
                         input.resize(Edit1->Text.ToInt());
                         input[0]=1;
                         Process();
                         break;

                case 1:
                         input.clear();
                         input.resize(Edit1->Text.ToInt());
                         for(int i=0; i<Edit1->Text.ToInt(); i++) {
                                input[i]=(double)20*((double)rand())/RAND_MAX-10;
                         };
                         Process();
                         break;
                case 2:
                         input.clear();
                         input.resize(Edit1->Text.ToInt());
                         for(int i=0; i<Edit1->Text.ToInt(); i++) {
                                input[i]=1;
                         };
                         Process();
                         break;

                case 3:
                         input.clear();
                         input.resize(Edit1->Text.ToInt());
                         input[0]=1;
                         FuncEditorForm->SetData(input);
                         FuncEditorForm->SetCaption("Входной сигнал");
                         FuncEditorForm->SetType(TDSeries2::typeContinuous);
                         FuncEditorForm->SetScale(1);
	                 if(FuncEditorForm->ShowModal() == mrOk){
                         input=FuncEditorForm->GetData();
                         Process();
                         break;
        };
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::CSpinEdit1Change(TObject *Sender)
{
       if (Edit1->Text=="") {
                Edit1->Text=100;
       }

       if (CSpinEdit1->Text!="") {
                Process();
       };
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
        if (Edit1->Text!="") {
        int nSize = Edit1->Text.ToInt();
        switch ( ComboBox1->ItemIndex ) {
                case 0:
                         input.resize(nSize);
                         input[0]=1;
                         Process();
                         break;

                case 1:
                         input.clear();
                         input.resize(nSize);
                         for(int i=0; i < nSize; i++) {
                                input[i]=(double)20*((double)rand())/RAND_MAX-10;
                         };
                         Process();
                         break;

                case 2:
                         input.clear();
                         input.resize(nSize);
                         for(int i=0; i < nSize; i++) {
                                input[i]=1;
                         };
                         Process();
                         break;

                case 3:
                         input.resize(nSize);
                         Process();
                         break;
        };
        }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
	if(ParamStr(1).Length()){
		if(ParamStr(1) == "-auto"){
			AutoMode();
			exit(0);
		}
		else if(ParamStr(1) == "-opt")
			sOptimize = ParamStr(2);
	}
	else
		sOptimize = "optimize.exe";

	if(FileExists(sOptimize)){
		Optimize->Visible = true;		
	}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::AutoMode(){
	HANDLE hEvStart, hEvFinish, hEvClose;
	hEvStart = CreateEvent(NULL, 0, 0, "pous/start");
	hEvFinish = CreateEvent(NULL, 0, 0, "pous/finish");
	hEvClose = CreateEvent(NULL, 0, 0, "pous/close");
	if(!hEvStart || !hEvFinish || !hEvClose)
		exit(0);
	HANDLE hWait[2] = {hEvStart, hEvClose};
	while(1){
		DWORD res = WaitForMultipleObjects(2, hWait, FALSE, INFINITE);
		switch(res){
			case WAIT_OBJECT_0:
				LoadData("data.in");
				FirstProcess();
				SaveData("data.out");

				SetEvent(hEvFinish);
				break;
			case WAIT_OBJECT_0 + 1:
				exit(0);
		}
	}
}

//---------------------------------------------------------------------------

void __fastcall TForm1::SaveData(const char *str) {
       fstream out(str);
       vector<double> adderData=mainAdder.getData();
       adderData.pop_back();
       vector<double> objectData=mainObject.getData();
       vector<double> adcData=controlAdc.getData();
	   vector<double> cntrlObjectData=controlObject.getData();
	   vector<double> dacData=controlDac.getData();
	   setprecision(4);
       out << input;
       out << mainControls;
       out << controlControls;
       out << CSpinEdit1->Value << endl;
       out << adderData;
	   out << objectData;
       out << adcData;
       out << cntrlObjectData;
       out << dacData;
       out.close();
}

void __fastcall TForm1::LoadData(const char *str) {
       fstream out(str, ios_base::in);
       out >> input;
       out >> mainControls;
       out >> controlControls;
       out >> CSpinEdit1->Value;
       Process();
}


void TForm1::FirstProcess() {
       mainAdder.releaseData();
       mainObject.releaseData();
       controlObject.releaseData();
       controlAdc.releaseData();
       controlDac.releaseData();

       mainAdder.releaseControls();
       mainObject.releaseControls();
       controlObject.releaseControls();

	   mainObject.setTau(1);
       controlObject.setTau(CSpinEdit1->Value);
       controlAdc.setTau(CSpinEdit1->Value);
       controlDac.setTau(CSpinEdit1->Value);

       mainAdder.processData(input);

       mainObject.setControls(mainControls);
       controlObject.setControls(controlControls);

       for (int i=0; i<input.size(); i++) {
                mainObject.processData(mainAdder.getData());
                controlAdc.processData(mainObject.getData());
                if (controlAdc.isNew()) {
                        controlObject.processData(controlAdc.getData());
                };
                controlDac.processData(controlObject.getData());
                mainAdder.setControls(controlDac.getData());
                mainAdder.processData(input);
       }

       fromAdc.SetScale(CSpinEdit1->Value);
       fromControlObject.SetScale(CSpinEdit1->Value);
       fromAdc.SetLimit(input.size());
	   fromControlObject.SetLimit(input.size());
}
void __fastcall TForm1::OptimizeClick(TObject *Sender)
{
		SaveData("data.out");
		STARTUPINFO si;
		memset(&si, 0, sizeof(si));
		si.cb = sizeof(si);

		PROCESS_INFORMATION pi;
		BOOL b =  CreateProcess(
			sOptimize.c_str(),
			0,
			0,
			0,
			FALSE,
//			CREATE_NEW_CONSOLE,
			CREATE_NO_WINDOW,
			0,
			0,
			&si,
			&pi
			);

		WaitForSingleObject(pi.hProcess, INFINITE);
		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
//        WinExec(sOptimize, SW_SHOWNORMAL);
		LoadData("data.in");
		ComboBox1->ItemIndex=3;
}
//---------------------------------------------------------------------------

Соседние файлы в папке Drawer