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

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

Форум самогонщиков Автоматика
1 ... 57 58 59 60 61 62 63 ... 132 60
PavelSaratov Доктор наук Саратов 622 80
Отв.1180  17 Февр. 18, 20:23
Не не совсем согласен. Понимаете - мы же не видим, что городят люди у себя. То есть не фото ничего, просто не видно. Понятно и ежу что на 2 метрах провода - все эти экраны это бред сивой кобылы. Но с точки зрения опыта (именно чего сколько и как видел) - выясняется, что например кабель просунут из комнаты сарая в другую комнату сарая на уровне земли в воде. Так блин - ну тут надо брать просто инструмент и выезжать выяснять по месту.
Естественно это не вариант.
Поэтому в теории максимизируем возможную проблему - техническими средствами ее отсекаем и больше вообще не мучаемся. Тут просто качественно 2 подхода - или делаешь чтобы и в теории все нормально было или имеешь под рукой опытного человека. Через форум естественно первое проще.
Кстати думаю HAZOP ради прикола провести для ректификационной установки и показать что не надо ардуины ставить, но чую тяжелаю слишком ноша, описать философию оценки. Трудно, не оплачиваемо и потом еще и заклюют

Т.к., что 15 мкВ, что 3584 мкВ - это все-равно ноль по сравнению с 3.3В. И никакого влияния на цифровой канал эти помехи не оказывают. Цифры я взял "с потолка" - из статьи, ссылку на которую привел уважаемый коллега PavelSaratov (рис.3.102).
Оффтоп. Не сморите на таблицу, смотрите на принципы. 24 вольтовые цепи (постоянного! тока) собирая всякое с полей нагоняют до 50 вольт наводки за счет индуктивности (под фальшполом запас каждого полевого кабеля свернут как правило в круглую петлю из двух трех витков).
SedoY Профессор Новосибирск 5.1K 2.2K
Отв.1181  17 Февр. 18, 20:26, через 3 мин
человеческий фактор!
вот военные машины - там капец как все экранированно, ядерный взрыв с его ЭМИ теоретически выдержат.
но простой Русский солдат....

так что есть знания - применяем и незнающих учим, как правильно сделать.
PavelSaratov Доктор наук Саратов 622 80
Отв.1182  17 Февр. 18, 20:29, через 4 мин
Штык на казенные ботинки капать ?! Нехорошо!
По делу - есть системы ПАЗ - на 32 входа модуль ввода вывода стоит от 10К. Прикол в том, что производитель ГАРАНТИРУЕТ его работу в нефтегазе при четко обозначенных границах , то бишь измеряемых (нефть внезапно радиоактивна иногда).
OldBean Доцент Красноярск 1K 1.4K
Отв.1183  18 Февр. 18, 05:14
14.5. Некоторые рекомендации по шине 1-Wire

Мне кажется, избежать большинства проблем, связанных с нестабильной работой датчиков DS18B20, да и вообще забыть об этой проблеме, можно, если выполнить следующие несложные правила:
1. Устранить источники сильных импульсных помех. Это следует сделать хотя бы потому, что разработка устройств, работающих в условиях помех, требует гораздо более высокой квалификации разработчика, чем без оных.
2. Не делать грубых ошибок в монтаже. А именно, 1) все земли должны соединяться в одной точке; 2) не допускать протекания сильных импульсных токов по сигнальным землям; 3) не делать петель (в том числе и емкостных), на которых могут наводится электромагнитные наводки и тому подобное.
3. Использовать рекомендованную топологию шины 1-Wire (т.е. - гирлянду). В частности, топологию "звезда" MAXIM не рекомендует использовать (см., например, Tutorial 148: Guidelines for Reliable Long Line 1-Wire Networks).
4. Ну и конечно, для длинной шины 1-Wire желательно использовать витые пары (категории 5), как это отмечается в этом же документе. Подключение витых пар, как советует коллега makh, можно выполнить следующим образом: одна пара - "питание-земля", вторая - "сигнальная линия - земля".

