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 - Скорость работы в Linux

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

Результаты испытаний на скорость работы PowerAnt - Linux/GCC

Изначально предполагалось, что если переписать программу с задействованием функции select ($man 2 select), программа тестирования будет работать быстрее. Ожидания не оправдались. Выявленные задержки в работе, относительно программы тестирования применяемой для MS DOS, связаны с наличием и "эффективным использованием" буфера FIFO порта RS-232 операционной системой. Так как используются очень коротенькие команды, большинство прерываний порта RS-232 происходит по таймауту. То есть передача команды в PowerAnt происходит очень быстро, PowerAnt быстро отсылает ответ. Если ответ меньше размера буфера FIFO порта RS-232, то отчет о выполнении команды приходит в управляющую программу по таймауту.

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

// Description: Program for PowerAnt speed test
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>

#include <time.h>

void init_raw_tty( int fd ){
    struct termios newtio;

    bzero(&newtio, sizeof(newtio));
    newtio.c_cflag  = B9600 | CS8 | CLOCAL | CREAD  /*| CSTOPB  */;
    newtio.c_iflag  = IGNPAR;
    newtio.c_oflag  = 0;
	        
    /* set input mode (non-canonical, no echo,...) */
    newtio.c_lflag = 0;
				         
    newtio.c_cc[VTIME]    = 1;
    newtio.c_cc[VMIN]     = 1;   /* blocking read until 5 chars received */

    tcflush(fd, TCIFLUSH);
    tcsetattr(fd,TCSANOW,&newtio);
}

FILE * powerants;
int powerants_int;

void printAnswer( void ){
    int inCh;
    do {
        inCh = fgetc(powerants);
        if( inCh > 0 ){
    	    printf("%c",inCh);
	    if( inCh == 0x0D ){ printf("\n"); };
        } else { 
	    printf("Non blocking output!\n"); // Ввод блокирующий, то есть этого сообщения мы никогда не увидим
	    exit( 0 );
	};
    } while( inCh != 0x0D );  
}

int main( int ArgC, char * ArgV[] ){
    if( ArgC < 4 ){
	fprintf( stderr, "ERROR: some parameters are missing (f.e. /dev/ttyS1 3600 '??')\n");
	return 0;
    };
    powerants_int = open(ArgV[1],O_RDWR | O_NOCTTY );

    if(! powerants_int ){
	fprintf( stderr, "ERROR: (open) %s\n", strerror( errno ) );
	return -1;
    };
    printf("Working with %s, 9600 8N1\n",ArgV[1]);

    init_raw_tty( powerants_int );
    powerants = fdopen( powerants_int, "w+b" );

    fputc(  0x1B, powerants );  // Прочистка буфера приема PowerAnt
    int x = atoi( ArgV[2] );
    printf("Cycles:%i\n",(x));    
    printf("Command:'%s'\n",ArgV[3]);    
    time_t start = time( NULL );
    while( x-- ){
	fputs( ArgV[3], powerants );
	fputc( 0x0D, powerants );
	//fprintf(powerants,"%s\r",ArgV[2]);
	//fflush( powerants );
	//printf("%s\n",ArgV[2]);
	printAnswer();
    };
    printf("Time:%li\n",(time(NULL) - start ));
    fclose(powerants);
    return 0;
};

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

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


echo 3600 '?%'
./powerant_1 /dev/ttyS1 3600 '?%' 2>&1 >3600_1.txt

echo 3600 '?='
./powerant_1 /dev/ttyS1 3600 '?=' 2>&1 >3600_2.txt

echo 3600 '??'
./powerant_1 /dev/ttyS1 3600 '??' 2>&1 >3600_3.txt

echo 3600 '=A'
./powerant_1 /dev/ttyS1 3600 '=A' 2>&1 >3600_4.txt

echo 3600 '=abcdefgh' 
./powerant_1 /dev/ttyS1 3600 '=abcdefgh' 2>&1 >3600_5.txt

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

PowerAnt - тип SwSe - /dev/ttyS1, 9600 8N1

^low_latency

Перед выполнением теста выполнена установка режима работы порта "по умолчанию", то есть:

$setserial /dev/ttyS1 ^low_latency

КомандаПередано + принято байт за циклЧисло цикловПередано + принято байтВремя выполнения теста (сек)Скорость (байт/сек)Практически (циклов/сек)Теоретически (циклов/сек)Циклы %
?%<CR>
+%<CR>
6 3600 21600 72 300 50 160 31,25%
?=<CR>
+=ABCDEFGHIJKLMN<CR>
20360072000 140 514,29 25,71 48 53,57%
??<CR>
+? PowerAnt v2_8c SWSE<CR>
26360093600 145 645,52 24,83 36,92 67,24%
=A<CR>
+=<CR>
63600 21600 72 300 50 160 31,25%
=abcdefgh<CR>
+=<CR>
13360046800 99 472,73 36,36 73,85 49,24%

Тесты пройдены без ошибок. Полученная скорость работы устройства значительно отличается от теоретической, что связанно с тем, что программа передает и получает ОЧЕНЬ малые объемы данных. То есть в данном случае на результаты тестирования в большей мере повлияло время переключения контекста задачи, чем сам ввод-вывод.

low_latency

Перед выполнением теста выполнена установка режима быстрой работы порта, то есть:

$setserial /dev/ttyS1 low_latency

КомандаПередано + принято байт за циклЧисло цикловПередано + принято байтВремя выполнения теста (сек)Скорость (байт/сек)Практически (циклов/сек)Теоретически (циклов/сек)Циклы %
?%<CR>
+%<CR>
6 3600 21600 43 502,33 83,72 160 52,33%
?=<CR>
+=ABCDEFGHIJKLMN<CR>
20360072000 109 660,55 33,03 48 68,81%
??<CR>
+? PowerAnt v2_8c SWSE<CR>
26360093600137 683,21 26,28 36,92 71,17%
=A<CR>
+=<CR>
63600 21600 43 502,33 83,72 160 52,33%
=abcdefgh<CR>
+=<CR>
13360046800 72 650 50 73,85 67,71%

Итого по тестам

Тесты пройдены без ошибок. Полученная скорость работы устройства несколько меньше чем в MS DOS, но не настолько катастрофически меньшей, чем в тесте с выключенной опцией low_latency. Судя по тестам, выполняемым командами '??', '?=', '=abcdefgh', задержка в выполнении команд связана с малыми объемами передаваемых и принимаемых данных за один цикл.

Дополнительные сведения

$cat /etc/issue

ASPLinux release 9 (Ural)
Kernel 2.4.20-9asp on an i686


$gcc --version
gcc (GCC) 3.2.2 20030222 (ASPLinux 3.2.2-5asp)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


В документации на ($man setserial) сказано, что установка опции low_latency сделает работу порта более быстрой (что и наблюдается), но увеличит нагрузку на систему (что тоже наблюдается).

$setserial /dev/ttyS1 low_latency
$time ./powerant_1 /dev/ttyS1 3600 '?%' 2>&1 >3600_1.txt

real: 0m43.869s
user: 0m0.160s
 sys: 0m0,160s

$setserial /dev/ttyS1 ^low_latency
$time ./powerant_1 /dev/ttyS1 3600 '?%' 2>&1 >3600_1.txt

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