Форум самогонщиков Сайт Барахолка Магазин Опрокинем стопаря?

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

Форум самогонщиков Автоматика
1 ... 123 124 125 126 126
OldBean Доцент Красноярск 1K 1.4K
Отв.2500  14 Июня 22, 02:42
А... Понятно. Вы взяли очень сарую прошивку ("еще до lite"). Там даже кода семейства устройства еще нет. Поэтому платка и не распознается. Берите все прошивки не древнее (!) прошивок, которые размещены с приложении к этому топику.
NBVV Бакалавр Новосибирск 93 2
Отв.2501  14 Июня 22, 03:40, через 58 мин
Спасибо. Хотя ссылку на прошивку брал в lite_v041x_doc:
прошивка.PNG
прошивка. Ненавязчивая автоматизация ректификационной установки. Автоматика.
OldBean Доцент Красноярск 1K 1.4K
Отв.2502  14 Июня 22, 05:56
Хотя ссылку на прошивку брал в lite_v041x_docNBVV, 14 Июня 22, 03:40
Ну ладно...

Справедливости ради замечу, что эта ссылка, таки, не на прошивку, которая должна работать с библиотекой lite, а на конкретное устройство - датчик давления на базе MPX5010DP с интерфейсом 1-Wire и упрощенным протоколом обмена (без адресации). Если Вы подключите эту платку (с той самой изначальной прошивкой) к любому мастеру шины 1-Wire, то она должна заработать (одно устройство на шине, т.е. без адресации) и всяко мерить давление. Но для работы с библиотекой lite, прошивку нужно расширить (добавить код семейства, интерпретатор дополнительных команд, калибровки и прочие мелочи). Т.е. прошивки нужно брать из комплекта (папки) firmware библиотеки lite.

