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

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

Форум самогонщиков Автоматика
1 ... 131 132 133 134 135 134
C-Bell Научный сотрудник Улан-Удэ 1.8K 1.3K
Отв.2660  12 Нояб. 24, 20:43
Можно попробовать в файле lite.py строку №1307
cinit = 'def finit():\n' # Начало строки кода инициализации режима мониторинга

изменить следующим образом:
cinit = 'def finit():\n  pass\n' # Начало строки кода инициализации режима мониторинга


Похоже, что в функцию не добавляются коды сброса всех контроллеров и накопительных виртуальных датчиков
OldBean Доцент Красноярск 1K 1.4K
Отв.2661  13 Нояб. 24, 01:48
Такое ощущение, что косяк в железе, а из-за него всплывает непредвиденный баг в софте.NBVV, 11 Нояб. 24, 10:02
Возможно у Вас в системе отсутствуют исполнительные устройства (их имена начинаются со строчных букв или Q). Поэтому у функций cinit() генерируется только объявление функций (def ...). Без какого-нибудь "тела" функции. Питону это не нравится и возникает исключение. Для лечения проблемы можно 1) вставить в крейт какое-нибудь исполнительное устройство (контроллер) или 2) в файле lite.py добавить пустой оператор (pass) в строку с объявлением функции cinit (заоодно и в ccond). Коллега C-Bell Вам насчет pass уже посоветовал выше. Вот, например, как показано на картинке (нумерация строк может не совпадать с Вашей, смотрите по тексту кода):
frag.png
Frag. Ненавязчивая автоматизация ректификационной установки. Автоматика.

PS Не забудьте добавить отступ (два пробела) перед оператором pass!
NBVV Специалист Новосибирск 134 2
Отв.2662  13 Нояб. 24, 11:17
Оказалось, что действительно " у Вас в системе отсутствуют исполнительные устройства (их имена начинаются со строчных букв или Q)")). Умер блок питания, который запитывал крейт. Но я не видел этого, пока не исправил код на "cinit = 'def finit():\n pass\n'" (Спасибо C-Bell). Программа запустилась, и на I2C увиделся только датчик давления, а он вне крейта.
OldBean Доцент Красноярск 1K 1.4K
Отв.2663  13 Нояб. 24, 16:32
NBVV, перед оператором pass нужно поставить строго два пробела (а у Вас вроде бы один пробел). Это важно. Иначе питон опять будет ругаться, когда/если обнаружит доступные исполнительные устройства. Операторы их сброса при формировании функцию cinit() будут добавляться с отступом в два пробела. Отступы в функциях питона должны быть одинаковыми.
NBVV Специалист Новосибирск 134 2
Отв.2664  06 Марта 25, 15:13
# Определение режима "Ожидание" (режим 7)

def finit(): # Инициализация режима

w0.v = u.ww0 # Нагрев ТЭНа0 на рабочем уровне

w1.v = u.ww1 # Нагрев ТЭНа1 на рабочем уровне

w2.v = u.ww2 # Нагрев ТЭНа2 на рабочем уровне

q0.off() # Отбор выключен

u.ss_flag = False # Старт-стоп в этом режиме не используется

#s0.v = 0 # Фракционник - в нулевое состоянии

def fcond(): # Проверка условий

if time.time() - tim.mst > 1200: # 20 мин прошло

u.mode = 0

pass

modes.append(Mode('Ожидание', finit, fcond))

Создал я такой режим. Хотел, чтобы агрегат ждал меня 20 мин. и если не дожидался, то - mode=0.
На практике, получается, что нет 20-ти минутного ожидания, а сразу mode=0. Эксперименты показали такую вещь: из любого режима, если он длился менее двадцати минут - переход в режим "Ожидание" корректен, и через 20 минут все заканчивается mode=0. А если предшествующий "Ожиданию" режим длится более 20-ти минут, то вместо режима №7 включается "Мониторинг".
Я так понимаю, что код успевает проверить условие: if time.time() - tim.mst > 1200 раньше, чем меняется название режима и обнуляется tim.mst.
Посоветуйте, как разрешить проблему.
OldBean Доцент Красноярск 1K 1.4K
Отв.2665  10 Марта 25, 08:25
Я так понимаю, что код успевает проверить условие: if time.time() - tim.mst > 1200 раньше, чем меняется название режима и обнуляется tim.mst.NBVV, 06 Марта 25, 15:13
tim.mst не должен обнуляться. Это время начала текущего режима в секундах с начала эпохи и оно устанавливается во время смены режима (см. модуль main.py).