Предыдущий топик  Вернуться к оглавлению  Следующий топик
gol_avto Доцент Москва - Серпухов - Анапа 1.3K 458
Отв.1184  18 Февр. 18, 06:13, через 60 мин
Поэтому надо делать темп. сервер.
Dmi_D Кандидат наук Минск 393 138
Отв.1185  18 Февр. 18, 09:41
Печатку я уже рисую, кто возьмется за прошивку? Сам я, наверное, не потяну.
gol_avto Доцент Москва - Серпухов - Анапа 1.3K 458
Отв.1186  18 Февр. 18, 10:22, через 42 мин
Автор обещал же доделать и кажется делает, я вот жду с нетерпением, чтобы все платы оптом заказать  
Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.

А он ведь тестовую печатку уже выкладывал
================
BMP 180 я решил на крейте расположить и уменьшил число разъёмов до 8. Не думаю, что потребуется больше модулей
плата.gif
плата.gif Ненавязчивая автоматизация ректификационной установки. Автоматика.

1-crate_low_voltage_bus_pcb.lay6 40.2 Кб
Dmi_D Кандидат наук Минск 393 138
Отв.1187  18 Февр. 18, 13:15
тестовую печаткуgol_avto, 18 Февр. 18, 10:22
Да, причем было несколько вариантов, а вот прошивки так и не было. Если бы была, оттуда, наверное, достаточно было убрать секцию индикации.
gol_avto Доцент Москва - Серпухов - Анапа 1.3K 458
Отв.1188  18 Февр. 18, 13:31, через 17 мин
Была прошивка, только тестовая, не отлаженная.
[сообщение #13040384]
Dmi_D Кандидат наук Минск 393 138
Отв.1189  18 Февр. 18, 14:30, через 59 мин
Виноват, слепой.
Спасибо!
OldBean Доцент Красноярск 1K 1.4K
Отв.1190  18 Февр. 18, 14:58, через 29 мин
Коллеги, унифицированный цифровой модуль (может работать и просто в качестве температурного сервера) - сейчас в процессе разработки. Кое-какие реальные шаги уже сделаны (схема, разводка и готовый тестовый образец), но разработка еще не завершена. В целом опытный образец работает, но новая универсальная прошивка еще не отлажена. Ничего страшного там нет, но сейчас просто очень мало свободного времени, чтобы сесть и спокойно ее "вылизать"...

PS
Кстати, эта плата работает со старой прошивкой, о которой речь шла чуть выше.
dm_18.02.06.1_sch.gif
dm_18.02.06.1_sch.gif Ненавязчивая автоматизация ректификационной установки. Автоматика.
dm_18.02.06.1_pbc_05.gif
dm_18.02.06.1_pbc_05.gif Ненавязчивая автоматизация ректификационной установки. Автоматика.
dm_готовая_плата.JPG
dm_готовая_плата.JPG Ненавязчивая автоматизация ректификационной установки. Автоматика.
dm_проверка_работоспособности_модуля.JPG
dm_проверка_работоспособности_модуля.JPG Ненавязчивая автоматизация ректификационной установки. Автоматика.

dm_18.02.06.1_pcb_05.lay6 46.8 Кб
makh Профессор Sаmara 2.1K 1.1K
Отв.1191  18 Февр. 18, 17:16
Guidelines for Reliable Long Line 1-Wire NetworksOldBean, 18 Февр. 18, 05:14
В первых же строках:
scope of this document is limited to 1-Wire networks that use Category 5, twisted-pair copper wire
Без вариантов, и это правильно. ИМХО, уместно было бы добавить в список рекомендаций использование витухи.
OldBean Доцент Красноярск 1K 1.4K
Отв.1192  19 Февр. 18, 02:50
было бы добавить в список рекомендаций использование витухи.makh, 18 Февр. 18, 17:16
Конечно стОит. Уже добавил.
OldBean Доцент Красноярск 1K 1.4K
Отв.1193  21 Февр. 18, 08:11
Еще немного про цифровой модуль

Наконец довел софт цифрового модуля до рабочего состояния. Точнее: до более-менее рабочего. Поставил на долговременное тестирование. Сутки отработал без сюрпризов. Как-нибудь попозже протестирую посерьезней и опишу этот модуль подробнее. А пока, как говорят, as is...

Суть в двух словах. Унифицированный цифровой модуль - это универсальный интерфейс между малинкой и разнообразными цифровыми датчиками, имеющими однопроводной интерфейс. Это могут быть как простые датчики, типа обычных концевиков и термоконтактов, формирующих на сигнальной линии статические цифровые уровни, так и "умные" датчики (типа DS18B20), реализующие на этой линии довольно сложный протокол (например, 1-Wire, как у DS18B20).

В текущей реализации прошивки возможно подключение к одному цифровому модулю до 8 (в сумме) датчиков типа DS18B20 и простых датчиков (контактов) замыкающих/размыкающих сигнальную линию на землю. Датчики могут подключаться в произвольном порядке и сочетании, но только по одному на каждую из восьми линий. Контактов можно подключать и больше, но - "по схемному И". Со временем, надеюсь, ассортимент датчиков будет расширяться.

Текущий вариант прошивки и примера использования из малинкиного питона - во вложении. Схему и разводку цифрового модуля приводил чуть выше. На картинке во вложении - модуль в крейте во время тестирования и скриншот выдачи тестового скрипта.


С наступающим праздником, коллеги!  
Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.



Добавлено после праздников (26.02.2018 )
Оставил малинку с крейтом тестироваться на все праздники. 410550 секунд (это почти 5 суток) непрерывного обмена по i2c с частотой 1 Гц прошло без ошибок (зелененький столбец на скриншоте в приложении). Все. Будем считать первый релиз прошивки цифрового модуля законченным.
dm_дл_тест_стабильности_работы_модуля.JPG
dm_дл_тест_стабильности_работы_модуля.JPG Ненавязчивая автоматизация ректификационной установки. Автоматика.
dm_дл_тест_после_праздников.png
dm_дл_тест_после_праздников.png Ненавязчивая автоматизация ректификационной установки. Автоматика.

firmware.zip 5.3 Кб
OldBean Доцент Красноярск 1K 1.4K
Отв.1194  01 Марта 18, 07:00
Уф... Наконец-то, минимальный набор компонентов варианта LITE собран в кучу. Все прошивки отлажены и протестированы.

Набор включает в себя три контроллера исполнительных устройств (контактор, ТЭН, клапан отбора), унифицированный цифровой модуль для датчиков температуры (DS18B20), термоконтактов и других "контактов" (в сумме до 8 шт), датчик RMS с детектором нуля и датчик атмосферного давления. В принципе, такой комплект автоматизации, в сочетании с "железом" для кубовой ректификации, позволяет получать вполне приличный питьевой спирт путем двукратной ректификации исходного спирта-сырца. Но, перед подключением варианта LITE к "железу", неплохо было бы провести какое-нибудь финальное тестирование всех узлов автоматизации. В комплексе. Вчера вечерочком я это проделал. В качестве "модели" ТЭНа взята обычная лампочка накаливания на 100 Вт (удобнее плитки, т.к. "моща" видна ;), а в качестве нагрузки контроллера клапана отбора - свободный клапан AR-HX-3 MSQ (с обмоткой на 220 В). Поскольку все переключения используемого здесь регулятора мощности происходят в нуле тока и напряжения, то, с точки зрения наводок, почти все равно будем мы использовать лампочку, плитку или реальный ТЭН на пару-тройку киловатт. Уровень наводок регулятора будет практически нулевым во всех вариантах.

Тестовая конфигурация показана на рисунке ниже.
 Ненавязчивая автоматизация ректификационной установки
Ненавязчивая автоматизация ректификационной установки. Автоматика.

Лампочку я расположил рядом с датчиками температуры и термоконтактом на 30°C. При увеличении мощности, подаваемой на лампочку, DS-ки и термоконтакт будут нагреваться, оживляя процесс тестирования ;).

