0

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

Sergey 12 лет назад в Общие вопросы обновлен 10 лет назад 0
подскажите как реализовать таймер.
нужно посчитать время работы печи в нагреве
тег включения реле (boolean)
как реализовать включение таймера? виртуальный канал?
Добрый день!

1. Создать вирт.канал.
2. Навесить на него скрипт по таймеру
3. В скрипте считывать значение тега реле
4. Если значение меняется с 0 на 1 - запомнить текщее время в переменной
Если меняется с 1 на 0 - взять текущее врем и вычесть из него запомненное - получим время работы

Функции работы с временем:

http://www.codenet.ru/progr/delphi/Object-Pascal/datetime.php
Добрый день!
В целом верно, но дьявол кроется в деталях. Вот что получается у меня:
1)создаем виртуальный канал time4 (играет роль переменной, тип DateTime, скрипта нет никакого)
2)создаем виртуальный канал time4v (тип DateTime, скрипт на С++)

/* Скрипт канала time4v. Вычисляем время работы сушильного шкафа №4 */
{
// при подъеме температуры выше 50 градусов считаем что шкаф включен,
// и наоборот, при снижении температуры ниже 50 градусов считаем что шкаф выключен
TDateTime t1;
Double In1=ReadValue("Шкаф 4");
if(In1 > 50.0)
{
if(DateTimeToStr(ReadValue("time4"))=="11.11.1111 11:11:11") WriteValue("time4",Now());
// вычисляем интервал времени, прошедший со времени "засечки"
t1 = Now()-ReadValue("time4");
}
else
{
t1=StrToDateTime("11.11.1111 11:11:11")
WriteValue("time4",t1);
}
// выводим в канал либо интервал времени, либо "заглушку"
WriteValue("time4v",t1);
}

В первоначальной версии использовалась функция Time() вместо Now(), и соответственно тип виртуальных каналов был Time. Скрипт прекрасно работал … но в пределах суток. А так, как у нас процессы могут продолжаться несколько суток, то на следующий день я с удивлением наблюдал как таймер отсчитываем в обратную сторону и стремится к нулю. Потом соображаю, что 15:10:00 (время засечки, установленное вчера) больше чем сегодняшние 08:13:00.
Лихорадостно беру вместо функции Time() функцию Now(), которая возвращает дату и время. Меняю тип обоих виртуальных каналов, изменяю заглушку "11:11:11". И получаю потрясающую картину - таймер показывает 30.12.1899 0:01:45.
Опа-на, а вычитание в формате дата+время оказывается работает "по-своему усмотрению".
Может кто подскажет, как выкрутиться из такого положения, а то, ой как не хочется самостоятельно отдельно вычитать дни, отдельно вычитать время, потом все это "женить"…

С уважением, Анатолий
Новочеркасск
Спасибо за развёрнутое объяснение.
Возможно баг – проверим.
Добрый день!

Хотелось бы знать, как продвигаются работы по вопросу отсчета времени.
Элемента "таймер" на мнемосхеме не хватает просто катастрофически.
На презентации новой версии 4.3.2 я задавал вопрос про таймер, был ответ - всё работает.
Проверил на этой версии вычитание времени - все осталось по старому, как и два года назад. :(

И ещё про время, на этот раз уже в элементе "тренд".
Нельзя ли позволить элементу иметь более продолжительную ось Х, так как максимальное значение, которое там можно выставить - 23 часа 59 минут 59 секунд.
А у нас есть процессы продолжительность по 45 - 60 часов.
Я прекрасно знаю, что есть "Просмотрщик графиков", где можно просмотреть информацию за любой интервал времени. Прекрасный модуль спору нет (именно через него вышел на вашу систему SIMP Light). Но! Он не для оперативной работы. Для анализа, отчетности - самое то, а для оператора-диспетчера нет.
В новой версии появился новый тренд - "тред ХY" (далее ТХУ). Задумался. Поизучал (кстати говоря, описание новых элементов в новой системе не нашел нигде - отстает обоз канцелярский от передовых частей разработчиков ;) ). Теоретически можно сделать на нем зависимость температуры от времени. Но! Не видит ТХУ каналов с временным типом данных. Хорошо! Слепим цифровой канал, куда будем складывать минуты. И построим зависимость температуры от этого цифрового канала. Но! Как объяснить оператору-диспечеру, что цифры по оси Х от 0 до 2700 означают период в 45 часов. Разговор плавно перейдет на идиоматические выражения, несущиеся мне в лицо.
Поэтому предлагаю в элемент ТХУ "вшить" временной канал. Т.е. для построения зависимости температуры от времени в ТХУ: по оси Y выбираю канал температуры, по оси X "вшитый" в элемент временной канал (а по сути тот же таймер, который включается по условию от канала выбранного по оси Y, и длится указное значение в минутах, которое указываем в параметрах). То есть, как только температура перешагнула указанный порог, ТХУ начинает рисовать график, который продолжатся на указанное значение времени вне зависимости от поведения температуры. И по истечении заданного времени ТХУ перестает рисовать, а просто отражает нарисованный график. И как только опять сработало условие канала по оси Y, то стирает весь график, и начинает рисовать новый.
Вот как-то так. Надеюсь я понятно объяснил свое пожелание. Если это, или что-то подобное, появится в вашей систем, то цены вам не будет :woohoo: .

