как реализовать таймер работы.

Avatar
  • обновлен
подскажите как реализовать таймер.
нужно посчитать время работы печи в нагреве
тег включения реле (boolean)
как реализовать включение таймера? виртуальный канал?
Avatar
SIMP Tech (Сергей)
День добрый, Анатолий.

Если Вы знакомы с программированием то можете использовать для работы с текстовыми файлами класс TStringList.

var List: TStringList; Str: string; begin // создали List := TStringList.Create; try // загрузили (файл должен существовать) List.LoadFromFile('C:\test.txt'); // добавить List.Add('line1'); // получить/переписать значение если надо Str := List[0]; // сохранить List.SavetoFile('C:\test.txt'); finally List.Free; end; end.
Avatar
Добрый день!

Новая проблема.
Затеялся сделать "неубиваемый" таймер, т.е. таймер продолжает считать от начала засечки времени даже в случае перезагрузки SIMP Light.
Для этого, очевидно, необходимо временные засечки для моих 8-ми объектов сохранить во внешнем файле. То есть в текстовом файле записаны 8 строк, которые либо сохраняют временную засечку, либо какую-то заглушку,свидетельствующую о том что для этого объекта таймер сейчас не запущен. При перезагрузке системы производится проверка: есть ли для объекта N в соответствующей строке засечка времени. Если таковая будет найдена, то соответствующая глобальная переменная (предназначенная для хранения стартового значения времени этого объекта) будет заполнена этим значением.
Надеюсь, идея понятна.
Задачка не сложная.
НО!
Для решения описанной задачки, необходимо в текстовом файле значения записывать в строго определенном месте. То есть для объекта №1 засечка должна быть первой строкой, для объекта №2 засечка должна быть второй строкой, и т.д.
Это можно реализовать стандартным путем, перезаписыванием всех 8-ми строк, на ходу меняя необходимые строки.
НО!
Изучив функции SIMP Light, отвечающие за работу с текстовыми файлами, я не обнаружил возможности перезаписать существующий файл. Функция SaveToTxtFile не позволяет перезаписать существующий файл, а методично дописывает информацию в конец файла.
Как быть?
Можно было бы переложить эту грязную работу (по уничтожения файла) на плечи внешнего командного файла.
НО!
Тут то же - засада. Как оказалось в С-скриптах функция ExecuteApp напрочь отказывается работать.
Так что, HELP ME :unsure:

С уважением, Анатолий
Новочеркасск
Avatar
SIMP Tech (Сергей)
День добрый.

[quote="kondrat]
Функция SetTimeout (а также и SetTimeOut) не работают, при компиляции выдается сообщение "undeclared …"
[/quote]

Упс… Мой "косяк" прошу прощенья, имя функции [b]Delay[/b](AInterval: Integer), SetTimeout - внутреннее имя функции в системе )))
Avatar
Добрый день!

Функция SetTimeout (а также и SetTimeOut) не работают, при компиляции выдается сообщение "undeclared …"
:(

С уважением, Анатолий
Новочеркасск
Avatar
Добрый день!

О! То, что нужно. Коротко и чётко. Спасибо. Забираю.

Удачи!
С уважением, Анатолий.
Новочеркасск
Avatar
SIMP Tech (Сергей)
День добрый.

Свершилось, я слепил таймер. :)
Что значит слово, упавшее на благодатную почву. Ваши слова про "…все дело в формате TDateTime…" застряли в голове. И вот неожиданно в голове всплыл вопрос к самому себе: "ну и замечательно, что все дело в формате, а стоит ли с ним бороться?". И, воспользовавшись принципом айкидо, поставил себе на службу работу этого формата, получилось вот что:

{
if(AsFirstRun) WriteValue("time4",DateTimeToStr(Now()));
string data, dd;
int poz;
data=DateTimeToStr(Now()-StrToDateTime(ReadValue("time4")));
poz=Pos(" ",data);
dd=Copy(data,0,poz);

if (dd == "30.12.1899 ") data=" "+Copy(data,poz,8);
else if (dd == "31.12.1899 ") data="1 день "+Copy(data,poz,8);
else if (dd == "01.01.1900 ") data="2 дня "+Copy(data,poz,8);
else if (dd == "02.01.1900 ") data="3 дня "+Copy(data,poz,8);
else if (dd == "03.01.1900 ") data="4 дня "+Copy(data,poz,8);

WriteValue("time4v",data);
}

Для запуска этого скрипта необходимо иметь:
1) канал time4, тип "строковый"
2) канал time4v, тип "строковый", со скриптом, приведенным выше
3) форма с двумя элементами "панель", прикрепленные к указанным каналам
4) можно добавить элемент "строковый задатчик", прикрепленный к каналу time4 (для задания начального значения таймера в формате "01.04.2014 10:10:35").

