Форум самогонщиков Сайт Барахолка Магазин Помощь солдатам

Ненавязчивая автоматизация ректификационной установки

Форум самогонщиков Автоматика
1 ... 79 80 81 82 83 84 85 ... 132 82
ekochnev Магистр Екатеринбург 207 54
Отв.1620  08 Авг. 19, 20:54
Ну нравится мне художничать с платами вручную...BogAD, 08 Авг. 19, 20:19

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

Ну и немного критики :-)
У температурного хаба разъем для подключения датчиков вверху платы. При подключении проводов от датчиков имхо сильно увеличится общая высота. Я тут измерения проводил: при высоте платы в 50 мм вся конструкция уже впритык помещается по высоте в стандартный рапределительный бокс с DIN-рейкой, а тут еще подключенные провода высоты добавят. В этом отношении вариант Сергея где разъем сбоку мне больше понравился.

P.S. Пардон. Понял, что на хабе разъем под плоский шлеф сделан типа как для дисководов на материнских платах раньше было, он вверх выступать не будет. Изначально подумалось, что там угловой разъем типа PBD-R будет стоять, вот и критикнул... :-)
BogAD Кандидат наук Красногорск - Белово 403 184
Отв.1621  09 Авг. 19, 09:02
...  Подумалось, что при таком раскладе если у малины GPIO поменять на угловой, то и ее можно будет прямо в крейт втыкать. При этом сторона где у нее USB порты как раз будет вровень с краем крейта...
...для такого решения в разводке разъема на крейте надо еще ряды где контакты 1 и 2 поменять местами. Ну либо ничего не менять и не перепаивать, а просто маленький райзер переходник изготовить...ekochnev, 08 Авг. 19, 20:54


В первой конструкции с крейтом вертикально, рядом с разъемом 40pin на крейте, на своих стойках стояла Малинка (жаль фото с флехой благополучно прое...терялась). Между крейтом и Малинкой, шлейф в 5 см (резал по месту), с наколотыми розетками IDC-40F (DS1016-40) с фиксатором шлейфа. Аккуратно, и не ошибёшься...

при высоте платы в 50 мм вся конструкция уже впритык помещается по высоте в стандартный рапределительный бокс с DIN-рейкой,ekochnev, 08 Авг. 19, 20:54
Я свой первый корпус изготовил из оргстекла. Клеил дихлорэтаном.
Не было целью использовать боксы с DIN-рейкой. Сложно впихнуться в них. Хотя… вполне! Смотря что выбрать. К примеру EKF pb65-n-pg-18
https://etim.vellmart.net/...B2B917961CA.png

Понял, что на хабе разъем под плоский шлеф сделан типа как для дисководов на материнских платах раньше было, он вверх выступать не будет. Изначально подумалось, что там угловой разъем типа PBD-R будет стоять, вот и критикнул... :-)ekochnev, 08 Авг. 19, 20:54
Да, закладывалось применение шлейфа с розеткой IDC-34F (DS1016-34), 2.54мм на шлейф 34 pin с фиксатором кабеля
На чип-дипе ценник 12 рублей.
OldBean Доцент Красноярск 1K 1.4K
Отв.1622  11 Авг. 19, 15:59
Для lsync сначала хотел сделать автоматическое распознавание типа датчика, например, если адрес 0х76, то воспринимать датчик как ВМР280 (этот адрес для него идет по-умолчанию, чтобы переключить на 0х77 необходимо еще один проводок подпаять), а если адрес 0х77, то работать как с ВМР180.ekochnev, 08 Авг. 19, 18:13
Да. Так будет хорошо. В новой версии lsync (уже заканчиваю) я тогда тоже сделаю так же.OldBean, 08 Авг. 19, 20:44
Увы, идея оказалась не очень хорошей, т.к. в "закромах" вдруг обнаружился еще один датчик атмосферного давления (MS5611), который тоже работает по адресам 0x76 и 0x77. Кстати, очень приличный линейный датчик с широким диапазоном (от 7.5 до 900 мм рт.ст.). Вполне может пригодиться для вакуумной перегонки.

