Добрый день!
Попросили добавить таймер и вот что заметил.
1. По нажатию кнопки присваиваем переменной типа DateTime текущее время 2. В 1-секундном скрипте переменной типа DateTime присваиваю следующее: tTime_Now.Value := StrToDateTime(IntToStr(SecondsBetween(Now, tTime_start.Value)));
3. Там же переменной типа String присваиваю следующее: tTime_Now_1.Value := SecondsToStr(SecondsBetween(Now, tTime_start.Value));
На прикрепленных картинках видно, что String переменная меняется как надо, то есть с нуля начинается отсчет.
Но вот переменная типа DateTime как-то странно. С "начала веков" отсчитывает часы, а после 23 переходит на текущее время.
Не знаю что это. Можете как то пояснить, может что не правильно делаю?
Жду ответов и вопросов.
Функция SecondsToStr (https://simple-scada.com/help/script/secondstostr.html) переводит количество секунд в строку в формате "чч:мм:сс", что и происходит в Вашем случае. В остальных случаях Вы работаете с DateTime. Это обычное вещественное число (аналогично типу Double). Нулевое значение соответствует дате "30.12.1899 00:00:00". Более подробное описание типа можно найти по этой ссылке (http://www.delphibasics.ru/TDateTime.php).
Здравствуйте. А есть возможность в результате функции SecondsToStr не отображать секунды? В подсчете наработок оборудования нужны только HH:MM. Применяю универсальный скрипт на текст с событием OnDataChenge, и секунды - лишняя информация
var
aSeconds: Int64;
begin
if Sender is TM_Text then
with Sender as TM_Text do
begin
aSeconds := SecondsBetween(Variable.AsDateTime, 0);
Text := SecondsToStr(aSeconds);
end;
end.
Здравствуйте.
А есть возможность в результате функции SecondsToStr не отображать секунды? В подсчете наработок оборудования нужны только HH:MM.
Такой возможности нет, но для решения описанной задачи можно изменить код скрипта следующим образом:
var
aSeconds, aHours : Int64;
begin
if Sender is TM_Text then
with Sender as TM_Text do
begin
aHours := HoursBetween(AsDateTime, 0);
aSeconds := SecondsBetween(AsDateTime, 0);
Text := ZeroPad(aHours, 2) + ':' + ZeroPad((aSeconds mod 3600) div 60, 2);
end;
end.
Пытаюсь заполнить таблицу, SecondsBetween не работает, ткните почему пожулуйста
var
Timer:TDateTime;
begin
tblSchedule.GetCell(1, 1).Text := txt_l1m1_time_bt_start_1.Text;
tblSchedule.GetCell(4, 1).Text := txt_l1m1_time_bt_stop_1.Text;
tblSchedule.GetCell(2, 1).Text := TimeToStr(StrToTime(tblSchedule.GetCell(1, 1).Text) + StrToTime(tblSchedule.GetCell(3, 1).Text));
//Timer := SecondsBetween(StrToTime(tblSchedule.GetCell(4, 1).Text), StrToTime(tblSchedule.GetCell(2, 1).Text));
//tblSchedule.GetCell(5, 2).Text := TimeToStr(Timer); // не работает, выводит только нули
tblSchedule.GetCell(5, 1).Text := TimeToStr(StrToTime(tblSchedule.GetCell(2, 1).Text) - StrToTime(tblSchedule.GetCell(4, 1).Text));
//tblSchedule.GetCell(4, 1).Text := TimeToStr(StrToTime(tblSchedule.GetCell(1, 1).Text) + StrToTime(tblSchedule.GetCell(3, 1).Text));
end.
Доброго дня. Помогите справиться с задачей:
По тех процессу на одном из этапов варки (itap_varki) мы должны 20 мин варить продукт при температурном диапазоне 124,8-126,8°С
Скрипт таймера 1сек имеет вид, но температура естественно измеряемый параметр и если она выйдет за допустимый интервал то таймер остановиться.
if (itap_varki.AsInt = 4) and (temperature.AsInt > 123) and (CompareTime(vrTimer.AsDateTime, 0) > 0) then
begin
vrTimer.Value := IncSecond(vrTimer.AsDateTime, -1); // уменьшаем таймер на 1 секунду
if CompareTime(vrTimer.AsDateTime, IncMinute(0, 5)) = 0 then // если осталось 5 минут, то
AddMessage(Now, mkAlarm, 'До окончания таймера 4 этапа осталось 5 минут' + ' варка: ' + fld_VarkaAdd.Text, True, True)
else
if CompareTime(vrTimer.AsDateTime, 0) <= 0 then
// КОД РАЗМЕЩЕННЫЙ ЗДЕСЬ БУДЕТ ВЫПОЛНЯТЬСЯ ПО ТАЙМЕРУ
AddMessage(Now, mkAlarm, 'Таймер 4 этапа Окончено. Охлаждение реактора.' + ' варка: ' + fld_VarkaAdd.Text, True, True);
end;
end.
Может у кого то уже реализовано, как правильно запустить таймер допустим сравнив показания температуры 20 сек назад по времени, а потом стартовать таймер?