В вашем скрипте ошибок вроде не видно. Он, с точки зрения паузы, эквивалентен режиму холостого хода (режим 2). А режим хх (2) работает нормально?
NBVV Специалист Новосибирск 134 2
Отв.2666  10 Марта 25, 10:38
Да, режим 2 работает нормально.
"tim.mst не должен обнуляться. " все верно, я неправильно выразился. Правильно так: "Я так понимаю, что код успевает проверить условие: if time.time() - tim.mst > 1200 раньше, чем меняется название режима и изменяется tim.mst."
OldBean Доцент Красноярск 1K 1.4K
Отв.2667  10 Марта 25, 17:45
Если режим 2 (с паузой 30 минут и после длительного разгона >20 мин) работает нормально, то и Ваш режим 7 должен работать. Значение паузы, скорее всего, здесь ни при чем. Возможно что-то не так с инициализацией режима (функция finit()). Попробуйте сделать еще один режим (8) с пустой функцией finit(). Поставьте там только один оператор pass. А функцию fcond() сделайте такую же, как в режиме 7. Зайдите в него, нажав клавишу 8, сразу же после запуска системы. Работает пауза или нет?

PS
код успевает проверить условие: if time.time() - tim.mst > 1200 раньше, чем меняется название режима и изменяется tim.mst.NBVV, 10 Марта 25, 10:38
Я посмотрю - возможно ли это в принципе.
OldBean Доцент Красноярск 1K 1.4K
Отв.2668  10 Марта 25, 18:57
Я посмотрю - возможно ли этоOldBean, 10 Марта 25, 17:45
Посмотрел. В принципе может произойти смена режима и проверка условия выхода из режима до его инициализации. Может быть Вам "повезло" наткнуться на такую ситуацию. Вы можете провести небольшой эксперимент. Найдите в модуле main.py пару строчек и передвиньте их ниже, как показано на рисунке ниже. Это сдвинет проверку условий выхода из режима заведомо после инициализации tim.mst. Возможно, это поможет решить Вашу проблему.
fix.png
Fix. Ненавязчивая автоматизация ректификационной установки. Автоматика.
NBVV Специалист Новосибирск 134 2
Отв.2669  11 Марта 25, 08:52
Да, вроде бы все в порядке. Времени было мало, пару раз прогнал - все отрабатывает корректно. Спасибо.

Добавлено через 28дн. 19ч. 31мин.:

Установил в крейт еще одну плату - модуль PWM (для управления клапаном воды, на случай протечки). После этого начались периодические «непонятки» на шине I2C. Запускаю или перезагружаю малинку, ввожу: i2cdetect -y 1, после чего, примерно в половине случаев, все нормально и на экране такая картинка:
555.PNG
555. Ненавязчивая автоматизация ректификационной установки. Автоматика.

Во второй половине случаев, картинки вылазят разные:
55556.PNG
55556. Ненавязчивая автоматизация ректификационной установки. Автоматика.
5554.PNG
5554. Ненавязчивая автоматизация ректификационной установки. Автоматика.
5553.PNG
5553. Ненавязчивая автоматизация ректификационной установки. Автоматика.
5552.PNG
5552. Ненавязчивая автоматизация ректификационной установки. Автоматика.
5552.PNG
5552. Ненавязчивая автоматизация ректификационной установки. Автоматика.
5551.PNG
5551. Ненавязчивая автоматизация ректификационной установки. Автоматика.


Если отключаю плату 1-Wire хаба , то все стабильно и корректно. Кстати новая плата встала как раз рядом с хабом, который подключен к крейту не напрямую, а через 5-ти сантиметровый переходничек:
photo_2025-04-09_08-06-35.jpg
Photo_2025-04-09_08-06-35. Ненавязчивая автоматизация ректификационной установки. Автоматика.


С чем все это может быть связано – наводки, просадки, непропай, что-то подкарачивает?

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

Добавлю, что плата хаба была установлена через переходник и раньше. Единственное изменение на ней, после установки новой платы – это небольшой разворот Mpx 5010 и подключение его к другим (более близким) точкам на плате хаба.

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

Причину нашел: "разворот Mpx 5010 и подключение его к другим (более близким) точкам на плате хаба."
Одна точка оказалось неверной)).

Добавлено через 1дн. 3ч. 23мин.:

Хочу отслеживать изменение температуры T1. У OldBean, к примеру, разгон заканчивается по заданному времени, а я бы хотел, чтобы условием окончания, было отсутствие изменения Т1, в течении заданного промежутка.
Хотел осуществить это следующим образом: «Разгон», условно, идет 20 минут, после чего – переход в «Разгон2», где и будет отслеживаться Т1.
Кроме того, хотел бы отслеживать температуры в разных точках на предмет предотвращения захлеба.
Проблема в том, что максимальное количество режимов У OldBean 10, и при моем подходе к реализации задуманного, это мало.
Подскажите, пожалуйста, как решить мою задачу, не плодя количество режимов? Не прошу конкретного кода (правда - это было бы идеально)) ), хотя бы совет или канву для направления мыслей.
ekochnev Магистр Екатеринбург 214 55
Отв.2670  12 Апр. 25, 16:37
У OldBean, к примеру, разгон заканчивается по заданному времени, а я бы хотел, чтобы условием окончания, было отсутствие изменения Т1, в течении заданного промежуткаNBVV, 11 Марта 25, 08:52