В конечном итоге, в новой версии синхронизатора железа с БД Redis пришлось сделать "честное" распознавание BMP180 и BMP280 по содержимому их ID-регистров (адрес регистра в устройствах - 0xD0, значения - 0x55 и 0x58, соответственно). А вот у MS5611, к сожалению, ID-регистра нет. Поэтому его идентификацию пришлось сделать по косвенным признакам (чтение калибровочных данных с регистров по определенным адресам). Не самое лучшее решение, конечно, но пока ничего другого не придумалось... :(

Таким образом, в новой версии lsync автоматически распознается и поддерживается три типа датчиков атмосферного давления: BMP180, BMP280 и MS5611. Причем, можно работать сразу с двумя датчиками одновременно (соответственно, на адресах 0x76 и 0x77). Логику идентификации датчиков давления можно глянуть во фрагменте скрипта синхронизатора ниже:

Скрытый текст
...
bus = smbus.SMBus(1)
for addr in range(0x03, 0x78): # Пробегаем по адресам шины I2C
  try:
    bus.write_byte(addr, 0x33) # Запрос кода семейства
    time.sleep(0.1)
    if addr in (0x76, 0x77): # Датчики атм. давления (BMP180, BMP280, MS5611...)
      try: # Может быть это BMPxxx? Пробуем прочитать ID (код семейства)
        fc = bus.read_i2c_block_data(addr, 0xD0, 1)[0] # ID BMP-датчика
      except BaseException as error: # Увы... Что-то другое
        try: # А может это MS5611? - попробуем почитать регистры с калибр.
          data = bus.read_i2c_block_data(addr, 0xA2, 2)
          # Что-то приходит с этих регистров - предположим, что это MS5611
          fc = 0x59 # Назначим код семейства для MS5611
        except BaseException as error: # Неизвестное (пока) устройство
          print('\n! Устройство по адресу 0x%02X не распознано'%(addr))
          continue
    else: # Другие устройства на i2c - просто читаем код семейства (fc)
      fc = bus.read_byte(addr)
    o = cls[fc](addr) # Создаем объект устройства
    obj.append(o)
...

ekochnev Магистр Екатеринбург 207 54
Отв.1623  12 Авг. 19, 21:18
Интересно будет посмотреть новую версию lsync...

Текущая версия у меня иногда часами нормально работает, а иногда самопроизвольно "падает", например вот с такими сообщениями:

Найдено следующее оборудование:
x11 Датчик RMS ( 0.3810, 0, 1)
x12 Твердотельное реле
x13 PDM-контроллер ( 3000.0000, 0, 2)
x14 PWM-контроллер ( 8000.0000, 0, 3)
x15 Хаб 1-Wire. К каналам хаба подключены:
    0 Датчик температуры DS18B20
    1 Датчик температуры DS18B20
    2 Датчик температуры DS18B20
    3 Нормально разомкнутый контакт или пусто
    4 Нормально разомкнутый контакт или пусто
    5 Датчик температуры DS18B20
    6 Датчик температуры DS18B20
    7 Нормально разомкнутый контакт или пусто
x77 Датчик давления BMP180/BMP280

Traceback (most recent call last):
  File "lsync.py", line 575, in <module>
    sup.sync()
  File "lsync.py", line 503, in sync
    self.teh.power = float(self.r.lindex(self._keyTeh, -1))
  File "lsync.py", line 316, in power
    self._pdm.setpdm(pdm)
  File "lsync.py", line 172, in setpdm
    self._wf.write(buf)
OSError: [Errno 121] Remote I/O error


При этом клиент вообще не видит, что синхронизатор упал и продолжает работать по последним записанным в базу показаниям. И я понимаю, что если я, например, запущу программу перегонки и уйду спать, а синхронизатор упадет в момент разгона, то тэн так и будет работать на максимальной мощности и никакая галочка в клиенте "Контроль температуры ТСА" не поможет предотвратить большой БУМ...

Дальше буду предлагать идеи как этого можно было бы избежать:

1. Клиент в процессе работы должен быть уверен, что синхронизатор работает и данные с датчиков в базе актуальные. Для этого добавил в редиску новый ключ: lsync_alive содержащий признак работоспособности синхронизатора. Синхронизатор при запуске создает данный ключ и задает ему время жизни в 2 минуты (можно любое другое число заведомо большее времени цикла синхронизатора), затем в каждом цикле чтения датчиков и обновления данных базы постоянно устанавливает время жизни этого ключа в 2 минуты повторно. Если синхронизатор вывалится и параллельно не запущено никакого другого синхронизатора, то через две минуты ключ просто исчезнет из базы. Клиент в свою очередь при каждом цикле чтения данных из базы проверяет существование этого ключа в базе и если его не находит то сигналит как может: моргает большими красными буквами, пищит в бипер и т.п. Однако, если бипер никто не слышит и надписи на экране не видит, то БУМ это не предотвратит, т.к. вырубить клиент все сам не может, т.к. напрямую с железом клиент не работает - он работает только с базой, а синхронизатор который из базы переносит команды в железо у нас уже упал... В общем программного ватчдога в данном случае недостаточно... Можно конечно запускать синхронизатор скриптом шелла и анализировать код завершения процесса синхронизации, если он ошибочный, то тупо запускать синхронизатор повторно...

2. Можно реализовать данную схему программно-аппаратно, например, в контроллере контактора, точнее в его прошивке. Сейчас контактор включается/выключается путем записи в него одного байта: нулевого на выключение, любого ненулевого на включение. Можно сделать в прошивке так, что если пишем 0,то контактор выключается, если пишем 0хFF, то контактор работает неограниченно долго. Если пишем любое другое число, то это будет означать кол-во секунд которые должен работать контактор. В прошивке контактора записанное число потихоньку уменьшается в цикле и по достижении нуля прошивка автоматом сама вырубает контактор. При включении контактора из клиента синхронизатор должен в каждом цикле считывания показаний датчиков также обновлять время в контакторе как бы повторно включая его ненулевым байтом с величиной заведомо больше чем время цикла синхронизатора. Если синхронизатор упадет и его быстренько не запустят вновь, то контактор вырубится обесточив всю систему. При однобайтовой записи данных в контактор как сейчас диапазон контролируемых времен 1-254 секунды. Можно его расширить расширив разрядность управления контактором до 2 или 4 байт.

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

4. А сейчас можно забыть все, что я написал в предыдущих пунктах. :-) Потому, что по-хорошему нужен аппаратный ватчдог, т.е. отдельный модуль. К нему  датчики безопасности: температура в ТСА или системе охлаждения, датчик разлива жидкости или переполнения емкости - по сигналу любого из этих датчиков модуль будет формировать общий сигнал RESET для всех модулей, перегружая их в безопасное состояние: тэн обесточен, все клапана закрыты, контактор выключен, вода закрыта и т.п. Это должно работать даже если малинка зависла или вообще отключена. Для этого наверное сигнал RESET стоит вывести на отдельную линию крейта.


Это так, все просто мои рассуждения на эту тему, т.к. данный проект меня реально заинтересовал...
OldBean Доцент Красноярск 1K 1.4K
Отв.1624  13 Авг. 19, 05:02
Интересно будет посмотреть новую версию lsync...ekochnev, 12 Авг. 19, 21:18
К сожалению, новая версия несовместима со старым клиентом, а новый еще не написан.
Но я сделал и подробно документировал небольшой модуль api.py к редиске, ориентированный на функционал lsync. Там достаточно полный клиентский функционал, который позволяет не только тестировать lsync, но и быстренько "накидывать" несложные прототипы клиентов. Сейчас дописываю документацию к новой версии lsync (если не напишу сейчас, то потом точно не соберусь. Ну Вы знаете как это бывает... ;) Потом могу выложить lsync + api. С этой связкой вполне можно заниматься уже реальными процессами, думать и пробовать разные варианты клиентов.

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

