PDA

Просмотр полной версии : Чтение и запись даты и времени в ПР200 наименьшим колличеством сетевых переменных



acronis
10.04.2016, 04:00
Добрый день.


1) Необходимо передать из ПР200 в ПК дату и время часов реального времени через сетевые переменные наименьшим кол-вом сетевых переменных
2) Необходимо обратно в ПР200 из компьютера посредством сетевых переменных получить дату и время наименьшим кол-вом сетевых переменных и если дата и время совпадает - запустить программу реле

Есть ли макрос для передачи даты и времени наименьшим кол-вом сетевых переменных используя PUTBIT -EXTRACT ?
можно без секунд.

capzap
10.04.2016, 06:35
если не хочется читать/писать по адресу 0х400-0х408, внутри проекта считывайте эти переменные преобразуйте в одно целочисленное и записывайте в сетевую переменную, на другом оконечном устройстве делайте обратное преобразование

acronis
10.04.2016, 09:00
Я именно про это и написал , есть ли у кого готовый макрос преобразования ?

capzap
10.04.2016, 10:15
ищите выложенные проекты расчета восхода/заката, возможно там шел подсчет в одну переменную, а так есть бибка оскат в КДС, там полно функций для даты и времени

acronis
10.04.2016, 10:18
Спасибо, посмотрю.
Если же у кого то есть готовая наработка, прошу поделиться

capzap
10.04.2016, 10:47
а сами не пробовали, минуты умножить на 60 и сложить с секундами, часы умножить на 3600 и сложить с предыдущим результатом и т.д.

acronis
10.04.2016, 11:07
Все просто , пока не доходишь до месяца - кол-во дней разное может быть , соответственно и секунд неизвестно .
То же самое относительно дней в году.
Не знаю как это решить

rovki
10.04.2016, 11:26
ДЕРЖИТЕ ВАРИАНТ ,ПОЛУЧАЕМ 2 СЛОВА ВМЕСТО 6.фомат даты ддммгг.формат времени в секундах
если нужна одна сетевая переменная ,то переведите дату в вещественный формат,умножте на миллион и сложите с вещественным временем .правда кол.регистров не уменьшите ...

acronis
10.04.2016, 11:32
Спасибо большое , а можно ли загнать в одну сетевую переменную ?

acronis
10.04.2016, 11:36
ДЕРЖИТЕ ВАРИАНТ ,ПОЛУЧАЕМ 2 СЛОВА ВМЕСТО 6.фомат даты ддммгг.формат времени в секундах

Классное решение !

rovki
10.04.2016, 11:40
Спасибо большое , а можно ли загнать в одну сетевую переменную ?
можно ,читайте выше

acronis
10.04.2016, 12:02
можно ,читайте выше

Спасибо ОГРОМНЕЙШЕЕ !
То что нужно было , и очень просто !
СУПЕР !!!!!

По совету rovki сделал так , секунды не стал учитывать. Должны работать до 2042 года.
Поправьте , если не так.

Сергей0308
11.04.2016, 02:20
Спасибо ОГРОМНЕЙШЕЕ !
То что нужно было , и очень просто !
СУПЕР !!!!!

По совету rovki сделал так , секунды не стал учитывать. Должны работать до 2042 года.
Поправьте , если не так.

Вас не смущает передавать такие значения одним регистром(16 бит)???
23789

Сергей0308
11.04.2016, 08:23
Скажу по-другому: диапазон значений WORD - 0-65535, как Вы собираетесь передавать значения никак не меньше 1,6 миллиарда? Я не говорю, что это не возможно, например последовательной передачей в одном регистре, для синхронизации можно использовать старший бит, подобно знаку в INTе, или 2 бита!!!

acronis
11.04.2016, 15:39
Добрый день.

Подскажите , а какая размерность у не сетевых переменных , если они обозначены как целочисленное ?

Павел Братковский
11.04.2016, 15:50
Подскажите , а какая размерность у не сетевых переменных , если они обозначены как целочисленное ?

выведите константу целочисленную и вбейте 10 девяток ОЛ выведет вам 42.......... десятизначное число

acronis
11.04.2016, 16:04
Печально что в симуляторе программа не выдает ошибку сетевой переменной , а показывает полностью число (целочисленное) .
Симулятор мог бы и ругаться на превышение размера....

capzap
11.04.2016, 16:10
Добрый день.

Подскажите , а какая размерность у не сетевых переменных , если они обозначены как целочисленное ?

