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

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

Форум самогонщиков Автоматика
1 ... 82 83 84 85 86 87 88 ... 132 85
ekochnev Магистр Екатеринбург 207 54
Отв.1680  21 Авг. 19, 17:13
Вот Вы в клиента закладывали следующую логику:
- Первый реле в списке (r0) - это контактор подачи силового питания на все устройства
- Первый PDM (w0) - это модуль управления ТЭНом
- Первый PWМ (q0) - первый клапан отбора
По этой логике первый датчик давления (P0) должен быть датчик атмосферного давления, по нему и температуре кипения будем определять спиртуозность. А если датчик атмосферного давления из-за подключения/отключения датчиков кубового давления будет скакать то P0, то Р1 как программа будет знать какой ключ в данный момент нужно использовать? Нужно будет при каждом запуске клиента уточнять у оператора на каком "P" в данный момент находится атмосферный датчик. Если названия разнести, то прога всегда будет искать Pa0 в качестве атмосферного, а Рс0, РС1 в качестве кубовых.

Ну появится еще датчик давления (по типу атмосферного) где-нибудь в колонне или буфере. Атмосфера стоит на 0x77, а новый, скажем, станет на 0x76. И номер у атмосферного датчика опять поплыветOldBean, 21 Авг. 19, 14:59
Да, в данном случае поплывет. Действительно, старый который был на 0х77 станет Ра1, а новый с 0х76 появится как Ра0, но ситуация аналогична тому когда у нас датчик температуры Т0 был подключен к каналу 1 хаба, а затем мы к каналу 0 хаба подключили второй температурный датчик. Старый после этого стал Т1, а новый будет Т0. Так и с атмосферными датчиками: новый Ра0 - это датчик такого же типа как и предыдущий Ра1, т.е. атмосферный. Поэтому вести себя нужно в обоих случаях одинаково. Рассмотрим:
 Пусть у нас есть ПРОГРАММА-клиент. Но программа одна, а алгоритмов ее работы может быть множество. Поэтому после запуска программа должна запрашивать у оператора РЕЖИМ своей работы. В свою очередь, для каждого режима где-то внутри должны быть прописаны ТРЕБОВАНИЯ для его включения. В требованиях необходимо прописать нужный состав оборудования (сколько нужно температурных датчиков, клапанов, датчиков давления) и выдать оператору рекомендацию по подключению данного оборудования к железу. Например (первое что пришло в голову):

1. Монитор.
  Пользователь просто видит информацию со всех доступных датчиков, но не может ей управлять. Где установлены эти датчики знает только пользователь, программе это не важно

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

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

3. Простая дистилляция.
  Требования к аппаратуре: контактор, тэн, один датчик атмосферного давления, один датчик температуры.
  Требования к расположению датчиков:
    Ра0 - датчик атмосферы используемый для определения спиртуозности
    Т0 - куб

4. Дистилляция по Габриэлю.
  Требования к аппаратуре: контактор, тэн, один датчик атмосферного давления, два датчика температуры.
  Требования к расположению датчиков:
    Ра0 - датчик атмосферы используемый для определения спиртуозности
    Т0 - куб
    Т1 - верхняя часть дистиллятора

5. Ректификация 1
  Требования к аппаратуре: контактор, тэн, один датчик атмосферного давления, один клапан, два датчика температуры.
  Требования к расположению датчиков:
    Ра0 - датчик атмосферы используемый для определения спиртуозности
    Т0 - куб
    Т1 - дефлегматор (по нему старт-стоп будем отрабатывать)

6. Ректификация 2
  Требования к аппаратуре: контактор, тэн, один датчик атмосферного давления, один клапан, три датчика температуры.
  Требования к расположению датчиков:
    Ра0 - датчик атмосферы используемый для определения спиртуозности
    Т0 - куб
    Т1 - колонна
    Т2 - дефлегматор

7. Ректификация 2 + ЦП
  Требования к аппаратуре: контактор, тэн, один датчик атмосферного давления, два клапана, четыре датчика температуры.
  Требования к расположению датчиков:
    Ра0 - датчик атмосферы используемый для определения спиртуозности
    Т0 - куб
    Т1 - колонна
    Т2 - ЦП
    Т3 - дефлегматор

8. ну и так далее...

