PDA

Просмотр полной версии : ПЛК100 миллисекунды



leming495
02.12.2015, 18:37
День добрый подскажите пожалуйста новичку.
Есть ПЛК100 Р-М
нужно узнать текущую дату время с точностью до миллисекунд

Если сделать стандартный код(найденный на просторах форума)
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;
Sys_time.ulHigh :=0;
Sys_time.ulLow :=0;
GetTime (SystemTime:=Sys_Time , TimeDate:= TimeAndDate);

миллисекунды (TimeAndDate.Milliseconds) всегда равны 0

Гарчев Евгений
02.12.2015, 19:10
Миллисекунды необходимо высчитывать из переменной Sys_time.ulLow.

leming495
02.12.2015, 19:46
Спасибо
А значение Sys_time.ulLow начинает отсчет с какого времени ?

petera
02.12.2015, 20:09
Спасибо
А значение Sys_time.ulLow начинает отсчет с какого времени ?
с полуночи (00:00:00 UTC) 1 января 1970 года (четверг)

Plutus
02.12.2015, 21:00
А подскажите пожалуйста, как лучше эти миллисекунды сконвертировать в число (int,Dint,Lint). Пробовал Dword_to_Dint, получал на выходе совсем не то, что показывает отладчик.

Plutus
03.12.2015, 09:54
21161
Что-то у меня не получается с 1970г. Получается от момента включения контроллера после долгого выключения(для наглядности в переменные скопировал значения чтоб ровно одно под другим было).
Секунда бежит в 4й позиции слева, то есть прошло всего 1815 секунд.
Причём, вчера выключал и сразу включал контроллер, данные не обнулялись. Сегодня контроллер ночь постоял выключенный и данные о миллисекундах обнулились. И вчера TimeAndDate.dwLowMSecs не были равны Sys_time.ulLow, а сегодня уже равны(за исключением того что Sys_time.ulLow более точно).

Гарчев Евгений
03.12.2015, 13:10
все правильно, я Вас немного обманул )).
Переменные структуры SysTime64 (ulLow и ulHigh) - это время работы ПЛК в мкс от включения. Т.к. после отключения питания программа в ПЛК100 продолжает выполняться до 10мин, эти переменные не обнуляются при кратковременном (менее 10 мин) отключении питания.
Миллисекунды системного времени хранятся в структуре SystemTimeDate, извлечь их можно из переменной dwLowMSec:
mms:=std.dwLowMSecs-(std.dwLowMSecs/1000)*1000;

Plutus
03.12.2015, 14:00
Спасибо большое за информацию (в том числе и о 10ти минутах) и за пример.

Валенок
03.12.2015, 19:08
Интересно, сколько мсек выполняется код для получения в строку времени с точностью до мсек