1. Прошивки модулей, которые висят на i2c, переработаны. Существенное изменение в них по сравнению с предыдущими прошивками - это блокировка TWI во время критических операций в модулях (чтение/запись EEPROM, внутренние копирования блоков данных, циклы преобразований и т.п.).
2. Готовность соответствующего TWI теперь проверяется малинкой при всех операциях чтения/записи в модули по шине i2c. В сочетании с п.1, это позволило уменьшить вероятность коллизий в прерываниях у модулей и, в целом, ускорило процесс обмена.
3. В самом синхронизаторе тоже много изменений. Фактически он наполовину переписан. Главное, что будет заметно "снаружи" - сделано более "дружественное" именование ключей. Например, ключи для температур это 'T0', 'T1'..., давлений: 'P0', 'P1'..., клапаны отбора (контроллеры PWM) - это 'q0', 'q1', 'q2'... для скоростей отбора и 'Q0', 'Q1', 'Q2' для суммарных расходов через них и т.д. Работать с редиской стало гораздо удобнее. Даже сам перестал путаться ;)

Теперь по поводу текущей версии синхронизатора. Во-первых, большое спасибо за подробный внешний анализ системы! Мне этого как раз очень не хватало. Теперь конкретно.
1.
1. Клиент в процессе работы должен быть уверен, что синхронизатор работает и данные с датчиков в базе актуальные.ekochnev, 12 Авг. 19, 21:18
В принципе, контроль работоспособности синхронизатора со стороны клиента можно обеспечить по изменению относительного времени в редиске (ключ b'time'). Если синхронизатор завис - это время тоже замрет. Клиент может это почувствовать.

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

3.
необходимо в прошивке(ах) реализовать режим чтения из силовых модулей.ekochnev, 12 Авг. 19, 21:18
Совершенно согласен с Вами. Это - "наследие" простого (точнее - просто "нулевого" ;) протокола прикладного уровня, который был заложен еще в первом (до LITE-овом) варианте системы. Сейчас (в LITE) протокол побогаче, поэтому реализовать опцию чтения состояния контроллеров добавить несложно. Добавлю.

4.
по-хорошему нужен аппаратный ватчдог, т.е. отдельный модуль.ekochnev, 12 Авг. 19, 21:18
Конечно это самое лучшее решение проблем безопасности. Я просто немного увлекся идеей "универсальности" систем автоматизации, отложив вопросы безопасности в сторону. Обязательно нужно сделать такой модуль. Думаю, имеет смысл сделать его даже вообще на жесткой логике (не на МК)? Или это уже параноидальный перебор? :)
ekochnev Магистр Екатеринбург 207 54
Отв.1625  13 Авг. 19, 06:05
Потом могу выложить lsync + api.OldBean, 13 Авг. 19, 05:02

Буду ждать с нетерпением.

сделано более "дружественное" именование ключей. Например, ключи для температур это 'T0', 'T1'..., давлений: 'P0', 'P1'..., клапаны отбора (контроллеры PWM) - это 'q0', 'q1', 'q2'... для скоростей отбора и 'Q0', 'Q1', 'Q2' для суммарных расходов через них и т.д.OldBean, 13 Авг. 19, 05:02

Вот! абсолютно с Вами согласен! Я пришел к этой же мысли, просто в предыдущем своем посте не стал эту тему смешивать с проблемами безопасности... Рассматривал даже два варианта подобных именований:

1. Именовать последовательно все обнаруженные однотипные устройства не зависимо от канала хаба к которому они подключены. Т.е. датчики температуры, подключенные к каналам 1, 3 и 5 хаба в системе появились бы как Т0, Т1 и Т2, а датчики давления, подключенные к каналам 2 и 4 - как P0 и Р1.

2. Именовать двухзначным индексом с учетом номера хаба и канала. Первая цифра - номер хаба (их ведь может быть несколько). Для предыдущего примера: T01,T03,T05 и P02,P04

Проанализировав оба варианта более склонился к первому, т.к. клиент будет отвязанным от железа, то ему все равно к какому каналу и хабу что подключено, важно лишь количество и порядок подключения чтобы можно было отличить один датчик от другого. Также по поводу ключей была мысль, что вообще не обязательно каждому датчику давать свое индивидуальное имя ключа, можно вообще использовать списковые типы ключей, редиска это позволяет, и обращаться к однотипным датчикам по индексу в списке: TEMP_SENSOR[0], TEMP_SENSOR[1] и т.п.

Сейчас клиент жестко завязан на фиксированное число датчиков. Если что-то недостает, например, не подключен один из датчиков температуры, то даже не запустится. Это безобразие. Для разных режимов работы необходим разный набор исходных данных:
- для первичной дистилляции браги на СС в минимуме достаточно только одного температурного датчика в кубе
- для ректификации в зависимости от сложности колонны нужно либо два датчика температуры (куб, деф), либо три (куб, деф, центр колонны), либо четыре и более (+датчики в ПБ и ЦП)
Кроме этого минимума факультативно (кому-то это надо, кому-то наплевать) могут быть датчики безопасности: температура в ТСА, вода на выходе, вода на входе и т.п. Если они есть, то учитывать их показания, если отсутствуют, то не учитывать.

Клиент должен видеть в базе лишь обезличенный набор датчиков: есть, например, пять датчиков температуры Т0-Т4, а вот связь какой датчик куда подключен это видимо надо решать уже в настройках клиента под конкретную задачу. Можно конечно как сейчас делать жесткую привязку: Т0 - это куб, Т1 - колонна, Т2 - деф, Т3 - ТСА и т.п., но тогда теряется гибкость конфигураций оборудования. Например, клиент видит что подключено 4 датчика и разбирает их по вышеизложенному принципу, но он не знает, что из 4 подключенных к системе датчиков в данный момент я использую только два (куб и деф), на безопасность (ТСА) мне сегодня наплевать, а датчик колоны воткнуть просто некуда т.к. в данный момент я поставил колпачковую колонну без отверстия для центрального датчика. А четыре их видится потому что у меня все оборудование стационарно собрано и я не стал выдергивать разъемы: два неиспользованных датчика сейчас подключены, но просто рядом лежат. Т.е. в клиенте должна быть возможность указать, что из четырех видимых датчиков вот этот - в кубе, вот этот - в дефе, а вот эти два неиспользуемые. Тогда и алгоритм работы должен измениться и строиться не с учетом показаний трех датчиков (куб, колонна, деф), а только двух (куб, деф), а показания двух неиспользуемых могут отображаться чисто информативно. В идеале возможно что еще и для одной конфигурации предоставить выбор алгоритма работы, например: классический стар-стоп или последовательное уменьшение отбора или гибрид или что-то еще.