Текст тестового скрипта с GUI приведен ниже:
Скрытый текст
# _*_ coding: utf8 _*_
import time # В этом модуле - задержки
import smbus # В этом модуле - средства для работы с шиной i2c
import math # В этом модуле математические функции (sqrt, в частности)
import Adafruit_BMP.BMP085 as bmp # Обслуживание датчика давления
from Tkinter import * # Инструментарий для GUI
import tkMessageBox as mbox # Чтобы ругаться

import matplotlib # Библиотека для построения графиков
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
#-------------------------------------------------------------------------------
# Тестирование всей системы
# OldBean, 01.03.2018
#-------------------------------------------------------------------------------
# Адреса устройств
addrR = 0x11 # Адрес датчика RMS
addrC = 0x12 # Адрес контроллера контактора
addrT = 0x13 # Адрес контроллера ТЭНа
addrV = 0x14 # Адрес контроллера клапана отбора на шине i2c
addrD = 0x15 # Адрес цифрового модуля
#-------------------------------------------------------------------------------
# Параметры и вспомогательные переменные
a = 0.3838 # Калибровочный коэффициент для перевода кода в вольты
buf = [0]*16  # Буфер для приема байтов от цифрового модуля
pdm = 0 # Уровень pdm-модуляции для контроллера ТЭНа
pwm = 0 # Уровень pwm-модуляции для контроллера клапана отбора
# Кольцевые массивы для построения графиков температурных трендов
gLen = 100 # Длина кольцевых массивов
t = range(gLen)  # Массив дискретных веренных отсчетов
Tkub = [0.0]*gLen # Массив для значений температуры в кубе
Tcol = [0.0]*gLen # Массив для значений температуры в колонне
Tdef = [0.0]*gLen # Массив для значений температуры в дефлегматоре
Ttsa = [0.0]*gLen # Массив для значений температуры в ТСА
#-------------------------------------------------------------------------------
def fC(): # Вызывается при изменении состояния чекбокса
  global vC
  bus.write_byte(addrC, vC.get());
