Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Юрий от 02 Июля 2018, 09:42:12

Название: Последовательности выполнения шагов
Отправлено: Юрий от 02 Июля 2018, 09:42:12
Добрый день!

В СУБД MySQL есть таблица, где каждая строка соответствует технологическому шагу работы установки со своими уставками и временем выполнения. Данную таблицу я могу редактировать, добавлять и удалять шаги средствами SCADA.
Подскажите пожалуйста, как с помощью внутренних средств SIMPLE SCADA сделать так, что бы данные шаги, каждый соответствует своей строке с уставками и временем выполнения, выполнялись последовательно автоматически, т.е. без участия оператора. 
Т.е. как только закончилось время выполнения первого шага (первая строка таблицы), начался второй шаг (вторая строка таблицы) со своими уставками и временем выполнения и т.д. пока не закончатся все технологические шаги (строки таблицы). Количество шагов может быть произвольное количество и зависит от конкретной технологии обработки в данный момент.
Название: Re: Последовательности выполнения шагов
Отправлено: asutpvit от 02 Июля 2018, 11:41:50
вангую: выполнять данные манипуляции лучше средствами ПЛК, скада нужна для визуализации процесса.
Да и проще, особенно на siemens это реализовать)
Название: Re: Последовательности выполнения шагов
Отправлено: Simple-Scada от 02 Июля 2018, 14:59:45
Здравствуйте.

Как совершенно верно отметил asutpvit, это будет перекладывание функций ПЛК на скаду, поэтому также просто решить эту задачу, как можно было бы с использованием ПЛК не получится. Тем не менее решение возможно. Например можно при помощи процедуры RunSQL (https://simple-scada.com/help/script/workbd.html) сделать выборку всей таблицы с шагами из базы данных.
Код: (delphi)
begin
  RunSQL('SELECT * FROM `my_table`', nil, 1); // помечаем запрос тегом = 1
end.

Далее в скрипте с типом события "Выполнен SQL-запрос" (https://simple-scada.com/help/script/sql-query-completed.html) можно как угодно обработать результат выборки. Результатом выборки всегда является набор данных (https://simple-scada.com/help/script/tmdataset.html) (по сути является таблицей с ячейками).
Код: (delphi)
begin
  if DataSet.Tag = 1 then  // если это результат выполнения запроса с тегом = 1
    { выполняем цикл пока не дойдём до конца набора данных }
    while not DataSet.EOF do
    begin
      { здесь можем работать с текущей строкой и её ячейками, для
        примера обратимся к первой ячейке текущей строки }
      Text1.Text := DataSet[0].AsUTF8String;

      { переходим на следующую строку набора данных }
      DataSet.Next;
    end;
end.

Таким образом можно извлечь из БД таблицу шагов и получить уставку и время выполнения для каждого шага. Время выполнения текущего шага можно скопировать в отдельную внутреннюю переменную, например vrTime. Далее для отсчета времени придется использовать скрипт с типом события "Прошла секунда" (https://simple-scada.com/help/script/second-passed.html) и в нём по секунде отсчитывать время до наступления следующего шага:
Код: (delphi)
begin
  { ведём отсчет времени вычитая по одной секунде }
  if vrTime.Value > 0 then
    vrTime.Value := IncSecond(vrTime.Value, -1)
  else { если время вышло  }
    begin
      { здесь выполняем код перехода к следующему шагу }
    end;
end.

При реализации задачи на скаде нужно учитывать, что при перезапуске проекта текущий шаг не будет сохраняться, хотя при желании можно реализовать и сохранение, например в файл или в БД через скрипты.
Название: Re: Последовательности выполнения шагов
Отправлено: Юрий от 02 Июля 2018, 16:27:32
Спасибо!
То, что надо