Добавлено через 50мин.:

По концепции клиента:

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

1. Работа без клиента

1.1. На блоке автоматики не зависимо от наличия/отсутствия монитора и клавиатуры хочу видеть дублирующий дисплей с отображением важнейших параметров. Думаю, достаточно будет текстового LCD 20 символов на 4 строки, подключенного через переходник на I2C шину. Для себя в изготовлении такого вообще проблем не вижу. Выводить текущую информацию на него может синхронизатор, который должен запускаться после загрузки малинки в фоне как системный сервис.

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

2. Простейший клиент. Если не требуются графики, не хочется долго смотреть ни в какие экраны, имеется необходимый набор оборудования и программа полностью автоматизирующая процесс, то достаточно простейшей менюшки с текстовым интерфейсом. Например: открыл терминальное окно по ssh, запустил в нем какой-нибудь tmux чтобы при закрытии окна все не прервалось, затем запустил программу управляющую процессом (можно на том же питоне), выбрал из меню нужный алгоритм работы, закрыл терминальное окно, пошел спать. При особом любопытстве важные параметры, ход и шаги процесса можно контролировать на дисплейчике из п.1.1. или зайдя в терминальное окно повторно.

3. Web клиент. Все это же самое что есть в п.2. можно реализовать без терминального окна. Поставить на малинку маленький web сервер и управлять через него режимами работы из браузера. Из плюсов: тут можно и графики пристроить рядом красивые и с телефона или планшета зайти... Язык программирования может быть тот же питон.

4. Красивый графический клиент. Подобно текущему, но функциональнее. :-) С кнопочками, окошечками, рюшечками, закладками. Запускать либо локально на малинке если к ней подключены монитор, клавиатура, мышь, либо, если ничего этого нет, зайдя на малинку удаленно через VNC (как я это делаю сейчас).

5. Сетевой графический клиент. Как в п.4., только запускаться клиент будет в другом месте на компьютере, планшете, телефоне, подключение к малине по IP. Редиска это позволяет.


В общем, вариантов развития много. Пока зафиксировал все что пришло в голову чтобы не забылось.
Esc Профессор Москва 2K 2K
Отв.1626  13 Авг. 19, 11:39
для первичной дистилляции браги на СС в минимуме достаточно только одного температурного датчика в кубеekochnev, 13 Авг. 19, 06:05
Я бы не стал умалять в глазах автоматики погон браги.
Второй термодатчик в железе над кубом способен на многое, ... даже при банальном погоне браги.
Например, "лишний" зеленый датчик фиксирует резкий температурный рывок.
moment_zakipaniya.png
Moment_zakipaniya. Ненавязчивая автоматизация ректификационной установки. Автоматика.

Это подсказка автоматике, что содержимое куба вскипело. Можно подавать охлаждение и т.д.
- Подумаешь охлаждение. Да я попрошу подать охлаждающую воду в самом начале процесса. И вообще у меня автономка. Плевать мне на экономию воды.
- Хорошо, с охлаждением разобрались. Но ведь благодаря "температурному рывку" автоматике не сложно рассчитать начальную кубовую крепость.
nachalnaya_spirtyoznost.png
Nachalnaya_spirtyoznost. Ненавязчивая автоматизация ректификационной установки. Автоматика.

- Что мне это, вернее автоматике даст?
- Ну например можно попросить контроллер произвести погон браги по Габриэлю в автоматическом режиме. 
otbor_t1_i_t2.png
Otbor_t1_i_t2. Ненавязчивая автоматизация ректификационной установки. Автоматика.


В начале через клапан Valve_T1 автоматика отбирает тело T1. А когда кубовая спиртуозность понизится до определенного значения, через клапан Valve_T2 контроллер отбирает второе тело.
ekochnev Магистр Екатеринбург 207 54
Отв.1627  13 Авг. 19, 12:17, через 38 мин
Esc, вариантов использования масса, я же сделал оговорку "в минимуме". :-)
Сам использую один датчик, необходимости во втором пока не было, но допускаю, что кому-то может понадобиться больше. В каком месте у Вас второй (зеленый) датчик был установлен?

А зачем автоматике необходимо знать начальную крепость в кубе?
Конечную крепость понимаю, нужно знать чтобы вовремя остановить процесс, но она легко вычисляется одним датчиком по температуре кипения в кубе плюс корректировки от датчиков давления.
Зачем при простой дистилляции без отбора голов и хвостов автоматике нужна начальная, не совсем понимаю...
сообщение удалено
OldBean Доцент Красноярск 1K 1.4K
Отв.1628  13 Авг. 19, 14:50
Проанализировав оба варианта более склонился к первому, т.к. клиент будет отвязанным от железаekochnev, 13 Авг. 19, 06:05
Да. Именно такой вариант и именно из этих же соображений сейчас как раз и реализован. Величины с одинаковым физическим смыслом имеют сквозную нумерацию (возрастающую с ростом i2c-адреса и номеров каналов хабов). Пример конфигурации железа и результата ее анализа синхронизатором (на правой консоли) можно глянуть на картинках в приложении к топику.

