Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Rolich от 17 Февраля 2023, 14:23:48

Название: Запись в БД текущих значений параметра
Отправлено: Rolich от 17 Февраля 2023, 14:23:48
Доброго всем времени суток
Пытаюсь писать значение переменной в БД с интервалом секунда, для чего:
1. В БД создана таблица Current_Values со столбцами ID, DataTime, Value
2. Создан скрипт с исполнением каждую секунду
3. Код скрипта
 
Код: (delphi)
var
    aQuery: string;
  begin
    aQuery := 'INSERT INTO `current_values` (`id`, `datetime`, `value`) VALUES (' +
    IntToStr(Parametr.ID) +', Now(), '+ FloatToStr(Parametr.AsFloat,8) +');
    RunSQL(aQuery);
  end
Запись не происходит :(
Что я делаю не так ?
Название: Re: Запись в БД текущих значений параметра
Отправлено: Simple Scada от 18 Февраля 2023, 15:37:31
Здравствуйте.

Насколько нам известно, Вы используете СУБД PostgreSQL. В синтаксисе SQL-запросов для данной СУБД вместо "`" нужно использовать двойные кавычки.

Правильный код:
Код: (delphi)
var
  aQuery: string;
begin
  aQuery := 'INSERT INTO "current_values" ("id", "datetime", "value") VALUES(' +
  IntToStr(Parametr.ID) +', Now(), '+ FloatToStr(Parametr.AsFloat, 8) +')';
  RunSQL(aQuery);
end.

Как выполнять запросы к БД, можно прочесть по ссылке (https://simple-scada.com/help/script/querytodb.html). Обработать ошибки выполнения SQL-запроса можно в скрипте "Ошибка SQL-запроса (https://simple-scada.com/help/script/sql-query-error.html)". Пример записи значения переменной в БД по таймеру можно найти по ссылке (https://simple-scada.com/help/script/dbwrtime.html).
Название: Re: Запись в БД текущих значений параметра
Отправлено: Rolich от 20 Февраля 2023, 07:34:50
Спасибо !
Название: Re: Запись в БД текущих значений параметра
Отправлено: Rolich от 05 Апреля 2024, 12:24:15
Доброго всем времени суток
Имеется выполняющийся 1 раз в час скрипт для записи значений наработки оборудования в БД:
Код: (delphi)
var
  Time, DateStart, DateEnd: TDateTime;
  I:integer;
  aQuery: string;
 begin
    DateEnd:= Now;
    DateStart:= IncHour(Now, -1);
    ArchiveTimeOn(HPT_2, HPT_2_narabotka, DateStart, DateEnd);
    I:= MinutesBetween(0, HPT_2_narabotka.AsDateTime);
    aQuery := 'INSERT INTO "public.equpment_operating" ("id","operating_time","operating_value") VALUES ('+IntToStr(2)+', Now(), '+IntToStr(I)+')';
    RunSQL(aQuery);
end.

Запись в БД не происходит
Что здесь не так ?
Название: Re: Запись в БД текущих значений параметра
Отправлено: Simple Scada от 05 Апреля 2024, 21:31:58
Здравствуйте.

1. Если требуется выявить ошибки при выполнении SQL-запроса, то нужно использовать скрипт с типом события "Ошибка SQL-запроса (https://simple-scada.com/help/script/sql-query-error.html)". Также, для отладки скриптов работы с БД можно активировать опцию "Лог пользовательских SQL-запросов (https://simple-scada.com/help/manual/settings-simple-scada-server.html?anchor=debug)", тогда все пользовательские SQL-запросы будут записываться в лог-файл сервера. Данную опцию можно использовать только для отладки проекта, иначе она будет создавать лишнюю нагрузку на сервер скады.

2. Нужно использовать синтаксис используемой СУБД. В данном случае, если требуется выполнить запись в таблицу, расположенную в схеме "public", то указание схемы можно опустить:
Код: (delphi)
aQuery := 'INSERT INTO "equpment_operating"… ';
В случае, когда в SQL-запросе требуется указать определенную схему, нужно использовать следующий синтаксис:
Код: (delphi)
aQuery := 'INSERT INTO "my_schema"."equpment_operating"… ';

Также в скрипте используется архивная процедура "ArchiveTimeOn (https://simple-scada.com/help/script/archivetimeon.html)". Рекомендуем ознакомиться с принципом работы архивных процедур (https://simple-scada.com/help/script/work-with-arch-procedures.html). В Вашем случае при выполнении скрипта, в БД могут записываться неверные значения, так как архивные процедуры не выполняются мгновенно. Скорость их выполнения зависит от производительности ПК, загруженности СУБД, качества связи между сервером Simple-Scada и СУБД. Поэтому, после вызова архивных процедур, скрипт продолжит выполняться, но результат вычислений может записаться в переменную "HPT_2_narabotka" позже, например через секунду после полного выполнения скрипта.
Название: Re: Запись в БД текущих значений параметра
Отправлено: Rolich от 08 Апреля 2024, 12:07:25
Спасибо за подробные комментарии, проблема выявлена и решена !