И напоследок, но! уже не про время.
Столкнулся с проблемой, которая многим отравляет жизнь.
Начал переводить интерфейс нашей системы мониторинга на оконный режим, поскольку система начинала создаваться еще в те стародавние времена, когда в SIMP Light не было окон ;) .
И так как система отображается на различных мониторах (у диспетчера, у начальства, у технологов), то решил сделать сделать два окна с одной и той же информацией, на разного размера. То есть для маленьких мониторов - маленькая мнемосхемка, а для больших мониторов - большая мнемосхемища. И на каждой мнемосхеме есть кнопка перехода на другое окно. То есть, хочешь - смотри маленькую мнемосхемку, а если у тебя большуший монитор, то нажми кнопку "большая мнемосхема", и маленькая мнемосхемка закроется, а большая - откроется.
Это была присказка, а вот и сказка начинается.
Пока эти два окна были пустенькими (на них кроме кнопок перехода были лишь пара элементов), то все работало как часы - нажал кнопку и текущее окно закрывается, а другое открывается. Но! Как только мнемосхемки стали обрастать всё бОльшим количеством элементов, то после закрытия текущего окна стала появляться надпись "Ошибка открытия мнемосхемы". Причем через меню оба окна открываются ВСЕГДА хорошо. Причем слова "стала появляться" означает, что это было так не всегда - иногда процесс закрытия одного окна и открытия другого окна проходил нормально. Но! По мере наполнения окон новыми элементами, эта противная надпись стала появляться ВСЕГДА. И уже никаких исключений не было.
Проблема встала во весь свой рост. И ее требовалось решить. Многочисленные раздумья привели к мысли, что борьба за ресурсы компьютера не всегда заканчивается мирным путем. То есть новое окно не может открыться потому, что старое окно еще не освободило ресурсы.
Была решено организовать задержку с открытием нового окна. И теперь скрипт одного из окон выглядит так:
{
CloseMnemo("Общая схема 1900");

for(int y, i=0; i < 100000; i++) {y=0;}

OpenMnemo("Общая схема 1600");
}

И все стало снова работать как часы! :woohoo: И никаких больше окон с ошибками не всплывает!

Надеюсь - кому-то пригодится это маленькое наблюдение.

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

Спасибо за подробные вопросы)

Хотелось бы знать, как продвигаются работы по вопросу отсчета времени.
Элемента "таймер" на мнемосхеме не хватает просто катастрофически.
На презентации новой версии 4.3.2 я задавал вопрос про таймер, был ответ - всё работает.
Проверил на этой версии вычитание времени - все осталось по старому, как и два года назад.

попробуйте вот такой вариант:
SetTimeout(Enabled, Interval) - Выполнение скрипта приостанавливается, на время (Interval), после чего продолжает свою работу

И ещё про время, на этот раз уже в элементе "тренд".
Нельзя ли позволить элементу иметь более продолжительную ось Х, так как максимальное значение, которое там можно выставить - 23 часа 59 минут 59 секунд.
А у нас есть процессы продолжительность по 45 - 60 часов.
Я прекрасно знаю, что есть "Просмотрщик графиков", где можно просмотреть информацию за любой интервал времени. Прекрасный модуль спору нет (именно через него вышел на вашу систему SIMP Light). Но! Он не для оперативной работы. Для анализа, отчетности - самое то, а для оператора-диспетчера нет.

Ок. По тренду подумаем, какой размах шкалы по Вашему мнению будет более предпочтительным?

