Смекни!
smekni.com

Сеть на основе нейрочипа (стр. 6 из 7)

Выводы

Теперь видно, что реализованное устройство выполняет поставленную задачу и не содержит ошибок, что позволяет без опасений работать с программой и устройством.

Заключение.

В результате проведенной работы была организована структурная схема распределенных датчиков для измерения скорости ветра. Из данной схемы и определения производительности полученной имитируемой системы были сделаны выводы о пригодности нейрочипов для данной области их использования. В результате использование датчиков на основе нейрочипов на небольших аэродромах не имеет под собой экономической основы, т.к. стоимость нейрочипа значительно больше имеющихся на данный момент аналогов, а производительность их при небольшом количестве не значительно выше других процессоров. Поэтому данное устройство нужно использовать при большом количестве датчиков, больше нескольких тысяч, тогда производительность датчиков с нейрочипами и приемо-передающих устройств на их основе значительно выше, чем при том же количестве датчиков с использованием других процессоров. Отсюда видны следующие преимущества и недостатки данного метода.

Преимущества:

· не большая стоимость компонентов для реализации отдельного прикладного узла,

  • очень простая конфигурация узла нижнего уровня,
  • большая номенклатура устройств и приборов, выпускаемых промышленно в странах ЕЭС и США и имеющих встроенные узлы LONWORKS для работы в составе сетей ECHELON (большая распространенность стандарта в мире),
  • большое количество готовых процедур по адаптации типовой периферии в стандартной библиотеке NEURON,
  • простота разработки прикладного программного обеспечения узлов.

Недостатки:

· чрезвычайно большая стоимость, хотя и весьма эффективных и удобных, отладочных средств,

  • отсутствие узлов WDT, узла автоматического сброса при включении питания (требует использования внешнего супервизора) и возможности работы в “спящем режиме” у микроконтроллеров NEURON,
  • крайне слабая поддержка данного стандарта дилерскими фирмами в России.

Программа полностью соответствует техническому заданию и выполняет поставленное задание.

Из-за большой стоимости пакета разработки, компиляции и компановки программ написанных на NEURONC проверить работоспособность программы является невозможным, поэтому приходится довольствоваться лишь примерным теоретическим результатам и результатам имитационного и математического моделирования.

Хотя на данный момент нейрочипы являются дорогостоящим продуктом, но

за ним будущее, т.к. в наше время главным фактором является скорость, а скорость нейрочипа пока не видит ограничений.

Список литературы.

1. Дитрих-Лой-Швайнцер. «LON -технология».ПГТУ .395с. 1999

2. Журнал «Радио и связь» №4 1999г.

3. Войкова А.П. «Нейронные сети и нейрочипы», Москва, 280с., 2000г.

8. Приложения.

8.1. Текст программы.

8.1.1 Подготовка нейрон чипов

************************************************************************

* Эта программа на NeuronCустанавливаетNeuronChip в slaveA

* mode.

************************************************************************

IO_0 parallel slave s_bus;

#defineDATA_SIZE 255 //максимально разрешенное поле данных

struct parallel_io_interface

{

unsigned int length; //length of data field

unsigned int data[DATA_SIZE];

}piofc

when (io_in_ready(s_bus))1 //готовность приема информации

{

piofc.length = DATA_SIZE; //максимальное число в байтах

to read

io_in(s_bus,&piofc); //получить 10 байт

incoming data

}

when (io_out_ready(s_bus)) //готовность передать 10 байт

{

piofc.length = 10; //кол-во байт

io_out(s_bus,&piofc); //передать 10 байт из буфера

}

when (...) //условие по которому будет отправлено сообщение о заполнении буфера

{

io_out_request(s_bus); } request

8.1.2. Программа обработки

************************************************************************

* Эта программа на NeuronCзадаетNeuronChip в slaveA

* подсчет импульсов поступающих с нейрочипа.

************************************************************************

#pragma enable_io_pullups

////////////////////Параматры для подсчета (определяются пользователем)////////////

#definelower_limit 0 //нижний предел подсчета

#defineupper_limit 100 //верхний предел подсчета

#defineshaft_direction 1 //направление счета (т.е.,

0=лево,1=право)

/////////////////// Программа //////////////////////

IO_5 input pulsecount analog_input;

IO_5 input quadrature shaft_encoder; //импульсыпоступаютна 5 входнейрочипа

signed long count;

signed long increment;

