Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 19. Программирование Ethernet модулей KernelChip на языке Delphi. Часть 1.

Дмитрий Иванов, 26 мая 2012

Файлы к статье скачать
Имя: KA019.zip (ZIP архив)
Размер: 215 КБ

В этом обзоре напишем простую программу на языке Delphi (среда - Borland Delphi 7.0), которая позволит нам подключаться по сети к модулям KernelChip с Ethernet интерфейсом. Для конкретности, выберем модуль Laurent, хотя все описавыемые ниже принципы программирования полностью применимы и к другим модулям этого семейства. Программа позволит нам открывать / закрывать сетевое соединение, управлять реле модуля и принимать от него данные.


Для работы с сетевыми соединениями будем использовать штатный компонет от Borland - TTcpClient. Итак, создаем простое проложение - Windows-форму и 'накидываем' на нее компоненты управления, а именно кнопки, которые будут отвечать за закрытие / открытие соединения с модулем, включение / выключение реле и кнопку запроса информации о модуле. Последним шагом перекидываем на форму компонент TTcpClient. Место его расположения показано на рисунке ниже:

Программирование сокетов на Delphi

В результате рабочее окно нашего приложения будет иметь примерно вот такой вид:

TTcpClient

А теперь обратим наши взгляды к коду (архив с готовым проектом можно найти в "шапке" данной статьи). Итак, рассмотрим сначала обработчик нажатия кнопки Connect.

procedure TForm1.Button1Click(Sender: TObject);
begin
// TcpClient1 - это экземпляр компонента TTcpClient. 
// Указываем ниже реквизиты для подключения к модулю по сети.
  TcpClient1.RemoteHost := '192.168.0.101';
  TcpClient1.RemotePort := '2424';

// Подключаемся...
  TcpClient1.Open;

  CRbyte := 13; // HEX 0x0D
  LFbyte := 10; // HEX 0x0A
                       
// Создаем и запускаем поток, который будет заниматься чтением данных  
  MyThread := TMyThread.Create(False);
  MyThread.Priority := tpNormal;
  MyThread.FreeOnTerminate := True;
  MyThread.Resume;

// Отправляем тестовую команду
  TcpClient1.Sendln('$KE' + Char(CRbyte) + Char(LFbyte));
// Вводим пароль (по умолчанию - Laurent)
  TcpClient1.Sendln('$KE,PSW,SET,Laurent' + Char(CRbyte) + Char(LFbyte));
end; 

Следует обратить внимание, на то что процедура открытия соединения сделана минимально просто - в случае если соединение не будет устанволено по какой-либо причине (например, модуль к сети не подключен), то это вызовет зависание программы.


В случае успешного соединения, первым же делом можно протестировать управление реле. Рассмотрим код обработчика включения 1-го реле:

procedure TForm1.Button3Click(Sender: TObject);
begin
// Формируем команду и отправляем ее модулю
  TcpClient1.Sendln('$KE,REL,1,1' + Char(CRbyte) + Char(LFbyte));
end;

Код обработчика выключения реле рассматривать не будем, ибо почти полностью аналогичен выше рассмотренному. Далее перейдем к коду выполнения потока. Он показан ниже. Просто напросто постоянно проводим чтение данных из сети. По факту приема порции данных вызывается обработчик события OnReceive компонента TTcpClient. Этот обработчик реализуется по средством функции OnDataReceive() которая рассмотрена ниже.

procedure TMyThread.Execute;
begin
  Form1.TcpClient1.Receiveln(buffer);
end;

Представленный выше код тоже не является 'оптимальным'. Постоянный опрос на прием данных может 'подгрузить' систему. Простейшим решеним для улучшения ситуации является чередование вызова функции Sleep() и чтения данных (в цикле).


procedure TForm1.OnDataReceive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
begin
// Отыскиваем во входящих данных ответ модуя на команду $KE,INF, 
// т.е. ищем ответ в виде #INF
 if(StrLComp(Buf, '#INF', 4) = 0) then
 begin
  // Если нашли - просто выводим текущий буфер для просмотра
  ShowMessage( Buf );
 end;
end;

Ну и соответственно, для того чтобы запросить у модуля команду $KE,INF предназначена кнопка Get INF, исходный код которой отдельного рассмотрения не заслуживает.



© Дмитрий Иванов
26 мая 2012 года
http://www.kernelchip.ru



© KERNELCHIP 2006 - 2023