В новой версии появился новый тренд - "тред ХY" (далее ТХУ). Задумался. Поизучал (кстати говоря, описание новых элементов в новой системе не нашел нигде - отстает обоз канцелярский от передовых частей разработчиков ;) ). Теоретически можно сделать на нем зависимость температуры от времени. Но! Не видит ТХУ каналов с временным типом данных. Хорошо! Слепим цифровой канал, куда будем складывать минуты. И построим зависимость температуры от этого цифрового канала. Но! Как объяснить оператору-диспечеру, что цифры по оси Х от 0 до 2700 означают период в 45 часов. Разговор плавно перейдет на идиоматические выражения, несущиеся мне в лицо.
Поэтому предлагаю в элемент ТХУ "вшить" временной канал. Т.е. для построения зависимости температуры от времени в ТХУ: по оси Y выбираю канал температуры, по оси X "вшитый" в элемент временной канал (а по сути тот же таймер, который включается по условию от канала выбранного по оси Y, и длится указное значение в минутах, которое указываем в параметрах). То есть, как только температура перешагнула указанный порог, ТХУ начинает рисовать график, который продолжатся на указанное значение времени вне зависимости от поведения температуры. И по истечении заданного времени ТХУ перестает рисовать, а просто отражает нарисованный график. И как только опять сработало условие канала по оси Y, то стирает весь график, и начинает рисовать новый.
Вот как-то так. Надеюсь я понятно объяснил свое пожелание. Если это, или что-то подобное, появится в вашей систем, то цены вам не будет :woohoo:

Хорошее предложение, надо подумать в какие сроки сможем реализовать

И напоследок, но! уже не про время.
Столкнулся с проблемой, которая многим отравляет жизнь.
Начал переводить интерфейс нашей системы мониторинга на оконный режим, поскольку система начинала создаваться еще в те стародавние времена, когда в SIMP Light не было окон ;) .
И так как система отображается на различных мониторах (у диспетчера, у начальства, у технологов), то решил сделать сделать два окна с одной и той же информацией, на разного размера. То есть для маленьких мониторов - маленькая мнемосхемка, а для больших мониторов - большая мнемосхемища. И на каждой мнемосхеме есть кнопка перехода на другое окно. То есть, хочешь - смотри маленькую мнемосхемку, а если у тебя большуший монитор, то нажми кнопку "большая мнемосхема", и маленькая мнемосхемка закроется, а большая - откроется.
Это была присказка, а вот и сказка начинается.
Пока эти два окна были пустенькими (на них кроме кнопок перехода были лишь пара элементов), то все работало как часы - нажал кнопку и текущее окно закрывается, а другое открывается. Но! Как только мнемосхемки стали обрастать всё бОльшим количеством элементов, то после закрытия текущего окна стала появляться надпись "Ошибка открытия мнемосхемы". Причем через меню оба окна открываются ВСЕГДА хорошо. Причем слова "стала появляться" означает, что это было так не всегда - иногда процесс закрытия одного окна и открытия другого окна проходил нормально. Но! По мере наполнения окон новыми элементами, эта противная надпись стала появляться ВСЕГДА. И уже никаких исключений не было.
Проблема встала во весь свой рост. И ее требовалось решить. Многочисленные раздумья привели к мысли, что борьба за ресурсы компьютера не всегда заканчивается мирным путем. То есть новое окно не может открыться потому, что старое окно еще не освободило ресурсы.
Была решено организовать задержку с открытием нового окна. И теперь скрипт одного из окон выглядит так:
{
CloseMnemo("Общая схема 1900");

for(int y, i=0; i < 100000; i++) {y=0;}

OpenMnemo("Общая схема 1600");
}

И все стало снова работать как часы! :woohoo: И никаких больше окон с ошибками не всплывает!

Спасибо за наблюдение, погоняем у себя, попытаемся "поймать" из за чего происходит ошибка
Добрый день!

Спасибо за быстрый отклик. Но!
Не люблю приводить цитаты, но тут без цитаты никак не обойтись. Итак! :dry:

Спасибо за подробные вопросы)

Хотелось бы знать, как продвигаются работы по вопросу отсчета времени.
Элемента "таймер" на мнемосхеме не хватает просто катастрофически.
На презентации новой версии 4.3.2 я задавал вопрос про таймер, был ответ - всё работает.
Проверил на этой версии вычитание времени - все осталось по старому, как и два года назад.

