PDA

Просмотр полной версии : Как работать с аппаратными часами ПЛК-100?



SERHY
25.04.2007, 17:30
Необходимо программно считывать показания аппаратных часов реального времени.SysLibRTC не работает.При использовании SysLibTime
корректное время появляется один раз, после чего часы "стоят"(меняются только микросекунды).Как быть?
Serhy

Nekit
25.04.2007, 18:01
Обратите внимание что переменная SystemTime имеет тип VAR_IN_OUT и обращаться к ней нужно через указатели.
"...Обратите внимание, что переменные вход-выход (VAR_IN_OUT) передаются в экземпляр функцио-
нального блока через указатели. Поэтому таким переменным нельзя присваивать константы при вызове...".
Должно все работать.

Филоненко Владислав
26.04.2007, 08:10
Для корректной работы SysLibTime, если вы хотите считать данные, то надо обнулить структуру, передаваемую ФБ, иначе будет происходить запись! Это описано в документации.

Василий Куц
05.05.2007, 20:48
пример простейший можно? что-то в доке написано как-то..... да и пример из доки у меня не заработал.

Generator
07.05.2007, 07:01
пример простейший можно? что-то в доке написано как-то..... да и пример из доки у меня не заработал.

Пожалуйста:
FUNCTION_BLOCK DateAndTimeStr
...
VAR_OUTPUT
DateStr: STRING;
...
END_VAR
VAR
CTimeEX: CurTimeEx;
SystemTime: SysTime64;
TimeDate: SystemTimeDate;
StrTemp1: STRING;
StrTemp0: STRING;
END_VAR

(* получение системного времени *)
LD 0
ST TimeDate.Milliseconds
ST TimeDate.Second
ST TimeDate.Minute
ST TimeDate.Hour
ST TimeDate.Day
ST TimeDate.DayOfWeek
ST TimeDate.Month
ST TimeDate.Year
ST SystemTime.ulLow
ST SystemTime.ulHigh
CAL CTimeEX(SystemTime:=SystemTime, TimeDate:=TimeDate)

(* подготовка строки "дата" в формате DD Month YYYY (16) *)
LD TimeDate.Year
INT_TO_STRING
ST StrTemp1
LD DateFormat

(* вывод названия месяца *)
LD TimeDate.Month
SUB 1
MUX ' января ', ' февр. ', ' марта ', ' апреля ', ' мая ', ' июня ', ' июля ', ' авг. ', ' сент. ', ' окт. ', ' ноября ', ' дек. '
CONCAT StrTemp1
ST StrTemp1

LD TimeDate.Day
INT_TO_STRING
INSERT '0', 0
RIGHT 2
CONCAT StrTemp1
ST DateStr

ну и т.д. для времени.
Удачи.

Vitaly K.
17.06.2009, 19:12
В примере выше время конвертируется в строку.
А как перевести полученные INT-овые дату и время в формат DATE_AND_TIME (в секундах)?

Kirill
18.06.2009, 10:56
В примере выше время конвертируется в строку.
А как перевести полученные INT-овые дату и время в формат DATE_AND_TIME (в секундах)?

При переводе целые числа становятся милисекундами.
Домножаете на нужное значение(например на 100 для получения секунд) и переводите. Но способ, конечно, не слишком удобный.

Vitaly K.
18.06.2009, 12:04
Время-то таким образом переводить можно. А вот как перевести дату? Нет чёткого алгоритма, на сколько умножать, например, месяцы. Потому что в месяце может быть разное количество дней.
Или, может быть, кто-то подскажет другой способ получения текущих даты/времени в секундах от 01/01/1970.

Филоненко Владислав
19.06.2009, 14:14
яндекс поможет, существуюет стандартный алгоритм

Vitaly K.
19.06.2009, 16:23
яндекс поможет, существуюет стандартный алгоритм
Спасибо за исчерпывающий ответ!

Пока просто строю строку с датой, а потом конвертирую её в тип DT.

acidburst
25.10.2009, 15:07
Вопрос. процедура CurTimeEx в режиме эмуляции не работает?

Валенок
25.10.2009, 15:13
нет. только на живом плк

acidburst
25.10.2009, 15:18
это как бы... засада. могу ли я надеяться, что если выложу код, знающие люди просмотрят его правильность? а то все отдали заказчику, а нужно переделать...
и еще, есть ли способ в режиме эмуляции получить время из ос?

acidburst
25.10.2009, 16:09
спасибо. завтра еще вопросы созреют ))

