Согласие на обработку персональных данных.

15.12.2018
Новая задача Как преобразовать байт в килобайт.

05.12.2018
Новые видео и статья Параграфы и выравнивание текста в HTML.

01.12.2018
Новый выпуск журнала Автоматизация и программирование.

26.11.2018
Новые видео и статья Функция Concat.

25.11.2018
Новые видео и статья Справка в Lazarus.



Раздел: Как стать программистом / Секреты программирования /

Директива define

Начну издалека…

О панели оператора ОВЕН СП3хх

Я занимаюсь автоматизацией, и в своей работе нередко использую панели оператора российского производителя ОВЕН. Эти панели по цене в 1,5-2 раза дешевле таких же импортных, и при этом по функционалу и качеству импортным не уступают.

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

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

Также в программе-конфигураторе есть эмулятор работы панели. С его помощью на экране компьютера можно посмотреть, как будут выглядеть экраны панели, проверить действие кнопок и других элементов.

Но! Есть одна маленькая неприятность - в этом эмуляторе нельзя проверить работу макросов.

Конечно, можно загрузить конфигурацию в панель и проверить работу макросов непосредственно в панели. На этапе проектирования я так и делаю.

Но как быть, если проект уже работает и панель уже используется на объекте, который может находиться очень далеко от вашего рабочего места, и понадобится внести изменения в какой-либо макрос?

Изменения то внести можно, но проверить правильность работы макроса будет нельзя, если у вас нет под рукой панели. И может случиться так, что вы приедете за 300 вёрст на объект, зальёте конфигурацию в панель, а макрос работать не будет. Как быть?

Как говорится, “голь на выдумки хитра”. Если мы не можем себе позволить держать всегда панель в запасе для экспериментов, то мы сможем проверить работу макроса иначе.

Как? Используя творческий подход и некоторые возможности языка Си…

Программа на языке Си

Поскольку для создания макросов в панели используется язык Си, то мы можем написать исходный код макроса в любой среде разработки, где можно создавать программы на Си, откомпилировать его и проверить, правильно ли работает этот код. Я для этих целей использую Dev-C++, потому что это простая и шустрая среда, которая поддерживает языки программирования С/С++.

ВАЖНО!
Советую создавать программу именно на языке Си, а не на С++. Потому что при использовании С++ можно случайно применить в исходном коде конструкции, которые не поддерживаются языком Си, и это не позволит использовать исходный код в панели оператора, где применяется чистый Си.

Однако и это ещё не всё. В конфигураторе панели оператора имеются стандартные функции, которых нет в языке Си (например, функция SetPSB, которая устанавливает указанный регистр панели). Кроме того, чистый Си не поддерживает такие типы данных, как WORD, которые поддерживаются конфигуратором панели.

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

Тип данных WORD в Си

Как известно, в языке Си нет типа данных WORD. А вот в программе-конфигураторе, где мы пишем макросы для панели, такой тип есть.

Можно, конечно, использовать другие типы данных. Но тогда не получится просто скопировать код из Dev-C++ в панель - придётся потом исправлять типы данных.

Лучше сразу сделать так, чтобы не пришлось тратить время на исправление кода в панели. Например, создать свой тип данных с именем WORD.

Сделать это можно с помощью директивы define следующим образом:

#define WORD unsigned short

Здесь мы для типа unsigned short, который имеется в Си, определяем новое имя WORD. И далее в программе мы можем сделать, например, так:

WORD PSW402 = 0;

То есть объявить переменную типа WORD. Хотя на самом деле, это, конечно, будет переменная типа unsigned short. Но нам это не важно, потому что оба этих типа имеют одинаковый диапазон значений, а слово WORD для нас удобнее.

И вот таким вот образом мы можем написать программу на компьютере, проверить её работу, а потом просто скопировать исходный код в макрос панели.

Ну и напоследок немного о директиве define.

Директива define используется в языке С для того, чтобы назначить новое имя для какого либо типа или другой конструкции языка. С помощью этой директивы можно создавать новые типы данных или, например, объявлять константы:

#define A 100;

После этого вместо числа 100 можно использовать в программе константу А.

У меня есть книга о директивах компилятора, где я подробно рассказал о том, что это и для чего. Правда, там речь идёт о директивах в Паскале. Директивы в С/С++ - это немного другое, хотя их назначение и применение по сути похожи на директивы Паскаля.


Директивы компилятора Директивы компилятора
Как это ни странно, но даже многие опытные программисты не используют директивы компилятора, считая их чем-то ненужным и бесполезным. А между тем, директивы компилятора - это очень классная штука. Если их умело применять в своих программах, то можно существенно сократить время на разработку и уменьшить количество рутинных операций. Подробнее...
Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика