Айти хоум Нижегородской области

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

Предыдущая глава Список статей Следующая глава

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

Прежде всего, необходимо осознать, что мы собираемся делать.

Формализованная постановка задачи.

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

К контроллеру мы подключили 7 датчиков с аналоговым выходом:

  • датчик давления воды;
  • датчик протечки;
  • стандартный охранный шлейф;
  • напряжение питания контроллера;
  • датчик тока двигателя крана;
  • 2 резервных датчика.

Значения со всех этих датчиков мы должны передавать на центральный контроллер. В каком виде? В итоге надо получить физические величины: давление, расход воды, температура и т.п. Для этого необходимо где-то умножать коды АЦП на коэффициенты для перевода в физические величины. Есть несколько вариантов, как сделать это:

  • Можно передавать на центральный контроллер считанные коды АЦП, и в нем же хранить коэффициенты для каждого параметра. Вариант хорош тем, что передается минимум информации. Для каждого канала всего 2 байта. Но при установке или замене локального контроллера необходимо задавать коэффициенты в центральном. Система получается сложной в настройке, не универсальной. К тому же мы еще в первой главе решили, что контроллеры должны работать в автономном режиме.
  • Другой вариант – передавать с локального контроллера коды АЦП и коэффициенты к ним. Сэкономим вычислительные ресурсы, но увеличим число передаваемых данных.
  • В каком формате передавать коэффициенты? Самый экономичный вариант – дробные числа с фиксированной запятой. Но выходной формат данных получается разным для различных параметров. При вычислениях таким методом можно ”сломать голову”. По просьбе одного любознательного человека я написал о таком способе небольшую статью на форуме. Не знаю, дочитал ли кто-нибудь ее до конца, но уверен, что никто такой метод вычислений использовать не будет.
  • Остается формат с плавающей запятой. Самый неэкономичный, но самый удобный и универсальный. Думаю, ресурсов Arduio Nano должно хватить.

Итак, первая задача – необходимо:

  • считывать значения аналоговых входов;
  • производить цифровую фильтрацию кодов АЦП;
  • преобразовывать значения АЦП в формат с плавающей запятой и умножать на коэффициенты;
  • обеспечить чтение результата центральным контроллером;
  • реализовать операции для работы с коэффициентами:
    • запись и чтение в EEPROM;
    • контроль целостности данных.

Значения некоторых датчиков нам необходимы только для диагностики. Например, важно знать значение параметра “давление воды”. Но какое напряжение на выходе датчика протечки совершенно не интересно. Главное – случилась протечка или нет.

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

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

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

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

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

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

Подготовка к разработке программы.

У меня нет собранного контроллера водоснабжения, нет многих датчиков, конечно, нет крана. Я не могу проверить работу устройства на реальном объекте. Это сделает Михаил.

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

Что необходимо для отладки?

  • Задавать напряжения на аналоговых каналах.
  • Кнопками имитировать дискретные датчики.
  • Светодиодами отображать состояние выходов.

Для этого я собрал простую схему.

Припаял ее к плате Ардуино из главы 3 и адаптеру RS-485 из главы 2.

Теперь можно разрабатывать программу.

Формат данных регистров хранения.

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

Назначение первых 6 регистров мы определили для всех локальных контроллеров в главе 3. Они останутся без изменений. Я добавил к ним новые данные и получился полный формат регистров устройства.

Регистр 0. Идентификационная информация.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
2 1 0 4 3 2 1 0 7 6 5 4 3 2 1 0
Резерв Версия ПО Тип контроллера

Регистр 1. Идентификационная информация.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Заводской номер

Регистр 2. Идентификационная информация.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
3 2 1 0 3 2 1 0 3 2 1 0 3 2 1 0
десятки единицы десятки единицы
Год Месяц
Дата выпуска устройства

Регистр 3. Состояние локального контроллера.