В автоматических режимах пользователь перед запуском должен выполнить требования программы по количеству датчиков и их месту установки в оборудовании. Автоматические режимы будут отрабатывать по ШАГАМ, задаваемым при описании данных режимов. Для разных режимов количество шагов и их состав может быть различным: разгон, работа на себя, пауза, отбор голов, отбор подголовников, пауза, отбор тела, отбор хвостов, промывка колонны и т.п. Если подключены дополнительные датчики, избыточные для ТРЕБОВАНИЙ конкретного РЕЖИМА работы, то просто показываем их значение в качестве факультативной информации. Количество режимов работы теоретически может быть не ограниченным, каждый из них всего лишь пункт в меню. Базовые режимы (монитор, ручной, простая дистилляция) должны быть запрограммированы в клиенте, а по остальным наверное нет смысла забивать в программу конфигурацию по всем мыслимым и немыслимым комбинациям. Конфигурацию (описание, требования, рекомендации, набор щагов) для каждого режима можно, например, расположить в отдельном XML файле, нужно лишь определить правила его заполнения. Клиент при запуске будет разбирать набор этих файлов и строить меню выбора режима. Файлы смогут составлять сами пользователи и делиться друг с другом. Файлы с режимами можно складывать в определенную директорию малинки либо вставлять на USB флэшке в порт малинки. Представляете, каждый сможет сформировать свой собственный набор файлов с режимами, только нужных ему лично с его собственным оборудованием! И меню режимов в программе не будет распухать ненужными пунктами пытаясь удовлетворить всех. По мере апгрейда оборудования нужно будет лишь доложить нужные файлы с режимами использующие это оборудование.

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

Пусть у нас выбран режим 5 - Ректификация 1. Есть два датчика Т0 на канале 2 хаба и Т1 на канале 4 хаба. Согласно требованиям режима датчик с канала 2 должен быть подключен в куб, а с канала 4 в дефлегматор. Теперь в канал 1 включаем еще один датчик температуры. Происходит следующее переназначение датчиков:
 - канал 1: Т0 - новый
 - канал 2: Т0 -> Т1
 - канал 4: Т1 -> Т2
Т.к. все датчики однотипные (и я подразумеваю что взаимозаменяемые), то согласно требованиям мы вновь установленный датчик должны воткнуть в куб, из куба переставить в дефлегматор, а из дефлегматора вытащить и оставить болтаться в воздухе - с него показания не будут использоваться в алгоритме, а просто будут отображаться факультативно.

Режим по-прежнему 5:
Аналогично для взаимозаменяемых датчиков давления. Пусть у нас есть ВМР180 на 77 адресе, который видится как Ра0. Пусть мы добавили к нему ВМР280 на 76 адрес и нумерация изменилась:
 - ВМР280: Ра0 - новый
 - ВМР180: Ра0 -> Ра1
Опять же, т.к. эти датчики однотипные (и взаимозаменяемые), то аналогично температурам как бы виртуально "перетыкаем" их. Теперь для расчетов алгоритма будут использоваться показания ВМР280 (т.к. он теперь Ра0), а со второго датчика показания будут отображаться факультативно. Если добавить датчик кубового давления, то он появится как Рс0 и не повлияет на нумерацию группы Ра, он вообще ни на что в данном режиме не повлияет, т.к. датчиков группы Рс нет в требованиях и его показания будут отображаться как факультативная информация.

А теперь представим ситуацию как сейчас у Вас для режима 5:
Есть ВМР180, который виден как Р0. Все хорошо. Ставим кубовый датчик, который теперь Р0, а атмосфера будет Р1. Но в требованиях режима атмосфера должна быть Р0 и обеспечить их мы не можем, т.к. эти датчики не взаимозаменяемые!!! Один абсолютного атмосферного давления, а другой дифференциальный кубового и один не может исполнять функции другого. Поэтому они должны быть в разных группах. Количество групп должно быть именно по количеству взаимозаменяемых сущностей.

А тем, что на уровень lsync закладывается конкретная семантика.OldBean, 21 Авг. 19, 14:59
Так Вы уже для датчиков атмосферного давления прописали в lsync конкретную семантеку создав классы BMP180, BMP280, МС5611 и опрашивая из них шину I2C особым образом! Остается лишь именовать эти три типа датчика по-другому выделив их в отдельную группу! :-)

Ух, много написал, тормознусь пока... :-)
OldBean Доцент Красноярск 1K 1.4K
Отв.1681  22 Авг. 19, 04:31
Вот Вы в клиента закладывали следующую логику:ekochnev, 21 Авг. 19, 17:13
Евгений, не нужно рассматривать этого клиента (cli_0014) как пример универсального клиента. Он абсолютно не соответствует разрабатываемой концепции и был написан "на коленке" исключительно для тестирования lsync в реальных процессах и еще потому, что спирт заканчивался, а праздники были уже "на носу" ;)

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

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

По организации управления процессом
По "выстраданному" ИМХО :), клиент не должен непосредственно управлять процессом. Это это делает lsync. Там уже заложен бесконечный (тактирующий) цикл и синхронизация параметров "железа" с параметрами в БД. В этом же цикле заложен callback, к скриптам (которые клиент должен сформировать и положить в малинку/БД). В этих скриптах производится анализ условий изменений параметров текущего режима работы и условий перехода к следующему. Задача клиента - положить этот callback-тный скрипт на сервер и дать команду lsync-у "колбачить" эти скрипты. Дальше клиенту остается только наблюдать за процессом (показывать картинки пользователю и вмешиваться ежели что не так).