Примечание:
Скрытый текстДля тестирования новой версии lsync и api я просто подключил к крейту все, что удалось наскрести по "сусекам". Получилась довольно "широкая" конфигурация, подходящая для для полноценного тестирования: два хаба, два контроллера клапанов отбора (один на макетке), 6 датчиков температуры, воткнутые в разные хабы, 3 разных датчика давления (один тоже на канале хаба), 30-градусный термоконтакт, датчик RMS, контроллер PDM (для ТЭНа). Дальше расширять тестовую конфигурацию не стал, т.к. в принципе все ключевые моменты (по части вариативности железа) схватываются. Для тестирования достаточно.
Сейчас клиент жестко завязан на фиксированное число датчиков. Если что-то недостает, например, не подключен один из датчиков температуры, то даже не запустится. Это безобразие.ekochnev, 13 Авг. 19, 06:05
Конечно безобразие! Но этот клиент никогда и не рассматривался как универсальный. Он должен был решить всего три задачи:
  • Посмотреть как работает трехуровневая архитектура (железо <-> редиска <-> клиент) в реальных процессах ректификации. Удобно/неудобно, где узкие места такой архитектуры, не вылезет ли где-нибудь какой-нибудь неожиданный концептуальный ляп и т.д. С этой задачей он вполне справился. В результате как раз и затеяна разработка новой версии lsync.
  • Помочь "нащупать" базовую модель универсального клиента для данного класса процессов (кубовая дистилляция и ректификация). Здесь есть кое-какие подвижки, но до реальной разработки дело еще не дошло.
  • Ну и утилитарная цель - гнать спирт на чем-то нужно, а на старой системе работать уже не интересно... :) С этим тоже все нормально. Правда, сейчас модули перепрошиты - придется его подправить или написать новый (тоже не универсальный).
По концепции клиента:
...
В общем, вариантов развития много. Пока зафиксировал все что пришло в голову чтобы не забылось.
ekochnev, 13 Авг. 19, 06:05
Хорошо, что зафиксировали список. Но, читая его, мне показалось, что Вы сильно преувеличиваете роль интерфейса для этой задачи (разработка универсального клиента). Интерфейс здесь вторичен и может быть легко реализован. На любой вкус. Тут уже пусть каждый сам решает что ему по душе. Все равно единого мнения не будет. По мне, так лучше и, главное, универсальней консоли еще ничего не придумано ;)

Но, по сути.

ИМХО, проблема разработки универсального клиента совсем не в интерфейсе (точнее - в двух последних словах концепции model-view-controller), а в отсутствии (или - просто я не знаю) адекватной и универсальной модели процессов дистилляции и ректификации и управления ими. Я имею в виду не физическую модель процессов тепло-массообмена в наших колоннах, а, можно сказать, "информационную модель". С точки зрения физики - вполне феноменологическую.

Поясню, что я имею в виду. Вот смотрите: за счет редиски (точнее - при помощи трехуровневой системы) удалось полностью абстрагировать клиента от "железа". Это шаг в нужном направлении. Сейчас клиент оперирует уже чисто физическими сущностями (физическими переменными), которые даны ему в виде динамических последовательностей в БД (P0, P1..., T0, T1,..., q0, q1,...). Часть из них клиент может изменять, а часть - read only. Первые - это "ручки" управления при помощи которых можно управлять траекторией системы в пространстве параметров read only. Стабилизировать какие-нибудь параметры. Например, -  температуру в колонне. За счет регулирования скорость отбора. Или - двигаться по какой-нибудь заданной траектории в пространстве параметров, ориентируясь, например, на температуру (точнее - спиртуозность) в кубе. Ну как, например, "по шпоре" ;)

Я уверен, что наиболее адекватной информационной моделью наших установок/процессов является "конечный автомат". Действительно, мы можем четко выделить различные состояния системы (т.е. автомата). Например, разгон, холостой ход, отбор голов, подголовников, тела, авария и т.д. Состояние автомата определяется параметрами исполнительных устройств (например, мощностью нагрева, скоростями отбора клапанов и т.п.). Для переходов между этими состояниями тоже есть вполне четкие критерии, основанные на показаниях датчиков (read only параметрах). Т.е. интуитивно - ну чистый конечный автомат!

В этом случае основные задачи клиента: 1) определить набор допустимых состояний автомата и 2) критерии перехода между ними. "Доступные" клиенту физические величины - уже есть в редискином списке (те самые P0, P1...). При этом, набор состояний и критерии перехода между ними должны быть сформированы так, чтобы автомат в своих переходах случайно "не заблудился", а дошел из начального состояния (с полным баком разбавленного и грязного спирта) до конечного состояния (чистый спирт отдельно, барда отдельно ;).

Сформированные состояния автомата (mode) и критерии переходов (jump) между ними клиент сохраняет в БД. После этого задача автоматического проведения процесса становится тривиальной. Наш "конечный автомат" просто "выпускается" из начального состояния клиентом. Дальше весь процесс идет автоматически на уровне редиски. Клиенту остается только наблюдать за его "траекторией" и вмешиваться только если что-нибудь не так.

Это в идеале. А что сейчас?

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

test_setup_gen_view.JPG
test_setup_gen_view.JPG Ненавязчивая автоматизация ректификационной установки. Автоматика.
lsync_api_screen_shot.png
lsync_api_screen_shot.png Ненавязчивая автоматизация ректификационной установки. Автоматика.
OldBean Доцент Красноярск 1K 1.4K
Отв.1629  14 Авг. 19, 05:12
17.7.4. Текущие версии прошивок и синхронизатора lsync

1. Версия 0.2.0.0 от 14.08.2019 в архиве в приложении к топику.

Архив содержит новые прошивки, новую версию синхронизатора lsync, модуль api.py и документацию к lsync и api в формате html.

Прошивки изменены только для устройств, находящихся на шине i2c. Их нужно перепрошить. Для 1-wire устройств (датчик MPX5010PD и 1-Wire АЦП) прошивки не изменялись.

Порядок работы

1. Распаковать архив в рабочую папку на малинке.
2. Прошить модули, подключаемые к шине i2c крейта (датчики RMS, реле, контроллеры PDM и PWM и хабы).
3. Собрать установку и систему автоматизации.
4. На малинке необходимо установить (если еще не установлено) СУБД redis и redis-py для работы с БД из питона. Инструкция - в разделе 17.7.1. Установка сервера redis и redis-py
5. В данной версии lsync, для работы с датчиками атмосферного давления BMP180 или BMP280 библиотека Adafruit BMP не используется. Ее можно не устанавливать.
6. Подготовить установку к работе.
7. Открыть терминал, перейти в папку с распакованным архивом запустить синхронизатор:
python3 lsync.py
8. Через небольшой промежуток времени синхронизатор выведет на терминал список найденного оборудования и начнет бесконечный цикл синхронизации состояния "железа" с БД. В левой колонке списка находятся ключи, по которым можно получать или модифицировать соответствующие данные из/в БД. В последнем случае, в течение одного цикла синхронизатора (2 сек), измененные значения данные будут посланы соответствующим устройствам (контроллерам).
9. Удобно выполнять все эти действия при помощи модуля api.py. Для этого необходимо запустить интерпретатор питона
python3
и в интерпретаторе импортировать api.py  
from api import *
После импорта можно вызывать функции этого модуля непосредственно по имени. Например, получить значение температуры с 0-го температурного датчика можно так:
vget('T0')
Описание функций модуля api.py и примеры можно найти в документации (файл api.html).

