Микроконтроллеры в домашних условиях
 

Управляющая программа.

Руководство пользователя

Описание исходников

Руководство пользователя

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

Как уже рассказывалось на странице "Сетевой интерфейс", программа управляет сетью посредством соединения с ведущим модулем через com-порт компьютера.

Скачать исходные тексты и саму прорамму в фомате Delphi 6 можно здесь.

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

Итак, после распаковки архива в папке "Исходники" находятся файлы проекта управляющей программы и файлы настроек. Собственно, для работы с готовой программой необходим сам файл Comfort_home.exe и два файла настроек Comfort_Home_settings.ini (отвечает за сохранение настроек самой программы) и Modul_Description.ini (отвечает за описание параметров действующих в сети ведомых модулей - по мере разработки новых модулей должен пополняться).

Вышеуказанные два файла настроек должны находиться в одной папке с исполняемым файлом.

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

Скриншот 1

Наверх

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

Строка состояния содержит четыре раздела. В первом (при счете слева направо) отображается номер и состояние порта, на который настроена программа. Во втором расположен счетчик циклов работы программы (опроса сети), исполььзуется пока для служебных целей. Третий раздел пока пустой. В нем отображается номер активного визуального объекта после щелчка мышью на нем (используется, также, для служебных целей). В четвертом разделе расположено текущее время.

Теперь пройдемся по пунктам меню.

Скриншот 2

Пункт "Файл" имеет только один подпункт "Выход". Его назначение в комментарии не нуждается.

Скриншот 3

Пункт "Вид" побогаче и содержит уже три подпункта. Более подробно работа с данными подпунктами будет представлена ниже. Сейчас ограничимся общим описанием.

Подпункт "Память" открывает окно работы с памятью (EEPROM и Flash) модулей в сети.

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

В подпункте "Адреса модулей" открывается окно с информацией об адресах активных в сети модулей и их типах.

Скриншот 4

Наверх

В пункте "Настройка", также, три подпункта.

Подпункт "Порт" запускает окно настройки com порта.

В окне, запущенном из подпункта "Временные параметры" производится установка интервала опроса в сети.

Подпункт "Редактирование" содержит выпадающий список. На скриншоте из списка активен только один пункт "вкл" для включения режима редактирования.

Режим редактирования необходим для возможности внесения каких-либо изменений в визуальные объекты: создание новых, удаление ненужных, перемещение, изменение размеров, свойств объекта, задание команд. Кроме того, в режиме редактирования возможно добавление новых и удаление ненужных страниц главного окна, и изменение их названий. Все вышеперечисленное невозможно при выключенном режиме редактирования. Это сделано для исключения случайных изменений в конфигурацию визуальных объектов.

Окно программы при включенном режиме редактирования представлено ниже.

Скриншот 5

В этом режиме для удобства восприятия окно имеет более темный цвет. Также, становятся активными пункты выпадающего списка подпункта "Редактирование".

Скриншот 6

При щелчке правой кнопкой мыши на пустом месте страницы становится доступным всплывающее меню, позволяющее добавлять или удалять страницы, и задавать их названия.

Скриншот 7

Наверх

При этом удаление последней оставшейся страницы будет невозможно, о чем будет выдано соответствующее предупреждение.

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

Скриншот 8

При выборе пункта выпадающего списка "добавить объект" подпункта "Редактирование" в левом верхнем углу страницы появляется новый визуальный объект.

Скриншот 9

Объект можно перетаскивать мышью в любое место страницы (в режиме редактирования). При этом в третьем слева окне строки состояния отображается номер активного объекта. Номера присваиваются объектам в порядке их создания, независимо от привязки к странице.

Все созданные ранее объекты можно одновременно удалить при выборе пункта выпадающего меню "удалить все объекты" подпункта "Редактирование". При этом будет выполнен запрос подтверждения операции.

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

Индивидуальная работа с каждым объектом производится при щелчке на нем правой кнопкой мыши посредством выпадающего меню.