Короче - ректификацию проводит не клиент, а lsync по callback-скрипту/скриптам, который клиент подготовил и загрузил в БД.
Так Вы уже для датчиков атмосферного давления прописали в lsync конкретную семантеку создав классы BMP180, BMP280, МС5611ekochnev, 21 Авг. 19, 17:13
Я не эту семантику имею в виду. Эта информация содержится в самом железе (family code или адреса на шине), всегда доступна lsync-у и неизменна. Я же имею в виду предназначение устройства для проведения процесса. Предназначение может быть разным и изменяться. Информация о предназначении устройства непосредственно недоступна lsync-у, а известна только клиенту. Поэтому не ст'оит ею забивать мозги lsync-у. У него итак хватает забот :)
ekochnev Магистр Екатеринбург 207 54
Отв.1682  22 Авг. 19, 05:48
клиент не должен непосредственно управлять процессом. Это это делает lsyncOldBean, 22 Авг. 19, 04:31
В моем понимании задача lsync - это только абстрагирование от низкоуровневого обращения непосредственно к железу и предоставления более удобных стандартизированных (нами внутри данной программы) интерфейсов доступа к данным этого железа. Вы же ему хотите еще дать роль сервера приложений. Не знаю, мне кажется, что в применении к данной задаче не самый удачный расклад...
OldBean Доцент Красноярск 1K 1.4K
Отв.1683  22 Авг. 19, 06:52
мне кажется, что в применении к данной задаче не самый удачный расклад...ekochnev, 22 Авг. 19, 05:48
А почему? У него уже есть часть необходимого функционала (например, бесконечный тактовый цикл), в каждый момент времени он знает состояние железа и с редиской он связан по жизни. callback в конце процедуры синхронизации (в цикле) - очень удобный вариант реализации клиентской логики на сервере. Небезопасный, конечно. Но в нашем случае это не важно.
сообщения удалены (2)
OldBean Доцент Красноярск 1K 1.4K
Отв.1684  23 Авг. 19, 09:23
По именованию устройств
Возможно, удобным будет такое решение. При запуске lsync, в командной строке можно указать: 1) проводить ли именование оборудование "с чистого листа" или же 2) использовать привязки имен предыдущей сессии с сообщениями об изменениях в конфигурации оборудования, которые произошли за это время. Если при изменении конфигурации нужные устройства остались на тех же местах, то их имена останутся прежними и скрипты корректировать не придется. Нужно попробовать и посмотреть будет ли это удобно.OldBean, 22 Авг. 19, 04:31
Попробовал. "Чехарда" исчезает. Удобно. Меня уже не раздражает. Вот несколько примеров сессий.

1. Запускаю lsync с очисткой базы и именовании устройств "с чистого листа" (параметр -r в командной строке). Датчик кубового давления не подцеплен.
Скрытый текст
pi@raspberrypi:~/LITE2/190815_0201 $ python3 lsync.py -r
Новое устройство:  11_8_A1 Датчик RMS  Именовано:  U0
Новое устройство:  13_8_A3 PDM-контроллер  Именовано:  w0
Новое устройство:  14_0_A8 Датчик расхода  Именовано:  Q0
Новое устройство:  14_8_A4 PWM-контроллер  Именовано:  q0
Новое устройство:  15_0_28 Датчик температуры DS18B20  Именовано:  T0
Новое устройство:  15_1_28 Датчик температуры DS18B20  Именовано:  T1
Новое устройство:  15_2_28 Датчик температуры DS18B20  Именовано:  T2
Новое устройство:  15_3_28 Датчик температуры DS18B20  Именовано:  T3
Новое устройство:  15_4_28 Датчик температуры DS18B20  Именовано:  T4
Новое устройство:  15_5_FF Нормально разомкнутый контакт  Именовано:  Z0
Новое устройство:  15_6_FF Нормально разомкнутый контакт  Именовано:  Z1
Новое устройство:  15_7_FF Нормально разомкнутый контакт  Именовано:  Z2
Новое устройство:  15_8_A5 Хаб 1-Wire  Именовано:  H0
Новое устройство:  77_8_55 Датчик давления BMP180  Именовано:  P0

11_8_A1 Датчик RMS U0
13_8_A3 PDM-контроллер w0
14_0_A8 Датчик расхода Q0
14_8_A4 PWM-контроллер q0
15_0_28 Датчик температуры DS18B20 T0
15_1_28 Датчик температуры DS18B20 T1
15_2_28 Датчик температуры DS18B20 T2
15_3_28 Датчик температуры DS18B20 T3
15_4_28 Датчик температуры DS18B20 T4
15_5_FF Нормально разомкнутый контакт Z0
15_6_FF Нормально разомкнутый контакт Z1
15_7_FF Нормально разомкнутый контакт Z2
15_8_A5 Хаб 1-Wire H0
77_8_55 Датчик давления BMP180 P0
Естественно все устройства распознаются как новые и именуются как обычно - подряд. В конце анализа конфигурации и именования, информация сохраняется в редиске (хэш с ключом 'cfg').

