Пришла задача придумать “что нибудь” для просмотра и контроля за температурами на производстве. Был уже установлен контроллер ПЛК 160 и подключены датчики температур по интерфейсу RS-485 (Википедия).

Контроллер и датчики были установлены до меня.

Была примерная схема подключения:


Использовали CoDeSys (Википедия) для просмотра.

Не было никакой истории по температурам и неизвестно когда была авария.

Начало


Идея пришла такая — создать WEB-сайт в связке с базой MySQL и хранить там информацию по температурам и авариям.

Первоначальные задачи:

  • Просмотр данных с любого компьютера на территории предприятия
  • Просмотр текущих аварий и произошедших
  • Онлайн просмотр текущих значений
  • Изменять максимальные и минимальные значения для регистрации аварий

В дальнейшем выяснилось следующее:

Минимум и максимум недостаточны для контроля аварий.

Были добавлены критический максимум и критический минимум, а также время, во время которого температура может прийти в норму.

  1. Если температура вышла за пределы минимума или максимума, но вернулась в норму за время T, то это незначительная авария (но данная авария регистрировалась как незначительная).

    image
  2. Если температура вышла за пределы критического минимума или критического максимума, то это сразу критическая авария.

    image

Потребовалось разграничить доступ:

  • Администратор — только для меня )))
  • Технологи — для каждого датчика менять 5 параметров

    image
    Пришлось добавить изменения параметров аварии по времени. Это для того чтобы, например, с 00:00 до 09:00 не регистрировались аварии.

    image
  • Инженеры — калибровка

    По правильному необходимо с помощью ноутбука с COM портом цепляться к модулю для калибровки. Решил реализовать так же через WEB, т.е. человек занимающийся калибровкой подходит к датчику со своим термометром и выставляет фактическое значение на сайте.

    image
  • Все остальные — просмотр

Программная часть


Была создана виртуальная машина со связкой с ПЛК 160 по локальной сети.
Установлен CoDeSys.

Настроены IP адреса, чтобы компьютер видел контроллер.

image

Проект находится по пути c:\project\pro\ и называется my_work.pro.

Запуск самого проекта производится через файл run.cmd

"C:\Program Files\3S Software\CoDeSys V2.3\Codesys.exe" "C:\project\pro\my_work.pro" /userlevel 0 /password 157999 /online 

Приложение запускает файл run.cmd

WinExec(Pchar(“c:\run.cmd”), SW_HIDE);

Для получения значений температуры использовал DDE (Википедия)

config.ini

[CoDeSys]
service=CoDeSys
topic=C:\project\pro\my_work.pro
item=C:\Program Files\3S Software\CoDeSys V2.3cmd=C:\run.cmd
[db]
host=127.0.0.1
port=3306
user=root
key=keypassword
db=workdb