Хотя согласен с Вами, некая сбивающая с толку, неоднозначность здесь получилась. Sorry, но просто как-то в голову не приходило, что кто-нибудь будет использовать именно ту прошивку с библиотекой lite :((( Прошивка это же ведь штука переменная. Для одной задачи одна, для другой другая...
NBVV Бакалавр Новосибирск 93 2
Отв.2503  15 Июня 22, 08:32
Увы, опять затык. Прошил свежей прошивкой A7_ow_MPX5010DP. При запуске SR1 ругается - Ошибка: 'MPX5010DP' object has no attribute 'conv'.
5010.PNG
5010. Ненавязчивая автоматизация ректификационной установки. Автоматика.
OldBean Доцент Красноярск 1K 1.4K
Отв.2504  15 Июня 22, 14:40
При запуске SR1 ругается - Ошибка: 'MPX5010DP' object has no attribute 'conv'.NBVV, 15 Июня 22, 08:32
Правильно ругается. У датчиков, подключаемых к 1-Wire хабу, нет методов conv(). Цикл преобразования всех датчиков, подключенных к конкретному хабу, запускается автоматически и синхронно во времени для всех восьми каналов при вызове метода conv() для этого конкретного хаба. Уберите из Вашего скрипта инструкции типа P0.conv(), где Вы их поставили. Т.е., другими словами, работайте с датчиком давление точно так же, как Вы работаете, например, с датчиками температуры (DS18B20) - просто берите свойство v объекта. Кстати, не забудьте откалибровать датчик. Судя по скрину, он у Вас еще не калиброван.
NBVV Бакалавр Новосибирск 93 2
Отв.2505  16 Июня 22, 02:13
"Уберите из Вашего скрипта инструкции типа P0.conv(), где Вы их поставили". Уважаемый OldBean, здесь какое-то недоразумение. Проблема в том, что я нигде никакие инструкции не вставлял (у меня для этого не хватает знаний). Скрипт целиком Ваш и менялся только в той части, что касается количества тэнов и нефункционирующего фракционника. Без датчика 5010 этот скрипт работает корректно. На всякий случай прикладываю файлы, вдруг где-то нечаянно подпортил.
lite.py
main.py
sr1 2.py
OldBean Доцент Красноярск 1K 1.4K
Отв.2506  16 Июня 22, 05:35
здесь какое-то недоразумение... не хватает знаний).NBVV, 16 Июня 22, 02:13
А я уже надеялся, что Вы за это время стали крутым python-программером :) Чего искренне Вам желаю. Язык простой, симпатичный, очень высокоуровневый и ныне модный.

Я сейчас далеко от оборудования. Вечером приближусь, подключу такой же датчик и посмотрю на базе Ваших файлов что и как. Я в настоящее время с такими датчиками не работаю. Может быть где-то и мой косяк приключился. Всяко бывает. Посмотрю.
sig Магистр Ростов-на-Дону 294 134
Отв.2507  16 Июня 22, 13:49
Анализ выложенных выше файлов показывает, что источник проблемы в файле lite.py функция sens_conv()
def sens_conv(): # Запуск преобразований всех датчиков
 for k in sorted(obn.keys()):
   if k[0] in ['H', 'U', 'P']: # Это все датчики или хабы датчиков
     obn[k].conv()
Для всех объектов, имя которых начинается с 'Р' - вызывается метод conv(), но класс MPX5010DP такого не имеет! Все остальные классы датчиков давления (BMP180, BMP280, MS5611) имеют метод conv(). Поэтому проще всего добавить в class MPX5010DP метод-затычку
  def conv(self):
   pass
OldBean Доцент Красноярск 1K 1.4K
Отв.2508  16 Июня 22, 14:16, через 28 мин
здесь какое-то недоразумение.NBVV, 16 Июня 22, 02:13
Вот добрался до установки. Посмотрел. Да, это мой косяк. Спасибо за обнаруженную ошибку! Этот датчик не должен был попадать в список датчиков, для которых вызываются методы conv() и update(). Но, увы, попал. Из-за буквы P в имени объекта.:(((

Самый простой способ лечения, как уже написал коллега sig, поставить затычки в объявление класса MPX5010DP (см. скриншот). Не только на conv(), но и, конечно, еще и на update(). См.скриншот. ниже.
2022-06-16-165434_1920x1080_scrot.png
2022-06-16-165434_1920x1080_scrot. Ненавязчивая автоматизация ректификационной установки. Автоматика.


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

Хотя, правильнее будет, а точнее - "по-питоновски правильнее" будет использовать осторожную конструкцию: try-except. Дескать, попробуй выполнить такую команду, ну а если не получится - наплюй. :))) В данном случае, в файле lite.py фрагмент
#-----------------------------------------------------------------------------
def sens_conv(): # Запуск преобразований всех датчиков
  for k in sorted(obn.keys()):
    if k[0] in ['H', 'U', 'P']: # Это все датчики или хабы датчиков
      obn[k].conv()
#-----------------------------------------------------------------------------
def sens_update(): # Обновление показаний всех датчиков
      for k in sorted(obn.keys()):
        if k[0] in ['H', 'U', 'P']: # Это все датчики или хабы датчиков
          obn[k].update()
нужно отредактировать так:
#-----------------------------------------------------------------------------
def sens_conv(): # Запуск преобразований всех датчиков
  for k in sorted(obn.keys()):
    if k[0] in ['H', 'U', 'P']: # Это все датчики или хабы датчиков
      try:
        obn[k].conv()
      except:
        pass
#-----------------------------------------------------------------------------
def sens_update(): # Обновление показаний всех датчиков
      for k in sorted(obn.keys()):
        if k[0] in ['H', 'U', 'P']: # Это все датчики или хабы датчиков
          try:
            obn[k].update()
          except:
            pass
Никак не могу приучить себя именно так оформлять скользкие и сомнительные места кода. Но посоветовать могу... :)))
NBVV Бакалавр Новосибирск 93 2
Отв.2509  26 Июня 22, 12:41
В SR1 есть следующие строки:
u.timing.append(time.time())
if len(u.timing) > 2: # Подсчитаем эффективную скорость отбора
if q0.v > 0: # Был старт
koef = u.timing[-2] - u.timing[-3]
else:
koef = u.timing[-1] - u.timing[-2]
koef /= u.timing[-1] - u.timing[-3]
# u.q0_eff = int(u.qw*koef)
u.q0_eff = f'{100*koef:.0f}%'
OldBean, если можно, объясните, пожалуйста, для чего рассчитывается эффективная скорость отбора (в этом форуме не нашел обсуждения на эту тему),если кроме вывода на экран она больше никак не используется.
По идее ее значение на экране, должно мне о чем-то сигнализировать, но, увы, я не понимаю о чем))).

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