#-------------------------------------------------------------------------------
def fT(): # Вызывается при изменении состояния спинбокса ТЭНа
  global sbT, pdm
  pdm = int(sbT.get())
  bus.write_byte(addrT, pdm);
#-------------------------------------------------------------------------------
def fV(): # Вызывается при изменении состояния спинбокса клапана отбора
  global sbV, pwm
  pwm = int(sbV.get())*10
  if(bus.read_byte(addrV) == 0xff):
    bus.write_byte(addrV, (pwm & 0xff))
    bus.write_byte(addrV, ((pwm >> 8) & 0xff))
  else:mbox.showerror('Ошибка', 'Ошибка контроллера клапана отбора')
#-------------------------------------------------------------------------------
def wclose(): # Вызывается перед закрытием главного окна приложения
  bus.read_byte(addrV)    # Выключить клапан
  bus.write_byte(addrV, 0)
  bus.write_byte(addrV, 0)
  bus.write_byte(addrT, 0) # Выключаем ТЭН
  bus.write_byte(addrC, 0) # Выключаем контактор
  root.destroy()          # Закроем главное окно
#-------------------------------------------------------------------------------
def meas(): # Получение и вывод информации с датчиков
  # Измеряем и выводим RMS
  bus.write_byte(addrR, 0); # Установка индекса байтов в датчике RMS на 0
  crms = bus.read_byte(addrR)        # Читаем 4 байта с датчика RMS (начиная с
  crms |= bus.read_byte(addrR) << 8  # младшего и собираем 32-разрядное слово
  crms |= bus.read_byte(addrR) << 16 # В этом слове - сумма квадратов кода АЦП
  crms |= bus.read_byte(addrR) << 24 # за 1 сек (5000 отсчетов)
  v = a*math.sqrt(crms*0.0002)  # Вычисляем RMS (0.0002 это 1/5000)
  txts[0].configure(text = formats[0] % (v)) # Выводим значение RMS
  # Измеряем и выводим атмосферное давление
  p = ps.read_pressure()/133.322
  txts[1].configure(text = formats[1] % (p)) # Выводим значение давления
  # Измеряем и выводим данные с цифрового модуля (температуры и контакты)
  tries = 100 # Максимальное количество попыток доступа к данным модуля
  while tries > 0: # Ограничиваем количество попыток обращения к модулю
    try: # Попытаемся получить данные
      bus.write_byte(addrD, 0x00) # Сбрасываем индекс байтов в буфере модуля
      for i in range(16): # Считываем байты буфера последовательно
        buf[i] = bus.read_byte(addrD)
      break # Если все нормально - выходим из цикла
    except IOError:  # Устройство еще не готово - подождем 0.1 сек
      time.sleep(0.1) # и сделаем еще попытку
      tries -= 1      # Уменьшим на единичку счетчик попыток
  if tries <= 0: # Однако, что-то серьезно не так...
    print 'Цифровой модуль не доступен по i2c. Завершение работы.'
    sys.exit(1)
  for i in range(8): # Выводим информацию, полученную от цифрового модуля
    w = buf[2*i]*256 + buf[2*i + 1] # Формируем словf из пар байтов
    if w <= 2000 and w > 0: # Это явно DS18B20 - формируем значение температуры
      w *= 0.0625
    elif w > 2000: w = 1    # Разомкнутый контакт
    else: w = 0            # Замкнутый контакт
    # Обновляем кольцевые массивы для построения графиков температурных трендов
    if i == 0:  # Температура в кубе
      del Tkub[0]; Tkub.append(w)
    elif i == 1: # Температура в колонне
      del Tcol[0]; Tcol.append(w);
    elif i == 2: # Температура в колонне
      del Tdef[0]; Tdef.append(w);
    elif i == 3: # Температура в колонне
      del Ttsa[0]; Ttsa.append(w);
    # Выводим температуры в соответствующие окошечки главного окна
    txts[2 + i].configure(text = formats[2 + i] % (w))
    print formats[2 + i] % (w), # и еще - на терминал для контроля...
  print
  # Перестраиваем графики температурных трендов
  ax.clear()
  ax.plot(t, Tkub, 'b', Tcol, 'r', Tdef, 'g', Ttsa, 'c')
  ax.grid(True, linestyle='--')
  ax.tick_params(labelsize='small')