Можно удалить выбранный объект.

Скриншот 10

Можно установить размеры объекта.

Скриншот 11

Наверх

Добавление нового объекта, также возможно посредством всплывающего меню.

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

Скриншот 12

Скриншот 14

При этом основные управляющие настройками кнопки не активны.

Кроме этого, выбором пункта "команды" открывается окно задания команд. В данный момент список не содержит ни одной команды, так как к объекту не привязан ни один модуль.

Скриншот 13

Наверх

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

Сеть состоит из одного ведущего и двух ведомых модулей.

Скриншот 15

Здесь мы видим наличие пяти визуальных объектов. Объекты, отображающие температуру на улице и состояние вытяжки, привязаны к одному модулю (ведомому). Объект с надписью "Объект 10" привязан к другому ведомому (картинки для него пока не сделал).

Объекты с надписью "НА УЛИЦЕ" и "ВЫТЯЖКА" не привязаны ни к одному модулю и используются для нанесения поясняющих сведений, не помещающихся в основной отображающий объект.

Начнем рассмотрение пунктов меню с подпункта "Адреса модулей" пункта "Вид". При его выборе появляется соответствующее окно.

Скриншот 22

Здесь в строке "Данные из сети" отображаются пары чисел в шестнадцатеричном формате. Числа появляются в этой строке при подключенной и работающей сети на момент открытия программы. Если сеть не подключена, то строка остается пустой. Кнопка "Обновить" используется при изменении количества подключенных модулей.

Первое число из пары представляет собой адрес модуля, второе - его тип (4D - ведущий модуль, 54 - модуль температуры, 55 - модуль управления).

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

Итак, после обновления данных из сети необходимо перенести их в строку "Данные для сохранения" нажатием кнопки ">". Окно подтверждения этой операции приведено на скриншоте.

После занесения данных в правую строку становится активной кнопка "Ok", нажатием которой завершается сохранение данных.

Рассмотрим подпункт "Память" меню "Вид". При его выборе открывается окно с отображением 256 ячеек (с полосой прокрутки).

Скриншот 16

Наверх

Выбрав один из видов памяти (EEPROM или память программ), нажимаем кнопку "Получить данные", при этом все ячейки обнуляются. После получения данные заносятся в ячейки с соответствующими адресами.

Скриншот 17

Кнопкой "шестнадцатеричный/десятичный" меняем вид представления чисел в ячейках.

Скриншот 18

В окошке "Адрес модуля" выбираем один из адресов зарегистрированных модулей.

Следует особо отметить, что в рассматриваемом окне возможно отображение 256 ячеек памяти. Если, например, в модуле меньшее количество ячеек (в модуле температуры 128 ячеек EEPROM), то остальные ячейки остаются равными 0.

Скриншот 19

Что касается памяти программ, команда на ее передачу распознается только модулем управления, и передает он те 256 байт памяти, где хранятся данные о параметрах сигнала ИК пульта управления (подробнее при описании модуля управления).

Скриншот 20

Наверх

Память EEPROM модуля управления содержит 256 ячеек, в которых хранятся данные о настройках модуля.

Далее рассмотрим подпункт "Сеть" пункта "Вид".

Скриншот 23

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

Кнопка "шестнадцатеричный/десятичный" позволяет менять формат представления чисел.

На скриншоте наблюдаемая последовательность передаваемых байтов соответствует описанной на странице "Сетевой интерфейс" (окончание цикла обмена - 5Ah, 5Ah, 5Ah; окончание обмена с одним модулем - 45h, 45h и т. д.).

Вообще говоря, мне это окошко очень помогло при отладке сетевого взаимодействия модулей.

На скриншотах ниже приведены варианты мониторинга сети при передаче содержимого EEPROM ведущего и ведомых модулей (информация отображается кратковременно, так как интервал опроса выставлен 1 секунда, поэтому приходилось делать скриншоты быстро).