Может ее можно использовать как один из критериев окончания отбора тела?
OldBean Доцент Красноярск 1K 1.4K
Отв.2510  27 Июня 22, 06:07
Может ее можно использовать как один из критериев окончания отбора тела?NBVV, 26 Июня 22, 12:41
Да. Он для этого там и есть. Но, для отлаженных процессов и стабильного сырья (!) простейший критерий по количеству старт-стопов оказался гораздо проще и постепенно вытеснил первый. Соответствующее условие было убрано.

PS
В Сибири не так уж и много стабильного сырья для получения спирта в домашних городских условиях. Кроме, пожалуй, сахара. Поэтому процесс ректификации быстро становится рутинным, со стабильными этапами и простыми (я бы даже сказал - туповатыми) критериями их смены :)
NBVV Бакалавр Новосибирск 93 2
Отв.2511  27 Июня 22, 06:19, через 12 мин
Так как опыта (в нашем общем деле) у меня чуть меньше года, сам я не смогу верно определить значение данного коэффициента, при котором следует прекратить отбор тела. Надеюсь на Вашу помощь в этом вопросе.
OldBean Доцент Красноярск 1K 1.4K
Отв.2512  27 Июня 22, 13:30
Тут все просто. В списке timing фиксируются моменты времени в которые происходит либо стоп либо старт. В эти же моменты подсчитываются длительности периода отбора (т.е. когда клапан работает в соответствии с заданным уровнем ШИМ контроллера клапана) и длительность всего периода старт-стопа (сумма длительности фазы отбора с длительность паузы, когда клапан полностью закрыт, не "щелкает" :) и их отношение в процентах. Последнее - это и есть q0_eff. По сути это - средняя скорость отбора за текущий период старт/стопа. Допустим, длительность отбора (с последнего старта) равна 5 мин, а длительность паузы в отборе после последнего стопа равна 15 мин. Тогда средняя (эффективная) скорость отбора будет равна 100%*5мин/(5мин+15мин) = 25% от номинальной (базовой) скорости отбора, которая выставляется как уровень ШИМ контроллера клапана отбора.
NBVV Бакалавр Новосибирск 93 2
Отв.2513  08 Июля 22, 05:57
800.png
800. Ненавязчивая автоматизация ректификационной установки. Автоматика.
Уже был от меня подобный вопрос (безответный Отв.2483 20 Мая 22, 05:52), столкнулся с такой же проблемой снова.
Решил протестировать колонну на предмет захлеба. Для этого в sr1 задал значение мощности трех тэнов по 800Вт. Запустил процесс, после разгона пошел холостой ход. В отдельной консоли открыл lite.py, в нем пропечатал: u.ww0=850, u.ww1=850, u.ww2=850. Каждый раз печатался ответный «ОК». Но в запущенном main.py значение мощности менялось только в рабочих переменных, а в столбце «Контроллеры» оставалось прежним. И, как я понимаю, реальная подаваемая на тэн мощность тоже не увеличилась. Приходилось откатываться на разгон и возвращаться на ХХ, только тогда мощность менялась.
Я что-то не так делаю? Или всё-таки баг?

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