2. Подключаю датчик кубового давления. И снова запускаю lsync (естественно, уже без параметра -r в командной строке). Этот датчик распознается как новый, именуется как положено. Хотя анализатору он попадает раньше, чем датчик атмосферного давления.
Скрытый текст
pi@raspberrypi:~/LITE2/190815_0201 $ python3 lsync.py
Новое устройство:  15_5_A7 Датчик давления MPX5010DP  Именовано:  P1

11_8_A1 Датчик RMS U0
13_8_A3 PDM-контроллер w0
14_0_A8 Датчик расхода Q0
14_8_A4 PWM-контроллер q0
15_0_28 Датчик температуры DS18B20 T0
15_1_28 Датчик температуры DS18B20 T1
15_2_28 Датчик температуры DS18B20 T2
15_3_28 Датчик температуры DS18B20 T3
15_4_28 Датчик температуры DS18B20 T4
15_5_A7 Датчик давления MPX5010DP P1
15_6_FF Нормально разомкнутый контакт Z1
15_7_FF Нормально разомкнутый контакт Z2
15_8_A5 Хаб 1-Wire H0
77_8_55 Датчик давления BMP180 P0

3. Теперь я убираю датчик кубового давления, а на его место перетыкаю температурный датчик T4 (с 4-го канала хаба). Естественно пояляется новое устройство: датчик температуры T5, и на месте пустого гнезда (4-й канал хаба) - нормально разомкнутый контакт.

Скрытый текст
pi@raspberrypi:~/LITE2/190815_0201 $ python3 lsync.py
Новое устройство:  15_4_FF Нормально разомкнутый контакт  Именовано:  Z3
Новое устройство:  15_5_28 Датчик температуры DS18B20  Именовано:  T5

11_8_A1 Датчик RMS U0
13_8_A3 PDM-контроллер w0
14_0_A8 Датчик расхода Q0
14_8_A4 PWM-контроллер q0
15_0_28 Датчик температуры DS18B20 T0
15_1_28 Датчик температуры DS18B20 T1
15_2_28 Датчик температуры DS18B20 T2
15_3_28 Датчик температуры DS18B20 T3
15_4_FF Нормально разомкнутый контакт Z3
15_5_28 Датчик температуры DS18B20 T5
15_6_FF Нормально разомкнутый контакт Z1
15_7_FF Нормально разомкнутый контакт Z2
15_8_A5 Хаб 1-Wire H0
77_8_55 Датчик давления BMP180 P0

4. Ну и теперь возвращаю температурный датчик на его старое место (4-й канал хаба), и датчик кубового давления тоже на прежнее место (5-й канал хаба). Синхронизатор присваивает им прежние имена (которые он им дал, когда первый раз их увидел :)
Скрытый текст
pi@raspberrypi:~/LITE2/190815_0201 $ python3 lsync.py

11_8_A1 Датчик RMS U0
13_8_A3 PDM-контроллер w0
14_0_A8 Датчик расхода Q0
14_8_A4 PWM-контроллер q0
15_0_28 Датчик температуры DS18B20 T0
15_1_28 Датчик температуры DS18B20 T1
15_2_28 Датчик температуры DS18B20 T2
15_3_28 Датчик температуры DS18B20 T3
15_4_28 Датчик температуры DS18B20 T4
15_5_A7 Датчик давления MPX5010DP P1
15_6_FF Нормально разомкнутый контакт Z1
15_7_FF Нормально разомкнутый контакт Z2
15_8_A5 Хаб 1-Wire H0
77_8_55 Датчик давления BMP180 P0


