Здравствуйте. Объясните пожалуйста на пальцах как наладить время наработки мото-часов. Все делаю по примеру, но в шкале со временем при изменении переменной добавляется одна секунду и больше нет никаких изменений.
это я вставил в OnDataChange
begin
Text1.Text := SecondsToStr(var1.AsInt64) ;
end.
Спасибо.
Rinat, какой именно скрипт? Из демо-проекта?
Доброе утро. Да, скрипт из демо проекта.
var
aState: ShortInt;
begin
{ получаем состояние таймера }
aState := TimerGetState(vrTimer);
case aState of
{ если таймер сброшен, то запускаем его с нуля }
-1: TimerStart(vrTimer, 0);
{ если таймер на паузе, то снова запускаем его (0 не имеет значения) }
0: TimerStart(vrTimer, 0);
{ если таймер уже запущен, то ставим его на паузу }
1: TimerPause(vrTimer);
end;
end.
Получается если использовать этот скрипт при изменении переменной (OnDataChange) то он начинает отчет времени сразу же после старта проекта. И нужно менять переменную с 0 на 1 и обратно что бы остановить отчет времени. Получается переменная не изменялась, а отчет времени начался. Как это исправить? Спасибо.
Так же не сохраняется накопленное время работы при остановке и запуске проекта.
Update: начиная с версии Simple-Scada 2.3.2.0 (https://simple-scada.com/forum/index.php?topic=178.msg6267#msg6267) у переменных можно включить опцию "Автоматическое восстановление" (https://simple-scada.com/help/manual/variable-new.html). Тогда скада будет автоматически сохранять значение переменной и восстанавливать его при перезапусках проекта.
Rinat!
Виртуальные переменные можно устанавливать из файла при запуске и сохранять в файл при останове проекта. Пример для 4-х целочисленных счетчиков времени работы. Восстановление данных - скрипт по событию "Запуск проекта":
var i: integer;
begin
if not FileOpen('MyBinaryFile.dat', '') then exit; // или иные действия при ошибке файла
if FileSize = 0 then begin // новый файл без данных
for i := 1 to 4 do FileWriteInteger(0); // заполнить 0
FileSeek(0, soBeginning); // указатель на начало
end;
for i := 1 to 4 do // установить значения таймеров из файла
GetVariableByName('iTimer_' + IntToStr(i)).Value := FileReadInteger;
FileClose;
end.
Сохранение данных - скрипт по событию "Останов проекта":
var i: integer;
begin
if not FileRecreate('MyBinaryFile.dat', '') then exit; // новый файл не создан
for i := 1 to 4 do
FileWriteInteger(GetVariableByName('iTimer_' + IntToStr(i)).Value);
FileClose;
end.
Полностью пример во вложении.
-------------------------------------------------------------
Скрипт (по изменению вектора состояния устройств) для управления таймерами подсчета времени работы:
vrTimer_1 ... vrTimer_8 - "массив" таймерных переменных;
iDevVector - вектор состояния устройств (для соответствующего устройству разряда: 1 = вкл, 0 = выкл.)
var i: integer;
tmr: TM_Variable;
begin
for i := 1 to 8 do
begin
tmr := GetVariableByName('vrTimer_' + IntToStr(i)); // указатель на очередной таймер
case (TimerGetState(tmr) * 2) + integer(GetBit(iDevVector.AsInt, i)) of
2: TimerPause(tmr); // остановить активный таймер
1, 511: TimerStart(tmr, 0); // запустить таймер из паузы или начального состояния
end; // игнорировать повторные запуски и остановы
end;
end.