Пожалуйста, включите JavaScript для просмотра этого сайта.

Скрипты Simple-Scada

История: Примеры скриптов > Работа с БД

Запись в БД по таймеру

Пред. Вверх След. Еще

Пусть имеется проект в Simple-Scada и мы настроили подключение к СУБД MySQL к нашей базе данных с именем "my_database", теперь в нее сохраняются сообщения, тренды и т.д.

Задача:

Создать в БД пользовательскую таблицу и записывать в нее значение какой-нибудь переменной с заданной периодичностью.

Решение:

Сначала нужно создать нашу таблицу, в которую будем записывать значения переменной. Для создания таблицы воспользуемся программой "MySQL Workbench". Таблица будет состоять из двух колонок: "timestamp" (отметка времени) и "value" (значение переменной). Открываем нашу БД, делаем клик правой кнопкой мыши на разделе "Tables" и в раскрывшемся меню выбираем "Create Table", как по-казано ниже:

Заполняем структуру таблицы в соответствии с требованиями. Назовем таблицу "my_archive":

Теперь остается сделать в нашем проекте периодическую запись переменной в таблицу "my_archive". Для примера будем записывать переменную температуры с именем "vrTemperature" и типом данных "Double". Сначала создаем виртуальную переменную "vrTimer" с типом данных "DateTime". Будем использовать ее для отсчета времени таймера. Затем создаем новый скрипт с типом события "Прошла секунда":

И пишем в него код таймера:

const
  INTERVAL = 60;  // Интервал таймера в секундах
var
  aSeconds: Int64;
begin
  { если vrTimer ещё не инициализирована, то инициализируем её и прерываем скрипт }
  if vrTimer.Value < 1 then
    vrTimer.Value := Now;
 
  { получаем кол-во секунд с последнего срабатывания таймера }
  aSeconds := SecondsBetween(Now, vrTimer.AsDateTime);
 
  { если прошло больше, чем INTERVAL секунд с последнего срабатывания таймера }
  if aSeconds >= INTERVAL then
  begin
    // КОД РАЗМЕЩЕННЫЙ ЗДЕСЬ БУДЕТ ВЫПОЛНЯТЬСЯ ПО ТАЙМЕРУ
 
    vrTimer.Value := Now;
  end;
end.

 

Теперь изменим код таймера добавив в него подпроцедуру (подпроцедуры добавляются между "var" и "begin") для выполнения запроса вставки в нашу таблицу. А вызов подпроцедуры разместим в теле таймера, вот так:

const
  INTERVAL = 60;  // Интервал таймера в секундах
var
  aSeconds: Int64;
 
  { эта подпроцедура выполняет запрос на вставку в БД значения переменной vrTemperature }
  procedure WriteValueToTable;
  var
    aQuery: string;
  begin
    aQuery := 'INSERT IGNORE INTO `my_archive` (`timestamp`, `value`) ' +
              'VALUES (NOW(), ' + QuotedStr(vrTemperature.AsStr) + ')';
    RunSQL(aQuery, nil0);
  end;
 
begin
  { если vrTimer ещё не инициализирована, то инициализируем её и прерываем скрипт }
  if vrTimer.Value < 1 then
    vrTimer.Value := Now;
 
  { получаем кол-во секунд с последнего срабатывания таймера }
  aSeconds := SecondsBetween(Now, vrTimer.AsDateTime);
 
  { если прошло больше, чем INTERVAL секунд с последнего срабатывания таймера }
  if aSeconds >= INTERVAL then
  begin
    WriteValueToTable;    // вызываем подпроцедуру вставки в БД
    vrTimer.Value := Now;
  end;
end.

 

Теперь значение переменной "vrTemperature" записывается с заданной периодичностью в созданную нами таблицу.