when (io_update_occurs(shaft_encoder){

if (shaft_direction) count += input_value;

elsecount -= input_value; //вывод полученных данных

/////////////////// Проверка//////////////////////

if (count<lower_limit) count=lower_limit;

if (count>upper_limit) count=upper_limit; //Проверкапереполненияoverflow

}

when (reset)// Сброс

{

count = 0;

}

************************************************************************

* Эта программа на NeuronCзадаетNeuronChip в masterA

* принимает информацию со всех нейрочипов типа slaveA и в случае превышения порогового уровня в 50 импульсов, что * соответствует ветру 50м/с передает информацию в центральную ЭВМ с указанием номера того датчика с которого поступила * данная информация и времени ее поступления

************************************************************************

#pragma scheduler_reset // процедурасброса

#pragmaenable_io_pull-ups // процедура подчета импульсов (описана выше)

#pragma num_addr_table_entries 1

#pragma one_domain

#pragma app_buf_out_priority_count 0

#pragma net_buf_out_priority_count 0

#definetimerl 100 // таймер производит опрос по входам на наличие информации каждые 100мкС

#definemax_char_from_PC 30 //максимально разрешенное кол-во символов принимаемых нейрочипом

#defineporog 50 //установочный порог

{

unsignedintspeed; //данные о скорости

unsignedintnumber; // данные о номере датчика

};

#definemax_packet_size 60 // максимально разрешенный пакет отсылаемый в ЭВМ

{

unsignedintspeed; //данные о скорости

unsignedintminutes; //время принятия сообщения

unsigned int hours;

unsigned int number // номердатчика

};

/******************************** Дополнительные файлы ************************************/

#include <control.h>

/********************************* Определение I/O ****************************************/

IO_5 output bit RTS;

IO_2 output bit СTS;

IO_4 output serial baud(4800) RXD; // read data from PC

IO_10 output serial baud(4800) TXD; // send data to PC

IO_8 input bit R/W;

IO_5 input bit CS;

IO_9 input bit HS;

/****************************** Сетевыеданные *************************************/

network input struct temp_time pctobc_speed_in; // speed

network input struct temp_time pctobc_number_in; // number

network input struct time NV_time_in; // BC time

network input boolean NVfan_state_in // TRUE: fan is flashing

network input boolean NVcomp_state_in; // TRUE: compressor is on

network output struct temp_time bind_info(unackd) NV_timesetpt_out;

//************************************ Глобальные ***************************************/

char input_but[max_packet_size]; // пакетотсылаемыйвЭВМ

char input_buf1[max_char_from_PC]; // Input from PC (1st time)

char input_buf2[max_char_from_PC]; // Input from PC (2nd time)

char * buf_ptr; // указатель в буфере

boolean packet_found = FALSE; // пакетненайден.

boolean compress_state = FALSE; // датчикнеисправен

intlast_num_chars; // количество принятых символов

int speed;

char out_char[1];

struct bcd digits; // holds BCD data to be sent to PC

// digits.d1 most significant nibble in ms byte

// digits.d2 least significant nibble in ms byte

// digits.d3 most significant nibble

// digits.d4 least significant nibble

// digits.d5 most significant nibble in ls byte

// digits.d6 least significant nibble in ls byte

struct { // data from bc

unsigned int speed;

unsigned int number;

} bc_data;

struct speed_time bc_number;

/************************************ Timers ******************************************/

mtimer repeating check_CTS;

mtimer repeating get_data_from_bc; // every 100 ms poll bc

// then send to PC

/*********************************** Functions ****************************************/

boolean append_packet( )

description: assert CTS, append data to input_buf[ ] if any

and return append_packet = TRUE if 1st char. = ‘D’

and last char. is a CR.

{

boolean packet;

int i;

int num_chars1;

int num_chars2;

packet = FALSE;

num_chars1 = 0;

num_chars2 = 0;

io_out( CTS, 0 ); // enable cts

num_chars1 = io_in( RXD, input_buf1, max_char_from_PC );

io_out( CTS, 1 ); // disable cts

when (io_puls_up io_5 > porog )

{

num_chars2 = io_in( RXD, input_buf2, max_char_from_PC );

// append data over to where final packet goes

if ( num_chars1 != 0 )

{ // if data append it to input_buf

for ( i = last_num_chars; i < last_num_chars + num_chars1; i++ )

{

input_buf[i] = input_buf1[ i - last_num_chars ]; // append

}

last_num_chars = last_num_chars + num_chars1;

}

if ( num_chars2 != 0 )

{ // if data append it to input_buf

for ( i = last_num_chars; i < last_num_chars + num_chars2; i++ )

{

input_buf[i] = input_buf2[ i - last_num_chars ]; // append

}

last_num_chars = last_num_chars + num_chars2;

}

if ( last_num_chars > 0 ) { // something there

if ( input_buf[0] != ‘D’ )

{ // A packet is started and packet is invalid

last_num_chars = 0; // reset count of total characters read

packet = FALSE;

}

else if ( input_buf[ last_num_chars - 1 ] == ‘/r’ ) {

// 1st char. a ‘D’ and last char. a carriage return

packet = TRUE;

}

} // something there

return( packet );

}

// This function converts a hex character to 2 ASCII characters

// and sends the characters to out the TXC port to the PC

//

void putch_hex(unsigned int hex_char)

{

out_char[0] = ( hex_char >> 4 ) & 0x0f; // keep lower nibble

if( out_char > 9 )

out_char[0] += 0x37;

else

out_char[0] += 0x30;

io_out( TXD, out_char, 1 ); // output 1 char. out the 232 port to the PC

out_char[0] = hex_char & 0x0f;

if(out_char > 9)

out_char[0] += 0x37;

else

out_char[0] += 0x30;

io_out( TXD, out_char, 1 ); // output 1 char. out the 232 port to the PC

}

//

// This function converts two ascii characters to a decimal digit

//

unsigned char to_dec(unsigned char msb,unsigned char lsb)

{

return( (msb - 48) * 10 + (lsb - 48) );

}

/************************************* Reset *****************************************

when (reset) {

bc_data.hours = 0;

bc_data.minutes = 0;

bc_data.speed = 0;

bc_data.number = 0;

check_CTS = timer1; // repeating timer when to assert CTS

// to check for PC data

get_data_from_bc = 100; // every 100 ms poll bc and then send to PC