Программирование плат расширения
Рассмотрим работу с ППА платы расширения 5600 на примере создания программы «PausePPA».
В дальнейшем, для использования в лабораторной установке БИС ППА платы расширения 5600 будет настроен в режим «0», каналы А и В настраиваются на ввод, канал С на вывод. Код управляющего слова ППА, решающий поставленную задачу, представляет собой константу 0х92.
Итак, в общем случае работа с БИС плат расширения предполагает запись необходимых кодов (констант) в соответствующие регистры или чтение кодов из регистров. Конкретные действия определяются назначением БИС. Очевидно, что в языке программирования необходимо иметь функции записи/чтения кодов регистров БИС.
Использование платы расширения в прикладной программе требует в начале программы сделать так называемое «открытие» платы. Открытие платы расширения представляет собой создание специальной переменной (в виде целого длинного числа (32 разряда)), которое в функциях записи/чтения кодов БИС будет идентификатором конкретной платы расширения с которой идет работа. В наших программах это будет переменная Hdevice объявленная типа long в которую заносится 32 разрядное число с помощью функции OpenDevice(N).
Открытие платы расширения происходит с помощью функции OpenDevice( ), например:
Hdevice = OpenDevice (N);
Где N – десятичный номер платы расширения (0 - N) в списке плат расширения компьютера;
Hdevice - переменная в которой хранится константа (длинное, целое 32 разрядное число);
В конце программы необходимо «закрыть» плату расширения с помощью функции CloseDevice ( ), например:
CloseDevice ( Hdevice );
Тем самым сообщая операционной системе об окончании работы с данной платой расширения в конкретной прикладной программе и давая возможность другим прикладным программам работать с данной платой.
Запись/чтение кодов БИС плат расширения производится с помощью функций ввода/вывода, соответственно:
WriteDeviceData (Hdevice, &DataIO[i], k);
ReadDeviceData (Hdevice, &DataIO[i], k);
Где:
Hdevice – переменная, определяющая плату расширения с которой ведется работа;
DataIO – имя массива данных типа структура в котором располагаются адреса и коды регистров БИС, используемые при записи/чтении. (Будет рассмотрено далее);
DataIO[i] – элемент массива данных, номер которого определяется переменной i;
&DataIO[i] – взять адрес элемента массива данных с номером i;
k – количество элементов массива, начиная с номера i, используемых при работе функции записи/чтения.
Тип данных типа структура используются в дальнейшем как тип данных каждого элемента массива, который используется в функциях записи и чтения регистров БИС.
Структура объединяет несколько переменных, возможно разного типа, в нашем случае одного типа.
Тип данных структура используемых в дальнейшем имеет вид:
typedef struct
{
unsigned short int port, value;
} TDataIO;
Где:
struct – ключевое слово для объявления структуры;
port, value – переменные объявленные (как беззнаковые, целые, короткие (16 разрядов каждая) ) в структуре;
TDataIO – имя переменной типа структура;
Typedef – оператор позволяющий назначать имена новым типам данных.
В целом же эту конструкцию надо рассматривать так:
Имя – TDataIO будет определять тип данных типа структура, рассмотренная выше.
Следовательно, в дальнейшем TDataIO следует рассматривать как тип данных объявленных для каких либо переменных, например в массиве.
Тип данных типа одномерный массив структур будет иметь следующий вид:
TDataIO DataIO [ ] =
{
{ port, value },
{ port, value },
.
.
.
{ port, value }
};
Где:
TDataIO – тип каждого элемента массива;
DataIO – имя массива;
[ ] – означает, что программист сам определяет количество элементов массива;
{ port, value } – элемент массива типа структура;
port – переменная в которой хранится адрес регистра БИС;
value – переменная в которой хранится код записанной/прочитанной в/из регистра БИС.
В реальных программах в массиве данных при объявлении и инициализации вместо переменных port и value записываются реальные коды необходимые для выполнения действий предусмотренных программой (см. распечатку файла реализации программы), например:
TDataIO DataIO [ ] =
{
{ BASE+3, 0x92 },
{ BASE, 0 },
{ BASE+1, 0 },
{ BASE+2, 0 }
};
Где BASE – символьная константа равная 0х100 в наших программах для ППА представляет собой базовый адрес платы расширения.
Для работы со значениями элементов массива например, внесения в переменную value какого-либо значения программным путем необходимо выполнить следующие действия:
DataIO[i].value = Y;
Где:
Y – значение переменной, присваиваемое элементу массива;
i – номер элемента массива типа структура, которому присваивается значение переменой Y.
Например выражение:
DataIO[3].value = Y;
означает присвоение переменной value находящейся в 3 элементе массива типа структура значения переменной Y.
В свою очередь решение обратной задачи, например, присвоение переменной Z значения переменной value являющейся элементом массива типа структура, требует выполнить следующие действия:
Z = DataIO[i].value;
Где:
Z – переменная, которой присваивается значение переменной value, которая является элементом массива типа структура;
i – номер элемента массива типа структура в котором находится переменная value, значение которой присваивается переменной Z.
Например выражение:
Z = DataIO[1].value;
Означает присвоение переменной Z значение переменной value, находящейся в 1 элементе массива типа структура.
Для создания приложения «PausePPA», которое через две секунды выводит на форму переменную “y” и её значение в виде нуля или единицы, а так же одновременно выводит в порт “С” ППА значение 0х00 и 0х01 в шестнадцатиричном виде необходимо включить в проект PausePPA драйверы для работы функции записи/чтения регистров.
Необходимые драйверы находятся в каталоге PCL836 находящемся в корневом каталоге диска С.
Для создания проекта PausePPA необходимо выполнить следующую последовательность действий:
4.1 Открыть проект.
4.1.1 Включить питание компьютера:
- нажать клавишу включения питания на устройстве “Пилот”;
- нажать клавишу включения питания на устройстве УПС.
4.1.2 Загрузить операционную систему (ОС) Windows NT 4.0 :
- после включения питания компьютера ОС запросит у пользователя подтверждения работы: нажать одновременно две клавиши Ctrl и Delete;
- ОС запросит у пользователя подтверждения пароля: нажать клавишу Enter.
На мониторе компьютера появится рабочий стол Windows NT 4.0 с необходимыми пиктограммами.
4.1.3 Запустить С++ Builder 5 :
- щёлкнуть два раза левой кнопки мыши по пиктограмме С++ Builder 5 на рабочем столе Windows NT 4.0.
4.1.4 Открыть проект:
- после включения питания и загрузки С++ Builder 5 первый раз, на экране монитора появляется ИСР, в составе которой появиться заготовка будущей программы: форма с именем Form1 и файл реализации с именем Unit1.cpp в окне Редактора Кода, находящийся за окном формы;
если С++ Builder 5 работает и в ИСР велась работа по разработке какой-то другой программы другим пользователем, то после окончания своей работы он закроет и сохранит файлы, с которыми работал; на мониторе останется ИСР, не содержащая форму и Редактор Кодов, в этом случае для работы над новой программой следует открыть новый проект, для этого надо выполнить команду File / New Application; в ИСР появится заготовка будущей программы, содержащая форму и Редактор Кода файла Unit1.cpp.
4.2 Сохранить проект
4.2.1 Открыть окно сохранения файла:
- нажать быструю кнопку Save All и откроется окно Save Unit1 As.
4.2.2 В окне Save Unit1 As открыть директорий: C:\Grypp AT\Brigada\Ivanov.
4.2.3 В этом директории создать папку с именем PausePPA.
4.2.4 Открыть папку PausePPA.
4.2.5 Сохранить файл реализации в папке PausePPA с именем PausePPAUnit1.cpp:
- в окне Save Unit1 As в графе “Имя файла” изменить имя Unit1.cpp, предлагаемое С++ Builder 5, на имя PausePPAUnit1.cpp;
- щёлкнуть один раз левой кнопкой мыши по кнопке “Сохранить”.
4.2.6 Сохранить файл проекта в папке Pause с именем PausePPAProject1.bpr:
- в окне Save Unit1 As в графе “Имя файла” изменить имя Project1.bpr, предлагаемое С++ Builder 5, на имя PausePPAProject1.bpr.
- щёлкнуть один раз левой кнопкой мыши по кнопке “Сохранить”.
Таким образом, результатом действий по сохранению проекта будет создание папки PausePPA в нужном директории и сохранение в этой папке проекта с именем PausePPA. Следует отметить, что имя проекта записывается латинскими буквами.
4.3 Включение в проект дополнительных файлов.
4.3.1 Включение в проект файла DriverDataIO.cpp.
4.3.1.1 На мониторе отображается визуальная форма проекта. Войти в меню Project, выбрать в меню Project пункт меню Add to project (или в панели быстрых кнопок выбрать кнопку Add to project).
4.3.1.2 В открывшемся диалоговом окне перейти в корневой каталог диска С.
4.3.1.3 В корневом каталоге диска С открыть каталог C:\Pcl836.
4.3.1.4 В строке диалогового окна “Тип файла” выбрать расширение *.cpp.
4.3.1.5 В диалоговом окне установить курсор на файл DriverDataIO.cpp. (См. рисунок 9).
4.3.1.6 Щёлкнуть курсором мыши по кнопке Открыть (или щёлкнуть два раза курсором мыши по выделенному файлу DriverDataIO.cpp).
4.3.1.7 На экране монитора появится файл DriverDataIO.cpp.
4.3.1.8 Щелкнуть правой кнопкой мыши по пустому месту файла драйвера и выбрать пункт Close Page и щелкнуть по нему 1 раз левой кнопкой мыши (см. рисунок 10) и тем самым закрыть этот файл (т.е. убрать файл из редактора кода).
Рисунок 9
Рисунок 10
4.3.2 Включение в проект файла adsapi32.lib.
4.3.2.1 Войти в меню Project, выбрать в меню Project пункт меню Add to project (или в панели быстрых кнопок выбрать кнопку Add to project).
4.3.2.2 В открывшемся диалоговом окне перейти в корневой каталог диска С.
4.3.2.3 В корневом каталоге диска С открыть каталог C:\Pcl836.
4.3.2.4 В строке диалогового окна “Тип файла” выбрать расширение *.lib.
4.3.2.5 В диалоговом окне установить курсор на файл adsapi32.lib. (См. рисунок 11).
4.3.2.6 Щёлкнуть курсором мыши по кнопке Открыть (или щёлкнуть два раза курсором мыши по выделенному файлу adsapi32.lib).
Рисунок 11
4.3.3 Включение в проект файла DriverDataIO.h.
4.3.3.1 На мониторе отображается файл реализации. Войти в меню File, выбрать в меню File пункт меню Include Unit.
4.3.3.2 В открывшемся диалоговом окне Use Unit установить курсор на файл DriverDataIO.h.
4.3.3.3 Щёлкнуть курсором мыши по кнопке ОК (или щёлкнуть два раза курсором мыши по выделенному файлу DriverDataIO.h.). (См. рисунок 12). В заголовочную часть файла реализации проекта добавится файл DriverDataIO.h. (См. рисунок 13).
Рисунок 12
Рисунок 13
4.5 Визуальное проектирование.
4.5.1 Повторить действия связанные с созданием приложения Pause (см. методические указания № 5 раздел 6.3).
4.5.2 Добавить в проект обработчик событий функции FormCreate:
Щелкнуть два раза левой кнопкой мыши по свободному от объектов месту визуальной формы (в файл реализации проекта добавится заготовка этой функции и пустое тело функции) (см. рисунок 14).
4.5.3 Добавить в проект обработчик событий функции FormDestroy:
В редакторе кода сделать активной визуальную форму.
В инспекторе объектов перейти на панель Events объекта Form.
Выбрать пункт On Destroy и щелкнуть по нему 1 раз левой кнопкой мыши. Справа от пункта On Destroy появится пустое окно белого цвета. Установить курсор в это окно и щелкнуть два раза левой кнопкой мыши по этому окну (в файле реализации проекта добавится заготовка этой функции – имя функции и пустое тело функции) (см. рисунок 14).
Рисунок 14
4.6 Программирование файла реализации проекта
4.6.1 На рисунке 15 показана распечатка файла реализации проекта PausePPAUnit1.cpp, который создан на основе файла PauseUnit1.cpp (см. Методические указания № 5 рисунок 20).
4.6.2 Строка 5 – внесение директивы BASE 0x100 (см. рисунок 15).
4.6.3 Строка 14 – объявление переменной HDevice.
4.6.4 Строки 23 – 29 объявление и инициализация структуры данных для работы с ППА.
4.6.5 Строки 53, 54 в функции Timer1Timer – вывод переменной «y» в порт канала» С ППА.
4.6.6 Строки 60, 62 в функции Form Create – открытие платы ППА и инициализация ППА.
4.6.7 Строка 69 в функции Form Destroy – закрытие платы ППА.
1: //---------------------------------------------------------------------------
2:
3: #include <vcl.h>
4: #pragma hdrstop
5: #define BASE 0x100
6: #include "Pause_PPA.h"
7: #include "DriverDataIO.h"
8: //---------------------------------------------------------------------------
9: #pragma package(smart_init)
10: #pragma resource "*.dfm"
11: TForm1 *Form1;
12: unsigned short int y;
13: // Объявление указателя для ППА
14: long HDevice;
15: //---------------------------------------------------------------------------
16: __fastcall TForm1::TForm1(TComponent* Owner)
17: : TForm(Owner)
18: {
19: y = 0;
20: }
21: //---------------------------------------------------------------------------
22: // Инициализация структуры данных
23: TDataIO DataIO[] =
24: {
25: {BASE+3, 0x92},// Адрес и упр.слово ППА, реж. 0, A<--,B<--,C-->
26: {BASE,0}, // Адрес канала А
27: {BASE+1,0}, // Адрес канала В
28: {BASE+2,0} // Адрес канала С
29: };
30: void __fastcall TForm1::Button1Click (TObject *Sender)
31: {
32: // Разрешение работы таймера
33: Timer1 -> Enabled = true;
34: }
35: //---------------------------------------------------------------------------
36: void __fastcall TForm1::Button2Click (TObject *Sender)
37: {
38: // Закрытие формы и завершение приложения
39: Close();
40: }
41: //---------------------------------------------------------------------------
42: void __fastcall TForm1::Timer1Timer (TObject *Sender)
43: {
44: // Инверсия y
45: y = ~y;
46: // Выделение разряда D0 переменной y
47: y = y&0x01;
48: // Вывод значения переменной "y" на форму
49: Label2 -> Caption = "y =" + AnsiString(y);
50: // Окрашивание переменной "y" в красный цвет
51: Label2 -> Font -> Color = clRed;
52: // Вывод значения переменной "y" в порт канала "C"
53: DataIO[3].value = y;
54: WriteDeviceData (HDevice, &DataIO[3], 1);
55: }
56: //---------------------------------------------------------------------------
57: void __fastcall TForm1::FormCreate (TObject *Sender)
58: {
59: // Открытие платы ППА
60: HDevice = OpenDevice (1);
61: // Инициализация ППА
62: WriteDeviceData ( HDevice, &DataIO[0], 1 );
63: // Функция заносит в порт 0х103 значение 0х92
64: }
65: //---------------------------------------------------------------------------
66: void __fastcall TForm1::FormDestroy (TObject *Sender)
67: {
68: // Закрытие платы ППА
69: CloseDevice (HDevice);
70: }
Рисунок 15