Скриншот 24

Скриншот 25

Скриншот 26

Наверх

При этом можно наблюдать соответствие фактической последовательности байтов и приведенной в описании сетевого интерфейса.

Далее перейдем к пункту меню "Настройка".

Подпункт "Порт" вызывает окно настроек порта.

Скриншот 27

Здесь можно выбрать номер порта, к которому подключена сеть (ведущий модуль), а также установить параметры USART. Напомню, что сеть работает на скорости 9600 бит/сек с одним стоповым битом без контроля четности.

Подпункт "Временные параметры" вызывает окно настройки интервала опроса в сети.

Скриншот 30

После перемещения движка устанавливается новый интервал опроса, и становятся активными кнопки "Ok" и "Применить", посредством которых команда на установку нового интервала отправляется ведущему модулю.

Скриншот 29

Нужно сказать, что программа автоматически берет данные об интервале опроса из сети (число перед признаком окончания опроса - 5Ah, 5Ah, 5Ah) и сохраняет их в своих настройках. То есть, если при запуске программы число интервала в настройках и в сети будет различным, то в настройках сохранится новое число, взятое из сети.

Таким образом, данные об интервале, передаваемые ведущим модулем первичны. Это сделано для того, чтобы в случае превышения времени транзакции установленного интервала опроса (при добавлении большого количества новых модулей) автоматически произошел переход на больший интервал.

Наверх

Далее перейдем к визуальным объектам.

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

Для этого в режиме редактирования нужно выбрать пункт "Свойства" всплывающего меню (при нажатии правой кнопки мыши на объекте).

Скриншот 33

В появившемся окне отображается довольно большой объем информации. Начнем с того, что, если объект будет использоваться для активной индикации (то есть не будет отображать статическую надпись или изображение), то необходимо привязать его к адресу соответствующего модуля.

При выборе адреса в окошке "Адрес связанного модуля" справа выводится подсказка о типе модуля. После выбора будет выдано предупреждение, что настройки объекта для предыдущего адреса будут сброшены. Согласившись, мы устанавливаем новый адрес привязанного модуля.

Ниже расположено окошко "Режимы индикации". Здесь необходимо пояснить, как вообще организуется индикация.

Возьмем для примера отображение состояния вытяжки. Необходимо отобразить включенное и выключенное состояние, а также отсутствие ответа модуля по сети. Итого получилось три состояния или три режима индикации, которые исчерпывающим образом характеризуют состояние отображаемого объекта. То есть, в любой момент времени визуальный объект должен отображать одно из этих трех состояний (не больше).

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

Перейдем к делу. Мы выяснили, что для вытяжки необходимо три режима индикации. Рассмотрим один из них - отображение включенного состояния.

Скриншот 31

Для этого в левой половине окна свойств выбран третий номер байта состояния модуля (снизу подсказка, что это байт состояния нагрузки). Значение этого байта должно быть равно 49 (31 шестнадцатеричный) - так указано в описании температурного модуля на странице "Сетевой интерфейс".

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

В нижней части окна свойств расположены две вкладки: текст и картинка. Установленная на этих вкладках информация и будет отображаться на объекте при равенстве третьего байта значению 31h.

Начнем с вкладки "Текст". Здесь устанавливается размер выводимого текста. Кроме того, имеются четыре окошка, два из них - для вывода текста, два другие - для вывода значения байта состояния модуля (имеется ввиду модуль, привязанный к данному объекту индикации), номер которого указан в окошке. Выбор, отображать или нет содержимое каждого окошка, определяется установкой галочки "Показать" снизу. Содержимое окон, отмеченных галочкой, отображается в виде одной строки на визуальном объекте.

Таким образом, можно осуществить различные комбинации текста и отображения байтов данных.

Скриншот 32

Наверх

Вкладка "Картинка" отвечает за отображение графической информации на визуальном объекте.