Я немного дополню свои предыдущий пост про особенность TDateTime, простое вычитание одной даты из другой возможно, но отобразить это корректно посредством этого же формата будет невозможно, по этому прибегнем к хитрости:

{ TDateTime Dt, Dt1, D; String Str; // первая дата Dt = now; // вторая дата (для пример + 3 дня) Dt1 = Dt + 3; // получим кол - во дней и время D = Dt1 - Dt; //отформатируем результат - целая часть это у нас дни, ну а время остается как и было Str = IntToStr(Trunc(D)) + " дн. " + TimeToStr(D); }
Avatar
Добрый день!

Свершилось, я слепил таймер. :)
Что значит слово, упавшее на благодатную почву. Ваши слова про "…все дело в формате TDateTime…" застряли в голове. И вот неожиданно в голове всплыл вопрос к самому себе: "ну и замечательно, что все дело в формате, а стоит ли с ним бороться?". И, воспользовавшись принципом айкидо, поставил себе на службу работу этого формата, получилось вот что:

{
if(AsFirstRun) WriteValue("time4",DateTimeToStr(Now()));
string data, dd;
int poz;
data=DateTimeToStr(Now()-StrToDateTime(ReadValue("time4")));
poz=Pos(" ",data);
dd=Copy(data,0,poz);

if (dd == "30.12.1899 ") data=" "+Copy(data,poz,8);
else if (dd == "31.12.1899 ") data="1 день "+Copy(data,poz,8);
else if (dd == "01.01.1900 ") data="2 дня "+Copy(data,poz,8);
else if (dd == "02.01.1900 ") data="3 дня "+Copy(data,poz,8);
else if (dd == "03.01.1900 ") data="4 дня "+Copy(data,poz,8);

WriteValue("time4v",data);
}

Для запуска этого скрипта необходимо иметь:
1) канал time4, тип "строковый"
2) канал time4v, тип "строковый", со скриптом, приведенным выше
3) форма с двумя элементами "панель", прикрепленные к указанным каналам
4) можно добавить элемент "строковый задатчик", прикрепленный к каналу time4 (для задания начального значения таймера в формате "01.04.2014 10:10:35").

Идея надеюсь понятна!

Удачи!
С уважением, Анатолий
Новочеркасск
Avatar
SIMP Tech (Сергей)
Спасибо огромное.
Нашел указанные вами файлы Passport.
Взял эти файлы из архива от 28.03.2014.
И вуаля - появились мои временные канальчики и общее число каналов стало 146 вместо 144.

Замечательно. Как будет готов обещанный выше пример, я напишу.
Avatar
Добрый день!

:woohoo: Ура!
Спасибо огромное.
Нашел указанные вами файлы Passport.
Взял эти файлы из архива от 28.03.2014.
И вуаля - появились мои временные канальчики и общее число каналов стало 146 вместо 144.

Удачи!
С уважением, Анатолий.
Новочеркасск
Avatar
SIMP Tech (Сергей)
1) Да-да, именно так: 3 дня 21:15:00. Просто отображаем эту информацию на мнемосхеме.
Но!
Тут есть и побочные эффекты в виде зависания системы, пропадания электроэнергии, поломки компьютера и др. То есть, по какой-то причине система SIMP Light будет перезапущена. А производственная установка продолжает работает и "шоу маст гоу". Т.е. хотелось бы, чтобы запущенный таймер продолжил работать и после перезапуска системы, невзирая на такое "выпадение из реальности". Ну, на это пока не обращайте внимание, это просто информация для размышления. Пока просто хочется видеть на экране надпись: "процесс продолжается 3 дня 21 час 15 минут 00 секунд"

Ок. Понятно. Как накидаю пример пришлю потестить

2) А как можно сделать бекап без информационных баз? Насколько помню, при выборе "сделать копию" никаких вопросов не задается, а сразу стартует процесс создания резервной копии. И как должен происходить процесс восстановления из бекакпа без информационных баз? Не "обнулит" ли в этом случает система базу данных?

Можно сделать, только "руками".

3) "Не осталось копии файлов конфигурации на момент когда каналы "выпали"?" Дак, вот сейчас пытался найти где же хранится список каналов. И ничего не нашел. Полагал, что этим занимается каталог InternalTag, но там в файле InTaglist всего тридцать строк с какими-то цифрами, а каналов у нас полторы сотни. Или речь идет о файлах .dll в каталоге размещения программы. При старте Конфигуратора каналов вижу, что он загружает информацию из файла конфигурации, а где это файл - не знаю.

Файлы:
Passport.bak - резервная копия конфигурации на момент последнего сохранения
Passport.slp - актуальный файл конфигурации
SortItem.sls - вспомогательный файл конфигурации

папки:

Forms - мнемосхемы
InternalTag - скрипты для вирт. каналов + вспомогательный файл конфигурации
UserSetting - настройки разных модулей