Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Запись в БД текущих значений параметра  (Прочитано 5134 раз)

Rolich

  • Пользователь
  • **
  • Сообщений: 87
    • Просмотр профиля
Доброго всем времени суток
Пытаюсь писать значение переменной в БД с интервалом секунда, для чего:
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
Запись не происходит :(
Что я делаю не так ?
« Изменён: 18 Февраля 2023, 16:14:49 от Simple_Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 285
    • Просмотр профиля
    • Simple-Scada
Re: Запись в БД текущих значений параметра
« Ответ #1 : 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.

Как выполнять запросы к БД, можно прочесть по ссылке. Обработать ошибки выполнения SQL-запроса можно в скрипте "Ошибка SQL-запроса". Пример записи значения переменной в БД по таймеру можно найти по ссылке.
« Изменён: 05 Апреля 2024, 12:40:48 от Simple_Scada »

Rolich

  • Пользователь
  • **
  • Сообщений: 87
    • Просмотр профиля
Re: Запись в БД текущих значений параметра
« Ответ #2 : 20 Февраля 2023, 07:34:50 »
Спасибо !

Rolich

  • Пользователь
  • **
  • Сообщений: 87
    • Просмотр профиля
Re: Запись в БД текущих значений параметра
« Ответ #3 : 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.

Запись в БД не происходит
Что здесь не так ?
« Изменён: 05 Апреля 2024, 12:39:48 от Simple_Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 285
    • Просмотр профиля
    • Simple-Scada
Re: Запись в БД текущих значений параметра
« Ответ #4 : 05 Апреля 2024, 21:31:58 »
Здравствуйте.

1. Если требуется выявить ошибки при выполнении SQL-запроса, то нужно использовать скрипт с типом события "Ошибка SQL-запроса". Также, для отладки скриптов работы с БД можно активировать опцию "Лог пользовательских SQL-запросов", тогда все пользовательские SQL-запросы будут записываться в лог-файл сервера. Данную опцию можно использовать только для отладки проекта, иначе она будет создавать лишнюю нагрузку на сервер скады.

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

Также в скрипте используется архивная процедура "ArchiveTimeOn". Рекомендуем ознакомиться с принципом работы архивных процедур. В Вашем случае при выполнении скрипта, в БД могут записываться неверные значения, так как архивные процедуры не выполняются мгновенно. Скорость их выполнения зависит от производительности ПК, загруженности СУБД, качества связи между сервером Simple-Scada и СУБД. Поэтому, после вызова архивных процедур, скрипт продолжит выполняться, но результат вычислений может записаться в переменную "HPT_2_narabotka" позже, например через секунду после полного выполнения скрипта.
« Изменён: 05 Апреля 2024, 21:45:10 от Simple-Scada »

Rolich

  • Пользователь
  • **
  • Сообщений: 87
    • Просмотр профиля
Re: Запись в БД текущих значений параметра
« Ответ #5 : 08 Апреля 2024, 12:07:25 »
Спасибо за подробные комментарии, проблема выявлена и решена !