0
Отвечен

Как считать значение из базы данных

АСУТП ЗСМ-7 6 лет назад в Редактор каналов обновлен 6 лет назад 17

Как считать значение канала из базы данных записное 15 часов назад?

ХОРОШО, МНЕ ПОНРАВИЛОСЬ

Огромное спасибо за помощь.

Оценка удовлетворенности от АСУТП ЗСМ-7 6 лет назад
На рассмотрении

День добрый.


Вот пример как работать с БД из под скрипта:

var
  begindate, enddate, date: TDateTime;
  reccount: integer;
  res, value: double;
  stream: TMemoryStream;
  error: word;
Begin
  // дата начала
  begindate := Now - ((1/24) * 15));

  // конечная дата
  enddate := begindate + (1/24/60);


stream := TMemoryStream.Create;

try

  // считаем данные из БД в буфер
  error := StreamReadFromDatabase(begindate, enddate, 'Имя канала', stream);

  // error code
  //  DB_READ_OK = 0;
  //  DB_DATE_ERROR = 1;
  //  DB_MEMORY_OVERFLOW = 2;
  //  DB_CHANNEL_NOTFOUND = 3;

  res := 0;
  if error = 0 then
  begin
    // кол - во записей за считываемый интервал времени
    reccount := GetCountRecordToStream(stream);

    // вычитываем данные из буфера
    while GetValueFromStream(stream, date, value) do
    begin

        // date - метка времени
        // value - значение канала

    end;
  end;


finally

   stream.free;

end;


end.

Здравствуйте. Хочу уточнить несколько позиций, что я правильно понял.


Now - ((1/24) * 15)    это -15 часов от текущего времени

begindate + (1/24/60)   это 1 минута опроса

  res := 0;       а это что?


begin 

     WriteValue('Virtual channel 2',value)     Вывести значение в канал как пример
        // date - метка времени
     
  // value - значение канала
    end;


reccount   Если будет 2 то как получить 2 значения


error  если время запроса попадет между двумя записями какую выдаст ошибку?

Запустил скрипт со значением "Имя канала"  error=3, изменил значение на существующий канал "Установка платформ", получил ошибку. (ver4.6.2.121 Windowd XP)


07.03.2018 09:50:03.102 Нарушение доступа по адресу 0042912F в модуле 'Monitor.exe'. Чтение с адресом 00000000 - [Проталкивание]


Проталкивание - канал со скриптом. В скрипте изменил значения:


  // дата начала
  begindate := Now - ((1/24/60/6) * 5);   // -50 секунд

  // конечная дата
  enddate := begindate + ((1/24/60/60)*2);  // 2секунды


День добрый.


Пришлите полный текст скрипта, который у Вас получился.

{Pascal Script}
Var
  begindate, enddate, date: TDateTime;
  reccount: integer;
  res, value: double;
  stream: TMemoryStream;
  error: word;

  // Выполняется при старте скрипта
  procedure OnStartScript;
  begin
    // Ваш код
  end;

  // Выполняется при завершении работы скрипта
  procedure OnStopScript;
  begin
    // Ваш код
  end;

Begin

   WriteValue('Проталкивание',Now);
  // дата начала
  begindate := Now - ((1/24/60/6) * 5);

  // конечная дата
  enddate := begindate + ((1/24/60/60)*2);

  // считаем данные из БД в буфер
  error := StreamReadFromDatabase(begindate, enddate, 'Установка платформ', stream);

  WriteValue('Ошибка',error);
  // error code
  //  DB_READ_OK = 0;
  //  DB_DATE_ERROR = 1;
  //  DB_MEMORY_OVERFLOW = 2;
  //  DB_CHANNEL_NOTFOUND = 3;

  res := 0;
  if error = 0 then
  begin
    // кол - во записей за считываемый интервал времени
    reccount := GetCountRecordToStream(stream);

    // вычитываем данные из буфера
    while GetValueFromStream(stream, date, value) do
    begin
          WriteValue('позиция 15',value);
        // date - метка времени
        // value - значение канала
    end;
  end;

end.

на вскидку вот тут есть ошибка -  begindate := Now - ((1/24/60/60) * 5);

Если добавить 0 то будут секунды, сейчас десятки секунд.  -50

Ок. Понятно тогда. Скрипт запускается по событию?

Включите "Окно отладочной информации" в настройках (редактор каналов). Запустите монитор, посмотрим, какие ошибки будут возникать при работе скрипта.

Я же писал, отладчик выдает : 07.03.2018 09:50:03.102 Нарушение доступа по адресу 0042912F в модуле 'Monitor.exe'. Чтение с адресом 00000000 - [Проталкивание]

День добрый.


Подскажите какой тип у канала - Проталкивание?

Здравствуйте.


DateTime, пробовал Word и Double результат одинаковый.

Ок. Сможете предоставить доступ к ПК по тимвьюверу. Посмотрим на месте. Если такая возможность есть напишите на simp@simplight.ru данные для подключения а так же укажите время когда Вам будет удобно что бы мы подключились.

То есть проект что я выкладывал у Вас работает без ошибок?  Учет тоннелей.slz

письмо отправил

Отвечен

День добрый.


Поправил скрипт у Вас на ПК. Была небольшая ошибка в тексте скрипта. (Мой косяк, не дописал пример)

+1

Спасибо. Рабочий скрипт, может кому пригодится:


{Pascal Script}
Var
  begindate, enddate, date: TDateTime;
  reccount: integer;
  res, value: double;
  stream: TMemoryStream;
  error: word;

  // Выполняется при старте скрипта
  procedure OnStartScript;
  begin
    stream := TMemoryStream.Create;
  end;

  // Выполняется при завершении работы скрипта
  procedure OnStopScript;
  begin
    stream.free;
  end;

Begin

   WriteValue('Проталкивание',Now);
  // дата начала
  begindate := Now - ((1/24/60/6) * 5);

  // конечная дата
  enddate := begindate + ((1/24/60/60)*2);

  // считаем данные из БД в буфер
  stream.clear;
  error := StreamReadFromDatabase(begindate, enddate, 'Установка платформ', stream);

  WriteValue('Ошибка',error);
  // error code
  //  DB_READ_OK = 0;
  //  DB_DATE_ERROR = 1;
  //  DB_MEMORY_OVERFLOW = 2;
  //  DB_CHANNEL_NOTFOUND = 3;

  res := 0;
  if error = 0 then
  begin
    // кол - во записей за считываемый интервал времени
    reccount := GetCountRecordToStream(stream);

    // вычитываем данные из буфера
    while GetValueFromStream(stream, date, value) do
    begin
          WriteValue('позиция 15',value);
        // date - метка времени
        // value - значение канала
    end;
  end;

end.

Сервис поддержки клиентов работает на платформе UserEcho