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

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

Форум самогонщиков Автоматика
1 ... 131 132 133 134 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 Специалист Новосибирск 132 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 Специалист Новосибирск 132 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 Специалист Новосибирск 132 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 Специалист Новосибирск 132 2
Отв.2669  11 Марта 25, 08:52
Да, вроде бы все в порядке. Времени было мало, пару раз прогнал - все отрабатывает корректно. Спасибо.