Вообще не понимаю, как на разгон можно закладывать какое-то конкретное время. Если я налью полный куб - это одно время, когда половину - другое, треть - третье. У меня режим разгона заканчивается когда температура на датчике в кубе становится больше температуры кипения идеального спирта при давлении равном сумме давлений (атмосферное + давление в кубе), после этого переходит в следующий режим. Это позволяет совершенно не зависеть от объема налитой в куб жидкости. По поводу количества режимов, у меня их тоже 10, могу сделать любое кол-во, но этого достаточно, чтобы поменять емкости:
0. Мониторинг
1. Разгон
2. Прогрев колонны
3. Стабилизация колонны
4. Отбор голов
5. Пауза для смены емкости
6. Отбор тела 1
7. Отбор тела 2
8. Пауза для смены емкости
9. Отбор хвостов
10. Конец работы
Режимы отбора тела 1 и 2 отличаются алгоритмами управления. Основной - это первый режим. Если между ними воткнуть паузу, то второй можно обозвать по сути "Отбор предхвостов".
NBVV Специалист Новосибирск 134 2
Отв.2671  13 Апр. 25, 03:15
Можно поподробнее, на счет "могу сделать любое кол-во"? С нулевым мониторингом у Вас сейчас 11 режимов, а значит уже сейчас нет возможности выбора режима с клавиатуры. То есть из мониторинга не перескочить, к примеру, на стабилизацию.
ekochnev Магистр Екатеринбург 214 55
Отв.2672  13 Апр. 25, 08:02
Можно поподробнее, на счет "могу сделать любое кол-во"?NBVV, 13 Апр. 25, 03:15

У меня своя программа всем управляет, не от OldBean, поэтому нет таких ограничений как у него

а значит уже сейчас нет возможности выбора режима с клавиатурыNBVV, 13 Апр. 25, 03:15

По нажатию кнопки "3" перейдет в режим стабилизации. Есть также кнопки следующий режим/предыдущий режим. Если уж надо перескочить из мониторинга в стабилизацию альтернативным способом, то можно три раза подряд нажать "Следующий режим" и получите искомое, только я не понимаю зачем вообще это нужно...
Undol Студент Владимир 22 2
Отв.2673  19 Апр. 25, 11:35
Народ, добрый день. Сейчас при очередном перегоне сдох DS1820 в баке, исполнение датчика- в гильзе, стоит в бочине бака на уровне ТЭНа. Причем это уже третий - первые 2 стояли в колонне и узле отбора. Сейчас готовых в гильзе нет, есть сами DS1820 россыпью. Нужно быстренько заменить, хочу в гильзу влить силиконового масла. Вопрос: кто-нибудь герметизировал гильзы? А как и чем? Верхний край гильзы наверняка маслом заляпаешь - как исхитриться?
ekochnev Магистр Екатеринбург 214 55
Отв.2674  19 Апр. 25, 11:44 (через 10 мин)
А цель залития маслом какая? Перенос тепла обеспечить от стенок гильзы к датчику? Так для этих целей имхо лучше термопасту купить в компьютерном магазине, которую между процессором и кулером мажут. Обмазать ей датчик и затолкать его на дно гильзы, ну или шприцом выдавить пасту внутрь на дно гильзы, а затем в это пятно опустить сам датчик.
Undol Студент Владимир 22 2
Отв.2675  19 Апр. 25, 11:57 (через 14 мин)
Ну цель-то та же. Про пасту не сообразил, спасибо. Тюбик вон лежит. А открытый торец чем заткнуть?
ekochnev Магистр Екатеринбург 214 55
Отв.2676  19 Апр. 25, 12:47 (через 50 мин)
А открытый торец чем заткнуть?Undol, 19 Апр. 25, 11:57

Так я и затыкать особого смысла не вижу...
Так то хоть чем, хоть палочкой какой-нибудь. А потом сверху на открытый край с проводом термоусадочную трубку, чтоб провод на выходе не болтался.
Undol Студент Владимир 22 2
Отв.2677  19 Апр. 25, 12:52 (через 5 мин)
Угу. А термоусадка - это таперя наше все, взамен синей изоленты.
malina74 Новичок Пушкино 4
Отв.2678  30 Апр. 25, 14:43
Добрый день. Можно ли заменить датчик давления MPX5010DP на более дешевый MPS20N0040D и какие изменения потребуются ,если возможно?
U-M Магистр MSK 212 40
Отв.2679  30 Апр. 25, 22:00
MPX5010DP это максимум 10 кПа = 75 мм. ртутного столба.
MPS20N0040D это 40 кПа = 300 мм. ртутного столба.

Колонны у всех работают на разном давлении, но скорее всего это будет диапазон 10-20 мм. ртутного столба.
На MPX5010DP мы находимся в зоне близкой к 25% диапазона, а на MPS20N0040D будем находиться в зоне менее 10% диапазона.

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