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. Ненавязчивая автоматизация ректификационной установки. Автоматика. 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. Ненавязчивая автоматизация ректификационной установки. Автоматика.
NBVV
Специалист
Новосибирск
134 2
Отв.2669 11 Марта 25, 08:52
Да, вроде бы все в порядке. Времени было мало, пару раз прогнал - все отрабатывает корректно. Спасибо.
Добавлено через 28дн. 19ч. 31мин.:
Установил в крейт еще одну плату - модуль PWM (для управления клапаном воды, на случай протечки). После этого начались периодические «непонятки» на шине I2C. Запускаю или перезагружаю малинку, ввожу: i2cdetect -y 1, после чего, примерно в половине случаев, все нормально и на экране такая картинка: 555. Ненавязчивая автоматизация ректификационной установки. Автоматика. Во второй половине случаев, картинки вылазят разные: 55556. Ненавязчивая автоматизация ректификационной установки. Автоматика.5554. Ненавязчивая автоматизация ректификационной установки. Автоматика.5553. Ненавязчивая автоматизация ректификационной установки. Автоматика.5552. Ненавязчивая автоматизация ректификационной установки. Автоматика.5552. Ненавязчивая автоматизация ректификационной установки. Автоматика.5551. Ненавязчивая автоматизация ректификационной установки. Автоматика.
Если отключаю плату 1-Wire хаба , то все стабильно и корректно. Кстати новая плата встала как раз рядом с хабом, который подключен к крейту не напрямую, а через 5-ти сантиметровый переходничек: 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.