Следует отметить, что картинки для отображения на объектах должны быть формата .bmp. Я сделал картинки трех размеров: 40х40, 60х60 и 100х100 пикселов (см. архив) для различных предполагаемых случаев размещения (к сожалению, размеры картинки не меняются с изменением размеров самих объектов). При этом существует еще одно условие: путь к файлам картинок не должен содержать русских букв. Поэтому папку Pictures следует размещать в корне диска (я разместил на D:).

Итак, на вкладке "Картинка" в окошке "Расположение файла" указываем путь к файлу необходимой для отображения картинки. Для этого, нажав кнопку "Обзор" вызываем стандартное диалоговое окно выбора файла. Выбрав файл, нажимаем "Открыть".

В правой части вкладки "Картинка" выбирается способ взаимного расположения на объекте выбранных текста и картинки.

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

Убедившись в правильности расположения картинки и текста на объекте, нажимаем кнопку "Добавить" (расположена возле окошка "Режимы индикации"). При этом выбранный режим индикации сохраняется.

Аналогичную процедуру необходимо проделать для установления двух других режимов.

Для установки режима индикации при отсутствии ответа модуля нужно поставить галочку "Нет ответа модуля", и, выбрав картинку и установив текст, сохранить режим.

Выше рассмотрен пример отображения состояний "включено - выключено".

Для отображения значения какого-либо байта необходимо на вкладке "Текст" указать его номер.

Скриншот 38

На скриншоте показан режим отображения отрицательной температуры (номер байта - 2, его значение - 1h). Здесь в логике мы опираемся на второй байт, а отображаем первый.

Скриншот 28

Наверх

На этом скриншоте показан режим отображения при отсутствии данных из сети.

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

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

В общем случае, механизм действия программы следующий. После каждого опроса ответы всех модулей сохраняются в массиве данных. Программа последовательно пробегает по всем визуальным объектам. Для каждого объекта она определяет привязанный модуль. Затем проверяются все сохраненные режимы индикации на предмет совпадения их с состоянием байтов (битов) в ответе модуля. Если находится одно из совпадений, то программа выводит на объект соответствующую картинку и надпись, либо в случае отсутствии информации от модуля - картинку и надпись об отсутствии данных.

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

Перейдем к командам. Для отправки команд в рабочем режиме (при отключенном режиме редактирования) необходимо выбрать пункт "Команды".

Скриншот 13

Так в общем случае выглядит окно отправки команд.

Задание команд, которые можно отправлять с данного объекта привязанному модулю, осуществляется в режиме редактирования выбором пункта "Команды" всплывающего меню (при нажатии правой кнопки мыши).

Скриншот 34

В левом окне "Доступные команды" находятся все команды, которые понимает привязанный модуль. Отсуда кнопкой ">" можно переместить любое количество команд в окно "Активные команды", после чего они будут доступны для отправки при отключенном режиме редактирования. Удаление команды из списка активных производится кнопкой "<".

Скриншот 35

Наверх

Так выглядит список команд для модуля управления.

После формирования списка ативных команд окно отправки выглядит так.

Скриншот 37

Выбираем команду.

Скриншот 36

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

По характеру команды очевидно, нужен или нет ей дополнительный параметр.

Наверх

Для возможности настройки меню сетевых модулей управления из пункта меню "Настройка" выбором подпункта "Модуль управления" вызывается соответствующее диалоговое окно.

Скриншот 39

Вид окна представлен ниже.

Скриншот 40

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

Скриншот 41

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

Нажатием кнопки "Сохранение / Загрузка " открывается окно, где можно сохранить набранную конфигурацию меню с пояснениями. Кроме того, с помощью этого окна можно загрузить одну из ранее сохраненных конфигураций меню, чтобы не набирать ее заново.

Наверх

Далее следуют примеры работы с конфигурацией меню.

Скриншот 42

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

Скриншот 43

При выбранном назначении (отображение со знаком) количество состояний для отображения должно равняться 0, так как отображается непосредственно значение выбранного байта.