Добавление от 15.08.2019
В приложении к этому топику есть расширенная версия API с более компактным и, ИМХО, удобным интерфейсом к редиске через свойства классов.

Предыдущий топик  Вернуться к оглавлению   Следующий топик
ekochnev Магистр Екатеринбург 207 54
Отв.1630  14 Авг. 19, 13:15
Спасибо за новую версию!
Пока смотрю код на работе, не терпится поскорее прийти домой опробовать...

Внесу небольшое замечание:
Немного смутило разное основание констант fc в документации lsync.html (десятичное) и программном модуле lsync.py (шестнадцатиричное).

Так, например, для датчика BMP180: в lsync.html указано fc=85, а в lsync.py - fc=0x55.
И так для всех классов.

Я то понимаю, что это одно и то же, но глаз зацепился т.к. выглядит по-разному... :-)
OldBean Доцент Красноярск 1K 1.4K
Отв.1631  14 Авг. 19, 14:45
Немного смутило разное основание констант fc в документации lsync.html (десятичное) и программном модуле lsync.py (шестнадцатиричное)ekochnev, 14 Авг. 19, 13:15
Документация генерируется pydoc-ом из исходников автоматически. Боюсь, тут уже ничего не поделать :(
ekochnev Магистр Екатеринбург 207 54
Отв.1632  14 Авг. 19, 22:30
А зачем контроллер клапана на адресе 0х14 распознается два раза: как Q0 и как q0?
Судя по Вашему скриншоту выше, у Вас точно так же...

Ключи БД и соответствующие физические величины:
P0   Датчик давления BMP180 (0x77)
Q0   PWM-контроллер (0x14)
T0   Датчик температуры DS18B20 Хаб 1-Wire (0x15) канал 0
T1   Датчик температуры DS18B20 Хаб 1-Wire (0x15) канал 1
T2   Датчик температуры DS18B20 Хаб 1-Wire (0x15) канал 2
T3   Датчик температуры DS18B20 Хаб 1-Wire (0x15) канал 5
T4   Датчик температуры DS18B20 Хаб 1-Wire (0x15) канал 6
U0   Датчик RMS (0x11)
Zo0   Нормально разомкнутый контакт Хаб 1-Wire (0x15) канал 3
Zo1   Нормально разомкнутый контакт Хаб 1-Wire (0x15) канал 4
Zo2   Нормально разомкнутый контакт Хаб 1-Wire (0x15) канал 7
q0   PWM-контроллер (0x14)
r0   Твердотельное реле (0x12)
w0   PDM-контроллер (0x13)
Единицы измерения: ['', 'В', 'Вт', 'мл/час', '°C', 'мм.рт.ст.', 'мл', 'cek', 'мин', 'час']


Добавлено через 5мин.:

Кажется понял: в q0 текущее значение (скорость отбора), а в Q0 накопленное значение (объем)...
Документация рулит... :-)
OldBean Доцент Красноярск 1K 1.4K
Отв.1633  15 Авг. 19, 04:15
в q0 текущее значение (скорость отбора), а в Q0 накопленное значение (объем)ekochnev, 14 Авг. 19, 22:30
Да. Совершенно верно. Соглашение с самим собой :) - ключи с маленькой буквы - это контроллеры (на запись), с большой - датчики и контроллеры (на чтение).

Сделал "на попробовать" еще один вариант api, в котором физ.величины фигурируют в виде свойств. Запись получились компактнее и, мне показалось, гораздо удобнее. В модуле реализованы 3 динамических класса V, C и U - для работы с величинами, калибровками и разное, соответственно. Свойства экземпляров этих классов обеспечивают API с редиской. Предыдущий вариант (через функции) сохранен (в этом же модуле).
Новый вариант (api0201.py) в архиве в приложении к топику.

from api0201 import *
...

# Работа с физ. величинами:

v.T1              - получить значение температуры с 1-го датчика
v.q0 = 300        - установка скорости отбора через 0-й клапан на уровне 300 мл/час
v.Q0              - получить интеграл по времени от q0 (для клапана отбора - расход) с
                   момента последнего сброса интегратора.
v.Q0 = 0          - сброс интегратора (расхода) клапана отбора 0
v.w0 = 600        - установка мощности нагрева ТЭНа, подключенного к 0-ому контроллеру
                   PDM без учета сетевого напряжения (предполагается, что в сети 220В)
v.w0 = [600, 237] - то же самое, только с учетом напряжения сети. Здесь 237 -
                   RMS напряжения сети, измеренное датчиком RMS

# Работа с калибровками:

c.U0                   - возвращает калибровочные данные 0-го датчика RMS
c.q1 = [1015.0, 0, 3]  - установить калибровочные данные 1-го клапана отбора.
                        В данном случае 1015.0 - это скорость отбора полностью открытого
                        клапана.
c.P0 = [0.0734, 38, 5] - установить калибровочные данные датчика давления
                        MPX5010DP (у него ключ 'P0')
# Разные утилиты:

u.keys      - возвращает все ключи (доступные физические величины, соответствующие
             всем датчикам и контроллером + время)
