D18B20, Arduino, MODBUS, Master SCADA

  • В этой теме 259 ответов, 23 участника, последнее обновление 5 лет сделано Роман.
Просмотр 15 сообщений - с 196 по 210 (из 260 всего)
  • Автор
    Сообщения
  • #18682
    Степан
    Участник
    • Ответов: 51
    @sten58

    Есть реле на 5В с опторазвязкой для ардуино

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

    #18736
    Счастливчик
    Хранитель
    • Ответов: 2655
    @wpadm

    Коллеги, собрал действующий макет.

    Управляю ШИМ нагрузки через прерывания при помощи библиотеки ticker.h.

    Все на аппаратном уровне работает. Т.е. лампа (аналог нагрузки для тестов) послушно загорается и гаснет.

    Не очень нравится мне мой алгоритм. Покритикуйте пожалуйста.

    Реализовано: на входе параметр – мощность ТЭН, целое число от 0 до 100 (проценты мощности). Прерывание стучит каждые 100 мс. Если мощность, например 1%, то ТЭН включается на 0.1 секунду, а затем пауза 9.9 секунд. Если мощность, например 60%, то ТЭН работает 6 секунд, затем пауза 4 секунды.

    Не слишком это долгие паузы? Не могу придумать алгоритм как это изящнее реализовать. Может идеи есть какие, или почитать что?

    Вложения:
    Вы должны войти для просмотра вложений.

    Хорошо живет на свете Винни-Пух...

    #18738
    Максим
    Участник
    • Ответов: 306
    @maxx

    Буду собирать по этой схеме  http://forum.homedistiller.ru/msg.php?id=13179698  . В той теме можно много чего почитать. Пауза конечно большая, взять секунду(к примеру) за 100% и внутри неё уже… Мне проще повторить и дополнить, чем с нуля начинать.

    #18739
    ers
    Участник
    • Ответов: 30
    @ersivv

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

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

    В ЛС кину ссылку на наглядную модель.

    #18741
    skalinas
    Участник
    • Ответов: 441
    @skalinas

     

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

    #18742
    Счастливчик
    Хранитель
    • Ответов: 2655
    @wpadm

    @ersivv

    Спасибо, изучу.

    В основном цикле ничего в идеале быть не должно. Иначе вся система превратится в сплошную кашу, неразрывно связанную и нечитаемую. Я модульно делаю.

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

    Хорошо живет на свете Винни-Пух...

    #18746
    ers
    Участник
    • Ответов: 30
    @ersivv

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

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

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

    #18750
    Счастливчик
    Хранитель
    • Ответов: 2655
    @wpadm

    Тут реализован алгоритм

    Спасибо, посмотрю

    Из основного цикла можно разбить на подмодули

    Это понятно. Блин, хочу уже хоть как-то промежуточно финализировать и выпустить уже в шаловливые ручонки сообщества))

    Хорошо живет на свете Винни-Пух...

    #18753
    grizzzly
    Участник
    • Ответов: 419
    @grizzzly78

    Это понятно. Блин, хочу уже хоть как-то промежуточно финализировать и выпустить уже в шаловливые ручонки сообщества))

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

    Йо-хо-хо.

    #18758
    Степан
    Участник
    • Ответов: 51
    @sten58

    Покритикуйте пожалуйста.

    3. По Брезенхему. При этом способе в нагрузку всегда подаются [полу]периоды сетевого напряжения целиком, но не все, а только часть. Например, если из каждых 100 [полу]периодов подать в нагрузку только 20, то мощность, поданная в нагрузку, будет 20% от максимальной. Причём эта часть [полу]периодов как бы “размазывается” по времени, чтобы достичь более равномерного распределения “рабочих” и “нерабочих” [полу]периодов. Такой метод позволяет регулировать мощность лишь источников тепла (ТЭНов), так как при подключении в качестве нагрузки лампы она будет мигать. Помех по сети такой метод создаёт мало, так как включение и отключение тока нагрузки всегда происходит в момент перехода сетевого напряжения через ноль.

    Дальше там обсуждение, почитай. Два варианта реализации в Экселе было. Алгоритм сводится к десятку строк целочисленной арифметики.

    #18759
    Счастливчик
    Хранитель
    • Ответов: 2655
    @wpadm

    Начни с аппаратной части

    Да она готова почти, надо паука из проводов уместить в коробке, и все

    Хорошо живет на свете Винни-Пух...

    #18765
    Степан
    Участник
    • Ответов: 51
    @sten58

    По прерываниям рекомендуется использовать для выставления флагов

    Беда в том, что http не единственный критичный к задержкам процесс в системе. Та же программная реализация 1-Wire для DS18x20 тоже на временных интервалах построена.

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

    Поэтому стараются в обработке прерываний выполнять минимум простых действий (установка/сброс флагов, старт/рестарт/стоп таймеров и т.п.), а “тяжелый” код выполнять в порядке, тыскыть, очереди.

    Вот, кстати, Брезенхем:

    dy = !(2*z > xm) ;    // управление на триак; xm=100 – максимально возможная уставка в %; если двойная ошибка z больше xm, триак не открывается на следующей полуволне

    z = z – ym;                 // текущая ошибка, вначале =0; ym – текущая уставка в %

    If (dy) {z = z + xm}; // Коррекция ошибки для следующего шага

     

    И все!!!

    #18766
    Роман
    Участник
    • Ответов: 291
    @papazol

    Не знаю, вовремя ли влезу в тему, но на всякий случай…

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

    #18767
    Степан
    Участник
    • Ответов: 51
    @sten58

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

    Вариант – одно прерывание (генератор “тиков”), и программные счетчики-таймеры для каждой задачи. Как таймер сработал – задача выполняется. Грубо говоря, прежде чем что-то делать, задача проверяет состояние таймера.

    По-моему, это как раз и называется CASE-программированием 🙂

    “Задачи” либо встраиваются в основной цикл, либо делаются функциями. С функциями оно, конечно, читабельнее, но – накладные расходы времени на вызов-возврат, бывает критично.

    #18789
    Счастливчик
    Хранитель
    • Ответов: 2655
    @wpadm

    Ох, пока голова опухла))

    К выходным соберу макет в изделие, подчищу все другие вещи в коде, что остались в списке “To Do”, и надо на вас вываливать. Может еще немного времени возьмет доделать что-то по мелочам. В любом случае пока видится, что до первого апреля должен уложиться.

    Хорошо живет на свете Винни-Пух...

Просмотр 15 сообщений - с 196 по 210 (из 260 всего)
  • Для ответа в этой теме необходимо авторизоваться.