Скриншот 44

На этом описание программы для пользователя закончу. Далее немного остановлюсь на "кухне".

Наверх

Описание исходников

Программа выполнена в среде Delphi 6.

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

Работа основной части программы происходит в модуле главного окна Comfort_home_unit.pas.

При запуске программы происходит считывание данных из файла Comfort_Home_settings.ini. В нем находятся данные о конфигурации программы и о свойствах визуальных объектов, поэтому кратко поясню его содержание.

Заголовок [MainFormWindow] содержит данные о положении и размерах главного окна.

[PortSettings] - настройки com-порта.

[Pages] - общее количество страниц, нумерация и наименование каждой страници, а также последняя активная страница на момент завершения программы.

[ModAddresses] - информация о зарегистрированных в программе модулях: общее количество, адреса и типы соответствующих модулей.

[VisObjects] - информация о количестве визуальных объектов и их нумерация.

Информация о каждом отдельном визуальном объекте находится под заголовком [TagN]. где N - номер объекта. Здесь строка TagParam содержит информацию о местоположении и размерах объекта, а также адрес привязанного модуля, номер страницы, на которой он располагается, и количество состояний индикации.

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

Строка TextStateN, где N - номер состояния индикации, информация о тексте, отображаемом на визуальном объекте в случае идентификации данного состояния.

Строка PictStateN, где N - номер состояния индикации, путь к файлу отображаемого рисунка и расположение для данного состояния.

После чтения файла заполняются соответствующие массивы данных.

Одномерный массив Mod_Addresses. Например, для зарегистрированных двух ведомых модулей он выглядит так: [3h, 4Dh, 54h, 55h, 0, ..., 0]. Нумерация элементов массива начинается с 0. Нулевым элементом является число, представляющее собой максимальный адрес зарегистрированного модуля (в данном примере - 3h). Далее следуют числа: порядковый номер в массиве - это адрес зарегистрированного модуля, значение числа с данным порядковым номером - тип соответствующего модуля. Если один из элементов равен нулю, а последующие - не равны нулю (например так: [3h, 4Dh, 54h, 0, 55h, 0, ..., 0]), то это означает, что зарегистрированный ранее модуль отключен, а его адрес остался зарезервированным.

Еще один одномерный массив WorkingTags (нумерация элементов, также, начинается с нуля) представляет собой последовательность чисел, определяющих номера активных (неудаленных) визуальных объектов. Например: [4, 1, 2, 0, 4, 0, ..., 0]. Здесь значение нулевого элемента (4) определяет максимальный номер визуального объекта, а значение 0 третьего элемента говорит о том, что объект с этим номером был удален.

Наверх

Массив состояний States представляет собой следующую структуру. Массив является трехмерным, то есть, каждый его элемент имеет три координаты. Для пояснения приведу пример: States[1, 2, 4]. Первая координата (цифра 1) представляет собой номер визуального объекта в соответствии с массивом WorkingTags. Нумерация этой координаты начинается с единицы.

Вторая координата (цифра 2) является номером состояния индикации (или режима индикации), которое мы сохранили в окне свойств для данного объекта. Нумерация этой координаты начинается с нуля, хотя нумерация состояний начинается с единицы. Это сделано для того, чтобы не делать отдельный массив для описания общих параметров визуального объекта. Таким образом, элементы массива с нулевым значением второй координаты являются описанием общих свойств объекта. При этом третья координата является однозначным определением, о каком именно свойстве идет речь.

Приведем описание всех свойств. Например, для записи States[1, 0, x] x является номером свойства объекта с номером 1. Здесь x может принимать значение от 1 до 7. Соответственно элементы массива с такими значениями будут представлять собой следующее.

States[1, 0, 1] - расстояние в пикселах от левого верхнего угла визуального объекта до верха родительского объекта (страницы).

States[1, 0, 2] - расстояние в пикселах от левого верхнего угла визуального объекта до левого края родительского объекта (страницы).

