
0
Отвечен
Как считать значение из базы данных
Как считать значение канала из базы данных записное 15 часов назад?
Сервис поддержки клиентов работает на платформе UserEcho
День добрый.
Вот пример как работать с БД из под скрипта:
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
Ок. Понятно тогда. Скрипт запускается по событию?
Цикл 10 сек
Учет тоннелей.slz
Включите "Окно отладочной информации" в настройках (редактор каналов). Запустите монитор, посмотрим, какие ошибки будут возникать при работе скрипта.
Я же писал, отладчик выдает : 07.03.2018 09:50:03.102 Нарушение доступа по адресу 0042912F в модуле 'Monitor.exe'. Чтение с адресом 00000000 - [Проталкивание]
День добрый.
Подскажите какой тип у канала - Проталкивание?
Здравствуйте.
DateTime, пробовал Word и Double результат одинаковый.
Ок. Сможете предоставить доступ к ПК по тимвьюверу. Посмотрим на месте. Если такая возможность есть напишите на simp@simplight.ru данные для подключения а так же укажите время когда Вам будет удобно что бы мы подключились.
То есть проект что я выкладывал у Вас работает без ошибок? Учет тоннелей.slz
письмо отправил
День добрый.
Поправил скрипт у Вас на ПК. Была небольшая ошибка в тексте скрипта. (Мой косяк, не дописал пример)
Спасибо. Рабочий скрипт, может кому пригодится:
{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.