u.off       - выключение всех контроллеров (реле, PDM и PWM)
u.quit      - завершение работы синхронизатора. При этом выключаются все контроллеры
Ну как-то "покомпактнее" вроде бы получается...
api0201.py.zip 4.9 Кб
BogAD Кандидат наук Красногорск - Белово 403 184
Отв.1634  15 Авг. 19, 19:13
4. А сейчас можно забыть все, что я написал в предыдущих пунктах. :-) Потому, что по-хорошему нужен аппаратный ватчдог, т.е. отдельный модуль. К нему  датчики безопасности: температура в ТСА или системе охлаждения, датчик разлива жидкости или переполнения емкости - по сигналу любого из этих датчиков модуль будет формировать общий сигнал RESET для всех модулей, перегружая их в безопасное состояние: тэн обесточен, все клапана закрыты, контактор выключен, вода закрыта и т.п. Это должно работать даже если малинка зависла или вообще отключена. Для этого наверное сигнал RESET стоит вывести на отдельную линию крейта.ekochnev, 12 Авг. 19, 21:18

Конечно это самое лучшее решение проблем безопасности. Я просто немного увлекся идеей "универсальности" систем автоматизации, отложив вопросы безопасности в сторону. Обязательно нужно сделать такой модуль. Думаю, имеет смысл сделать его даже вообще на жесткой логике (не на МК)? Или это уже параноидальный перебор? УлыбающийсяOldBean, 13 Авг. 19, 05:02

Думаю, что это нужно обязательно в запланировать "закладках" железа.
Как вариант: Объедняем RES всех модулей в одну шину "RES" (RESet), жертвуя одной линией GND в крейте, и уже, в перспективе на развитие, потом  можем дергать шиной RESet на GND или Малинкой (программный анализ), или "аппаратным модулем ватчдог" для перегрузки всех модулей одновременно.
Предлагаю предусмотреть сразу вариант схемы и плат.  Предложить готов уже завтра новый вариант, если согласитесь.
ps Железо дольше переделывать, чем софт переписывать, считаю "закладку" нужно сделать...

ekochnev Магистр Екатеринбург 207 54
Отв.1635  15 Авг. 19, 20:19
жертвуя одной линией GND в крейтеBogAD, 15 Авг. 19, 19:13

Я против жертвоприношений.
Предлагаю кардинально пересмотреть разводку крейта. Сейчас у нас установлен для модулей расширения разъем PBS-12 в следующей разводке:
GND +3.3v GND +5v GND SDA GND SCL GND ZERO GND INT

Предлагаю пересмотреть дизайн и использовать PBD-24 примерно вот в такой раскладке:

GND +3.3v GND +5v GND +12v GND SDA GND Reset    GND ZERO
GND +3.3v GND +5v GND +12v GND SCL GND Reserved GND INT

Точно на такой вариант не претендую, просто привел для примера.
Обосную:
1. В двойном разъеме PBD гораздо устойчивее стоят платы , которые не крепятся к радиатору, в PBS они болтаются, т.к. разъем слишком хилый.
2. Шина +12 видится если возникнет необходимость управлять 12-вольтовыми клапанами вместо 220-вольтовых. Я себе подобный 12-вольтовый PWD модуль уже представлял как должен выглядеть
3. Добавлена шина Reset о которой говорили выше
4. Осталась еще одна свободная зарезервированная шина, мало ли чего мы еще тут в будущем напридумываем... :-)
5. Стоит еще посмотреть вариант крейта коллеги BogAD, у него там много чего полезного уже добавлено на крейт, стоит позаимствовать хорошие идеи.
6. Может стоит еще и увеличить длину крейта, то планов громадьё, разных модулей может потребоваться много.... :-))

Параллельно на крейте можно сделать разъемы для подключения BMP датчиков давления, плюс на вырост пару-тройку 4-пиновых разъемов, например, типа WF с контактами (SDA SCL +5 GND) для подключения по шине I2C внешних устройств не закрепленных на крейте. Для себя вижу подключение к подобному разъему локального LCD дисплея 2004.

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

Можно сделать раскладку например вот такой:
GND +3.3v GND +5v GND +12? GND +12? GND Reserved GND Reset
GND +3.3v GND +5v GND SDA GND SCL GND ZERO GND INT

Тогда останется полная совместимость с уже изготовленными модулями. Их по-прежнему можно будет устанавливать используя 1 край PBD разъема. Правда мне в таком варианте расположение шины +12 совсем не нравится....
OldBean Доцент Красноярск 1K 1.4K
Отв.1636  16 Авг. 19, 06:31
Объедняем RES всех модулей в одну шину "RES" (RESet), жертвуя одной линией GND в крейтеBogAD, 15 Авг. 19, 19:13
Линия INT была задумана для обмена аварийным сигналом типа "паника без потери сознания" :) между модулями, модулями и малинкой или пользователем (через специальную кнопку), минуя штатный канал обмена по i2c и UI малинки. Линия подтянута резистором 10кОм к +3.3В и установлена кнопочка. Это на крейте. По задумке, при низком уровне на линии INT, который может выставить любое устройство, подключенное к линии (в том числе малинка или пользователь, через ту самую кнопку на крейте), все контроллеры должны выключаться ("обнулиться" или переинициализироваться).

В данный момент этот функционал не реализован. Может быть настала пора реализовать его в новой версии прошивок? Причем, всех модулей. Не только контроллеров. Возможно, таким образом проблема и "рассосется"? Все-таки "глухое" зависание как самих МК, так и малинки - очень редкая ситуация. По крайней мере у меня все 100% отказов автоматики были связаны либо с хулиганским поведением какого-либо модуля на шине i2c, либо с отказом DS-ок. С последними мы вроде разобрались (за счет повышения питания до 5В и разнесению датчиков по каналам хабов). В новых прошивках с первым (шиной i2c) тоже должно стать получше. Поэтому, ИМХО, самое место для аппаратной сторожевой собаки - линия INT.
Предлагаю кардинально пересмотреть разводку крейта.ekochnev, 15 Авг. 19, 20:19
В вопросах конструирования модулей, крейта и пр. трудно придти к единому мнению. Да и кто будет переделывать железо, если оно, например, уже готово? Поэтому у меня более "демократичное" предложение - сделать какой-нибудь универсальный и достаточно профессиональный вариант единой схемотехники и разводки модулей. А каждый, если нужно, сделает себе соответствующие переходники для своего конструктива крейта и топологии шины.
Шина +12 видится если возникнет необходимость управлять 12-вольтовыми клапанами вместо 220-вольтовых.ekochnev, 15 Авг. 19, 20:19
Мне кажется, не стОит смешивать сигнальные линии с силовыми. Низковольтные устройства обычно сильноточные. Если нужно, то лучше 12-вольтовую силовую шину протянуть отдельно. Более-менее толстыми проводами. Как протянута "высоковольтная" (220В)
ekochnev Магистр Екатеринбург 207 54
Отв.1637  16 Авг. 19, 07:38
Сделал "на попробовать" еще один вариант apiOldBean, 15 Авг. 19, 04:15