попробуйте вот такой вариант:
SetTimeout(Enabled, Interval) - Выполнение скрипта приостанавливается, на время (Interval), после чего продолжает свою работу

1) Мой вопрос звучит: "неправильно работает вычитание двух переменных временного типа, в предыдущем посте двухлетней давности, я подробно это проиллюстрировал скриптом, а как дело обстоит с этим сейчас, в новой версии?".
И на свой вопрос я получаю ответ: "попробуйте вот такой вариант: SetTimeout(Enabled, Interval)".
:blink:

2) Хорошо! Допускаю, что вы ошиблись. И ваша реплика, очевидно, относящаяся к проблеме открытия одной мнемосхемы из другой мнемосхемы, просто заняла не свое место. Спрашиваю еще раз: "Как мне вычислить интервал времени более 24 часов? Поскольку вычитание двух каналов в формате дата+время, и с использованием функции Now(), приводит к плачевному результату".

3) Хорошо! Попробую-ка предложенный вами способ задержки с открытием мнемосхемы. SetTimeout так SetTimeout. Насколько помню - была, точнее есть, такая функция в javascript. Позволяла выполнить какую либо команду (функцию) с отсрочкой. В этой же функции на первом месте стоит, какая-то сердитая логика (Enabled), которая наверное разрешает мне выполнить-таки задержку на какой-то интервал времени. Ну что же, попробуем. Тем более, что мое решение с задержкой открытия мнемосхемы явно не блещет красотой. В свою защиту скажу лишь, что не найдя в документации на систему ни одной функции, хоть отдаленно напоминающей функцию по организации паузы, я взял первое попавшееся решение, использующееся многими поколениями кодеров. Но! Приступив к работе, вынужден был ее прервать, поскольку опять объявилась проблема, которая не часто, но сильно портит нервы.

4) Проблема в следующем - портятся каналы.
О чем идет речь. Показываю на конкретном примере. Открываю экспериментальную мнемосхему, на которой провожу исследования по работе со временем, организацией таймера и др. И вижу, что два элемента, в которых высвечивается у меня начало отсчета времени и показания таймера, ПУСТЫ. Всплывающая подсказка говорит о том, что "ссылка на канал не определена". Захожу в конфигуратор каналов - действительно два этих виртуальных канала (один имеет порядковый номер 8, а другой 12) не активны. То есть их нет в списке активных каналов. Переношу в список активных каналов - в канале с номером 12 остался в живых, имевшийся там скрипт. Но вся остальная информация разрушена (имя канала, тип канала, и др.)

Последний раз с это проблемой сталкивался пару недель назад, когда на сервере начал "сыпаться" диск. Тогда пропали не тестовые каналы, а самые настоящие 4 канала, получаемые посредством ОРС-сервера с электронного регистратора. Лихорадостно восстановил каналы, благо имена каналов совпадали с именами с переменными ОРС-сервера. Всё произошедшее было списано на больное оборудование.
Но! С тех пор, больной диск на сервере заменен, вставлены новые диски, система перенесена, вылизана, оптимизирована. Система SIMP Ligh предустановлена, поскольку как раз вышла исправленная версия. И вдруг рушатся два канала, которые жили в системе более 2-лет. Очень неприятно. А если завтра упадут еще несколько рабочих каналов, точных имен которых уже и не помнишь (число каналов сейчас уже 144, а ожидается втрое больше), а если скрипты каналов тоже разрушатся?

Вот тут прошу :unsure: вашего конкретного совета:
- как быстро восстановить пропавшие каналы?
- можно ли организовать электронную шпаргалку (какие активные каналы есть в системе, их имена и другие параметры) для того чтобы руками быстро восстановить статус кво? Или надежнее всё это записать в блокнот руками-ручками?

По поводу "размаха шкалы" для элемента Тренд.
Предлагаю сделать по аналогии с Просмотрщиком, т.е. дать возможность выставить любой диапазон. Наш максимальный горизонт - это четверо суток - 96 часов. Но может кому-то нужен и больший размах. :)

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

И так по порядку.

Хотелось бы знать, как продвигаются работы по вопросу отсчета времени.
Элемента "таймер" на мнемосхеме не хватает просто катастрофически.
На презентации новой версии 4.3.2 я задавал вопрос про таймер, был ответ - всё работает.
Проверил на этой версии вычитание времени - все осталось по старому, как и два года назад.


