В настоящее время мы не планируем проводить сертификацию своего оборудования во всевозможных компетентных организациях. Но мы проводим собственную сертификацию, результаты которой и приводятся на этой странице.
Тестирование производилось при помощи следующей программы:
// 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% |
Тесты пройдены без ошибок.