Можно, конечно, реализовать и более сложный анализ конфигураций (например, с введениме аппаратных ID датчиков), но, мне кажется, что это будет уже перебор. Пока решил остановиться на этом варианте.
ekochnev Магистр Екатеринбург 207 54
Отв.1685  23 Авг. 19, 09:39, через 17 мин
Имхо перебор.
Пользователю это надо, думать с каким ключём сейчас запускать синхронизатор, с "r" или без "r" в конце?
Уже высказывал свою позицию.
Планирую, что в конце разработки коробка с начинкой автоматики у меня станет неким "черным ящиком" с разъемами снаружи для подключения датчиков. Синхронизатор скорее всего будет стартовать автоматически при загрузке операционной системы малинки, думать в этот момент с каким ключём его запустить будет просто некому.
OldBean Доцент Красноярск 1K 1.4K
Отв.1686  23 Авг. 19, 11:23
Пользователю это надо, думать с каким ключём сейчас запускать синхронизатор, с "r" или без "r" в конце?ekochnev, 23 Авг. 19, 09:39
Параметр командной строки -r (--reset) предназначен для полной очистки БД и всей информации об именах. Если захочется начать "новую жизнь". С "чистого листа". В обычной жизни его не нужно использовать.
ekochnev Магистр Екатеринбург 207 54
Отв.1687  29 Авг. 19, 20:09
Позанимался я тут на досуге пару-тройку дней софтом, переделывал под свои видения и требования.
Переписал немного API, поправил lsync чтобы он однотипно с клиентами с базой тоже через стандартные вызовы API работал.
Сделал пару клиентов, правда пока без GUI, чисто консольных чтоб через ssh удаленно работать: первый вообще простейший, просто побаловался, второй покрасивее через curses динамически строится весь интерфейс исходя из найденных в базе датчиков и изменения размеров окна, с обработкой ошибок обращения к базе, падения lsync, горячего отключения датчиков и т.п. Допустимо запускать несколько копий одного клиента, мешать друг другу не будут, отображаться будет все везде одинаково и синхронно.
В общем достаточно много всего успел, не смотря на то, что с языком Python столкнулся впервые в жизни. Пока еще немного сыровато, поэтому выкладывать тут не буду, т.к. пишу этот пост не из-за этого. Пишу, что есть необходимость (имхо) доработки прошивок и железа.

Причины:
1. Мелкие недоработки прошивок общего плана. Об одной из них писал Вам, Сергей, здесь или в личку, уже сам не помню.
2. Следующее замечание ранее было бы не существенно, но сейчас Сергей (похоже по моей же предыдущей "хотелке" :-) ) добавил режим чтения из силовых модулей и это стало актуально. Суть в следующем. Есть, например, контроллер PDM, откалиброванный на 3 кВт. Но если записать в него величину мощности в 4 кВт, то потом при чтении я 4 кВт и прочитаю, но ТЭН ведь более трех выдать не может. Можно даже отрицательную мощность записать и тогда видно как ТЭН из вакуума высасывает энергию и загоняет ее обратно в розетку. :-) В общем, записываемое в модуль число должно при записи нормироваться относительно калибровочных значений: снизу 0, сверху максимальное значение которое мы при калибровке записываем.
3. Теперь о калибровке. Сейчас если свежеспаяные модули не калиброваны, то они могут показывать нечто не совсем понятное для Homo Sapiens. Предлагаю ввести автокалибровку для свежих модулей. Как реализовать? Данные калибровки хранятся в EEPROM, которая обнуляется программатором при прошивке. Поэтому свежепрошитый модуль получается некалиброваным. В процессе калибровки силового модуля мы зашиваем в одну из ячеек нормировочную величину (номинальную мощность ТЭНа, максимальную скорость отбора клапана) и индекс единицы измерения (0-пусто, 1-вольт, 2-Вт, 3-мл/ч и т.п.). А что если для индекса 0 единицу измерени считать не "пусто", а "процент", а в прошивке считать, что если единица измерения забита как ноль, то калибровочную величину ноль считать значением 100 (можно даже прямо из прошивки эту сотню в EEPROM при первом включении и записывать). Тогда свежепрошитый силовой модуль с обнуленной EEPROM будет автоматически откалиброван в процентах. Это же удобно: проценты мощности ТЭНа, проценты открытия клапана и т.п. Если кому-то этого не достаточно, то могут провести калибровку подобно тому как это делается сейчас и тогда модуль начнет выдавать значения в Ваттах и мл/час
4. Сейчас по железу. Накопительный счетчик клапана типа 'Q0' - это прекрасно, мне реально понравился. Кстати, с учетом п.3. на неоткалиброваном модуле когда "все в процентах" он считаться не должен, но речь в этом пунке не об этом. Беда накопительного счетчика сейчас - это то, что он продолжает "тикать" даже когда отключено силовое напряжение контактором если при этом записана ненулевая величина открытия клапана. А записывать нулевую величину в клапан при выключении контактора я принципиально не хочу. В общем, конкретно на силовом модуле клапана нужна обратная связь: от подводимых с крейта двух высоковольтных контактов через оптронную развязку сигнал на ногу контроллера, например, PD4 (вывод 6). В прошивке же прописать увеличение счетчика отбора только при наличии на этой ноге сигнала определенного уровня, означающего наличие силового питания.

Если все, что написал интересно, то давайте делать вместе. Иначе все это сделаю сам и будет трудно в дальнейшем хоть как-то синхронизировать наши версии. Получится очередной форк проекта. Я за коллективную работу, т.к. хотел бы внести свой вклад в понравившееся мне дело. Но обсуждать при коллективной работе детали программирования на форуме - это мазохизм. Имею на просторах сети личный серверочек, где развернут SVN для версионирования и хранения исходных материалов, CRM/CMS (Redmine) для постановки задач и их обсуждения, ну и конечно веб сервер для презентации того что есть. Готов создать проект и дать доступ заинтересованным разработчикам. Эта ветка на данном форуме конечно останется без изменений, просто не смотря на хорошо структурированную "шапку" в ней очень трудно искать техническую информацию, особенно с промежуточных этапов разработки между "самым началом" и "тем что сейчас". Если нет желания доверять лично мне, то можно создать проект, например, на GitHub c правами администрирования у Сергея как родителя данного проекта, а он уже будет пускать туда желающих помочь типа меня.