States[1, 0, 3] - ширина в пикселах визуального объекта.

States[1, 0, 4] - высота в пикселах визуального объекта.

States[1, 0, 5] - адрес привязанного модуля.

States[1, 0, 6] - максимальный номер состояния индикации для данного объекта.

States[1, 0, 7] - номер страницы, на которой отображается объект.

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

Перейдем к описанию состояний с ненулевой второй координатой.

В общем виде пример выглядит так (для объекта с номером 2 состояние 1): States[2, 1, x]. x может принимать значение от 1 до 11. Итак, пробежимся по всем свойствам (кстати говоря, свойства задаются именно в окне свойств объекта перед сохранением каждого режима индикации).

States[2, 1, 1] - номер байта состояния в ответе модуля. Если не выбран ни один байт состояния и не стоит галочка "Нет ответа модуля", то записывается число FF2h (случай, когда визуальный объект используется для статического отображения текста и/или картинки). Если галочка "Нет ответа модуля" установлена, то записывается число FF1h.

States[2, 1, 2] - значение выбранного байта состояния. Если значение не выбрано, то записывается число FF1h.

States[2, 1, 3] - битовая идентификация. Если установлена галочка "Бит состояния" в левой половине окна свойств, записывается 1, в противном случае 0.

States[2, 1, 4] - номер бита для идентификации, установленного в левой половине окна свойств.

States[2, 1, 5] - состояние бита - сброшен или установлен выбранный бит (соответственно 0 или 1).

States[2, 1, 6] - наличие или отсутствие дополнительного условия (записывается соответственно 1 или 0). Все последующие свойства устанавливаются в правой половине окна свойств при наличи галочки "+условие".

States[2, 1, 7] - номер байта состояния в ответе модуля.

States[2, 1, 8] - значение выбранного байта состояния. Если значение не выбрано, то записывается число FF1h.

States[2, 1, 9] - битовая идентификация.

States[2, 1, 10] - номер бита для идентификации.

States[2, 1, 11] - состояние бита - сброшен или установлен выбранный бит.

Наверх

Итак, вышеперечисленные три массива служат базой данных для работы программы. Заполняются они при запуске программы данными из файла Comfort_Home_settings.ini. Также, в момент создания нового объекта, либо удаления старого, или сохранении нового режима индикации вносятся изменения в соответствующие данные в массивах и записи в файле.