/* Скрипт канала time4v. Вычисляем время работы сушильного шкафа №4 */
{
// при подъеме температуры выше 50 градусов считаем что шкаф включен,
// и наоборот, при снижении температуры ниже 50 градусов считаем что шкаф выключен
TDateTime t1;
Double In1=ReadValue("Шкаф 4");
if(In1 > 50.0)
{
if(DateTimeToStr(ReadValue("time4"))=="11.11.1111 11:11:11") WriteValue("time4",Now());
// вычисляем интервал времени, прошедший со времени "засечки"
t1 = Now()-ReadValue("time4");
}
else
{
t1=StrToDateTime("11.11.1111 11:11:11")
WriteValue("time4",t1);
}
// выводим в канал либо интервал времени, либо "заглушку"
WriteValue("time4v",t1);
}

Попытаюсь объяснить почему "не работает" скрипт в предложенном Вами варианте, все дело в формате TDateTime, это переменная Double, с датой как целая часть, а время как дробная. Дата сохраняется как число дней с 30 декабря 1899. К примеру 01.01.1900 имеет значение 2.
Т.е. напрямую вычитая одну дату из другой Вы и получаете "странные результаты", без дополнительной математики тут не обойтись.

Далее…
SetTimeout(Enabled, Interval) - Выполнение скрипта приостанавливается, на время (Interval), после чего продолжает свою работу

Да, согласен, для Вашей задачи не подойдет. Данная функция подходит для организации задержек.

Проблема в следующем - портятся каналы.
О чем идет речь. Показываю на конкретном примере. Открываю экспериментальную мнемосхему, на которой провожу исследования по работе со временем, организацией таймера и др. И вижу, что два элемента, в которых высвечивается у меня начало отсчета времени и показания таймера, ПУСТЫ. Всплывающая подсказка говорит о том, что "ссылка на канал не определена". Захожу в конфигуратор каналов - действительно два этих виртуальных канала (один имеет порядковый номер 8, а другой 12) не активны. То есть их нет в списке активных каналов. Переношу в список активных каналов - в канале с номером 12 остался в живых, имевшийся там скрипт. Но вся остальная информация разрушена (имя канала, тип канала, и др.)

Последний раз с это проблемой сталкивался пару недель назад, когда на сервере начал "сыпаться" диск. Тогда пропали не тестовые каналы, а самые настоящие 4 канала, получаемые посредством ОРС-сервера с электронного регистратора. Лихорадостно восстановил каналы, благо имена каналов совпадали с именами с переменными ОРС-сервера. Всё произошедшее было списано на больное оборудование.
Но! С тех пор, больной диск на сервере заменен, вставлены новые диски, система перенесена, вылизана, оптимизирована. Система SIMP Ligh предустановлена, поскольку как раз вышла исправленная версия. И вдруг рушатся два канала, которые жили в системе более 2-лет. Очень неприятно. А если завтра упадут еще несколько рабочих каналов, точных имен которых уже и не помнишь (число каналов сейчас уже 144, а ожидается втрое больше), а если скрипты каналов тоже разрушатся?

Вот тут прошу :unsure: вашего конкретного совета:
- как быстро восстановить пропавшие каналы?
- можно ли организовать электронную шпаргалку (какие активные каналы есть в системе, их имена и другие параметры) для того чтобы руками быстро восстановить статус кво? Или надежнее всё это записать в блокнот руками-ручками?

Вот это уже интересней. На моей практике подобного поведения не встречал. Давайте будем разбираться, поэтапно. Т.е. никаких действий с каналами не проводилось, а каналы сами собой "отпали". По поводу восстановления, я думаю поможет создание бэкапов конфигурации.
Добрый день!

Благодарю за оперативный ответ.
Вы говорите: "…Дата сохраняется как число дней с 30 декабря 1899. К примеру 01.01.1900 имеет значение 2…". Вот именно, по этому я ожидаю увидеть в результате вычитания двух величин 01.01.1900 и 03.01.1900 число 2, но этого не вижу. Подскажите, как мне из результата вычитания вытащить число дней между двумя датами. Сейчас вот появились глобальные переменные, наверняка можно сделать еще проще. Да и не держусь я за свой вариант - это просто была проба сил. Если предложите свой работающий способ, с удовольствием буду использовать. Просто дополнительная математика меня заводит в такие дебри (как то: проверка на число дней в месяце, раскладывание значения на год-месяц-день-…,), что смотря на всё это безобразие, понимаешь нелепость всей этой конструкции, предназначенной всего лишь для отсчета одной секунды.