Бит Назначение
0 Кнопка ОТКРЫТЬ
1 Кнопка ЗАКРЫТЬ
2 Датчик крайнего положения крана ОТКРЫТ
3 Датчик крайнего положения крана ЗАКРЫТ
4 Управляющий выход ОТКРЫВАТЬ
5 Управляющий выход ЗАКРЫВАТЬ
6 Счетчик РАСХОД ВОДЫ
7 Признак ТОК КРАНА БОЛЬШЕ НОРМЫ
8 Признак ТОК КРАНА В НОРМЕ
9 Признак ОШИБКА УПРАВЛЕНИЯ КРАНОМ
10 Признак ТРЕВОГА (для охранного шлейфа)
11 Признак ПРОТЕЧКА
12 Резерв
13 Резерв
14 Признак ошибки защищенной области EEPROM
15 Признак фатальной ошибки

Все признаки имеют активное состояние 1. Т.е. если написано, к примеру, ОТКРЫТ, то значит при открытом кране в соответствующем бите будет 1.

Регистр 4. Доступ к EEPROM

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
Данное 1 Данное 0

Регистр 5. Доступ к EEPROM.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
признаки 11 10 9 8 7 6 5 4 3 2 1 0
слово запись чтение Адрес EEPROM

Регистр 6. Регистр команд.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Свободны C O
  • O – открыть кран (10 = 1);
  • C – закрыть кран (10 = 2).

Регистр используется для управления краном. Если в него загрузить 1, то кран будет открываться, если 2 – закрываться.

Регистр 7. Копия регистра состояния (регистра 3). Регистр полностью повторяет данные регистра 7.

Регистры 8 – 25. Измеренные данные.

Регистр Количество регистров Тип данных Назначение
8 2 float Давление
10 2 float Расход воды
12 2 float Напряжение питания
14 2 float Резерв 1
16 2 float Резерв 2
18 2 float Ток двигателя
20 2 float Напряжение датчика протечки
22 2 float Напряжение охранного шлейфа
24 2 long Число импульсов расхода воды

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

Чтобы уменьшить время обмена по сети, я расположил подряд данные, которые необходимо считывать в рабочем режиме. Для этого слово состояния (регистр 3) копируется в регистр 7.

Предполагается, что в рабочем режиме в цикле будут считываться регистры 7 -11. В регистре состояния содержится вся информация о работе устройства. Также постоянно необходимо считывать параметры давление и расход воды. Все остальные регистры необходимы для диагностики, коррекции данных EEPROM и исправления ошибок.

Формат данных EEPROM области общего назначения, коэффициенты.

Формат данных защищенной области EEPROM мы определили в главе 3. Теперь надо добавить данные контроллера водоснабжения.

Для работы устройства необходимо много разных коэффициентов, которые будут храниться в EEPROM.

Для хранения коэффициентов будут использоваться 2 формата:

  • С плавающей запятой. Требует 6 байтов:
    • 0…3 – данное в формате float.
    • 4 – контрольный код. Сумма байтов 0…3 и исключающее ИЛИ с кодом 0xe5.
    • 5 – байт свободен.
  • С фиксированной запятой 16 разрядов. Занимает 4 байта:
    • 0 … 1 – данное в формате int.
    • 2 … 3 – контрольный код. Данное 0…1 и исключающее ИЛИ с кодом 0xa3e5.
Адрес Число байтов Тип Назначение
32 6 float Коэффициент датчика давления
38 6 float Коэффициент датчика протечки
44 6 float Коэффициент охранного шлейфа
50 6 float Коэффициент напряжения питания
56 6 float Коэффициент датчика тока двигателя
62 6 float Коэффициент резерв 1
68 6 float Коэффициент резерв 2
74 6 float Ток двигателя больше нормы
80 6 float Ток двигателя в норме
86 4 int Время срабатывания защиты двигателя (* 0,5 мс)
90 4 int Время на операцию с краном (* 0,5 мс)
94 6 float Минимальное напряжение охранного шлейфа
100 6 float Максимальное напряжение охранного шлейфа
106 6 float Порог напряжения датчика протечки
112 6 float Коэффициент датчика расхода воды

Коэффициенты для аналоговых входов (первые 7) должны учитывать все:

  • дискретность АЦП (5 В / 1024);
  • параметр усреднения (20);
  • коэффициенты датчиков;
  • перевод в физические параметры;
  • если необходимо, калибровку конкретных измерительных входов.