Поимел сейчас негативный опыт работы с данным api...
Бывает иногда у меня на работе свободная минутка, и есть компьютер. И ерунда, что это совсем не малинка и что даже шины i2c на нем нету. Думаю, накидаю-ка я по-быстрому себе клиента для новой версии прошивок. Клиент же сейчас к железу не привязан, он только с редиской работает, а редиска - это что? Правильно, это просто набор ключ-значение. Соответственно, я просто создам в редиске нужные для клиента ключи руками имитируя работу lsync, тем более у меня есть сейчас волшебный api с помощью которого это можно сделать легко.

Установил на компе редиску, установил питон и необходимые библиотеки,
однако, на первой же строчке

from api import *

имею ошибку

>>> from api import *
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/home/user/api.py", line 53, in <module>
   ccodeV = compile(codeV, '', 'exec')
 File "", line 2
   class V(object):
                  ^
SyntaxError: unexpected EOF while parsing


Посмотрев код api, вижу, что для его запуска как минимум требуются существующие в базе ключи 'calibr'. Понятно, сейчас создам руками... Поглядев код lsync, вижу, что подобные ключи создаются с помощью процедуры ser, которая находится в модуле api и описана в его сопроводительной документации... :-) Круг замкнулся: чтобы начать использовать апи нужны элементы, которые по идее должны создаваться функциями этого апи. Как же тогда работает lsync? Как оказалось он сам это апи не использует, а содержит в себе полную копию процедуры ser которая есть в апи.

Как то не по-фэншую получается. С одной стороны есть замечательные подвижки в сторону апи который должен облегчить жизнь всем. С другой стороны одна сторона системы (клиент) это апи должна использовать, а вторая сторона (lsync) почему-то не использует. Теряется смысл апи, т.к теряется универсальность: клиент будет работать с данными в базе по правилам апи, а синхронизатор с этими же данными по своим собственным правилам. Если мы изменяем что-то в одном месте в правилах обращения с данными, то и должны сделать аналогично в другом, если забываем это, то все взаимодействие разваливается.

В общем резюме:
1. Апи должен анализировать ошибки и не вываливаться даже на пустой базе.
2. Синхронизатору наверное тоже стоит начать использовать этот апи для единообразия с клиентом по методам работы с данными в базе.


Добавлено через 24мин.:

Мне кажется, не стОит смешивать сигнальные линии с силовыми.OldBean, 16 Авг. 19, 06:31
Думал про это. Даже соглашусь, т.к. концепция 12-вольтовых PWM у меня в голове еще не до конца сложилась. По силовым линиям тоже не все гладко получается: если тянуть силовую линию +12 параллельно существующим 220, то слишком широко получается, а если разделить сушествующую 220 по длине на изолированные друг от друга части и одну часть запитать 220, а другую 12, то при установке модулей нужно быть очень аккуратным - если модуль рассчитанный на работу с шиной 12 установить по ошибке в разъем крейта напротив которого шина на 220, то сами понимаете, что ни к чему хорошему это не приведет. Надо продумывать разный формат подключения разновольтовых силовых модулей к шинам, чтобы механически такого не получилось сделать. Либо модуль с 12-вольтовым выходом подключать все-таки к шине 220, но выход модуля запитывать от индивидуального преобразователя 220/12 расположенном на этом же модуле. Тогда на каждом таком модуле должен быть свой подобный преобразователь, что мне тоже как-то не очень нравится.

Добавлено через 12мин.:

Да и кто будет переделывать железо, если оно, например, уже готово?OldBean, 16 Авг. 19, 06:31

А у кого оно уже готово?
Здесь же пока не готовый продукт, а развивающийся концепт, который повторило лишь несколько энтузиастов у которых это все времянками собрано. На данном этапе это допустимо. Я вот уже несколько вариантов хаба уже спаял. К тому же предлагал вариант разводки PBD разъема когда он останется совместим с текущими модулями, которые будут вставляться лишь в один его ряд контактов из двух.
А переделывать железо все равно придется, даже если крейт не трогать. Сейчас же шина Int только на силовых модулях до ноги контролера идет, на остальных модулях она не разведена. А перегружать, например, цифровой модуль из-за зависших датчиков тоже хотелось бы иметь возможность.
gol_avto Доцент Москва - Серпухов - Анапа 1.3K 458
Отв.1638  16 Авг. 19, 08:23, через 46 мин
А у кого оно уже готово?ekochnev, 16 Авг. 19, 07:38
У меня к примеру и не только. И уже давно, ждет только софт.
ekochnev Магистр Екатеринбург 207 54
Отв.1639  16 Авг. 19, 09:32
У меня к примеру и не только.gol_avto, 16 Авг. 19, 08:23

Т.е. Вас вопросы безопасности не волнуют? Вопросы управляемой перезагрузки модулей при зависании тоже не волнуют? Корректное завершение работы малинки как это пытается реализовать BogADтоже не волнуют?
Потому что чисто программными методами на существующем железе без доработок это полноценно не реализовать...
Если существующий функционал устраивает и Вы не планируете развиваться дальше, то конечно ничего переделывать не надо.
Еще раз повторю: можно сделать новую разводку крейта расширив его разъемы, но при этом оставив совместимость со старыми модулями. Новые модули с новым функционалом, например аппаратный ватчдог, делать уже под новый разъем. При этом старые модули вам придется переделывать только если захотите этот новый функционал использовать, т.к. в существующей их разводке сигнал Reset или Int с аппаратного ватчдога до них просто не дойдет.