По поводу бекапов.
Безусловно дело важно и нужное.
И оно у нас выполняется, правда раз в неделю (до вчерашнего дня я считал, что этого вполне достаточно, но сегодня придется пересмотреть вопрос создания резервных копий).
Но! Вопрос в другом.
Допустим, обнаружил я поломку некоторого количества каналов спустя сутки.
Какие мои действия по восстановлению "потерянных" каналов.
Если я возьму бекап за вчерашний день, то я потеряю информацию за прошедшие сутки.
Единственный выход, который видится мне, это руками опять "прописать" каналы в конфигураторе каналов. Причем имя канала должно быть восстановлено с точностью до символа, поскольку имя канала может участвовать в скриптах, да и информация в базе данных "привязана" к точному имени канала, и окажется утраченной, если имя будет отличаться.
Как быстро и надежно восстановить список активных каналов?

А что случилось с этими двумя каналами, сейчас буду пытаться посмотреть - рабочий день начался. Два дня назад они точно были и здравствовали. Со временем я не экспериментировал в эти двое суток. Сложность в том, что это "экспериментальные" каналы - в базе не сохранялись и как определить момент их разрушения - ума не приложу.

Удачи!
С уважением, Анатолий.
Новочеркасск
День добрый,
Вы говорите: "…Дата сохраняется как число дней с 30 декабря 1899. К примеру 01.01.1900 имеет значение 2…". Вот именно, по этому я ожидаю увидеть в результате вычитания двух величин 01.01.1900 и 03.01.1900 число 2, но этого не вижу. Подскажите, как мне из результата вычитания вытащить число дней между двумя датами. Сейчас вот появились глобальные переменные, наверняка можно сделать еще проще. Да и не держусь я за свой вариант - это просто была проба сил. Если предложите свой работающий способ, с удовольствием буду использовать. Просто дополнительная математика меня заводит в такие дебри (как то: проверка на число дней в месяце, раскладывание значения на год-месяц-день-…,), что смотря на всё это безобразие, понимаешь нелепость всей этой конструкции, предназначенной всего лишь для отсчета одной секунды.

Уточним ТЗ. Если я правильно понял, необходимо отображать время между двумя событиями, примерно в таком формате 3 дня 21:15:00. Это время будет использоваться только для отображения или ещё где то? Почему спрашиваю, потому что для такого формата времени придётся использовать скорей всего строковый канал.

По поводу бекапов.
Безусловно дело важно и нужное.
И оно у нас выполняется, правда раз в неделю (до вчерашнего дня я считал, что этого вполне достаточно, но сегодня придется пересмотреть вопрос создания резервных копий).
Но! Вопрос в другом.
Допустим, обнаружил я поломку некоторого количества каналов спустя сутки.
Какие мои действия по восстановлению "потерянных" каналов.
Если я возьму бекап за вчерашний день, то я потеряю информацию за прошедшие сутки.
Единственный выход, который видится мне, это руками опять "прописать" каналы в конфигураторе каналов. Причем имя канала должно быть восстановлено с точностью до символа, поскольку имя канала может участвовать в скриптах, да и информация в базе данных "привязана" к точному имени канала, и окажется утраченной, если имя будет отличаться.
Как быстро и надежно восстановить список активных каналов?

Да, интересный вопрос. Как вариант сделать резервную копию конфигурационных файлов, без БД.

А что случилось с этими двумя каналами, сейчас буду пытаться посмотреть - рабочий день начался. Два дня назад они точно были и здравствовали. Со временем я не экспериментировал в эти двое суток. Сложность в том, что это "экспериментальные" каналы - в базе не сохранялись и как определить момент их разрушения - ума не приложу.

На "ходу" каналы "выпасть" не могли. Не осталось копии файлов конфигурации на момент когда каналы "выпали"?
Добрый день!

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

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

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

Удачи!
С уважением, Анатолий.
Новочеркасск
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 - настройки разных модулей
Добрый день!

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

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

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

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

{
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); }
Добрый день!

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

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

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

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

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

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

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

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

Если Вы знакомы с программированием то можете использовать для работы с текстовыми файлами класс 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.

Сервис поддержки клиентов работает на платформе UserEcho