Pz4
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО ЖЕЛЕЗНОДОРОЖНОГО ТРАНСПОРТА
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Петербургский государственный университет путей сообщения
Императора Александра I»
(ФГБОУ ВО ПГУПС)
Факультет «Автоматизация и интеллектуальные технологии»
Кафедра «Автоматика и телемеханика на железных дорогах»
Специальность 23.05.05 Системы обеспечения движением поездов
Специализация Автоматика и телемеханика на железнодорожном транспорте
Отчет по практическому заданию № 4
по дисциплине «Микропроцессорные информационно-управляющие системы 1»
М8 «Программная реализация последовательных схем на микроконтроллере К1-20»
Обучающийся Курс IV Группа АР-709 |
дата |
Баранов Д.А. |
Преподаватель |
Отметка о зачете, подпись, дата |
доц. Чухонин В.М. должность, Ф.И.О. |
Санкт-Петербург
2020
Цель практического задания: изучение методов программной реализации однотактных автоматов. В качестве программной среды используется интегрированная среда программирования (IDE) C++ Builder.
Запись функции алгебры логики в операторах языка программирования C++
Вариант 1: =
f = (
Таблица истинности для заданной функции
-
X4
X3
X2
X1
f
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
1
1
1
0
1
0
0
1
0
1
0
1
1
0
1
1
0
1
0
1
1
1
1
1
0
0
0
0
1
0
0
1
0
1
0
1
0
0
1
0
1
1
0
1
1
0
0
0
1
1
0
1
0
1
1
1
0
0
1
1
1
1
0
Этапы разработки проекта
1. Создание нового приложения (методика описана в ПЗ №1,2).
2. Сохранение нового проекта (методика описана в ПЗ №1,2).
3. Включение в проект дополнительных файлов.
Добавление файла: Adsapi32.lib
В полосе главного меню выбрать пункт Project (Проект) и в выпадающем меню выбрать пункт Add To Project (Добавить в проект) или можно воспользоваться быстрой кнопкой Add to Project (Добавить в проект) панели быстрых кнопок ИСР;
В открывшемся окне Add To Project (Добавить в проект) найти и открыть каталог: E:/Pcl836;
В поле «Тип файлов:» выбрать LibraryFile (*.lib);
В указанном каталоге найти файл: Adsapi32.lib и двойным щелчком левой кнопкой манипулятора «Мышь» включить его в файл проекта;
Файл Adsapi32.lib должен отразиться в головном файле проекта в виде строки, имеющей следующий вид:
USELIB("E:\Pcl836\Adsapi32.lib").
Добавление файла: DriverDataIO.cpp
В полосе главного меню выбрать пункт Project (Проект) и в выпадающем меню выбрать пункт Add to Project (Добавить в проект) или можно воспользоваться быстрой кнопкой Add to Project (Добавить в проект) панели быстрых кнопок ИСР;
Откроется диалоговое окно Add to project (Добавить в проект);
В диалоговом окне Add to Project (Добавить в проект) найти и открыть каталог E:/Pcl836;
В поле «Тип файлов:» выбрать C++Builder unit (*.cpp);
Выбрать файл: DriverDataIO.cpp и двойным щелчком левой кнопкой манипулятора «Мышь» включить его в головной файл проекта;
Одним щелчком правой кнопки манипулятора «Мышь» в окне редактора кода на пустом месте файла DriverDataIO.cpp вызвать контекстное меню, в котором выбрать левой кнопкой манипулятора «Мышь» команду Close Page (закрыть страницу), чтобы в дальнейшем исключить случайное редактирование указанного файла;
Файл DriverDataIO.cpp должен отразиться в головном файле проекта в виде строки, имеющей следующий вид:
USEUNIT("E:\Pcl836\DriverDataIO.cpp");
Добавление файла: DriverDataIO.h
Сделать активным файл реализации (при необходимости, переключение фокуса между окном редактора формы и окном редактора кода можно выполнить функциональной клавишей клавиатуры F12);
В полосе главного меню выбрать пункт File и в выпадающем меню выбрать пункт Include Unit Hdr;
В открывшемся окне Use Unit найти файл DriverDataIO, нажать кнопку ОК и этот файл отразится в файле реализации в виде:
#include "DriverDataIO.h"
4. Визуальное проектирование
Перенос на форму компонент:
Метка (Label) – в количестве 4 шт.
Кнопка (Button) – в количестве 1 шт.
Таймер (Timer) – в количестве 1 шт.
Установка свойств компонент
Занесение текста в заголовок компонента Form1:
Одиночным щелчком левой кнопки манипулятора «Мышь» на пустом месте формы выделить компонент Форма (Form1);
Осуществить переход в окно Инспектора объектов (Object Inspector) на страницу Properties;
Изменить текст свойства Надпись (Caption) для визуальной формы с Form1 на название соответствующего метода программной реализации однотактных автоматов.
Занесение текста в заголовки компонентов метка (Label1 и Label3)
Одиночным щелчком левой кнопки манипулятора «Мышь» по компоненту Label1 на форме (Form1) выделить метку с именем Label1;
Осуществить переход в окно Инспектора объектов (Object Inspector) на страницу Properties;
Изменить значение свойства Надпись (Caption) для метки Label1 с «Label1» на «Входной набор»;
Аналогично изменить значение свойства Надпись (Caption) для метки Label3 с «Label3» на «Выходная функция»;
Занесение текста в заголовок компонента Button1 (аналогично предыдущему пункту заменяем на «Пуск»);
Занесение текста в заголовки компонентов метка (Label2 и Label4)
На этапе визуального проектирования занесение текста в заголовки компонент (меток) Label2 и Label4 не требуется, так как текст, соответствующий значению свойства Надпись (Caption) для указанных меток будет изменен в ходе выполнения приложения за счет применения соответствующих команд, записанных программистом на этапе программирования файла реализации.
Установка значений свойств для компонента Таймер (Timer1)
Одиночным щелчком левой кнопки манипулятора «Мышь» по компоненту Timer1 выделить компонент Timer1;
Осуществить переход в окно Инспектора объектов (Object Inspector) на вкладку Свойства (Properties);
Установить значение 100 (что соответствует примерно 100 миллисекундам) свойству Interval (период срабатывания таймера);
Установить значение False свойству Enabled (разрешение/запрет работы таймера).
5. Создание обработчиков событий
Обработчик события функции Button1Click (щелчок по кнопке) для компонента Button1 создаётся двойным щелчком левой кнопки манипулятора «Мышь» по компоненту Button1, расположенному на визуальной форме (Form1), в результате чего в файле реализации появится конструкция вида:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
}
Обработчик событий функции Timer1Timer (срабатывание таймера) для компонента Timer1 создаётся двойным щелчком левой кнопки манипулятора «Мышь» по компонентуTimer1, расположенному на визуальной форме (Form1), в результате чего в файле реализации появится конструкция вида:
void_fastcall TForm1:: Timer1Timer (TObject*Sender)
{
}
Обработчик события функции FormCreate (создание формы) создаётся двойным щелчком левой кнопки манипулятора «Мышь» по пустому месту визуальной формы (Form1), в результате чего в файле реализации появится конструкция вида:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
}
Обработчик события функции FormDestroy (разрушение формы) создаётся следующим образом:
Визуальную форму необходимо сделать активной одиночным щелчком левой кнопки манипулятора «Мышь» по визуальной форме (никакие другие компоненты, находящиеся на визуальной форме, кроме неё самой, не должны быть выделены);
Осуществить переход на вкладку Events (События) в окне Object Inspector (Инспектор объектов);
Найти и выделить одиночным щелчком левой кнопки манипулятора «Мышь» строку с текстом OnDestroy;
В открывшемся справа окне белого цвета выполнить двойной щелчок левой кнопкой манипулятора «Мышь», не затрагивая кнопку с изображением треугольника, в результате чего в файле реализации появится конструкция вида:
void_fastcall TForm1::FormDestroy (TObject*Sender)
{
}
6. Программирование файла реализации
Выполняется согласно соответствующему программному листингу файла реализации.
7. Компиляция проекта
Осуществляется одиночным нажатием левой кнопкой манипулятора «Мышь» быстрой кнопки Run (зелёный треугольник) или функциональной клавиши клавиатуры F9.
8. Включение и остановка проекта
Включение программы осуществляется одиночным нажатием левой кнопкой манипулятора «Мышь» по кнопке Пуск, расположенной на визуальной форме. Выключение программы осуществляется левой кнопкой манипулятора «Мышь» по кнопке с изображением «крестика», расположенного в правом верхнем углу визуальной формы.
Отладка проекта - выполнение программы по шагам для выявления ошибок алгоритмического характера, которые не обнаруживаются при компиляции и компоновке.
Для этого необходимо: подвести курсор манипулятора «Мышь» к выбранной строке кода файла реализации и одиночным щелчком левой кнопкой манипулятора «Мышь» установить курсор в начале строки, нажать функциональную клавишу F4 на клавиатуре. Выполнение программы пошагово осуществляется нажатием функциональной клавиши клавиатуры F8. Прекращение отладки выполняется одновременным нажатием клавиш клавиатуры Ctrl и F2.
Блок-схемы алгоритма проекта и функции Timer1.Timer
Рис. 1 – блок-схема алгоритма проекта в целом
Рис. 2 – блок-схема алгоритма функции Timer1.Timer
Программный листинг файла реализации
Direct_Calc_Bool_funct.cpp 27.11.2020 22:27:46 Page 1 of 1
1: //---------------------------------------------------------------------------
2:
3: #include <vcl.h> // директива перепроцессора подключает файлы
4: // визуальных компонентов
5: #pragma hdrstop // директива перепроцессора указывает компилятору
6: // конец списка общих файлов
7: #define BASE 0x100 // объявление базового адреса платы ППА
8: #include "DriverDataIO.h" // включение в проект файла "DriverDataIO.h"
9: #include "Direct_Calc_Bool_funct.h" // включение в проект файла
10: // "Direct_Calc_Bool_funct.h"
11: //---------------------------------------------------------------------------
12: #pragma package(smart_init) // директива перепроцессора указывает
13: // компилятору последовательность
14: // инициализации пакетов такой, какая
15: // устанавливается взаимными ссылками
16: // использующих их модулей
17: #pragma resource "*.dfm" // директива перепроцессора указывает
18: // компилятору, что для формы надо
19: // использовать файл .dfm с тем же именем,
20: // что и имя данного файла
21: TForm1 *Form1; // объявление указателя *Form1 для объекта формы
22: // TForm1
23: //---------------------------------------------------------------------------
24: // Объявление конструктора формы и функции конструктора формы
25: __fastcall TForm1::TForm1(TComponent* Owner)
26: : TForm(Owner)
27: {
28: }
29: //---------------------------------------------------------------------------
30: // Объявление указателя для ППА
31: long HDevice;
32:
33: // Инициализация структуры данных
34: TDataIO DataIO[] =
35: {
36: {BASE+3, 0x92},// Адрес и Упр. слово ППА,реж.0, A<--,B<--,C-->
37: {BASE,0}, // Адрес канала А
38: {BASE+1,0}, // Адрес канала В
39: {BASE+2,0} // Адрес канала С
40: };
41:
42: //Преобразование десятичного 16(бит) разрядного
43: // в строку из 4 символов (1и0)
44: AnsiString IntToBinary( unsigned char byte )
45: {
46: char w[9] = "";
47: int i = 0;
48: for( i = 0; i < 4; i++ )
49: {
50: w[3-i] = char (((byte>>i)&1)? '1':'0');
51: }
52: w[i] = '\0';
53: return AnsiString(w);
54: }
55:
56: void __fastcall TForm1::Button1Click(TObject *Sender)
57: {
58: // Разрешение работы таймера
59: Timer1->Enabled=true;
60: }
61: //---------------------------------------------------------------------------
62: // Реализация метода непосредственного вычисления
63: // булевых функций
64: void __fastcall TForm1::Timer1Timer(TObject *Sender)
65: {
66: // Объявление входных переменных и выходной функции
67: unsigned short int x1,x2,x3,x4,f;
68:
69: // Чтение входного набора из канала А
70: // и занесение его в поле DataIO[1].value
71: ReadDeviceData( HDevice, &DataIO[1], 1 );
72:
73: // Выделение 4-х младших разрядов входного набора
74: DataIO[1].value=(DataIO[1].value)&(0x0F);
75:
76: //Вывод входных переменных на форму
77: Label2->Caption ="x4,x3,x2,x1="+IntToBinary( char(DataIO[1].value) );
78:
79: // Занесение входных переменных в разряд D0
80: x1=(DataIO[1].value)&1; // х1-->D0
81: x2=((DataIO[1].value)>>1)&1; // x2-->D0
82: x3=((DataIO[1].value)>>2)&1; // x3-->D0
83: x4=((DataIO[1].value)>>3)&1; // x4-->D0
84:
85: // Вычисление функции f
86: f= (x1&x2|x3)&(~x4);
87:
88: // Выделение разряда D0 выходной функции
89: f=f&1;
90:
91: //Вывод функции f на форму
92: Label4->Caption ="f="+ AnsiString(f);
93:
94: //Вывод функции f в канал С
95: DataIO[3].value=f;
96: WriteDeviceData(HDevice,&DataIO[3],1);
97:
98: // Окрашивание символов и значений входного набора и выходной функции в
99: // красный цвет
100: Label2->Font->Color=clRed;
101: Label4->Font->Color=clRed;
102: }
103: //---------------------------------------------------------------------------
104: void __fastcall TForm1::FormCreate(TObject *Sender)
105: {
106: // Открытие платы ППА
107: HDevice = OpenDevice(1); // 1 = Номер карты в списке устройств
108: // Инициализация ППА
109: WriteDeviceData( HDevice, &DataIO[0], 1 );
110: // Функция заносит в порт 0х103 значение 0х92
111: }
112: //---------------------------------------------------------------------------
113: void __fastcall TForm1::FormDestroy(TObject *Sender)
114: {
115: // Закрытие платы ППА
116: CloseDevice(HDevice);
117: }
118: //---------------------------------------------------------------------------
Выводы
В ходе выполнения работы изучена операция преобразования функций алгебры логики в текст, приемлемый для языка программирования С++.
С помощью промышленного компьютера и Интегрированной Среды Разработки С++ Builder 5.0 и платы ППА была получена таблица выходной функции, простроенной на основе таблицы от четырёх переменных, комбинации которых мы получили управлением кнопками на лицевой панели установки. Эти сигналы – эквивалент сигналов от устройств автоматики, расположенных на больших расстояниях от компьютера, который выполняет операции по ФУЛ, в соответствии с поступающими входными сигналами. В конечном итоге компьютер выдаёт дискретный сигнал – единицу или ноль, в 16 вариациях входных значений.
Такая система обработки может быть использована, если имеется множество вариаций входных сигналов и одно выходное значение, получаемое по функции алгебры логики.