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

Avatar
  • обновлен
  • Отвечен

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

Как Вы оцениваете обслуживание, которое получили?

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

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

Добавьте комментарий о качестве обслуживания (необязательно):

Avatar
СИМП Лайт (тех поддержка)
  • На рассмотрении

День добрый.


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

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.

Avatar
АСУТП ЗСМ-7

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


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  если время запроса попадет между двумя записями какую выдаст ошибку?

Avatar
АСУТП ЗСМ-7

Запустил скрипт со значением "Имя канала"  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секунды


Avatar

День добрый.


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

Avatar
АСУТП ЗСМ-7

{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.

Avatar

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

Avatar
АСУТП ЗСМ-7

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

Avatar

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

Avatar

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