В настоящее время мы не планируем проводить сертификацию своего оборудования во всевозможных компетентных организациях. Но мы проводим собственную сертификацию, результаты которой и приводятся на этой странице.
Тестирование производилось при помощи следующей программы:
// File Begin.cpp #include <vcl.h> #pragma hdrstop #include "Begin.h" #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } #include <winbase.h> #include <stdlib.h> #include <time.h> DCB pwrAntDCB; HANDLE pwrAntHANDLE; COMMTIMEOUTS pwrAntCommTimeouts; void ShowError( const char * whereError ){ LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); // Display the string. MessageBox( NULL, (const char *)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION ); // Free the buffer. LocalFree( lpMsgBuf ); } BOOL openPwrAntPort( const char * comName ){ pwrAntHANDLE = CreateFile( comName ,GENERIC_READ | GENERIC_WRITE // Read-Write access ,0 // Cannot be shared ,NULL // Security Attributes ,OPEN_EXISTING // Open existing file ,FILE_ATTRIBUTE_NORMAL || FILE_FLAG_WRITE_THROUGH // | FILE_FLAG_NO_BUFFERING // Auto flush ,NULL // Template File ); if( ! pwrAntHANDLE ){ ShowError("CreateFile"); return FALSE; }; if( ! GetCommState( pwrAntHANDLE, &pwrAntDCB )){ ShowError("GetCommState"); return FALSE; }; if( ! BuildCommDCB( "baud=9600 parity=N data=8 stop=1", &pwrAntDCB ) ){ ShowError("BuildCommDCB"); return FALSE; }; if( ! SetCommState( pwrAntHANDLE, &pwrAntDCB )){ ShowError("SetCommState"); return FALSE; }; if( ! GetCommTimeouts( pwrAntHANDLE, &pwrAntCommTimeouts ) ){ ShowError("GetCommTimeouts"); return FALSE; }; pwrAntCommTimeouts.ReadIntervalTimeout = 1; // milliseconds pwrAntCommTimeouts.ReadTotalTimeoutMultiplier = 0; // pwrAntCommTimeouts.ReadTotalTimeoutConstant = 0; // pwrAntCommTimeouts.WriteTotalTimeoutMultiplier = 0; // pwrAntCommTimeouts.WriteTotalTimeoutConstant = 0; // if( ! SetCommTimeouts( pwrAntHANDLE, &pwrAntCommTimeouts ) ){ ShowError("SetCommTimeouts"); return FALSE; }; return TRUE; } BOOL pwrAntCMD( const char * cmd ){ unsigned char buff[70]; unsigned long i; unsigned long io_i; for( i = 0 ; cmd[i] ; i++ ){ buff[i] = cmd[i]; }; buff[i++] = 0x0D; buff[i++] = 0x00; // if( ! WriteFile( pwrAntHANDLE ,buff , i-1 // Do not send Zero at end of command , &io_i , NULL )){ ShowError("WriteFile"); return FALSE; }; if( ! FlushFileBuffers( pwrAntHANDLE )){ ShowError("FlushFileBuffers"); return false; }; // Read the answer from PowerAnt bool noError = false; do { buff[0] = 0; if( ! ReadFile( pwrAntHANDLE ,buff , 50 // Full PowerAnt Buffer Length , &io_i , NULL )){ ShowError("ReadFile"); return false; }; buff[io_i] = 0; // Null Termination for( unsigned int k = 0 ; k < io_i ; k++ ){ if( buff[k] == '+' ){ noError = true; }; if( buff[k] == 0x0D ){ return noError; }; }; } while( 1 ); // Dead loop if 0x0D newer come in return false; } void closePwrAntPort( void ){ if( ! CloseHandle( pwrAntHANDLE )){ ShowError("CloseFile"); return; }; } void __fastcall TForm1::FormCreate(TObject *Sender) { openPwrAntPort( "COM2" ); } void __fastcall TForm1::FormDestroy(TObject *Sender) { closePwrAntPort(); } void testPass( const char * cmd, TEdit * show, TEdit * showErr ){ int count = 3600; int errors = 0; time_t start, end; errors = 0; start = time( NULL ); for( int i = 0; i < count ; i++ ){ if( ! pwrAntCMD( cmd ) ){ errors++; }; }; end = time( NULL ); show->Text = (end - start); showErr->Text = errors; } void __fastcall TForm1::Button1Click(TObject *Sender){ //-------- ?% testPass( "?%" , LastChanges, LastChangesErr ); //-------- ?= testPass( "?=" , AllState, AllStateErr ); //-------- ?? testPass( "??", GetVersion, GetVersionErr ); //-------- =A testPass( "=A", SwitchA, SwitchAErr ); //-------- =AbCdEfGh testPass( "=AbCdEfGh", SwitchAbcdefgh, SwitchAbcdefghErr ); }
Полный текст программы доступен для загрузки в виде zip архива.
Тесты пройдены без ошибок. Полученная скорость работы устройства отличается от теоретической и меньше чем в тестах MS DOS, что связанно с тем, что операционная система пытается максимально эффективно использовать буфера FIFO контроллера RS-232. Кроме того, в случае выполнения еще нескольких ресурсоемких задач, параллельно выполнению программы-теста, наблюдается некоторое замедление, но в отличии от программы под "чистый" MS-DOS, которая выполняется в виде "Сеанса MS-DOS" - буквы из отчетов о выполнении команд не теряются.
Полностью выполнить тест с отключенными буферами FIFO не всегда получается. PowerAnt слишком быстро отвечает на команду =A, в результате чего отчет о выполнении теряется и тест виснет. Это наблюдается если параллельно запущено несколько "тяжелых" приложений.
Результаты выполнения программы отрисовываются только после выполнения всего теста. То есть тест выглядит "зависшим" на все время выполнения.
PowerAnt - тип SwSw - COM2, 9600 8N1
Команда | Передано + принято байт за цикл | Число циклов | Передано + принято байт | Время выполнения теста (сек) | Скорость (байт/сек) | Практически (циклов/сек) | Теоретически (циклов/сек) | Циклы % |
---|---|---|---|---|---|---|---|---|
?%<CR> +%<CR> | 6 | 3600 | 21600 | 54 | 400 | 66,67 | 160 | 41,67% |
?=<CR> +=ABCDEFGHIJKLMN<CR> | 20 | 3600 | 72000 | 113 | 637,17 | 31,86 | 48 | 66,37% |
??<CR> +? PowerAnt v2_9c SWSE 001<CR> | 30 | 3600 | 108000 | 162 | 666,67 | 22,22 | 32 | 69,44% |
=A<CR> +=<CR> | 6 | 3600 | 21600 | 54 | 400 | 66,67 | 160 | 41,67% |
=abcdefgh<CR> +=<CR> | 13 | 3600 | 46800 | 75 | 624 | 48 | 73,85 | 65% |
Тесты пройдены без ошибок.
PowerAnt - тип SwSw - COM2, 9600 8N1
Команда | Передано + принято байт за цикл | Число циклов | Передано + принято байт | Время выполнения теста (сек) | Скорость (байт/сек) | Практически (циклов/сек) | Теоретически (циклов/сек) | Циклы % |
---|---|---|---|---|---|---|---|---|
?%<CR> +%<CR> | 6 | 3600 | 21600 | 36 | 600 | 100 | 160 | 62,5% |
?=<CR> +=ABCDEFGHIJKLMN<CR> | 20 | 3600 | 72000 | 107 | 672,8 | 33,6 | 48 | 70,1% |
??<CR> +? PowerAnt v2_9c SWSE 001<CR> | 30 | 3600 | 108000 | 144 | 750 | 25 | 32 | 78,1% |
=A<CR> +=<CR> | 6 | 3600 | 21600 | 36 | 600 | 100 | 160 | 62,5% |
=abcdefgh<CR> +=<CR> | 13 | 3600 | 46800 | 71 | 659 | 50,7 | 73,85 | 68,6% |
Тесты пройдены без ошибок.