На картинках запущенный клиент. На второй картинке уменьшил размер окна, отключил датчик кубового давления и пару датчиков температур - интерфейс перестроился, а затем еще "уронил" lsync. Все пока "сырое", планирую многое еще доделать
client.png
client.png Ненавязчивая автоматизация ректификационной установки. Автоматика.
client2.png
client2.png Ненавязчивая автоматизация ректификационной установки. Автоматика.
BogAD Кандидат наук Красногорск - Белово 403 184
Отв.1688  29 Авг. 19, 20:52, через 44 мин
4. Сейчас по железу...ekochnev, 29 Авг. 19, 20:09
Евгений, если не против, подожду комментарии Сергея.

Но хочу уточнить - зачем плодить ОС (обратную связь)?
Нагревом же полностью управляет Малинка, так пускай она и останавливает счетчик, или я не так понял?
Малинка может не увидеть, если рубанется дифреле по утечке, но, если только не смотрим RMS после дифреле. Это можно сделать, если задаться целью определять причину "почему нет 220?", или это кратковременно пропало 220 и есть вероятность продолжить после его появления, или пробило ТЭН с отключением дифреле (УЗО), нужно человеческого вмешательства...
А на счет синхронизации версий ПО, я ЗА!
ekochnev Магистр Екатеринбург 207 54
Отв.1689  29 Авг. 19, 21:01, через 9 мин
Нагревом же полностью управляет Малинка, так пускай она и останавливает счетчик, или я не так понял?BogAD, 29 Авг. 19, 20:52
В том то и дело, что рубануть контактор может не только малинка! В перспективе аппаратный ватчдог, который должен уметь сам гасить все даже если малинка "зависла". Например, зашкалила температура в ТСА или пропала вода, ватчдог рубанул контактор остановив все. Я быстренько пришел через пару минут, устранил проблему и продолжил работу, счетчик продолжил тикать с тех же значений на которых остановился. Чисто из этих соображений. Тем более, что на мой взгляд реализовать такую ОС севсем не сложно, все сигналы к модулю уже подведены даже сейчас. На тех силовых модулях где она не будет нужна, эту часть схемы можно просто будет не распаивать...
сообщение удалено
ekochnev Магистр Екатеринбург 207 54
Отв.1690  29 Авг. 19, 21:09, через 8 мин
INT - по нейBogAD, 29 Авг. 19, 21:04
На INT - кто-то тоже должен сигнал еще выдать.. А если проблема не глобальная, а локальная, например сгорел предохранитель клапана и он перестал щелкать? С локальной ОС на модуле мы в этом случае оперативненько отреагируем...
BogAD Кандидат наук Красногорск - Белово 403 184
Отв.1691  29 Авг. 19, 21:13, через 5 мин
глюки на форуме..

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

Вачдог может дергать любой из этих шин...
Или не достаточно и еще надо расширять крейт?
ekochnev Магистр Екатеринбург 207 54
Отв.1692  29 Авг. 19, 21:19, через 7 мин
Шин достаточно.
Но локальная ОС конкретно на данном модуле считаю будет интересней. Будем считать это моим сугубо субъективным мнением.
Просто не понимаю, почему контроллер клапана должен ждать от кого-то внешнего сигнала на шине Int или установки значения отбора в ноль чтобы приостановить счетчик если к нему самому подводится достаточно информации чтобы он мог принять это решение самостоятельно...

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

