PowerAnt - Могучий Муравей: Научи Свой компьютер Управлять Реальным Миром
PowerAnt это программное управление через RS-232 порт 14 и больше внешними устройствами с помощью компьютера. Открытый, текстовый, хорошо задокументированный протокол управления. Управление электроприборами с потребяемой мощностью до 200Вт. Хотите управлять Реальным Миром даже из MS Excel?.
 Применение
Компьютерный клуб
Компьютерная сеть
Домовая сеть
Умный дом
Прочее
 PowerAnt
Описание
Применение
Тех. характеристики
Документация
Фотографии
 Базовая станция
Описание
Применение
Тех. характеристики
Документация
 Типы PowerAnt
SwSe
SwSw
SeSe
 Скорость работы
MS-DOS
Linux
MS Windows 98
MS Windows 98, Perl
 Программирование
Примеры на Perl
C/C++ - c чего начать
C/C++ - примеры
MS Access 2000
MS Excel 2000
 Заказ
Комплектность
Цены
 ЧаВо
 Новости сайта RSS
 Статьи
 Контакты
 Рейтинги

PowerAnt - Скорость работы в MS Windows 98

В настоящее время мы не планируем проводить сертификацию своего оборудования во всевозможных компетентных организациях. Но мы проводим собственную сертификацию, результаты которой и приводятся на этой странице.

Результаты испытаний на скорость работы PowerAnt - MS Windows/Borland C++ 6

Тестирование производилось при помощи следующей программы:

// 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, в результате чего отчет о выполнении теряется и тест виснет. Это наблюдается если параллельно запущено несколько "тяжелых" приложений.

Результаты выполнения программы отрисовываются только после выполнения всего теста. То есть тест выглядит "зависшим" на все время выполнения.

Результаты тестирования

Буфер FIFO на максимуме

PowerAnt - тип SwSw - COM2, 9600 8N1
КомандаПередано + принято байт за циклЧисло цикловПередано + принято байтВремя выполнения теста (сек)Скорость (байт/сек)Практически (циклов/сек)Теоретически (циклов/сек)Циклы %
?%<CR>
+%<CR>
6 3600 21600 54 400 66,67 160 41,67%
?=<CR>
+=ABCDEFGHIJKLMN<CR>
203600 72000 113 637,17 31,86 48 66,37%
??<CR>
+? PowerAnt v2_9c SWSE 001<CR>
303600108000 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%

Тесты пройдены без ошибок.

Буфер FIFO отключен

PowerAnt - тип SwSw - COM2, 9600 8N1
КомандаПередано + принято байт за циклЧисло цикловПередано + принято байтВремя выполнения теста (сек)Скорость (байт/сек)Практически (циклов/сек)Теоретически (циклов/сек)Циклы %
?%<CR>
+%<CR>
6 3600 21600 36 600 100 160 62,5%
?=<CR>
+=ABCDEFGHIJKLMN<CR>
203600 72000 107 672,8 33,6 48 70,1%
??<CR>
+? PowerAnt v2_9c SWSE 001<CR>
303600108000 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%

Тесты пройдены без ошибок.

PowerAnt это программное управление через RS-232 порт 14 и больше внешними устройствами с помощью компьютера. Открытый, текстовый, хорошо задокументированный протокол управления. Управление электроприборами с потребяемой мощностью до 200Вт. Хотите управлять Реальным Миром даже из MS Excel?.
  © 2004-2022 by  www.anthillsolutions.com