Изучение утилиты ADAM-5000TCP-6000 Utility. Программирование модулей Advantech в среде DELPHI: Методические указания к лабораторным работам, страница 3

При выборе конкретного пункта появляется форма, компоненты которой позволяют осуществить те или иные операции над соответствующими модулями. Пункт «Операции с ADAM-5000/TCP» содержит подпункты для реализации действий с модулями базового блока ADAM-5000/TCP:

·  чтение и запись данных для модуля 5055S;

·  чтение данных модуля 5017;

·  запись данных в модуль 5024;

·  взаимодействие модулей  5024 и 5017.

Для подключения методов библиотеки к проекту Delphi используется функция ADAMTCP_Open, которая возвращает значение 0 в случае успешного подключения. Отключает библиотеку процедура ADAMTCP_Close. Для создания физического соединения с аппаратными средствами используют функцию, которая возвращает код завершения операции соединения:

ADAMTCP_Connect(<IP-адрес>, <порт, используемый Modbus/TCP> , 

 <ConnectionTimeout>, <SendTimeout>,  <ReceiveTimeout>),

где порт имеет по умолчанию номер 502, а три последних параметра задают соответствующие интервалы ожидания.

Процедура ADAMTCP_Disconnect разрывает созданное соединение.

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

1. Организация аналогового ввода/вывода

1.1.  Реализация аналогового ввода для модуля ADAM-5017

Модуль ADAM-5017 – это 16-разрядное устройство дифференциального аналогового ввода, которое обеспечивает  программирование входного  диапазона на всех 8 каналах. Значения для напряжения могут быть представлены в милливольтах (±150 мВ, ±500 мВ) и в вольтах (±1В, ±5В и ±10В), для тока – в миллиамперах (±20 мА, 4-20 мА). Модуль обеспечивает данные компьютеру в технических единицах (милливольт, вольт, миллиампер). 

Ниже представлена форма, созданная для работы с модулем.

Чтение данных может проводиться в двух режимах: ручное и автоматическое считывание. При ручном способе пользователь может получать новую информацию после очередного нажатия кнопки «Чтение». Автоматическое считывание проводит обновление данных через определённое время, которое задаётся параметром «Временной интервал». В верхней части формы находится группа параметров, ей соответствует в программном модуле Unit7 элемент GroupBox1 со следующими компонентами типа TEdit:

► edtIPAddress – IP-адрес устройства, с которым выполняется соединение;

► edtID – номер устройства (для ADAM-5000/TCP всегда равно  1);

► edtStartAddress – стартовый адрес для считывания данных; 

► edtCount – количество каналов,  с которых считывают значения.

Кнопка btnRead компонента GroupBox2 предназначена для получения информации в ручном режиме. Для проведения автоматического режима на элементе объединения GroupBox3 расположены следующие компоненты:

► edtTime – временной интервал получения новых данных;

► TrackBar1 – движок для  задания временного интервала;

► UpDown1 – счетчик тоже для  задания временного интервала; 

► btnStart и  btnStop – кнопки запуска и останова процесса считывания.

Кроме того, на форме имеются кнопка btnExit для выхода из подпрограммы, компонент edtVersion для вывода номера версии библиотеки DLL, а также текстовая область memoMsg для демонстрации в окне формы считываемых значений.

После того как была подключена библиотека DLL и связь с устройством установлена, приложение обращается к функции ADAMTCP_ReadReg, с помощью которой осуществляется чтение данных модуля ADAM-5017:

function ADAMTCP_ReadReg(szIP : PChar; wID : Word; wStartAddress : Word; 

              wCount : Word; wData : PWord ): Integer; StdCall.

Функция использует параметры szIP - IP-адрес, wID – номер устройства (ID), который для ADAM-5000/TCP всегда равен 1, StartAddress - стартовый адрес   для  чтения, wCount -  количество каналов, wData - массив шестнадцатеричных чисел, содержащихся в регистре временного хранения информации. Ниже приведен фрагмент программы с означенной функцией.

        wDeviceID := StrToInt(edtID.Text);                        { ID устройства }

        wStartAddress := StrToInt(edtStartAddress.Text);  {Стартовый адрес}

        wCount := StrToInt(edtCount.Text);                        {Количество каналов}

        if ( (wCount < 1) or (wCount > 64) ) then begin

           ShowMessage('Количество каналов должно быть от 1 до 64');

           ADAMTCP_Disconnect();

           ADAMTCP_Close();

           close();                                                end;

        for i := 0 to wCount - 1 do wData[i] := $1234;

        iRetVal := ADAMTCP_ReadReg(PChar(edtIPAddress.Text),

                         wDeviceID,wStartAddress, wCount, @wData);

        if ( iRetVal <> 0 ) then begin

           ShowMessage('ADAMTCP_ReadReg() Отказ!, Код ошибки:'

                                   + IntToStr(iRetVal) );

           ADAMTCP_Disconnect();

           ADAMTCP_Close();

           close();                       end;

        memoMsg.Lines.Clear();

        j := wStartAddress;

        for i := 0 to wCount-1 do begin

           fValue[i] := (wData[i] - 32767.5)*10/32767.5;

           memoMsg.Lines.Add ('Адрес:' + IntToStr(j) + '   Значение:'

           + IntToHex(wData[i],4) + '[hex]   Значение:'  + IntToStr(wData[i])

           + '  Значение: ' + Format('%6.3f', [fValue[i]]));

           inc( j );

        end;

        memoMsg.Lines.Add('');

Данные отображаются в десятичном, шестнадцатеричном виде и в инженерных единицах.

1.2.  Реализация аналогового ввода модулем ADAM-6017