Crusash
20.11.2009, 10:41
спасибо. завтра еще вопросы созреют ))

А вот у меня уже созрел вопросец:
Функциональный блок CurTime как и CurTimeEX выдаёт переменную SystemTime типа SysTime64, которая содержит в двух двойных словах системное время в микросекундах(при этом нижний регистр ulLow вмещает в себя около 80минут). Работа с 64 разрядными данными в КоДеСисе ,видимо, не предусмотрено (есть какой то LWORD, но никакие операции преобразования с ним не работают), поэтому чтобы перевести SystemTime скажем в минуты мне приходится делать так:

VAR
fb_time:CurTime;
t_time:SysTime64;
dw_time:DWORD;
rrr:REAL;
END_VAR
fb_time(SystemTime:=t_time);
rrr:=16#100000000;
dw_time:=t_time.ulHigh*REAL_TO_DWORD(rrr/60000000) + t_time.ulLow/60000000;(*конвертируем в минуты*)

Отсюда вопрос: может существует более изящный метод работы с этими данными?

Филоненко Владислав
20.11.2009, 13:42
есть еще время в мс.
и вообще, какова задача? нузны ли там наносекунды?

Crusash
21.11.2009, 13:39
Да нет, не нужны, просто интересно - если функция есть - значит её нужно както использовать)))
Кстати ещё вопрос: есть ли разница по скорости работы функции RTC из стандартной библиотеки и функциями из библиотеки SysLibTime?

lara197a
22.11.2009, 12:30
в настоящее время функция Rtc исключена из стандарта мэк, так как есть определенные проблемы в ходе выполнения функции(к примеру остановка при отключении питания плк). аппаратными часами пользоваться гораздо надежнее. аппаратные часы идут не зависимо от от цикла плк.
вы только обращаетесь к определенному регистру и считываете его значение и затем делаете в программе необходимые вам преобразования.
подробно данный вопрос описан в книге и. в. петрова "программируемые контроллеры"

Crusash
25.11.2009, 09:59
спасибо за совет, интересная книжица...
наконец то я хоть гдето увидел хорошее методическое пособие по Sfc языку...

Crusash
14.12.2009, 13:17
есть еще время в мс.
и вообще, какова задача? нузны ли там наносекунды?

Вообще суть в том чтобы не парится при расчётах времени(перевод дат со временем - во время),
а иметь конкретное время, скажем в минутах, от начала работы ПЛК, благо в два двойных слова (64 bit) в миллисекундах влезает более пятисот тысяч лет, что вполне достаточно для любых задач)))

Филоненко Владислав
14.12.2009, 14:56
В библиотеке SysLibTime.lib можно получить время в мили и микросекундах с момента запуска ПЛК

Crusash
15.12.2009, 10:49
В библиотеке SysLibTime.lib можно получить время в мили и микросекундах с момента запуска ПЛК

Да ладно, в документации говорится что в CurTimeEx.Milliseconds находятся миллисекунды текущей секунды, но никак не миллисекунды от начала работы...
Мне такая точность не нужна. Поэтому я и привёл способ перевода времени от начала работы (SysTime64) из микросекунд в минуты... Спрашивал есть ли более удачные решения И удивлялся - почему в кодесисе не работают 64х битные переменные....
А вы мне второй раз про миллисекунды рассказываете, да мне хоть наносекунды, разберитесь в сути вопроса прежде чем отвечать!!!
Мне нужно непрерывное значение времени в минутах, будь оно от начала работы или от рождества христого - не принципиально...

Филоненко Владислав
15.12.2009, 12:05
если вам надо время с включения - используйте миллисекунды/микросекунды, если время в минутах с какой-то даты - только часы реального времени. это радикально разные понятия.
а 64 битные переменные не работают. наверное процессор 32-битный?
но что мешает вам обработать 64битное число как 2 32 битных? переполнилось младшее - +1 к старшему.

Crusash
15.12.2009, 13:12
дело в том что с двумя 32х битными данными трудновато работать, рутинные операции (логические, арехметические) требуют отдельных процедур...
к сожалению кодесис не поддерживает перегрузку операторов как в с++, а методы фб не могут принимать аргументов(зачем их вообще реализовали?), поэтому я в моей процедуре и перевожу 64 бита в 32 с округлением времени до минут(8171 год влезает)))...

Филоненко Владислав
15.12.2009, 16:07
Какие трудные операции? Функцию ADD64, принимающую 3 аргумента Pointer to 64bita, 32 бита операнд , 32 бита операнд трудно сделать? И остальные?