Например, если необходимо установить коэффициент для измерения в диапазоне 0 … 5 В, он вычисляется так:

K = 5 В / 1024 / 20 = 0.00024414062.

При нарушении контрольного кода любого параметра EEPROM:

  • в регистре состояния устанавливается бит ФАТАЛЬНАЯ ОШИБКА;
  • мигает светодиод ОШИБКА;
  • в качестве параметра используется резервный параметр, заданный в программе.

Т.е. если какой-либо параметр ”залетит”, то контроллер будет работать с резервным параметром, но при этом сигнализировать о необходимости исправить ошибку.

Алгоритм управления краном.

Это самый сложный блок управления. Поэтому расскажу о нем подробнее.

Операция ОТКРЫТЬ или ЗАКРЫТЬ кран инициируется загрузкой команды (1 или 2 соответственно) в регистр команд (регистр 6).

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

Команда может быть сформирована:

  • центральным контроллером по сети;
  • кнопками ОТКРЫТЬ и ЗАКРЫТЬ;
  • программным блоком, закрывающим кран по обнаружению протечки.

По команде двигатель крана начинает вращаться в заданном направлении. Остановка происходит по:

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

Ошибочное завершение операции сигнализируется признаком в слове состояния.

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

Светодиод КРАН сигнализирует состояние процесса.

Состояние крана Состояние светодиода
Открыт Светится
Закрыт Погашен
Остановлен не в крайнем положении Мигает, 250 мс светится, 250 мс погашен
Открывается Мигает, 400 мс светится, 100 мс погашен
Закрывается Мигает, 50 мс светится, 450 мс погашен

Программа контроллера водоснабжения.

Программу можно загрузить по ссылке:

Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта!

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

За основу была взята программа из главы 3.

В обработчик прерывания добавлен блок обработки АЦП.Он последовательно считывает и усредняет значения 8 каналов АЦП. АЦП работает в фоновом режиме под управлением библиотеки BackgroundADC.h (урок 65). По готовности данных формируется признак readyADC.

В основном цикле loop() по этому признаку происходит умножение кодов на коэффициенты и перегрузка результата в регистры хранения. Здесь же измеренные значения сравниваются с пороговыми параметрами.

Следующий программный блок в цикле перегружает состояние дискретных выводов в регистр состояния.

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

Блок обработки протечки закрывает кран, блокирует возможность его открытия, управляет светодиодом ПРОТЕЧКА.

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

Проверка работы устройства.

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

Я написал программу диагностики контроллера водоснабжения. Загрузить можно по ссылке:

Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта!

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

Я приведу мою тестовую последовательность, заодно еще раз все проверю.

Включаем контроллер, запускаем программу DiagnWater_5_1.exe.

Проверяем данные в верхней левой панели.

Устанавливаем правильный адрес контроллера. По умолчанию задан резервный адрес 193. Даже с неправильным сетевым адресом обмен должен идти. Но лучше установить адрес, тип, заводской номер, дату выпуска контроллера. Об этом написано в главе 3.

Проверяем, что обмен происходит без ошибок. У меня ни единой.

Тестируем работу аналоговых входов. Если вы загрузили программу в плату Ардуино в первый раз, то контрольные коды параметров в EEPROM будут неверными. Да и сами данные будут неверными. Устройство перейдет на использование резервных коэффициентов, замигает светодиод ошибка.

Необходимо перейти в окно редактирования EEPROM и задать коэффициенты для аналоговых входов (7 первых) равными 0.00024414062.

Тем самым мы для всех каналов установим диапазон измерения 0 … 5 В. Закрываем окно редактирования.

По очереди, вращая переменные резисторы, убеждаемся, что измеряемые напряжения соответствуют реальным. Устанавливаем для каждого канала разные значения, например, 1 В, 2 В, 3 В, 4 В, 4,5 В.

У меня грубые переменные резисторы, точно установить не смог.

Проверяем правильную работу коэффициентов. В окне редактирования EEPROM устанавливаем следующие коэффициенты.