целочисленное может быть как двухбайтным, так и четырехбайтным, посмотрите такие типы как int и unsined short. Анатолий помому Вам что то говорил про использование флоата

По поводу симулятора, он же не отвечает за обмен по модбас, ну подал он число в сетевую переменную, а в регистре она обрезается

acronis
11.04.2016, 16:24
Признаю свою ошибку, переделаю правильно.
Спасибо всем участникам за подсказки.

energvk
07.09.2016, 22:25
ДЕРЖИТЕ ВАРИАНТ ,ПОЛУЧАЕМ 2 СЛОВА ВМЕСТО 6.фомат даты ддммгг.формат времени в секундах
если нужна одна сетевая переменная ,то переведите дату в вещественный формат,умножте на миллион и сложите с вещественным временем .правда кол.регистров не уменьшите ...

Не совсем понятно, если честно. С такой формулой мы можем получить два числа (и дату и время) больше 65535, а сетевая переменная 16 бит, то есть по сети передать в таких случаях не получится. Или я не прав?

melky
07.09.2016, 23:35
вопрос, время двумя словами соответствует формату double в языках C# или Delphi ?

Doubletime

Ревака Юрий
09.09.2016, 15:53
В ближайшее время появится макрос для программируемых реле с часами реального времени, выход которого будет содержать время упакованное в UNIX формат, надеюсь данный макрос окажется полезен.

capzap
09.09.2016, 15:59
В ближайшее время появится макрос для программируемых реле с часами реального времени, выход которого будет содержать время упакованное в UNIX формат, надеюсь данный макрос окажется полезен.

а внутри то ПР как процесс происходит, в отдельные переменные unix формат преобразовывается? Может не макрос нужен а сразу время в секундах выддавать

Ревака Юрий
09.09.2016, 16:11
а внутри то ПР как процесс происходит, в отдельные переменные unix формат преобразовывается? Может не макрос нужен а сразу время в секундах выддавать

Этот вопрос требует уточнения, и даже если и можно напрямую с процессора вытянуть эту переменную, то это потянет за собой большую работу, а с помощью макроса можно быстро получить переменную и с ней работать.

capzap
09.09.2016, 16:17
ни водном процессоре не обрабатывается время по отдельности, это одна целочисленная переменная, предлагаемый Вами макрос это реверс, получается две "больших" работы

Ревака Юрий
09.09.2016, 16:23
ни водном процессоре не обрабатывается время по отдельности, это одна целочисленная переменная, предлагаемый Вами макрос это реверс, получается две "больших" работы

По быстрому загуглив регистры часов в процессорах STM увидел что там тоже нет unix формата, там данные упакованы в BCD.

capzap
09.09.2016, 16:34
а разве bcd это не представление обычного целочисленного? как hex или dec

melky
09.09.2016, 16:40
представление, только там нет A,B,C,D,E,F

Ревака Юрий
09.09.2016, 16:46
а разве bcd это не представление обычного целочисленного? как hex или dec

Я к тому, что у процессора нет конкретного регистра который можно прочитать и там будет время в unix формате, изначально разговор был про двойную работу и реверс, но на самом деле получается что это не так, т.е внутри STM такой же примерно формат часов реального времени как если бы мы поставили рядом отдельную МС например DS1307, там похожий набор регистров календаря. В любом случае нужно преобразование для получения unix времени, в данном случае я это реализовал за пределами процессора.

capzap
09.09.2016, 20:01
Я к тому, что у процессора нет конкретного регистра который можно прочитать и там будет время в unix формате

что касается STM, а как же регистр TR, я может ничего в этом не понимаю(не программирую их), но на форумах озабочены как раз именно получением отдельных значений времени из счетчика секунд. Тоже бегло пробежался и в SPL есть функции RTC->CNTL,RTC->CNTH, RTC_GetCounter()

rovki
09.09.2016, 21:36
Уж не знаю баг и фича ,но если выводить на экран сетевые переменные или внутренне переменные на индикаторе разные значения получаются

energvk
10.09.2016, 13:12
Сетевые наверное просто обрезаются до одного регистра

rovki
10.09.2016, 13:40
Скорее всего

melky
10.09.2016, 14:31
float точно не обрезается. 2 регистра, 4 байта как в аптеке.

petera
10.09.2016, 22:01
В ближайшее время появится макрос для программируемых реле с часами реального времени, выход которого будет содержать время упакованное в UNIX формат, надеюсь данный макрос окажется полезен.