Мало того, получим еще и бонус: в случае перегорания предохранителя клапана, как раз именно модуль клапана может инициировать появление сигнала на шине Int чтобы проинформировать всех остальных что не все в порядке... Аналогично с предохранителями на других модулях... Хотя конечно для контроля высоких напряжений можно приспособить и входы "нормально открытых контактов" на цифровом хабе....
BogAD Кандидат наук Красногорск - Белово 403 184
Отв.1693  29 Авг. 19, 21:46, через 28 мин
Я согласен, что ОСы, это нужная весЧь и что можно запланировать отдельный вачдог, но...
Нужно стремиться к оптимальному конструктиву.
К примеру, наш HUB запросто можно заставить садить int (например 25 ногой АТмеги), если достигнут порог значения, который можно одному из каналов на DS18B20 задать программно, если этот канал, к примеру будет на ТСА, значение которого бубут выше на порог, который отслеживает малинка.
HUB также может обработать дискретные сигналы, к примеру от сухих контактов, как тут я [сообщение #13220498] пытался приделать ОС дифавтомату, которые помогут идентифицировать аварийную ситуацию.
В других ОС я не вижу смысла, иначе осложняем сильно концепцию...


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

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

То что с ним что-то не в порядке ОСом не все определишь (механическую причину точно нет), а вот при помощи отслеживания динамики температуры, думаю реализовать на ПО можно.

Я отступлю от сути дискуссии, гложет мЫсля на дополнительный функционал.
Просятся в систему, по моему взгляду:
1. сервопривод для сортировки по фракциям
2. Управление Перистальтическим насосом по 1-ware с двунаправленной передачей.

И!
Можно расширить нашу концепцию, делать не только ректификацию, но дистилляцию при помощи НБК, а у нас в железе все есть, кроме управлением шаговым двигателем перистальтического насоса...
nubsaybot Студент Рязань 27 6
Отв.1694  29 Авг. 19, 22:20, через 35 мин
Контроль на предохранитель, это уже кажется слишком
Esc Профессор Москва 2K 2K
Отв.1695  30 Авг. 19, 05:13
Просятся в систему, по моему взгляду:
1. сервопривод для сортировки по фракциямBogAD, 29 Авг. 19, 21:46
ИМХО, подобное решение актуально при отборе фракций из одной точки. Например из ДЕФа.
Но если:
головы цедим из ДЕФа;
тело из под царги пастеризации;
а хвосты, что бы не засирать насадку, из НУО.

Как в подобной ситуации сервоприводный фракционник сможет облегчить жизнь?
А если допустим несколько фракций предстоит отбирать одномоментно и причем с разной скоростью?
ZagAl Доцент Прибалтика 1.9K 916
Отв.1696  30 Авг. 19, 05:55, через 43 мин
Но если:
головы цедим из ДЕФа;
тело из под царги пастеризации;
а хвосты, что бы не засирать насадку, из НУО.Esc, 30 Авг. 19, 05:13
То берем 3и перистальтических насоса, благо они уже не так дороги.
https://www.aliexpress.com/...b00944365f0c9c7
https://www.aliexpress.com/....3f222e0erJ3cCk
ekochnev Магистр Екатеринбург 207 54
Отв.1697  30 Авг. 19, 05:56, через 2 мин
Контроль на предохранитель, это уже кажется слишкомnubsaybot, 29 Авг. 19, 22:20
Контроль предохранителя - это я в качестве побочного эффекта привел. Первичным было автоматический останов подсчета отбора.

Прочитав все мнения, остаюсь при своем.
Себе буду делать однозначно, ну видимо и прошивку придется самому допиливать.
По жизни регулярно сталкиваюсь с разработкой модульных систем на которые наложены жесткие требования по безопасности с двух/трехкратным резервированием. Приучили, что функционально законченный модуль должен в случае отказа переводить все свои выходы в безопасное состояние и информировать другие части системы о своем предотказном/отказном состоянии. Если в безопасное состояние сейчас у нас при пропадании силового напряжения у нас клапан переводится, т.к. используем нормально закрытый клапан, то в части информирования беда - клапан уже не щелкает, но мы продолжаем отвечать на запросы что все в порядке: спирт в баночке прибывает... Не порядок. Главное, не понимаю почему мы спорим об этом, т.к. доделка имхо элементарная как с точки зрения железа, так и с точки зрения софта. Пока это писал пришла мысль, что можно даже не силовое напряжение на входе модуля контроллировать, а даже датчик тока поставить в цепь клапана. Тогда еще и физическое подключение и работоспособность клапана контроллировать можно будет. Так наверное и сделаю: воткну что-нибудь типа ACS712...
OldBean Доцент Красноярск 1K 1.4K
Отв.1698  30 Авг. 19, 07:13
В замечательной книжке Брукса "Мифический человеко-месяц" есть замечательная табличка (скрин-шот - в приложении к данному топику), согласно которой трудоемкость (и стоимость) разработки софта, от программы (которая работает непосредственно "на коленке" разработчика) до системного программного продукта (который всесторонне оттестирован, документирован, снабжен интерфейсами для встраивания в другие системы и т.п.) возрастает примерно на порядок. Жизнь показывает, что и относительно "железа", и относительно методик проведения эксперимента можно построить аналогичные таблицы.

Я это к чему, коллеги? А к тому, что задача, которой мы здесь обсуждаем, состоит из трех больших блоков: 1) железо, 2) софт и 3) алгоритмы процессов (т.е. - что и как "гнать"...). Используя образ Брукса, это - три лапы, которые могут увязнуть в смоле, если ими работать несогласованно. С перекосом на какие-нибудь из них.

