PDA

Просмотр полной версии : Как отсветить UpTime контроллера?



Elka
22.10.2010, 10:08
Использую следующий код:
PROGRAM SHOW_UPTIME
VAR_INPUT
z: DINT;
END_VAR
VAR
FormatUint: STRING(10):='%02u';
FormatUintS: STRING(10):='%01u';
t: DINT;
dd: UDINT;
hh: UDINT;
mm: UDINT;
ss: UDINT;
uptime_sec: UDINT;
END_VAR

uptime_sec:=uptime_Sys_time.ulHigh*4294+uptime_Sys _time.ulLow/1000000;
dd:=uptime_sec/86400;
hh:=(uptime_sec-dd*86400)/3600;
mm:=(uptime_sec-dd*86400-hh*3600)/60;
ss:=uptime_sec-hh*3600-mm*60;
IF dd<9 THEN
t:=ShowDint(z, 9, 0, FormatUintS,dd);
t:=ShowString(z, 10, 0, 'д');
t:=ShowDint(z, 11, 0, FormatUint,hh);
t:=ShowString(z, 13, 0, ':');
t:=ShowDint(z, 14, 0, FormatUint,mm);
ELSE
t:=ShowString(z, 9, 0, '>9 дней-ОК');
END_IF

Структуры со временем - глобальные переменные:
VAR_GLOBAL
uptime_Sys_Time: SysTime64;
TimeAndDate: SystemTimeDate;
END_VAR

Переменные заполняются следующим образом:
PROGRAM GET_TIME
VAR_INPUT
END_VAR
VAR
GetTime: CurTimeEx;
END_VAR


TimeAndDate.Day :=0;
TimeAndDate.DayOfWeek :=0;
TimeAndDate.dwHighMsec :=0;
TimeAndDate.dwLowMSecs :=0;
TimeAndDate.Milliseconds :=0;
TimeAndDate.Minute :=0;
TimeAndDate.Second :=0;
TimeAndDate.Hour :=0;
TimeAndDate.Year :=0;
TimeAndDate.Month :=0;

uptime_Sys_Time.ulHigh :=0;
uptime_Sys_Time.ulLow :=0;

GetTime (SystemTime:=uptime_Sys_Time, TimeDate:= TimeAndDate);

Что в итоге имеем: сначала время отсчитывается хорошо, потом, в какой-то момент времени, начинает идти в обратную сторону, затем опять хорошо и т.д.
Очевидно, где-то вместо беззнакового INTа используется знаковый. Не могу понять где, и всё тут...

Или может есть готовый кусочек кода?

Под UpTime'ом подразумеваю время с момента загрузки контроллера и автостарта программы.

lara197a
22.10.2010, 20:37
см. влож.2953

Elka
23.10.2010, 00:26
спасибо, но либо я чего-то не увидел, либо чего-то не понял. интересно время с момента запуска контроллера, а не вывод текущих даты/времени. типа сколько времени не передёргивалось питание или не подвисал с последующей автоперезагрузкой контроллер. файловой системы на плк63 нет, с регистратором мсд-100 толком не поработаешь, ибо на Rs-485 висит модем. хоть так какое-то понимание у оператора будет...

lara197a
23.10.2010, 01:18
Ну так используй CurTime :
SysTime ulHigh: dword; Содержит 0
ulLow: dword; Содержит время с момента загрузки ПЛК в миллисекундах
Что-то не пойму проблему?
Правда учитывай, что после заполнения dword отсчет идет с нуля.
Есть готовая система диспетчеризации ПЛК со встроенным модемом и диспетчер для ПК+ СМС на 3 тлф. Удаленное управление объектом, контроль и обновление ПРГ.
Если интересно пиши в личку. Ты меня знаешь.

Elka
24.10.2010, 00:40
Во-первых, там микросекунды, т.е. 10^-6, а не миллисекунды (10^-3).
Во-вторых, и в ulLow, и в ulHigh есть данные (что следует из первого).
В-третьих, как минимум, между часами, отображающими время и этими внутренними часами у меня на ПЛК63 постоянно увеличивается расхождение. За 6 минут примерно на 20 секунд. Часы, отображающие время показывают его вполне точно. UpTime отстаёт. Разница велика, ни на какие погрешности округления не списывается. В принципе, проблема uptime решается переводом текущего времени при старте программы в unixtime, текущего в процессе работы, опять же в unixtime, дальше вычислением их разницы и переводом в дни/часы/минуты. Но муторно.

За предложение спасибо, но самому хочется ;-)

PS. Кстати, после заполнения DWORD'а нулями отсчёт не сбивается, если что...
PPS. Прошивка 2.11

lara197a
24.10.2010, 10:27
в плк при работе онлайн, значительно увеличивается время цикла.
попробуй к примеру вывести эти значения на экран и посмотреть, будет ли расти разница во времени?
и я не очень понял, нужны миллисекунды или микросекунды? если миллисекунды,то как бы проблема легко разрешима, если микро, то зачем такая точность?

Elka
25.10.2010, 10:55
Т.е. при работе online время работы контроллера течёт медленнее? Причем только его uptime, а календарное время - течёт как обычно. Как-то это не совсем правильно, как мне кажется, да и реализовать внутри контроллера это сложнее, чем обычный отсчёт времени. Но проверю в ближайшие дни, так ли это...

А требуемая точность - мне и минут достаточно...

Andy
25.10.2010, 13:00
в плк при работе онлайн, значительно увеличивается время цикла.
попробуй к примеру вывести эти значения на экран и посмотреть, будет ли расти разница во времени?
и я не очень понял, нужны миллисекунды или микросекунды? если миллисекунды,то как бы проблема легко разрешима, если микро, то зачем такая точность?

Опа! А можно поподробнее: на сколько %% (во сколько раз)? Или это субъективные ощущения? Вопрос не праздный, использую отображение встроенное в Кодесис, одновременно имею непонятные проблемы с реакцией на внешние входы.

Elka
28.10.2010, 01:08
Online на течение времени субъективно не влияет. Точных измерений не проводил, но вот программка на которой видно, что в любом случае часы, показывающие uptime (т.е. структура SystemTime функционального блока CurTimeEx) отстают от календарных.

Покажите, где у меня кривые руки, а если это не они, то стоит ли ждать каких-нибудь исправлений в прошивках? ПЛК63, прошивка 2.11

Не критично-есть альтернативные решения, про которые писал выше...

lara197a
28.10.2010, 18:11
как бы все правильно написано.
правда на на железе не проверял.
подождем что овен скажет.

Elka
01.11.2010, 12:51
А из службы поддержки OWEN никто не моделировал ситуацию (собственно всё моделирование - это запуск приаттаченного проекта и сравнение разницы времени при старте и через 1-2 минуты)? Подтверждается ли аналогичная проблема? И если подтверждается, будут ли исправления? Или ничего не подтверждается, а у меня какая-то железнячная проблема?
Или это вообще не проблема, а я просто неверно толкую смысл структуры SysTime?

Вкратце: текущая проблема: время работы контроллера течёт со скоростью, отличной от скорости течения календарного времени.

Elka
03.11.2010, 09:55
люди, где вы?

Александр Приходько
03.11.2010, 14:48
здравствуйте. проблема в том что оба метода получения времени работают от разных процессоров плк. процессоры между собой не синхронизированы, поэтому идет разбег во времени.

пользуйтесь одним из методов. я бы рекомендовал отталкиваться от часов реального времени.