Смекни!
smekni.com

Разработка программы контроля изделий и подготовка программной документации (стр. 4 из 4)

if(received_version == Module[i].version[j]->value){

mes =AnsiString(" ") + Module[i].version[j]->description + AnsiString(" 0x") + IntToHex((int) Module[i].version[j]->value, Module[i].version[j]->type) + AnsiString(" :HOPMA ");

msg(mes.c_str());

logmsg(mes.c_str());

}

else {

mes =AnsiString(" ") + Module[i].version[j]->description + AnsiString(" 0x") + IntToHex((int) received_version, Module[i].version[j]->type) + AnsiString(" :HEHOPMA ") + AnsiString("(должно быть 0x") + IntToHex((int) Module[i].version[j]->value, Module[i].version[j]->type) + AnsiString(")");

msg(mes.c_str());

logmsg(mes.c_str());

error+=1;

}

}

}

// перевести вывод в режим отладочной (0x01 0x02) или отчетной (0x01 0x01) информации

received_data[0] = 0x01; received_data[1] = 0x01;

res = mWrite(m_Disp, received_data, 2, &wrtd);

if(res != 0x0)

{

// sprintf(received_data, "Ошибка %d при переводе вывода в режим отчетной информации", res);

// MessageBox(NULL, received_data, "Ошибка", MB_OK);

}

// общий результат тестирования

if(error) {

msg(" ");

msg("Результат: НЕНОРМА");

logmsg(" ");

logmsg("Результат: НЕНОРМА");

}

else {

msg(" ");

msg("Результат: НОРМА");

logmsg(" ");

logmsg("Результат: НОРМА");

}

// освобождаем динамически выделенную память

if (item_type == 1) {

delete [] Module;

}

else delete Module;

delete [] Correction;

if(mClose != NULL)

{

// отключить каналы обмена

mClose(m_Disp);

}

ProgExchCl_FreeLibrary();

CoUninitialize();

PostMessage(Form1->Handle, WM_CLOSE, 0,0);

}

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

#ifndef Unit1H

#define Unit1H

//--------------------------------------------------------------#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <msxmldom.hpp>

#include <XMLDoc.hpp>

#include <xmldom.hpp>

#include <XMLIntf.hpp>

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

typedef struct _SVersion{

unsigned int address; //адрес регистра версии

unsigned int value; //считанное значение версии

unsigned int type; //разрядность версии

AnsiString description;//описание версии

} TVersion,* PVersion;

typedef struct _SModule{

AnsiString name; //имя модуля

unsigned int baseaddress; //базовый адрес модуля

int version_count;//количество версий у модуля

PVersion version[10]; //массив версий модуля

} TModule,* PModule;

typedef struct _SCorrection{

AnsiString name;

AnsiString new_name;

} TCorrection,* PCorrection;

class TForm1 : public TForm