#  ax.set_xlabel(u'Время, отн.ед')
#  ax.xaxis.label.set_size(9)
  ax.set_xlim(0, 100)
  ax.set_ylabel(u'Температура,°C')
  ax.yaxis.label.set_size(9)
  ax.set_ylim(20, 50)
  fig.canvas.draw()

  txts[0].after(1000, meas) # Все, но через 1 сек (1000 мс) опять вызовем meas
#-------------------------------------------------------------------------------
bus = smbus.SMBus(1) # Создаем объект "шина i2c"
ps = bmp.BMP085()    # Создаем объект - датчик давления

root = Tk() # Создаем и настраиваем главное окно
root.geometry('660x266+300+200') # Размер и положение
root.wm_title('LITE: Тест всей периферии') # Заголовок
root.resizable(width = False, height = False) # Фиксированные размеры окна
root.protocol('WM_DELETE_WINDOW', wclose) # В wclose - обработка закрытия окна
# Создаем объект - чекбокс для управления контактором
vC = IntVar() # В переменной vC - состояние чекбокса (контактора)
chC = Checkbutton(text = 'Контактор', command = fC, variable = vC)

lpdm = Label(text = 'ТЭН (%)  ', width = 13, anchor = 'w') # Метка PDM
# Создаем объект - спинбокс
sbT = Spinbox(from_ = 0, to = 100, width = 3, command = fT, justify = RIGHT)
lpwm = Label(text = 'Клапан (%) = ', width = 13, anchor = 'w') # Метка ШИМ
# Создаем объект - спинбокс
sbV = Spinbox(from_ = 0, to = 100, width = 3, command = fV, justify = RIGHT)
fr1 = Frame(width = 134, height = 1, bg = 'grey')
fr2 = Frame(width = 134, height = 1, bg = 'grey')
fr3 = Frame(width = 134, height = 1, bg = 'grey')
# Создаем метки и поля выводов для остальных параметров (RMS, атм.давление,
# температуры и состояние контактов)
labels = ['RMS (В)  ', 'P(мм.рт.ст)', 'Tкуб (°C)', 'Tкол (°C)', 'Tдеф (°C)',
          'Tтса (°C)', 'Контакт 1', 'Контакт 2', 'Контакт 3', 'Контакт 4']
formats = ['%.1f ', '%.1f ', '% 7.3f', '% 7.3f', '% 7.3f', '% 7.3f',
          '%d', '%d', '%d', '%d']