Мне (по работе) часто приходилось решать задачи, связанные с подготовкой и проведением физико-химических экспериментов, для которых нет готовых решений. Или они очень дорогие. Поэтому у меня выработался своеобразный принцип "разумной достаточности": если компонент (не важно: железо, софт или методика) готов на уровне, достаточном для решения общей задачи - останавливайся и переходи к следующему компоненту. Этому принципу не всегда легко следовать. Работая с каким-то компонентом, ты уже с ним "сроднился", появляется куча идей для доведения его до совершенства... Бесконечного. Но надо брать себя в руки. Иначе в разумные сроки не решить основную задачу.

Здесь (в данном проекте) все тоже самое. Только планов и сроков нет. В этом и прелесть - можно со вкусом "потворить" чего-нибудь. Но принцип разумной достаточности лучше и здесь соблюсти. Любовно полировать "ручки" у дверей можно годами :).

Проект сейчас находится на уровне концептуальной разработки. Не все концептуальные вопросы окончательно проработаны. ИМХО, нужно этот уровень закончить. Чтобы все "три лапы" были на работоспособном уровне. Не имеет никакого смысла совершенствовать железо или софт (например, синхронизатор), пока не ясно до конца (на концептуальном уровне!) как "вдыхать жизнь" в систему. Универсально, легко и без привлечения серьезного программирования. Поэтому я достаточно консервативно отношусь к предложениям совершенствовать железо или софт на данном этапе развития проекта. Потом изменять блестяще разработанное железо или не менее блестящий софт с концептуальными погрешностями будет нестерпимо жалко.

Если есть желание поучаствовать в данном проекте, то есть куча конкретной работы. По части железа - расширять ассортимент совместимых с данным концептом устройств:
1. Разработать переключатель фракций (на несколько позиций) с контроллером.
2. Устройства для контролируемой транспортировки спиртосодержащих жидкостей. Например, тот же перистальтический насос, про который говорил коллега BogAD.
3. Датчик спиртуозности (единое устройство, совмещающее в себе датчик давления и температуры, с МК и интерфейсом 1-Wire).
4. Нормальный (а не виртуальный как сейчас) датчик расхода. Тоже с интерфейсом 1-Wire. Например, на тензовесах. Или на каких-нибудь других принципах.

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

По части софта. После того как в системе появился синхронизатор с редиской, писать клиентов (программисту!) стало очень легко. С непрограммистами похуже. Сейчас нет проблем сделать универсального клиента для мониторинга и ручного управления. Без перепрограммирования. Но как быть с автоматическим управлением? Я имею в виду "универсального" клиента, нечувствительного к вариациям оборудования и алгоритмики управления. С оборудованием-то вопрос решен. А с алгоритмикой? У меня здесь полной (и "оттестированной":) ясности нет. Пока. Один (пробный) вариант я сейчас реализовал в новой версии синхронизатора (0.3.0.0), но еще толком не тестировал.

Евгений, если у Вас есть ясность в этом вопросе - с удовольствием бы обсудил. Это как раз то, что сейчас нужно для более-менее "однородного" завершения концептуального уровня системы (т.е. всех трех наших лап :). Такое обсуждение вполне возможно и в рамках данного форума. Ну а по поводу разработки конкретного софта там видно будет. Тут, наверное, Вам виднее...

Brooks_part.png
Brooks_part.png Ненавязчивая автоматизация ректификационной установки. Автоматика.
OldBean Доцент Красноярск 1K 1.4K
Отв.1699  30 Авг. 19, 14:25
Прочитав все мнения, остаюсь при своем.
Себе буду делать однозначно...ekochnev, 30 Авг. 19, 05:56
Дело, конечно, хозяйское, но... Для каждого модуля можно придумать много вариантов отказа. При разумных трудозатратах на разработку модуля, все их не отловить. Ну сделаете Вы супер-мупер электрический контроль работоспособности того же клапана отбора. А механические отказы как? Клапаны имеют свойство иногда засоряться и, как правило, потихоньку "зарастать". Кстати, это - наиболее вероятные варианты отказа, нежели сгоревшие катушки или выход из строя триака или MOSFET-а контроллера. Поэтому "православно правильное" :) решение - это реальный датчик расхода, включенный последовательно с устройством отбора.

Реализованный в контроллере PWM, виртуальный датчик расхода - это временное решение, эмулирующее реальный датчик расхода (которого у меня пока просто нет). Кстати, решение, вполне отвечающее принципу разумной достаточности. За почти три года эксплуатации контроллера клапана отбора (в разных вариантах системы) с виртуальным датчиком расхода не было ни одного отказа, который могла бы уловить электро-ОС. Только калибровку регулярно проверять нужно - у меня за первые пару лет жиклер процентов на 10 (по расходу) зарос. Жиклер нужно периодически чистить.

Кстати, в 0.3-й версии lsync виртуальный датчик расхода описан уже отдельным классом, как и все другие, "настоящие" датчики (типа RMS, атмосферного давления, температуры и т.д.). Когда виртуальный датчик будет заменен реальным, в софте ничего не нужно будет менять (разве что сам класс откорректировать).