Возвращаемся в основное окно и видим, что значение первого канала стало в 10 раз больше, второго в 100 раз и т.д. Коэффициенты соответствуют своим каналам.

Возвращаем коэффициенты к прежним значениям.

В правой верхней панели проверяем дискретные входы. По очереди нажимаем кнопки, эмулирующие датчики, и видим, что красным цветом загораются соответствующие кружки в окне программы. Выходы ОТКРЫТЬ и ЗАКРЫТЬ пока игнорируем.

Проверяем блок управления краном.

Задаем параметры для крана (вторая сверху панель).

Не забываем закрыть окно. При открытом окне редактирования EEPROM, работа основной программы останавливается.

Проверяем работу признаков тока крана. Вращаем переменный резистор канала ТОК:

  • при значении меньше 2 В, активен признак I<min;
  • от 2 до 4 В активен признак I>min;
  • свыше 4 В активны признаки I>min и I>max.

Устанавливаем напряжение канала ТОК меньше 2 В, признак I<min. На канале ПРОТЕЧКА задаем напряжение близкое к 0.

Проверяем выполнение команд крана.

Давим кнопку ОТКРЫТЬ в окне программы. Загораются признаки открыть команды и управления, а также соответствующий светодиод на макете.

Нажимаем датчик ОТКРЫТО. Признаки гаснут. В окне программы это может происходить с задержкой, а на макете светодиод должен гаснуть мгновенно.

Тоже самое проверяем с реальной кнопкой ОТКРЫТЬ на макете.

Проверяем остановку операции по времени. Нажимаем кнопку ОТКРЫТЬ. Ждем. Через 10 секунд все выключается. Горит признак ОШИБКА в окне программы.

Проверяем принудительную остановку операции. Нажимаем кнопку ОТКРЫТЬ, загораются признаки. Нажимаем кнопку СТОП. Все выключается.

Проверяем защиту по току. На входе канала ТОК устанавливаем напряжение больше 4 В, признак I>max. Нажимаем кнопку открыть. Через 3 секунды все выключается с признаком ошибки.

Все тоже самое повторяем для кнопок ЗАКРЫТЬ в окне программы и на макете.

Проверяем индикацию работы крана в соответствии с таблицей.

Состояние крана Состояние светодиода
Открыт Светится
Закрыт Погашен
Остановлен не в крайнем положении Мигает, 250 мс светится, 250 мс погашен
Открывается Мигает, 400 мс светится, 100 мс погашен
Закрывается Мигает, 50 мс светится, 450 мс погашен

Нажимаем:

  • датчик ОТКРЫТО – светодиод постоянно светится;
  • датчик ЗАКРЫТО – светодиод погашен;
  • проверяем режимы ОТКРЫВАЕТСЯ, ЗАКРЫВАЕТСЯ и ОСТАНОВЛЕН.

Проверяем состояние ПРОТЕЧКА.

Параметр ПОРОГ ПРОТЕЧКИ устанавливаем 2,5 В. Меняя напряжение на входе канала ПРОТЕЧКА убеждаемся, что при превышении 2,5 В на панели АВАРИИ загорается признак ПРОТЕЧКА и мигает соответствующий светодиод макета.

В режиме протечки видим, что кран пытается закрыться и останавливается только по датчику ЗАКРЫТО.

Проверяем охранный шлейф. Устанавливаем пороги 1,06 и 3,6 В. Вращаем переменный резистор канала ОХРАНА. Убеждаемся, что признак ОХРАННЫЙ ШЛЕЙФ горит красным, если напряжение на входе меньше 1 В или больше 3,6 В.

Проверка счетчика расхода воды. Задаем коэффициент счетчика 0.001. Проверяем, что при каждом нажатии на кнопку макета – эмулятор счетчика, параметр РАСХОД ВОДЫ увеличивается на 0,001.

После записи последнего параметра EEPROM светодиод ОШИБКА должен перестать мигать.

Еще раз смотрим на статистику обмена. У меня ни единой ошибки.

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

Программа верхнего уровня тестирования системы.

Новый контроллер я добавил в программу тестирования всей системы ”Умный дом”.

Загрузить можно по ссылке:

Зарегистрируйтесь и оплатите. Всего 25 руб. в месяц за доступ ко всем ресурсам сайта!

Не забудьте включить контроллер птичкой в левом верхнем углу.

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

«Умный дом» от EGNITE своими руками

Новости электроники

Главная Новости Новости электроники


AVR-ETHERNUT V.2.1 — недорогой и простой в освоении инструментарий фирмы EGNITE (Германия) позволяет разработчикам строить на базе микроконтроллера ATmega128 фирмы ATMEL и Ethernet интерфейса, реализованного на MAC+PHY Ethernet контроллере фирмы SMSCs LAN91C111, системы, такие как:

миниатюрные веб-сервера с использованием протоколов HTTP, Telnet, DHCP, DNS, PPP и др.;
приложения дистанционного оповещения;
дистанционный мониторинг и управление;
«Умный дом»;
управление дисплеем;
промышленные приложения;
сбор данных с датчиков и передача их через Интернет;
Интернет радио (посредством дочерней платы Medianut).

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

Отличительные особенности:
установленный RISC микроконтроллер ATmega128;
Ethernet контроллер LAN91C111;
установленный RJ-45 коннектор;
последовательный порт RS-232 и коннектор DB-9;
последовательный порт RS-485 (полу-дуплекс);
512 КБ последовательной Flash памяти;
512 КБ banked SRAM;
22 пользовательских ввода-вывода;
JTAG разъём;
светодиодный индикатор питания;
светодиодный индикатор активности Ethernet контроллера;
питание от источника +8 В — +12 В;
установленный стабилизатор напряжения на +5 В.

CPLD фирмы XILINX служит в качестве логики выбора банка внешней ОЗУ на 512 КБ и вырабатывает сигнал «выбор чипа» для LAN контроллера. Большой объём СОЗУ позволяет справляться системе с декодированием MP3 потока (в случае использования MEDIANUT V.1.1). На плате установлены два преобразователя последовательных интерфейсов RS-232 и RS-485. RS-232 можно использовать как во время отладки (в качестве загрузчика), так и в работе при стыковке к любому оборудованию с аналогичным интерфейсом (как вариант: управлять источником бесперебойного питания). Интерфейс RS-485 может использоваться для дистанционного управления различными устройствами посредством всего двух проводов на расстоянии более 1 км. К этому интерфейсу можно подключить различные датчики (температуры, давления, присутствия и т.п.), моторизированные приводы (управление открытием двери, окна и т.д.).

Небольшие габаритные размеры платы (78×98 мм) решают проблему её встраивания в небольшие корпуса или же в уже готовые изделия.

Программное обеспечение и техническое описание:
Ethernut 2.1 Hardware Users Manual — полное техописание с принципиальной схемой
Ethernut 2.1 Dimensions (in mm) — размеры печатной платы
enswm23e.pdf — Ethernut Software Manual — введение в Nut/OS
ethernut-3.9.7.exe — Nut/OS 3.9.7 (Windows) — исходники:
RTOS, TCP/IP стэк, примеры применения, конфигуратор и справочная информация по API
nut395d.exe — Nut/OS and Nut/Net documentation, должно быть установлено перед nut395c.exe

Комплектация:
отладочная плата AVR-ETHERNUT V.2.1;
CD с программным обеспечением, описаниями и примерами.

Дата публикации: 29.08.2005ПредыдущаяВсе за текущий деньСледующая Другие новости …

  • Интеллектуальные датчики и сенсорные системы компании SICK
  • National Semiconductor представляет новое семейство самых миниатюрных детекторов мощности радиосигналов
  • Повышающие DC-DC преобразователи с КПД до 95%, увеличивающие срок службы аккумуляторов и устраняющие необходимость разделять аккумуляторы батареи
  • Отладка для микроконтроллера AT91SAM7A3 от ATMEL
  • Демонстрационный комплект драйвера управления 3-фазным мотором IRADK31 от фирмы INTERNATIONAL RECTIFIER
  • National Semiconductor представляет две однокристальные подсистемы звукоусиления серии BOOMER® с расширенными функциональными возможностями