fgcol = ['black', 'black', 'blue', 'red', 'dark green', 'dark cyan', 'black',
        'black', 'black', 'black', 'black']
labs = []; txts = []
for i in range(10):
  labs.append(Label(text = labels[i], width = 13, anchor = 'w', fg = fgcol[i]))
  txts.append(Label(width = 6, anchor = 'e', fg = fgcol[i]))
# Теперь размещаем виджеты в главном окне приложения
chC.place(x = -6, y = 0)  # Чекбокс контактора
lpdm.place(x = 0, y = 20)  # Метка спинбокса RMS
sbT.place(x = 92, y = 20)  # Спинбокс RMS
lpwm.place(x = 0, y = 40)  # Метака спинбокса клапана отбора
sbV.place(x = 92, y = 40)  # Спинбокс клапана отбора
fr1.place(x = 0, y = 62)  # Просто разделительная черта
offs = 63 # Текущее смещение по y
for i in range(10): # Размещаем метки и поля вывода остальных параметров
  labs[i].place(x = 0, y = offs + 20*i)
  txts[i].place(x = 85, y = offs + 20*i)
  if i == 1: # Поставим дополнительный разделитель
    fr2.place(x = 0, y = offs + 20*(i + 1))
    offs += 2
  if i == 5: # Еще один разделитель
    fr3.place(x = 0, y = offs + 20*(i + 1))
    offs += 2
# Внедряем в главное окно Tkinter-а канву графиков от matplotlib
fig = Figure(figsize = (5.5, 2.85))
ax = fig.add_subplot(111)
canvas = FigureCanvasTkAgg(fig, master = root)
canvas.get_tk_widget().place(x = 140, y = -20)

txts[0].after(1000, meas) # Через 1 сек (1000 мс) будет вызов функции meas
root.mainloop() # Главный цикл приложения
Поскольку все низкоуровневые операции вынесены на нижний уровень иерархии (силовые и цифровые модули), то софт получился сравнительно простым. БОльшая часть текста - это обеспечение GUI. Скрипт написан по-быстрому, "на коленке", но все необходимые комментарии я вставил. Поэтому разобраться будет несложно. Окно работающего приложения показано на приведенном выше рисунке в правом нижнем углу.

Погонял я этот тест... Вроде все работает правильно. Без сбоев или каких-нибудь иных чудес ;)
052_LITE_test_all_gen_view.JPG
052_LITE_test_all_gen_view.JPG Ненавязчивая автоматизация ректификационной установки. Автоматика.

test_13_gui.py.zip 4.0 Кб
gol_avto Доцент Москва - Серпухов - Анапа 1.3K 458
Отв.1195  01 Марта 18, 08:30
А датчик кубового давления MPX5010DP будем пристраивать?
Sten58 Магистр Лисичанск 217 49
Отв.1196  01 Марта 18, 08:32, через 3 мин
зачем же дома воспроизводить промышленные условия и потом с ними героически "справляться"?OldBean, 17 Февр. 18, 20:13
Однако мыши всё-таки экранированным проводом подключают Улыбающийся
PavelSaratov Доктор наук Саратов 622 80
Отв.1197  01 Марта 18, 08:44, через 12 мин
Однако мыши всё-таки экранированным проводом подключают

Внезапно там не экран а земля отдельным проводом какой нафиг экранированный провод? Мухи и котлеты как говорится.
OldBean Доцент Красноярск 1K 1.4K
Отв.1198  01 Марта 18, 09:00, через 17 мин
А датчик кубового давления MPX5010DP будем пристраивать?gol_avto, 01 Марта 18, 08:30
Да. По схеме: датчик ---> АЦП и 1-Wire Slave на базе AVR-ки ---> на один из каналов цифрового модуля.
gol_avto Доцент Москва - Серпухов - Анапа 1.3K 458
Отв.1199  01 Марта 18, 09:43, через 44 мин
Внезапно там не экран а земля отдельным проводом какой нафиг экранированный провод?PavelSaratov, 01 Марта 18, 08:44
Персонально для неверующих
Мышь.jpg
Мышь.jpg Ненавязчивая автоматизация ректификационной установки. Автоматика.