{

__published: // IDE-managed Components

TXMLDocument *XMLDocument1;

TMemo *LogText;

void __fastcall FormActivate(TObject *Sender);

void __fastcall FormClose(TObject *Sender, TCloseAction &Action);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

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

extern PACKAGE TForm1 *Form1;

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

#endif

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

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

#include "Unit2.h"

#include <stdio.h>

//--------------------------------------------------------------#pragma package(smart_init)

#pragma resource "*.dfm"

Executing *Thread;

TForm1 *Form1;

tagMSG lpMsg;

//--------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

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

void __fastcall TForm1::FormActivate(TObject *Sender)

{

Thread = new Executing(FALSE); // запускаем поток

}

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

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{

Thread->WaitFor();

delete (Thread);

}

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

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

#ifndef UdevicesH

#define UdevicesH

#include <classes.hpp>

//#include "U_MK_pipe.h"

#include <Mask.hpp>

//--------------------------------------------------------------// Абстрактный класс, реализующий базовые функции любого устройства

class TDevFather: public TObject

{

__published:

private: // User declarations

protected:

bool active;

char receiver[0x1000];//априорно выделено 4кб буфера, приготовлены для отправки классу монитору

int receiver_size;//размер реально принятых байт в буфере

public:

virtual __fastcall TDevFather();

virtual __fastcall ~TDevFather();

virtual int __fastcall link_on();

virtual int __fastcall link_off();

//функции для работы с мостом в целях ввода/вывода

//чтение из буфера устройтва

virtual int __fastcall scan();//Возвращает признак состояния устройства

virtual int __fastcall read();//Если положительное число, то это число пинятых байт, если отрицательное, то это код ошибки

virtual char* __fastcall get_receiver_ptr();//

//отправить данные

virtual int __fastcall write(char* chs, int size);//передача символов/байтов на устройство

//запись в буфер

//virtual int __fastcall add_to_sender(char* chs, int size);//передача символов/байтов в передающий буфер

};

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

class TCom: public TDevFather

{

__published:

private: // User declarations

protected:

AnsiString comname;

int baudrate;

HANDLE com_hndl;

DCB st_dcb;

public:

virtual __fastcall TCom(char* comname, int baudrate);

virtual __fastcall ~TCom();

int __fastcall link_on();

int __fastcall link_off();

//функции для работы с мостом в целях ввода/вывода

//чтение из буфера устройтва

int __fastcall scan();//Возвращает признак состояния устройства

int __fastcall read();//Если положительное число, то это число пинятых байт, если отрицательное, то это код ошибки

//virtual char* __fastcall get_receiver_ptr();// метод наследуется без изменения

//отправить данные

virtual int __fastcall write(char* chs, int size);//передача символов/байтов на устройство

//запись в буфер

//virtual int __fastcall add_to_sender(char* chs, int size);//передача символов/байтов в передающий буфер

void __fastcall set_comname(AnsiString comname);

void __fastcall set_baudrate(int baudrate);

AnsiString __fastcall get_comname();

int __fastcall get_baudrate();

};

//--------------------------------------------------------------#endif

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

#pragma hdrstop

#include <Forms.hpp>

#include <Mask.hpp>

#include "Udevices.h"

//--------------------------------------------------------------__fastcall TDevFather::TDevFather(){}

//--------------------------------------------------------------__fastcall TDevFather::~TDevFather(){}

//--------------------------------------------------------------int __fastcall TDevFather::link_on()

{ return 0; }

//--------------------------------------------------------------int __fastcall TDevFather::link_off()

{ return 0; }

//-------------------------------------------------------------- //функции для работы с мостом

int __fastcall TDevFather::scan()//Возвращает признак состояния устройства

{

//

return receiver_size;

}

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

int __fastcall TDevFather::read()//Если положительное число, то это число принятых байт, если отрицательное, то это код ошибки

{

//

return receiver_size;

}

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

char* __fastcall TDevFather::get_receiver_ptr()//

{

return receiver;

}

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

int __fastcall TDevFather::write(char* chs, int size)

{

return size;

}

//---------------TCom-------------------------------------------__fastcall TCom::TCom(char* comname, int baudrate)

{

//

TCom::comname=comname; //="COM1";

TCom::baudrate=baudrate; //=115200;

active=false;

}

//--------------------------------------------------------------__fastcall TCom::~TCom()

{

//

if(active)

{

link_off();

}

}

//--------------------------------------------------------------int __fastcall TCom::link_on()

{

//

if (!active)

{

com_hndl=CreateFile(comname.c_str(), GENERIC_READ | GENERIC_WRITE , 0, NULL, OPEN_EXISTING, 0, 0);

if (com_hndl == INVALID_HANDLE_VALUE)

{

//MessageBoxA(0,"Invalid handle value","Simple_COM", MB_OK);

active=false;

return -1;

}

//настройка параметров соединения

st_dcb.DCBlength= sizeof(DCB);

st_dcb.Parity=NOPARITY; //NOPARITY, ODDPARITY, MARKPARITY , EVENPARITY

st_dcb.StopBits=ONESTOPBIT; //ONESTOPBIT , ONE5STOPBITS , TWOSTOPBITS

st_dcb.ByteSize=8; //4-8

st_dcb.BaudRate=baudrate; //CBR_115200

SetCommState(com_hndl, &st_dcb);

if ( com_hndl == INVALID_HANDLE_VALUE)

{

//MessageBoxA(0,"Invalid handle value","Simple_COM", MB_OK);

active=false;

return -1;

}

SetupComm(com_hndl, 40000, 40000);//размеры банков

if (com_hndl == INVALID_HANDLE_VALUE)

{

//MessageBoxA(0,"Invalid handle value","Simple_COM", MB_OK);

active=false;

return -1;

}

SetCommMask(com_hndl,EV_RXCHAR);

if (com_hndl == INVALID_HANDLE_VALUE)

{

//MessageBoxA(0,"Invalid handle value","Simple_COM", MB_OK);

active=false;

return -1;

}

active=true;

};

if (!active)

{

return -1;

}else{

return 0;

}

}

//--------------------------------------------------------------int __fastcall TCom::link_off()

{

//

if (active)

{

active=false;

CloseHandle(com_hndl);

return 0;

}

else

{

active=false;

return -1;

}

}

//--------------------------------------------------------------int __fastcall TCom::scan()//Возвращает признак состояния устройства

{

COMSTAT st;

unsigned long Err;

if (active)

{

if ( ClearCommError(com_hndl, &Err, &st) )

{

return st.cbInQue;

}

else

{

//MessageBoxA(0,"Com scan error","Simple_COM", MB_OK);

return -1;

}

}

else

{

return 0;

}

}

//--------------------------------------------------------------int __fastcall TCom::read()//Если положительное число, то это число пинятых байт, если отрицательное, то это код ошибки

{

COMSTAT st;

unsigned long Err;

unsigned long readed_bytes;

//

readed_bytes=0;

if (active)

{

if ( ClearCommError(com_hndl, &Err, &st) )

{

if ( (Err & CE_BREAK)>0 )

{

//MessageBoxA(0,"Com read error : CE_BREAK","Simple_COM", MB_OK);

return -2;

}

if ( 0x1000>st.cbInQue )

{

if (! ReadFile(com_hndl, receiver, st.cbInQue, &readed_bytes, NULL) )

{

//MessageBoxA(0,"Com read error : ReadFile 1","Simple_COM", MB_OK);

return -3;

}

}

else

{

if (! ReadFile(com_hndl, receiver, 0x1000, &readed_bytes, NULL) )

{

//MessageBoxA(0,"Com read error : ReadFile 2","Simple_COM", MB_OK);

return -4;

}

}

}

else

{

//MessageBoxA(0,"0шибка сканирования устройства COM","Simple_COM", MB_OK);

}

}

return (int)readed_bytes;

}

//--------------------------------------------------------------int __fastcall TCom::write(char* chs, int size)

{

unsigned long sended;

//

sended=0;

if (! WriteFile(com_hndl, chs, (unsigned long)size, &sended, NULL) )

{//ошибка

//MessageBoxA(0, "Ошибка передачи данных", "Simple_COM", MB_OK);

return -1;

}

return (int)sended;

}

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

void __fastcall TCom::set_comname(AnsiString comname){}

void __fastcall TCom::set_baudrate(int baudrate){}

AnsiString __fastcall TCom::get_comname()

{//

return comname;

}

//--------------------------------------------------------------int __fastcall TCom::get_baudrate()

{//

return baudrate;

}