Решил внести свою лепту.
26271

Макрос упаковывает стандартные дата_время в UNIX формат ( в кодесис это формат DATA_AND_TIME).
На выходе собственно упакованное DT и на двух дополнительных выходах - младший и старший WORD этого самого DT.
Выход DT можно использовать в самом ПР, например расчитывать интервалы для событий реального времени, например для вкл/выкл по расписанию. Ведь DT можно складывать, вычитать и сравнивать между собой, т.к. любое DT это всего лишь число секунд с 0 часов 1 января 1970г.
К выходам Lo_wDT и Hi_wDT нужно подключать две сетевые переменные с последовательными адресами, тогда панель или скада или ПЛК смогут прочитать DT как переменную DWORD.
26272

Как проверить работу макроса? Воспользоватся онлайн конвертером http://www.cy-pr.com/tools/time/
26273

UPD.
Немного исправил макрос,
26304
Теперь если забыли задать на входах Год или Месяц или День отличные от нуля значения, то макрос будет выдавать в DT для составляющей Дата значение "0", что соответствует началу эры Unix - 1 января 1970 года (четверг)

UPD.
Вложение удалил, т.к. полный набор макросов выложил здесь http://www.owen.ru/forum/showthread.php?t=25068&p=219996&viewfull=1#post219996.

petera
11.09.2016, 19:43
Теперь можно и в обратную сторону преобразовать:rolleyes:
26306

26307

А так же сегодня "насочинял" отдельных макросов для работы со временем Unix.
26308

Часть из них используется в макросе DT_to_UTC. Все эти макросы можно использовать и по отдельности, когда совсем не обязательно иметь все распакованные поля Дата_Время.
26309

26310

Сделаю описание и выложу отдельно

petera
11.09.2016, 22:23
Готовые макросы здесь http://www.owen.ru/forum/showthread.php?t=25068&p=219996&viewfull=1#post219996

energvk
11.09.2016, 22:27
И теперь главный вопрос к разработчикам: КОГДА же уже можно будет корректировать системное время ПР из программы?!!

rovki
11.09.2016, 22:40
И теперь главный вопрос к разработчикам: КОГДА же уже можно будет корректировать системное время ПР из программы?!!
С экрана что ли ???

energvk
12.09.2016, 01:08
С экрана или по сети

Ревака Юрий
12.09.2016, 08:59
Решил внести свою лепту.
26271

Макрос упаковывает стандартные дата_время в UNIX формат ( в кодесис это формат DATA_AND_TIME).
На выходе собственно упакованное DT и на двух дополнительных выходах - младший и старший WORD этого самого DT.
Выход DT можно использовать в самом ПР, например расчитывать интервалы для событий реального времени, например для вкл/выкл по расписанию. Ведь DT можно складывать, вычитать и сравнивать между собой, т.к. любое DT это всего лишь число секунд с 0 часов 1 января 1970г.
К выходам Lo_wDT и Hi_wDT нужно подключать две сетевые переменные с последовательными адресами, тогда панель или скада или ПЛК смогут прочитать DT как переменную DWORD.
26272

Как проверить работу макроса? Воспользоватся онлайн конвертером http://www.cy-pr.com/tools/time/
26273

UPD.
Немного исправил макрос,
26304
Теперь если забыли задать на входах Год или Месяц или День отличные от нуля значения, то макрос будет выдавать в DT для составляющей Дата значение "0", что соответствует началу эры Unix - 1 января 1970 года (четверг)

UPD.
Вложение удалил, т.к. полный набор макросов выложил здесь http://www.owen.ru/forum/showthread.php?t=25068&p=219996&viewfull=1#post219996.

Спасибо за труд, Вы прям мои мысли прочитали, как раз над обратным преобразованием я еще не начал работать, думаю теперь это будет намного легче сделать. Подгруппа "Дата и время" в ближайшее время пополнится новыми макросами.

AI!
12.09.2016, 09:18
С экрана или по сетитак если работать только с Юникс-временем, то достаточно в энергонезависимую ячейку занести смещение относительно внутренних часов, и работать только с "новым" временем.
ну и не использовать встроенных функциональных блоков CLOCK*

energvk
12.09.2016, 09:33
так если работать только с Юникс-временем, то достаточно в энергонезависимую ячейку занести смещение относительно внутренних часов, и работать только с "новым" временем.
ну и не использовать встроенных функциональных блоков CLOCK*