Данные в файле Comfort_Home_settings.ini представлены в виде строк с разделением отдельных элементов специальными символами (#, @, &, %, !).

Данные о тексте и о картинках, выводимых на объекте сохраняются только в файле, в массиве не хранятся.

В файле под заголовком [TagN] (N - номер объекта) в поле TextStateM (M - номер состояния) сохраняется текст с параметрами (размер, чередование с данными из байтов состояния), а в поле PictStateM (M - номер состояния) путь к файлу картинки и параметры взаимного расположения с текстом.

При необходимости отображения на объекте информация о тексте и картинке считывается непосредственно из файла.

При необходимости данные из строк файла преобразуются в элементы массивов (например, при запуске программы), либо элементы массивов - в строки данных и сохраняются в файле (при добавлении новых объектов, страниц, режимов индикации).

Следует остановиться на описании второго файла настроек Modul_Description.ini. Из названия следует, что информация в нем содержит описание модулей.

Описание заносится в файл однажды при разработке нового модуля и используется в процессе работы программы.

В данный момент файл содержит описание двух модулей - температуры и управления.

Заголовок описания представляет собой число, обозначающее тип модуля (например 85 - 45h модуль управления).

Далее следуют поля, содержащие всю необходимую информацию.

Поле Name - имя модуля (пример - Модуль управления).

Поле ByteNumber содержит количество байтов в ответе модуля.

Поле ByteNameN (где N - номер байта в ответе) - наименование байта с данным номером.

Поле CommandsNumber - количество команд, понимаемых модулем.

Поле CommandM (где M - номер команды) - числовое значение команды в десятичном представлении.

Поле ComNameM (где M - номер команды) - наименование команды для удобства понимания.

При необходимости добавляются поля HelpCommandLowM и HelpCommandHighM (где M - номер команды), служащие для обозначения соответственно нижней и верхней границы диапазона параметров соответствующей команды.

Указанные выше данные используются в окнах свойств и команд программы для пояснений и составления списков доступных свойств и команд для привязанного модуля.

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

Как было сказано на странице "Сетевой интерфейс", программа инициирует опрос в сети путем посылки команды синхронизации ведущему модулю. Для отсчета временных интервалов в программе использован таймер Ask_Interval_Timer.

Обработчик срабатывания таймера Ask_Interval_Timer выполняет считывание данных из приемника USART (данные последней транзакции, отправленные ведущим и всеми ведомыми модулями). После этого данные проверяются (на полное окончание опроса в одном интервале - наличие признака окончания - трех байтов 5Ah).

В случае валидности данных устанавливается флаг Net_Activity (сеть активна), который используется в разных местах программы (например, делает активными различные кнопки управления сетью). Также вычисляется значение интервала срабатывания таймера Ask_Interval_Timer в соответствии с данными из сети.

При отсутствии признака окончания транзакции данные признаются неправильными, и флаг Net_Activity не устанавливается.

После проверки данных вызывается процедура ShowRecData, в которой для кажного визуального объекта происходит проверка соответствия принятых данных всем режимам индикации (данным в массиве States). Если находится совпадение, то из файла считывается и отображается на объекте текстовая и графическая информация. В случае несовпадения данных ни с одним режимом выводится индикация об отсутствии данных (режим индикации должен быть заложен в свойствах объекта). При совпадении данных с несколькими режимами индикации (такое возможно при неправильной постановке задачи во время установления режимов индикации) на объекте будет отображаться информация, соответствующая последнему совпавшему режиму.

После проверки и вывода индикации на объектах проверяется наличие готовой к отправке в сеть команды (Flag_Set_Command). Если команда есть, то все байты ее отправляются (массив TXBuf), в противном случае отправляется команда синхронизации для начала следующей транзакции в сети.

Наверх

Пробежимся по всем модулям с описанием основных подпрограмм.

Главное окно программы модуль Comfort_home_unit.pas.

Обработчики выбора подпунктов меню запускают соответствующие формы настроек программы.

Обработчик события, наступающего при создании главного окна программы TMain_Form.FormCreate - связывает программу с файлами настроек, читает из них данные и вызывает подпрограмму FillForm, которая размещает все сохраненные объекты на соответствующих страницах.

Обработчик события, наступающего при закрытии приложения TMain_Form.FormDestroy - сохраняет номер активной страницы в файл, закрывает открытый com-порт, освобождает место, занятое под файловые переменные файлов настроек.

Основной цикл программы - обработчик срабатывания таймера TMain_Form.Ask_Interval_TimerTimer - его действие описано выше.

Выбор пунктов "вкл" или "выкл" подпункта "Редактирование" соответственно устанавливает или снимает флаг режима редактирования Flag_Edit_Mode.

Процедура AddObject добавляет новый объект на активную страницу и сохраняет его параметры в файл.

Процедура TMain_Form.BitBtnMouseDown используется для перетаскивания объектов при помощи мыши, и сохраняет данные об их местоположении в файл.

Процедура FillForm читает данные об объектах из файла, расшифровывает прочитанные строки, и располагает страницы и объекты на них согласно сохраненным данным.

Обработчик выбора пункта меню, удаляющего объект TMain_Form.DelObj1Click - запрашивает подтверждение операции и в случае согласия удаляет объект с внесением изменений в массивы данных и в файл.

Обработчик выбора удаления всех объектов TMain_Form.EraseAllClick делает то же, что и предыдущий обработчик, только для всех объектов разом.

Процедура ShowRecData была описана выше - выполняется при каждом срабатывании таймера и осуществляет вывод на индикацию информации, соответствующей принятым из сети данным.

Обработчик выбора добавления новой страницы TMain_Form.AddSheet1Click - создает новую страницу и сохраняет информацию о ней в файл.

Обработчик выбора удаления страницы TMain_Form.DelPage1Click проверяет, не последняя ли страница, и не остались ли на ней неудаленные объекты. При отрицательном результате выдает соответствующие предупреждения. В случае положительного результата запрашивает подтверждение действия, и, получив его, удаляет страницу и данные о ней из файла.

На этом описание главного модуля закончу. Далее идут модули различных настроек.

Модуль Comfort_home_unit_mod_addresses.pas окна "Адреса модулей" получает данные о зарегистрированных модулях из сети (адреса и типы модулей) и сохраняет их в файл настроек программы для дальнейшего использования.

Модуль Comfort_home_unit_network.pas окна "Сеть" периодически (установлен свой таймер) выводит данные из приемного буфера RCBuf в ячейки для отображения в шестнадцатеричном или в десятичном виде.

Модуль Comfort_home_unit_EEPROM.pas окна "Память" осуществляет формирование команды на отправление соответствующему модулю в сети на передачу содержимого выбранного типа памяти. После получения информации выводит ее в ячейки в шестнадцатеричном или десятичном формате.

Модуль Comfort_home_unit_port_settings.pas окна "Настройка порта" производит выбор номера com - порта компьютера, с которым будет работать программа, и, при необходимости, осуществляет настройку параметров порта, и сохраняет настройки в файл.

Модуль Comfort_home_unit_time_parameters.pas окна "Временные параметры" формирует и готовит к отправке команду на изменение интервала опроса в сети.

Модуль Comfort_home_unit_set_size.pas окна "Установка размеров" производит изменение размеров либо главного окна программы, либо визуального объекта, в зависимости от того, откуда был вызван модуль (из подпункта "Редактирование" пункта меню "Настройка", либо из всплывающего меню от нажатия правой кнопкой мыши на объекте). При закрытии окна размеры сохраняются в файле настроек.

Модуль Comfort_home_unit_Page_Name.pas окна "Название страницы" осуществляет сохранение введенного названия текущей страницы в файле.

Модуль Comfort_home_unit_Object_Prop.pas окна "Свойства объекта" осуществляет сохранение выбранных параметров отображения на визуальном объекте. При вызове модуля не в режиме редактирования часть кнопок, ответственных за изменение и сохранение режимов индикации не активна.

Модуль Comfort_home_unit_Commands_List.pas окна "Список команд" вызывается только в режиме редактирования. Он позволяет выбирать из списка всех доступных для привязанного модуля команд те, которые необходимо отправлять именно с данного объекта. При этом активные (выбранные) команды сохраняются в настройках.

Модуль Comfort_home_unit_Send_Command.pas окна "Отправка команды" вызывается только в рабочем режиме. Он позволяет сформировать и отправить команду из списка ранее сохраненных привязанному модулю.

Модуль Comfort_home_unit_library.pas не привязан к какой-либо форме (окну). В нем сосредоточены подпрограммы, которые явно не являются обслуживающими то или иное окно настроек, либо вынесены туда, чтобы не загромождать основной модуль. Среди них подпрограммы чтения и сохранения информации в файл, расшифровки считанных из файла данных, подготовки и отображения на объекте информации.

Модуль Comfort_home_unit_Manual_Mod.pas окна "Настройка модуля управления" (вызывается из пункта меню "Настройка") служит для формирования и отправки конфигурации меню модулю управления.

Модуль Comfort_home_unit_Save_Load_Menu.pas окна "Сохранение / Загрузка" (вызывается соответствующей кнопкой окна "Настройка модуля управления") используется для сохранения в файле ini настроенной конфигурации меню и для загрузки одной из ранее сохраненных конфигураций.

Наверх

Наверх