Старт программы:

  1. Загружаем параметры конфигурации CoDeSys из “config.ini”

    Загружаем параметры конфигурации MySQL из “config.ini”

    По Таймеру ( Определились что достаточно будет считывать данные раз в минуту ):

    • Получаем количество датчиков с MySQL
    • Для каждого датчика создаем компонент DDE.DDEConv:

      DDE.DDEConv[…]:= TDdeClientConv.Create(Self)
      DDE.DDEConv[…].ServiceApplication:=”patchcodesys”
      DDE.DDEConv[…].SetLink(“name”,”patchdde”)
      

      Создаем компонент DDE.DDEItem и связываем с компонентом DDE.DDEConv:

      DDE.DDEItem[…]:=TDdeClientItem.Create(Self)
      DDE.DDEItem[…].DdeConv:=DDE.DDEConv[…]
      

      Передаем имя датчика с MySQL:

      DDE.DDEItem[…].DdeItem:=MySQL.GetSensorName(…) 
      

      Как результат – получаем значение температуры:

      DDE.DDEItem[…].Text
      

      Сохраняем текущее значение температуры и их параметры для каждого датчика.

      MySQL.InsertTemp(MySQL.GetSensorName(...),”Температура”,INSQL(UMin[...]),INSQL(UMax[...]),INSQL(CRMin[...]),INSQL(CRMax[...]))
      

    • Получаем из MySQL на текущую дату и время:

      Минимум

      UMin[I…]:=OUTSQL(MySQL.GetMin(MySQL.GetSensorName(…)))

      Максимум

      UMax[…]:=OUTSQL(MySQL.GetMax(MySQL.GetSensorName(...)))

      Критический минимум

      CRMin[…]:=OUTSQL(MySQL.GetCriticalMin(MySQL.GetSensorName(…)))

      Критический максимум

      CRMax[…]:=OUTSQL(MySQL.GetCriticalMax(MySQL.GetSensorName(…)))

      Время

      CRTime[…]:=MySQL.GetCriticalTime(MySQL.GetSensorName(…))

      Примечание: «Защита от дурака» – если минимум больше максимума или наоборот – то меняем эти значения местами.

      if (UMin[…]>=UMax[…]) then
      begin
      UM[…]:=UMin[…];
      UMin[…]:=UMax[…];
      UMax[…]:=UM[…];
      end;
      

    • Авария:

      Если не было аварии создаем запись

      MySQL.InsertCrash(FormatDateTime('yyyy-mm-dd hh:nn:ss', dt),FormatDateTime('yyyy-mm-dd hh:nn:ss', dt),MySQL.GetSensorName(...),…)

      Если была авария обновляем

      MySQL.UpdateCrash(MySQL.GetCrashID(MySQL.GetSensorName(...)),FormatDateTime('yyyy-mm-dd hh:nn:ss', dt),…)

      Авария закончилась устанавливаем Флаг завершения

    WEB-сайт


    Написал страницы на PHP.

    Главная страница (кусок кода, сильно не пинайте):

    <?php
    require 'config.php';
    session_start();
    $page = isset( $_GET['page'] ) ? $_GET['page'] : "";
    
    switch ( $page ) {   
        case 'login':
            login();
            break;
        case 'logout':
            logout();
            break;
        case 'list':
            listpage();
            break;                             
    …………………..
      ?>

    Остальные страницы примерно такого же типа. Каждая страница обрабатывает свои данные.

    Что сделано:

    • Список датчиков. Наименования, Имя датчика для программы, Тип датчика.

      image
    • Датчики были Сгруппированы по назначению.

      image
    • Добавлены “статусы аварий”: В процессе аварии, Авария завершена, Критическая авария.
    • Реализовано добавление пользователей и их роли.
    • Логирование кто что делал.
    • Архив всех аварий.
    • Графики.

    Костыли


    1. При запуске программы CoDeSys выходит окошко:

      image
      Программно его закрываем.

      W_WND_Button_Run: HWND:
      W_WND_RUN: HWND;
      C_Button_Message='Button';
      C_CoDeSys_Message='CoDeSys';
      
      W_WND_RUN := FindWindow(nil,C_CoDeSys_Message);
       if W_WND_RUN<>0 then
      begin
      W_WND_Button_Run:=FindWindowEx(W_WND_RUN, 0,C_Button_Message, nil);
       if W_WND_Button_Run<>0 then
      begin
      SendMessage(W_WND_Button_Run, WM_LBUTTONDOWN, 10, 10);
      SendMessage(W_WND_Button_Run, WM_LBUTTONUP, 10, 10);
      SendMessage(W_WND_Button_Run, WM_LBUTTONDOWN, 10, 10);
      SendMessage(W_WND_Button_Run, WM_LBUTTONUP, 10, 10);
      end;
      end;
      

    2. Вдруг контроллер отключили.

      image

      W_WND_Error:=FindWindow(nil,'Ошибка');
      if W_WND_Error<>0 then
      begin
       W_WND_Button_Error:=FindWindowEx(W_WND_Error,0,'Button', nil);
      if W_WND_Button_Error<>0 then
      begin
      SendMessage(W_WND_Button_Error, WM_LBUTTONDOWN, 10, 10);
      SendMessage(W_WND_Button_Error, WM_LBUTTONUP, 10, 10);
      SendMessage(W_WND_Button_Error, WM_LBUTTONDOWN, 10, 10);
      SendMessage(W_WND_Button_Error, WM_LBUTTONUP, 10, 10);
      PostMessage(FindWindow(PChar(C_CoDeSys),nil), WM_QUIT, 0, 0);
      end;
      end;
      

    3. Непонятное зависание.

      image

      Перезапускаем приложение.

      C_CLOSE_DEBUG='CoDeSys for Automation Alliance (debug)';
      W_WND_CLOSE:=FindWindow(nil,C_CLOSE_DEBUG);
      if W_WND_CLOSE<>0 then
      begin
      KillProcess('Codesys.exe');
      KillProcess('WerFault.exe');
      PostMessage(FindWindow(PChar(C_Close_DEBUG),nil), WM_QUIT, 0, 0);
      PostMessage(FindWindow(PChar(C_CoDeSys),nil), WM_QUIT, 0, 0);
      MySQL.InsertLog('Error debug.. Kill process - codesys.exe and WerFault.exe');
      MySQL.InsertLog('Restart programm');
      RestartThisApp;
      end;
      
      //Убиваем процесс
      
      function KillProcess(ExeName: string): LongBool;
      var
        B: BOOL;
        ProcList: THandle;
        PE: TProcessEntry32;
      begin
        Result := False;
        ProcList := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        PE.dwSize := SizeOf(PE);
        B := Process32First(ProcList, PE);
        while B do begin
          if (UpperCase(PE.szExeFile) = UpperCase(ExtractFileName(ExeName))) then
            Result := TerminateProcess(OpenProcess($0001, False, PE.th32ProcessID), 0);
          B:= Process32Next(ProcList, PE);
        end;
        CloseHandle(ProcList);
      end;
      
      //Рестарт приложения
      
      procedure TForm1.RestartThisApp;
      begin
        ShellExecute(Handle, nil, PChar(Application.ExeName), nil, nil, SW_SHOWNORMAL);
        Application.Terminate; // or, if this is the main form, simply Close;
      end;
      

    ZABBIX


    Создал узел сети с адресом 127.0.0.1.

    В нем правило обнаружения с наименованием “Датчики”.

    image

    image

    Прототипы элементов данных.

    image

    Прототипы триггеров.

    image

    Добавляем в zabbix_agentd.conf

    UserParameter=sensors[*],/usr/lib/zabbix/alertscripts/sensors.sh
    UserParameter=crash[*],/usr/lib/zabbix/alertscripts/crash.sh $1
    

    Сами скрипты:

    sensors.sh

    #!/bin/sh
    unset id
    unset res
    id=(`echo "select id FROM sensor WHERE type='1'" | mysql -uroot -pПароль -D workdb -h 0.0.0.0 --default-character-set=utf8 2>/dev/null`)
    echo '{ "data": ['
    for (( count=1; count<${#id[@]}; count++ ))
    do 
    res=(`echo "select name FROM sensor WHERE (type='1' and id='${id[$count]}') " | mysql -uroot -pПароль -D workdb -h 0.0.0.0 --default-character-set=utf8 2>/dev/null `)
    r={${res[@]}
    l=${#r}
    res1=(`echo "select param FROM sensor WHERE (type='1' and id='${id[$count]}') " | mysql -uroot -pПароль -D workdb -h 0.0.0.0 --default-character-set=utf8 2>/dev/null `)
    r1={${res1[@]}
    l1=${#r1}
    res2=(`echo "select ddename FROM sensor WHERE (type='1' and id='${id[$count]}') " | mysql -uroot -pПароль -D workdb -h 0.0.0.0 --default-character-set=utf8 2>/dev/null `)
    r2={${res2[@]}
    l2=${#r2}
    res3=(`echo "select min FROM temp_${r2:17:l2} ORDER BY id DESC LIMIT 1 " | mysql -uroot -pпарольs -D workdb -h 0.0.0.0 --default-character-set=utf8 2>/dev/null`)
    r3={${res3[@]}
    l3=${#r3}
    res4=(`echo "select max FROM temp_${r2:17:l2}  ORDER BY id DESC LIMIT 1 " | mysql -uroot -pПароль -D workdb -h 0.0.0.0 --default-character-set=utf8 2>/dev/null`)
    r4={${res4[@]}
    l4=${#r4}
    res5=(`echo "select cmin FROM temp_${r2:17:l2}  ORDER BY id DESC LIMIT 1 " | mysql -uroot -pПароль -D workdb -h 0.0.0.0 --default-character-set=utf8 2>/dev/null`)
    r5={${res5[@]}
    l5=${#r5}2>/dev/null 
    res6=(`echo "select cmax FROM temp_${r2:17:l2} ORDER BY id DESC LIMIT 1 " | mysql -uroot -pПароль -D workdb -h 0.0.0.0 --default-character-set=utf8 2>/dev/null`)
    r6={${res6[@]}
    l6=${#r6}
    res7=(`echo "select param FROM temp_${r2:17:l2} ORDER BY id DESC LIMIT 1 " | mysql -uroot -pПароль -D workdb -h 0.0.0.0 --default-character-set=utf8 2>/dev/null`)
    r7={${res7[@]}
    l7=${#r7}
    
    s=$s'{ "{#SID}": "'${id[$count]}'", "{#SNAME}": "'${r:5:l}'", "{#SDDENAME}": "'${r2:17:l2}'" , "{#SPARAM}": "'${r7:7:l7}'", "{#SMIN}": "'${r3:5:l3}'", "{#SMAX}": "'${r4:5:l4}'", "{#SCMIN}": "'${r5:6:l5}'", "{#SCMAX}": "'${r6:6:l6}'" },'
    done
    a=${#s}
    b=${s: 0: $a-1}
    c=${#b}
    d=$b
    echo $d']}'
    

    crash.sh

    #!/bin/sh
    a=$1
    unset res
    res=(`echo "select flag, id_status FROM crash WHERE  id_sensor='$a' ORDER BY id DESC LIMIT 1 " | mysql -uroot -pПароль -D workdb -h 0.0.0.0  --default-character-set=utf8 2>/dev/null `)
    for (( count=2; count<${#res[@]}; count++ ))
    do 
    s=$s' '${res[$count]}
    done
    b=${s:0:2}
    c=${s:3:4}
    if [ $b = 0 -a $c = 1 ] 
    then
    echo 0
    else
    echo 1
    fi
    

    А дальше через zabbix можно и отправлять на почту и смс и многое другое.

    Результат


    Получилась система мониторинга температур на предприятии с просмотром текущих и произошедших аварий.

    image

    Подробнее об аварии.

    image

    На данный момент добавлены датчики открытия/закрытия дверей.

    Плюсы:

    • Минимальные затраты (относительно).
    • Плюс к карме (?).
    • Мониторинг работает уже 3 года.

    Минусы:

    • Много точек отказа: контроллер, сеть, программа CoDeSys, виртуальная машина, MySQL, IIS.

    P.S.

    Не пинайте сильно. Это первая моя статья.

Комментарии (62)


  1. alex_kag
    09.10.2019 18:35

    Если я не путаю, то модули мб110 умеют общаться по modbus?.. Поэтому у меня возникает вопрос, а зачем вам контроллер? С учетом того, как построена система, возможно будет проще выкинуть контроллер, написать свой опросчик датчиков и избавиться от codesys и контроллера?
    Так же не понятна фраза про калибровку.


    1. torum Автор
      10.10.2019 07:19

      В посте написал:
      «Контроллер и датчики были установлены до меня.»
      Я не разбираюсь в контроллерах и в модулях. Все датчики, модули и датчики устанавливал другой человек. Мне была поставлена задача сделать «мониторинг температур».
      На тот момент для меня было проще установить CoDeSys на виртуалку и считывать данные, не вдаваясь в подробности что и как подключено. Но знаю, что датчики установлены далеко друг от друга (на расстоянии более 100 метров), поэтому и были установлены модули.

      Для получения более правдивых значений температур необходима калибровка.
      В руководстве по эксплуатации «ОВЕН МВ110-224.8А МОДУЛЬ АНАЛОГОВОГО ВВОДА
      АРАВ.421459.002-05 РЭ» написано:
      «Полученные в результате вычислений отфильтрованные текущие значения
      измеренных величин могут быть откорректированы прибором в соответствии с заданными
      пользователем корректирующими параметрами.
      В приборе для каждого канала измерения предусмотрены два корректирующих параметра,
      с помощью которых можно осуществлять сдвиг и изменение наклона измерительной
      характеристики. Сначала выполняется сдвиг, затем наклон характеристики. „

      Для этого необходимо подключаться к каждому модулю и настраивать параметры.

      Для упрощения `калибровки` — разницу между фактической и показываемой температурой устанавливается через WEB-сайт, чтобы температура была максимально правдивой.


    1. xztau
      10.10.2019 08:30

      Скорее всего, контроллер тут как централизованный узел связи. RS-485 <-> Сеть предприятия.
      И немножко логики (хранение архивов) наверное. Если не МБ200 с Ethernet то всё равно придётся какой то преобразователь типа ICP-DAS Modbus RTU — Modbus TCP или COM — Ethernet лепить.


      1. torum Автор
        10.10.2019 08:54

        Да именно так — контроллер это центральный узел где «собираются» все значения с модулей.
        Сам контроллер находится примерно в 500 м. от нашего ЦОДа.


  1. Arson
    10.10.2019 08:12

    А временнЫе настройки связаны с отключением холодильников на ночь? Если так, то добавьте контроль ручного включения питания и по нему сбрасывайте алерт, тогда не нужно будет аварийные уставки менять.


    1. torum Автор
      10.10.2019 08:36

      Не только. Например днем идет выгрузка товара и температура в холодильниках будет выше в любом случае. И чтобы не было аварий в этом случае — изменить минимальную температуру.


      1. Arson
        10.10.2019 08:39

        Эту задачу решит датчик открытия дверей. Дергать уставки — не есть правильно.


        1. torum Автор
          10.10.2019 09:09

          Стоят датчики открытия/закрытия дверей и подключены к контроллеру.
          Но они не используются в обработке аварии.
          В каждом холодильнике 4 двери и 4 датчика.
          Пытался сделать зависимость температуры от открытия дверей — но вышла слишком длительная обработка запросов — от 5 минут и выше.
          На данный момент записей «о дверях» в базе MySQL — ~8,250,849
          Пример одной записи:
          id -78069049
          ID Датчика — 45
          Время -2019-10-10 10:11:33
          Статус-1 или 0 (Открыт или закрыт)


          1. Arson
            10.10.2019 11:35

            А зачем зависимость? Дверь открыта — игнор температуры, дверь открыта долго — авария закрытия дверей… Это если навскидку, а так, конечно, нужно описание технологического процесса, чтобы нормально спроектировать АСУ ТП.


            1. torum Автор
              10.10.2019 12:50
              +1

              Это не АСУ ТП — это СИСТЕМА МОНИТОРИНГА.
              Датчики дверей нужны были узнать как влияет открытие дверей на температуру в холодильниках.
              Например открыли дверь во время выгрузки товара на 20 минут — на сколько изменилась температура в холодильнике.
              И на какое время лучше открывать холодильник для нормальной работы.


              1. Arson
                10.10.2019 13:18

                А мониторинг для чего? :) Если по данным от этой системы мониторинга управляют каким-то процессом — то это часть АСУ ТП, в этом смысл мониторинга параметров :)


                1. torum Автор
                  10.10.2019 13:59

                  Ну тут спорный вопрос.
                  Система мониторинга изначально создавалась для просто для Анализа.
                  Хотя с другой стороны можно сказать и так, что это часть АСУ ТП.


                1. Alexeyslav
                  10.10.2019 17:04
                  +1

                  Мониторинг тут нужен не для управления производством, а для того чтобы выявить аварийные ситуации выхода холодильников из строя. Хотя, если по этим данным будет считаться наработка холодильных установок и их плановая замена то можно посчитать что это один из вторичных контуров обратной связи АСУ ТП… проходящий через бухгалтерию.


                  1. neco
                    10.10.2019 17:58

                    у нас примерно так и устроенно (я не автор статьи, там выше я комент оставил у нас похожая система)

                    очень удобно инженерам предсказывать выход холодильников из строя, замены, держать резерв… очень прям много практических случаев, плюс у нас в ночь идет сигнал дежурному по корпусу, он идет и смотрит что случилось… а дальше принимает решение по регламенту звонить хозяину или там подождет до утра…


  1. xztau
    10.10.2019 08:27

    Прикольненько.
    А почему, кстати, отказались от OPC сервера? Вроде бы не дорого стоит, с ODBC даже. Проще архитектуру разбить.
    ОВЕН ПЛК160 может в Modbus TCP (правда, конфигурировать нужно). Тут, насколько я понял как то неявно используется OPC DA среды Codesys? Можете поподробнее эту тему раскрыть?

    Кстати, а как Вы записываете калибровочные коэффициенты в модуль? Программа в ПЛК постоянно их пишет?


    1. alex_kag
      10.10.2019 08:50

      Хотелось бы еще чуть больше подробностей, какие используются термометры, и почему используются аналоговые модули а не температурные (а они у овена есть?).


      1. torum Автор
        10.10.2019 08:57

        К сожалению я не занимался установкой самих контроллеров, модулей и датчиков. Я занимался только программной частью.
        Всем этим железом занимался другой человек. Не знаю по каким принципам он это делал.


      1. xztau
        10.10.2019 11:26

        Входа то универсальные, как настроишь (термопара, термометр сопротивления, и т.п.) так и будет. Датчики то аналоговый сигнал выдают. К модулю пачка датчиков подходит.
        А если температура высокая или датчик в трубе где-нибудь, то всякие там ПВТ10 модули не подойдут.


        1. torum Автор
          10.10.2019 11:54

          Знаю что некоторые датчики температур установлены в холодильниках, где температура может достигать до -36.
          Есть датчики температур где температура +60 и выше.


  1. torum Автор
    10.10.2019 08:50

    OPC сервера — рассматривал и такой вариант, но честно говоря не разобрался в нем.
    Калибровочные коэффициенты записываются так:
    Инженер подходит к датчику и устанавливает рядом свой термометр, который по умолчанию верный (хотя тоже под вопросом, но так должно быть).
    Устанавливает значение с ЕГО термометра в веб-интерфейсе и сохраняет это значение.
    В PHP из реального значения вычитает фактическое:

    $real=(float)$_POST['real']-(float)$sensor->param;

    Получается коэффициент, который в дальнейшем и используется.


    1. AKudinov
      10.10.2019 09:28

      Разве это правильно?
      Выше Вы цитировали мануал «Овна», там идёт речь о двух параметрах: наклоне и смещении характеристики. По одной точке их не определить. Вы, грубо говоря, корректируете только смещение. И только при данной температуре показания будут верными; при другой температуре он будет врать, и чем дальше от температуры «калибровки», тем сильнее.


  1. torum Автор
    10.10.2019 09:41

    Тут нет ничего страшного.
    Диапазоны измеряемых температур не очень большие.
    И погрешность в любом случае будет, но в пределах нормы.
    Допустимая погрешность во время реализации решили сделать 1 градус Цельсия.
    У меня не было задачи получать максимально точные значения — главное чтобы все фиксировалось.


  1. neco
    10.10.2019 11:22

    несколько вопросов:
    1. сертифицировалась ли система целиком как средство измерения?
    как она проходит в предприятии для чего она вобще создавалась? для прохождения ISO?
    2. сколько всего примерно датчиков?
    3. какой тип датчиков? (модель\название)
    4. как часто собираются данные с датчиков?
    5. какое типичное время реации на аварию? задержка?


    1. xztau
      10.10.2019 11:39

      Что то Вы недопонимаете тут.
      Это система регистрации параметров. Она не завязана на технологический процесс (на сколько я понял).
      1) Зачем? Это же не производственная система. И на безопасность не влияет. А вообще, у овен МВ110 А есть сертификат средства измерения (на сайте смотреть). У датчиков тоже — в паспорте указано.
      2) Картинка же есть.


      5) Вообще, тут не должно быть аварий. Тут… как это по-русски… «алармы». Эта система ничего не включает и ничего не выключает. Даже звонка нет. Чистая регистрация.


    1. torum Автор
      10.10.2019 11:51
      +1

      1. Система не сертифицировалась. Это внутренний продукт для внутреннего использования.
      Создавалась найти нарушения в тех. процессах, когда и что случалось.
      Узнать причину из-за кого случилась авария — оборудование или человеческий фактор.
      Вся система мониторинга создавалась для АНАЛИЗА руководством что можно изменить или улучшить.
      2. 26 датчиков температур, 21 датчик температур.
      3. Типы датчиков не знаю.
      4. С температур — каждую минуту (этого достаточно). Двери — по факту.
      5. Реакции нет. Только просмотр и анализ по этим данным.


    1. torum Автор
      10.10.2019 11:58

      Мониторинг в процессе работы указал на некоторые проблемы:
      1) Человеческий фактор — не всегда закрывают двери, либо не плотно.
      2) Открывают двери на продолжительное время.
      3) В какое время приходит пик на выгрузке и отгрузке.

      Сейчас на вскидку не могу сказать


      1. neco
        10.10.2019 16:40
        +1

        благодарю за ответ.

        5. Реакции нет. Только просмотр и анализ по этим данным.

        под словом «реация» я подразумевал время от реального превышения температуры до того как в журнал запишется алярм — это задержка опроса датчика, выборка и анализ из базы и т.д. — т.е. фактическая задержка между превышением и появлением надписи на веб-странице клиента.

        в свою очередь, могу рассказать, что у нас похожая система, и также именно мониторинга, без всяких сертификаций и прочего, с похожими целями.

        похожая архитектура: на нижнем уровне сеть на rs-485, с которых (без контроллера) собираются данные на сервера в sql-базу, а сверху уже самописанная логика отображений архивирования и прочего.

        у нас на текущий момент ~700-800 температурных датчиков ds18b20 и еще около 20 датчиков влажности ну и прочая всякая мелочь типа датчика давления воздуха… четыре sql-сервера в репликации между четырьмя корпусами…

        а начинали мы примерно также… с 20 холодных складов…

        кстати очень правильно что вы не стали использовать OPC и SCADA, потому что это такие грабли в настройке и тихий ужас… (кто работал с OPC-DA2 в современных сетях тот меня поймет там одни только настройки безопасности чего стоят)

        я как-то лет 8 назад писал статьи про это, но с тех пор уже все поменялось совсем, если будет время и я созрею желанием я напишу как оно у нас сейчас устроенно…


        1. torum Автор
          11.10.2019 07:02

          5. Время реакции — фактически сразу выводится в вебе после аварии.
          Страница каждую секунду обновляет информацию.


  1. SeyranGV
    10.10.2019 13:41

    Честно признаюсь что прочитал только первый абзац и все картинки посмотрел, но я очень надеюсь что это статья о том как делать нельзя. Если все таки люди в здравом уме и трезвой памяти такое творят, то могу предложить более (на много более) дешевое и во много раз более стабильное решение, а самое главное намного более простое и стабильное.


    1. torum Автор
      10.10.2019 13:46

      Данная система была сделана 2015-2016 годах. Аналоги на такую систему были дороги для предприятия. Поэтому сделано было своими силами при минимальных на тот момент затратах.
      И эта система изначально не была идеальной, но она нужна была.


    1. alex_kag
      10.10.2019 13:48
      +1

      Хм, интересно было бы услышать, какое же решение будет на МНОГО БОЛЕЕ дешевое? удешевлять данную конструкцию можно только 1 способом — убрать контроллер, вместо него поставить модуль rs485/ethernet, оставить модули оставить термометры и модули mb110. Да, возможно есть модули преобразователей температуры в цифру другого производителя и вдобавок дешевле, но… Как правило, стараются использовать то, что доступно.


      1. torum Автор
        10.10.2019 13:51

        На тот момент как раз и использовали что было.
        Чтобы сейчас поменять что либо необходимо заново все переделывать.
        Желания у руководства нет (да и у меня если честно нету) — «работает и ладно».


        1. alex_kag
          10.10.2019 14:09

          Так я этот понял. Мне вот интересно, что же такого хитрого, причем промышленного, может предложить SeyranGV в виде решения?


      1. hooperer
        10.10.2019 17:32
        +1

        ну как " услышать какое решение будет МНОГО БОЛЕЕ Дешевое:
        Первый пример это когда считать исключительно оборудование:
        вместо ПЛК 160 который стоит 31 000р поставить м3000-Т который стоит 17 000р. и обойтись без сервера. то-есть минус 15к денег и минус сервер(сколько он там стоит?) плюс 5к от инсата за лицензию на число пользователей до 50. Вопрос цены сервера.

        Второй вариант — это когда считать всё на круг — и протяжку проводов, и блоки питания для каждого модуля, и пуско-наладку этого всего и обслуживания:
        Хардкорно дешевле в части минимизации проводов и ПНР-а тоже можно — Вельком к компании Болид за КВТ10/20/60. Где сразу в комплекте до 60-и датчиков С2000-ВТ на двух проводах вешаются, имеют каждый свой номер(уже выгравированный в комплекте) и выдают все значения с графиками в веббраузер. (с шахматами и библиотекаршами по желанию)
        По сравнению с 8А к которым вести 485 и питание к каждому а потом термосопротивлениями обвязывать это хозяйство — это прямо Совсем другое по цене включая пусконаладку.

        Конечно вопрос к диапазону, поверке/юстировке и прочему.
        И да, чтобы не совсем компанию рекламировать- все таки у других компаний вполне себе есть решения на Dalas овских датчиках 1-wire уже готовым комплектом. Что для таких измерений температуры может быть более чем достаточным. Это же не в горне измерять температуру


        1. hooperer
          10.10.2019 20:28

          И да, вариант — ВАйронборд, контроллер за те же 14 000 и да.
          И да, у них есть датчики DS18B20 по 400 рублей. Дороже термосопротивления? так 8А в максималке 8 сопротивлений 6200. плюс по 200 рублей 8 датчиков, плюс 1000 рублей блок питания. на круг получается 8 датчиков это 9000 за 8 датчиков. со скидками положим 8 000 -на 8 датчиков.
          Итого по 1000 рублей на датчикв текущем решении, против 400 от вайронборда. Ну и без проблем с кучей проводов и пауков. и настроек-юстировок.

          Опять же на круг по оборудованию от вайренборда получилась бы арифметика — ПЛК 31000 заменить на плк за 15 000. Четыре модуля 8А по 6 тысяч и 20 датчиков — 26 000 рублей заменить на 8 000. Итого решение дешевле предлагаемого по оборудованию на 32 000 рублей. ПО материалам и пуско-наладке такое решение в разы дешевле. Два провода вдоль ветки вместо блоков питания и кучи проводов к термодатчикам. при разветвлении модуль за 8 000 ничем не дороже чем модуль аналогово ввода.
          И да, 1 -wire всё-таки цифровая линия, а термосопротивления, от которых идёт провод длинной больше 2-х метров в производственном помещении, да ещё и в коробе с остальными проводами… это удовольствие для Сильных Духом.


          1. Alexeyslav
            11.10.2019 10:46

            Линия цифровая, посему более чувствительна к наводкам. Аналоговый сигнал можно сгладить и отфильтровать, пустить по витой паре и все дела. Этот самый 1-wire далласовсого термометра очень фигово работает уже на кабеле от 1 метра и больше в идеальных условиях. Постоянно нужно шаманить и играться с сопротивлением подтяжки чтобы датчик заработал и не перегревался(если перестараться с подтяжкой и постоянно опрашивать датчик можно получить погрешность более 1 градуса из-за саморазогрева в воздушной среде).


            1. hooperer
              11.10.2019 13:35

              Далас если не в пром зоне то до 30 метров вообще-то.
              По сравнению с гулянием напряжения на аналоговом Термосопротивлении это прямо вот земля и небо. Чего и Как Вы можете фильтровать на самом модуле 8А Большой вопрос))) Могу на него ответить, ибо чуть более пары лет назад это было в моей полной компетенции — почти ничего. Ну кроме постоянной составляющей и низкочастотного фильтра — сумматора по 8-и циклам опроса… и на уровне преобразователя ничего по сути и не сгладить.

              достаточно странно что он работал у Вас на 1-метровом кабеле в идеальных условиях. Даже китайские аналоги таким не грешат. 30 метров рядом с частотником — можно поверить. Но аналоговый 8А с датчиком скажем cu50 на 30 метров рядом с частотником будет с Большой долей вероятности показывать всё-таки погоду на Плутоне.
              Достаточно интересно, иногда, наблюдать как пытаются померить температуру Длинным проводом. Когда посередине этого кабеля стоит Частотник скажем на 7.5кВ. Значения получаются весёлые, но смотреть при этом более интересно как загораются неонки.
              Да, с 1-wire то проблемы тоже есть, оно не для пром зоны. Но все-таки попытка измерения сопротивления на расстоянии в 30 метров. не сильно высоким напряжением без большого тока — дело такое. Более Сильно зависящее от помех.
              Одно дело не получить значение пару периодов. А другое дело когда медиана значения понижается из за помехи. — значение получается не верное.


              1. Alexeyslav
                11.10.2019 13:47

                ТС обычно подключаются по 3-х или 4-х проводной схеме, и там никаких проблем с наводками нет — сопротивление датчика порядка 100 Ом, какую наводку надо на него навести чтобы что-то поехало? Темболее если линия симметричная и наводка, если она есть, будет обусловлена неидеальностью линии. В модуле фильтрация по входу не предусмотрена наверно потому что в правильных вариантах подключения ТС никаких наводок нет и в помине.


                1. hooperer
                  11.10.2019 14:05

                  4-х проводную схему для подключения датчика температуры который нужен
                  под указанную автором задачу? о_О
                  причём это же на каждый из 20-и датчиков.
                  Страх и Ужас по сравнению с двупроводной линией вселяет пуско-наладка такого решения даже при его разводки utp кабелем, не говоря уж про стандартные провода к термо-сопротивлениям.

                  По смыслу да, в пром зоне достаточно частая работа и аналогов ей нет. Да модули 8А хорошо зарекомендовали себя в пром. зоне. Да хорошо их менять и обслуживать клеммниками.
                  Да альтернативы слишком дороги или не серьёзны — если это управление Тех процессом.

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

                  Ездить в магазин на Белазе за хлебом может и прикольно, но вообще-то достаточно часто это дороже чем на маленькой машине. Хотя бывают и приятные исключения )))


          1. aptem334
            11.10.2019 10:54

            или dcsun от технолоджико, дороже, но зато настройка элементарная и отображение понятное.


        1. Alexeyslav
          11.10.2019 10:33

          Даласовские датчики по двум проводам особо не подключишь. В «однопроводном» режиме у них ограничение на длину провода в 1 метр, если не ошибаюсь. Некоторые работают и на 10 метрах но нестабильно и надо шаманить — для производства не подойдёт. А что это значит? — к каждому датчику по контроллеру…


  1. Dim252
    10.10.2019 13:46

    Может прикрутить 160й к owencloud ??
    А уже оттуда парсить данные.


    1. torum Автор
      10.10.2019 13:48
      +1

      Не вариант.
      Интерфейс был сделан минимально простым для пользователя — «нажать сюда и сюда чтобы появилось то то и то то..»


      1. Dim252
        10.10.2019 14:24

        Я про это и говорю… 160й спокойно шлет данные в облако, они там и лежат…
        А ты обращаешься к облаку только для отображения. Не нужны костыли с codesys


        1. torum Автор
          10.10.2019 14:29

          В те далекие времена 2015-2016 owencloud-а не было ))))
          На данный момент данную систему не планирую.


    1. torum Автор
      10.10.2019 13:57

      Первый вариант было сделать через ZABBIX.
      Но есть сложность просматривать, менять параметры для конечного пользователя.


  1. hooperer
    10.10.2019 15:04

    Интересное решение, не смотря на странный подбор оборудования.
    То-есть под такое ТЗ я бы выбрал другую среду исполнения — ms4d ( хотя бы даже 110[m02] ms4d), в которой весь описываемый функционал уже есть, и кроме него не потребуется сервера с ПО, но это уже другая история, а начальные условия, видимо, предполагали конкретно это оборудование.
    Решение прямо Очень интересное и красивое именно в реализации — респекты за реализацию, однозначно!


  1. roller
    10.10.2019 15:21

    Правда здорово жить в альтернативной вселенной, где Prometheus и Grafana еще и не придумали?


    1. hooperer
      10.10.2019 16:22

      да, альтернативная вселенная классная,
      И мне в ней нравятся решения своей Изящной красотой.
      Да, Prometheus на Овеновский ПЛК не поставить. Ну то-есть Go для него врят-ли соберут в ближайшие 5 лет — нет таких задач скорее всего. Хотя мысль интересная, поставить на контроллер рядом с python и lua какой нибудь Go с целью красиво запрометеяться, Спасибо, попробую к Новому Году.


      1. roller
        10.10.2019 17:13

        Так прометеус и не нужно затаскивать ни на какой ПЛК, на ПЛК должен быть запущен минимальный веб сервер, написанный хоть на баше хоть на ассемблере который отдаст по урлу "/metrics" метрики. Концепция прометеуса в том что оно pull-ит данные.


        1. hooperer
          10.10.2019 17:21

          «ну это то мы могём(с)». выдать метрики по url это ну совсем просто. я имел ввиду как готовое решение, всё на контроллере ибо линукс "… без регистрации, серверов и смс". где «без серверов» = без настройки серверов и это ключевой параметр для моей целевой группы(((


          1. roller
            10.10.2019 17:30

            Ок, ходить с внешнего сервера через прокинутый порт. Вот пожалуй самое простое решение для тех кто не хочет ставить прометеус рядом. И соответственно и прометеус и графану настроить где-нибудь на любой VPS что будет даже надежнее. Ничего не сломает уборщица махая шваброй рядом.


            1. hooperer
              10.10.2019 17:40

              ну как бы openvpn и всё такое даже, если что бывает и даже на плк. опять же прометеус внутри малинки наверняка заработает(не проверял), значит гигагерца на а9 с 512 памяти ему хватит(ни чем не обоснованные предположения) — а зачем плодить сущности во вне, если можно сделать всё внутри и достаточно красиво? это так думается потому что как то в embedded вставлял zabbix сервер, а там рельса. И как то он не много «кушал».


              1. roller
                10.10.2019 18:24

                Прометеусу воможно хватит, графане точно нет.


                1. hooperer
                  10.10.2019 20:18

                  печаль-тоска, но Прометеуса может быть и достаточно.

                  Кстати говоря не только мои контроллеры так могут — wirenboard тоже вполне себе может позволить себе поставить на борт Прометеус и не чихнуть. Благо там мфти… и студенту дать задачу — для них вполне себе забава. Да, полетит ниже чем моё....-требования к Оси придирчивы — но с бОльшей вероятностью всё таки полетит. И даже может быть будет красиво )


    1. torum Автор
      10.10.2019 17:26

      Ну я решил написать «свой велосипед». Я думаю у многих есть «велосипеды». И ничего плохого там нет. Зато свой, подпинываешь, но едешь.


      1. neco
        10.10.2019 18:02

        да полезен велосипед, вот как практик могу сказать, что все эти решения «из коробки» надо допиливать до конкретных нужд производства и задачи, и вот это то допиливание стоит очень сильно большие деньги чем сделать самому «как надо»…


      1. hooperer
        10.10.2019 20:31

        Да, и частенько он, свой «велосипед» Весьма Интересен.
        Смотришь на него и понимаешь — Да, не зря Сделал.
        Едет?
        Да!
        Красивый?
        Да! ( ну по-крайней мере мне понравились картинки)


    1. torum Автор
      10.10.2019 17:28

      Это все можно поставить но как дополнением для красоты.


  1. crustal
    10.10.2019 22:58

    Честно признаюсь что прочитал только первый абзац и все картинки посмотрел, но я очень надеюсь что это статья о том как делать нельзя. Если все таки люди в здравом уме и трезвой памяти такое творят, то могу предложить более (на много более) дешевое и во много раз более стабильное решение, а самое главное намного более простое и стабильное.

    Первая мысль, когда прочел такое, — сказать слово из трех букв. Оно уже много раз произносилось на этом форуме — IoT. Если не надо ничего сертифицировать, то — вперед на AliExpress, там этого барахла за копейки немеряно — всякие сенсоры и проводные и беспроводные, и на ESP2866 и по всякому другому в т.ч. в промышленном исполнении. Будет работать, куда оно денется.

    Я бы в те годы, если бы меня спросили, выбрал бы наверное такую вещь
    NUCLEO-F746ZG за пару тысяч рублей
    www.chipdip.ru/product1/8001822734
    от 3 шт. — 2 057 руб.

    Nucleo-144 F746ZG Example Jan 22, 2016 Carmine Noviello
    www.youtube.com/watch?v=ANfsMislJFg
    «The video shows a web server running on the Nucleo-144 F746ZG. The web app runs on bootstrap and jQuery and it allows to interact with LEDs and USER button.»

    К такому «web server running on the Nucleo-144 F746ZG» можно подключить наверное с полсотни термометров 1-wire, а можно и только один.

    А дальше уже дело техники, как вы будете эти данные забирать оттуда, где хранить, как обрабатывать и что давать клиенту. Не факт, что веб-сайт — это лучший вариант, может для простоты и надежности — просто десктопное приложение, работающее с сервером базы данных.


    1. torum Автор
      11.10.2019 07:07

      На тот момент контроллер достался бесплатно. К нему просто докупили пару модулей и датчиков температуры.
      Задача была — на любом компьютере предприятия открывать данную систему и без установки.
      Веб-сайт был лучшим решением.


      1. crustal
        13.10.2019 12:20

        На тот момент контроллер достался бесплатно. К нему просто докупили пару модулей и датчиков температуры.

        Зачем докупать что-то к тому, что не нужно? Зачем вам контроллер, если у вас уже есть PC? Адаптер RS-485 на COM порт купить и модули с датчиками. Сколько там того кода на С# по работе с COM портом для имитации Modbus. Зачем громоздить кучу слоев чтобы потом продираться через забытый всеми механизм DDE?

        Впрочем, я бы и эти RS-485 модули с датчиками не стал покупать, не температуру в домне же мониторить. Упомянутая плата разработчика за 2т рублей с Ethernet, веб-сервер на нем, блок питания MEAN WELL, платиновый элемент измерять температуру, к нему собрать мостовую схему, усилить разность операционным усилителем, подать на аналоговый вход микроконтроллера, всё это — в промышленный корпус за несколько сотен рублей. Вроде как намного дешевле, чем RS-485 модули с датчиками и адаптер к PC. И уже все компьютеры видят этот веб-сервер в сети. Можно флэшку добавить гигабайт на 32, чтобы лет на сто вперед хранить данные.

        Задача была — на любом компьютере предприятия открывать данную систему и без установки. Веб-сайт был лучшим решением.

        Так под Windows у вас все сидят вроде как, MS Office у всех установлен, я так думаю. Макрос на VBA в MS Excel для чтения данных с веб-сервера-термометра и, вроде как вообще без MySQL можно обойтись для начала, не говоря про IIS. Впрочем под Windows — MySQL, зачем? Express версия MS SQL сервера — бесплатная. Не у всех MS Office? Ну можно и докупить, ведь RS-485 модули с датчиками тоже не бесплатно достались.