И еще одна тема. Заметил, что значение уставки u.Tset не всегда кратно u.dT. Пример во вложении. Получается, что если она равна, к примеру, 73.812, то старт происходит корректно T1.v <= u.Tset - u.dT . А если 73.810, то из-за нехватки двух тысячных, фактически старт происходит при T1.v <= u.Tset – 2*u.dT. OldBean, уважаемый, можете это как то подправить?
810.png
810. Ненавязчивая автоматизация ректификационной установки. Автоматика.
812c.png
812c. Ненавязчивая автоматизация ректификационной установки. Автоматика.
OldBean Доцент Красноярск 1K 1.4K
Отв.2514  08 Июля 22, 06:52, через 56 мин
Увы, Вы просто запустили два независимых процесса. Если они связаны с одним и тем же железом, ничего хорошего не получится. Для Вашей задачи, т.е. для оперативного (в процессе работы) изменения управляющих параметров существует универсальный клиент (client.py), который взаимодействует с активным процессом через TCP-сокет. Краткая инструкция есть в документации, самом конце (раздел 5).
можете это как то подправить?NBVV, 08 Июля 22, 05:57
Это уже про уставку. Внутрь кванта залезть непросто :). Разве что за счет усреднения. Но за это придется заплатить временем реакции системы. Что лучше - пока не понятно. Нужно подумать.
NBVV Бакалавр Новосибирск 93 2
Отв.2515  08 Июля 22, 09:25
. В отдельной консоли открыл lite.py,NBVV, 08 Июля 22, 05:57
Прошу прощения, конечно же я открыл client.py, а не lite.py
OldBean Доцент Красноярск 1K 1.4K
Отв.2516  08 Июля 22, 10:57
я открыл client.pyNBVV, 08 Июля 22, 09:25
Параметры нужно менять заранее. До включения данной моды. В автоматическом режиме установка параметров контроллеров происходит только при инициализации режима (т.е. при входе в него). Если же Вы сменили параметры именно текущего режима, то, если не изменяет память, его обновления не происходит. В этом случае попробуйте после изменения параметров опять нажать клавишу с номером этого же режима. Блок инициализации должен вызваться опять. Вроде бы должно сработать. Но (!) таймер и некоторые другие критерии режима сбросятся.
NBVV Бакалавр Новосибирск 93 2
Отв.2517  08 Июля 22, 10:59, через 2 мин
Это уже про уставку. Внутрь кванта залезть непросто Улыбающийся. Разве что за счет усреднения.OldBean, 08 Июля 22, 06:52
Может быть я сейчас скажу какую-нибудь глупость:)). Количество возможных значений температуры кратных u.dT - 100/0.0625=1600. Сформировать список из этих значений и округлять Tset до ближайшего.
OldBean Доцент Красноярск 1K 1.4K
Отв.2518  09 Июля 22, 03:56
Честно говоря, не совсем понимаю что это даст. При простейшем старт/стопе мы сравниваем две дискретные величины, скажем образно, с разной степенью дискретности :). Одна - текущая температура T1 с разрешением 0.0625°C (12 разрядов АЦП), другая - уставка Tset, скорректированная на атмосферное давление, с бОльшим разрешением. Это за счет датчика давления. Если не изменяет память, у BMP180 - около 16 разрядов АЦП, а у BMP280 должно быть еще побольше. За счет округления Tset мы, по сути, уменьшаем разрешение Tset до 12 разрядов. Вы считаете, что это положительно скажется на динамике импульсного регулятора (старт/стоп)?
BogAD Кандидат наук Красногорск - Белово 390 176
Отв.2519  11 Авг. 22, 19:25
Была малинка, будет репка...
https://orangepi.su/content.php?p=227&c=Rezident
62f41b3d54300.jpg
62f41b3d54300. Ненавязчивая автоматизация ректификационной установки. Автоматика.