Ну это всё костыли, а хотелось бы...

Сергей0308
12.09.2016, 10:25
Добрый день.


1) Необходимо передать из ПР200 в ПК дату и время часов реального времени через сетевые переменные наименьшим кол-вом сетевых переменных
2) Необходимо обратно в ПР200 из компьютера посредством сетевых переменных получить дату и время наименьшим кол-вом сетевых переменных и если дата и время совпадает - запустить программу реле

Есть ли макрос для передачи даты и времени наименьшим кол-вом сетевых переменных используя PUTBIT -EXTRACT ?
можно без секунд.

Для сильно "экономных", позволяет передавать две 15 битных или одну 30 битную переменную одним регистром:

26347

Демонстрация:

26348

Надеюсь, идея понятна?!

Вот, не сдержался, чуть усовершенствовал:

32980

stratix
05.09.2017, 09:50
И теперь главный вопрос к разработчикам: КОГДА же уже можно будет корректировать системное время ПР из программы?!!

так это, можно ведь его из настроек задавать (меню по удержанию ALT) , жаль зима-лето нет перехода, но это мелочи

energvk
05.09.2017, 10:50
Объект может быть удалённым, без обслуживающего персонала. По сети было бы удобно в данном случае выполнять коррекцию

Сергей0308
05.09.2017, 12:28
Объект может быть удалённым, без обслуживающего персонала. По сети было бы удобно в данном случае выполнять коррекцию

Так вроде это возможно, совсем недавно подобную тему обсуждали и выкладывали таблицу с регистрами даты, времени и их можно не только читать, но и писать:

32972

melky
05.09.2017, 12:33
Сергей0308 просто красиво, когда передаешь 2 регистра, а время корректируется полностью. Например unix time передал, а в программе все распихалось по полочкам.

Сергей0308
05.09.2017, 19:56
Сергей0308 просто красиво, когда передаешь 2 регистра, а время корректируется полностью. Например unix time передал, а в программе все распихалось по полочкам.

Здесь выбора нет, как есть, так и есть, да и смысла особого не вижу в вашей крысоте! Раз в 5 лет?!

melky
06.09.2017, 10:12
Если нужна синхронизация то это далеко не 5 лет, а не менее раза в сутки.

Сергей0308
06.09.2017, 10:22
Если нужна синхронизация то это далеко не 5 лет, а не менее раза в сутки.

И что за сутки у Вас время на год убегает, я к тому, что в этом случае достаточно секунды синхронизировать, в крайнем случае ещё и минуты, батарейка в ПР200 5 лет прослужит, как заявляет производитель, даже наверно больше!

energvk
11.09.2017, 10:04
Так вроде это возможно, совсем недавно подобную тему обсуждали и выкладывали таблицу с регистрами даты, времени и их можно не только читать, но и писать:

32972

Оу! Как то я упустил этот момент. Спасибо большое

melky
11.09.2017, 10:46
Сергей0308 вы забываете об одной вещи, чтобы синхронизировать время по секундам и в крайнем случае минутам придется выполнять соответствующие проверки в скриптах scada системы. В случае передачи полного времени ныне в DoubleTime или на худой конец UNIX Time (что будет жить всего до 2038 года) просто передается одна переменная без всяких проверок. То есть ПК со scada синхронизируется через интернет и раз в сутки (час) отправляет время в ПР. НИикаких тебе проверок секунд, минут и прочего не требуется, как в первом случае. Достаточно привести к выбранному типу, который заложен в ПР (ПЛК)

Вариант 1 - это костыль с точки зрения программирования и прошивки прибора
Вариант 2 - это правильный вариант, так как нет необходимости сверять, высчитывать и так далее.

energvk
11.09.2017, 10:55
да, из программы было бы удобнее записывать. но хоть так можно, уже хоть что-то

Ревака Юрий
11.09.2017, 10:56
Сергей0308 или на худой конец UNIX Time (что будет жить всего до 2038 года) просто передается одна переменная без всяких проверок. То есть ПК со scada синхронизируется через интернет и раз в сутки (час) отправляет время в ПР. НИикаких тебе проверок секунд, минут и прочего не требуется, как в первом случае. Достаточно привести к выбранному типу, который заложен в ПР (ПЛК)


Вы оптимист однако:) Используя unix_to_DT можно и сейчас делать синхронизацию по сети, ничего не выщитывая, или речь о чем-то другом.