Здравствуйте.
В данном случае можно создать внутреннюю переменную (https://simple-scada.com/help/manual/variable-new.html) с типом данных DateTime и в свойство "Начальное значение" указать "Now" – для хранения времени последнего изменения переменной (например с именем "vrPrevTime"). Далее разместить на мнемосхеме компонент "Текст (https://simple-scada.com/help/manual/text.html)", в свойство "Переменная" указать переменную "Count", в свойство "Доп. переменная" указать переменную "vrPrevTime" и на событие "OnDataChange" (https://simple-scada.com/help/script/object-events.html) объекта Текст написать скрипт:
var
aSec : Integer;
begin
if Sender is TM_Text then // проверяем, что Sender это текст
with Sender as TM_Text do // приводим Sender к типу "TM_Text"
begin
// получить кол-во секунд с последнего изменения переменной
aSec := SecondsBetween(now, VariableEx.AsDateTime);
if aSec > 0 then // если прошло более 1 секунды
Text := IntToStr(aSec) + ' сек' // то вывести время в секундах
else // иначе в миллисекундах
Text := IntToStr(MilliSecondsBetween(now, VariableEx.AsDateTime)) + ' мсек';
VariableEx.Value := Now;
end;
end.
Теперь при изменении значения переменной в компонент "Текст" будет выводиться время, за которое изменилось значение переменной. Данный скрипт универсальный (https://simple-scada.com/help/script/universal-event.html) и его можно назначить на событие "OnDataChange" (https://simple-scada.com/help/script/object-events.html) любых объектов "Текст", в которые требуется выводить время за которое изменилось значение переменной. При этом следует учитывать, что первое показание времени после запуска/перезапуска проекта будет неправильным – в этом случае будет отображаться время с момента запуска проекта до первого считывания значения переменной с OPC-сервера.
Здравствуйте.
Получить предыдущее значение переменной можно только в скриптах с типами событий "Изменились переменны (https://simple-scada.com/help/script/changed-the-variables.html)е" и "Нарушена граница (https://simple-scada.com/help/script/borderviol.html)". См. функции PrevAsBool (https://simple-scada.com/help/script/prevasbool.html), PrevAsInt (https://simple-scada.com/help/script/prevasint.html), PrevAsFloat (https://simple-scada.com/help/script/prevasfloat.html), PrevAsStr (https://simple-scada.com/help/script/prevasstr.html).
Подобные вычисления лучше реализовать на контроллере. Для решения Вашей задачи в скада-системе можно создать отдельные внутренние переменные для всех переменных, по которым необходимо получать предыдущее значение. Имена внутренних переменных должны содержать: имя текущей переменной (например "vrMyVar1", "vrMyVar2" и тд.) + приставка (например "_Prev") = "vrMyVar1_Prev", "vrMyVar2_Prev" и тд. Далее нужно создать скрипт с типом события "Изменились переменные (https://simple-scada.com/help/script/changed-the-variables.html)", в список скрипта указать все переменных, для которых необходимо получать предыдущее значение, и написать скрипт:
var
aVar: TM_Variable;
begin
aVar := GetVariableByName(Variable.Name + '_Prev'); // ищем переменную, в которую нужно записать предыдущее значение
if aVar <> nil then // если переменная существует
aVar.Value := PrevAsFloat; // записываем предыдущее значение переменной
end.
Теперь внутренние переменные "vrMyVar1_Prev", "vrMyVar2_Prev" и тд. можно вывести в поля на мнемосхему проекта.
отлично спасибо
сделал два треугольника красный (Image16) и синий (Image15) и они соответственно появляются при повышении и понижении темературы
сделал разными скриптами, мне так проще чтобы не запутаться
begin
if d3_Prev.Value = 0 then Image16.Visible := False else // d3 - датчик температуры, d3_Prev - предыдущее значение
begin
if Image16.Value > 0 then Image16.Visible := True else Image16.Visible := False; // красный треугольник вверх (мигающий)
end;
end.
begin
if d3_Prev.Value = 0 then Image15.Visible := False else // d3 - датчик температуры, d3_Prev - предыдущее значение
begin
if Image15.Value < 0 then Image15.Visible := True else Image15.Visible := False; // синий треугольник вниз (мигающий)
end;
end.