Просмотр полной версии : Чтение и запись даты и времени в ПР200 наименьшим колличеством сетевых переменных
Добрый день.
1) Необходимо передать из ПР200 в ПК дату и время часов реального времени через сетевые переменные наименьшим кол-вом сетевых переменных
2) Необходимо обратно в ПР200 из компьютера посредством сетевых переменных получить дату и время наименьшим кол-вом сетевых переменных и если дата и время совпадает - запустить программу реле
Есть ли макрос для передачи даты и времени наименьшим кол-вом сетевых переменных используя PUTBIT -EXTRACT ?
можно без секунд.
если не хочется читать/писать по адресу 0х400-0х408, внутри проекта считывайте эти переменные преобразуйте в одно целочисленное и записывайте в сетевую переменную, на другом оконечном устройстве делайте обратное преобразование
Я именно про это и написал , есть ли у кого готовый макрос преобразования ?
ищите выложенные проекты расчета восхода/заката, возможно там шел подсчет в одну переменную, а так есть бибка оскат в КДС, там полно функций для даты и времени
Спасибо, посмотрю.
Если же у кого то есть готовая наработка, прошу поделиться
а сами не пробовали, минуты умножить на 60 и сложить с секундами, часы умножить на 3600 и сложить с предыдущим результатом и т.д.
Все просто , пока не доходишь до месяца - кол-во дней разное может быть , соответственно и секунд неизвестно .
То же самое относительно дней в году.
Не знаю как это решить
ДЕРЖИТЕ ВАРИАНТ ,ПОЛУЧАЕМ 2 СЛОВА ВМЕСТО 6.фомат даты ддммгг.формат времени в секундах
если нужна одна сетевая переменная ,то переведите дату в вещественный формат,умножте на миллион и сложите с вещественным временем .правда кол.регистров не уменьшите ...
Спасибо большое , а можно ли загнать в одну сетевую переменную ?
ДЕРЖИТЕ ВАРИАНТ ,ПОЛУЧАЕМ 2 СЛОВА ВМЕСТО 6.фомат даты ддммгг.формат времени в секундах
Классное решение !
Спасибо большое , а можно ли загнать в одну сетевую переменную ?
можно ,читайте выше
можно ,читайте выше
Спасибо ОГРОМНЕЙШЕЕ !
То что нужно было , и очень просто !
СУПЕР !!!!!
По совету 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 бита!!!
Добрый день.
Подскажите , а какая размерность у не сетевых переменных , если они обозначены как целочисленное ?
Павел Братковский
11.04.2016, 15:50
Подскажите , а какая размерность у не сетевых переменных , если они обозначены как целочисленное ?
выведите константу целочисленную и вбейте 10 девяток ОЛ выведет вам 42.......... десятизначное число
Печально что в симуляторе программа не выдает ошибку сетевой переменной , а показывает полностью число (целочисленное) .
Симулятор мог бы и ругаться на превышение размера....
Добрый день.
Подскажите , а какая размерность у не сетевых переменных , если они обозначены как целочисленное ?
целочисленное может быть как двухбайтным, так и четырехбайтным, посмотрите такие типы как int и unsined short. Анатолий помому Вам что то говорил про использование флоата
По поводу симулятора, он же не отвечает за обмен по модбас, ну подал он число в сетевую переменную, а в регистре она обрезается
Признаю свою ошибку, переделаю правильно.
Спасибо всем участникам за подсказки.
ДЕРЖИТЕ ВАРИАНТ ,ПОЛУЧАЕМ 2 СЛОВА ВМЕСТО 6.фомат даты ддммгг.формат времени в секундах
если нужна одна сетевая переменная ,то переведите дату в вещественный формат,умножте на миллион и сложите с вещественным временем .правда кол.регистров не уменьшите ...
Не совсем понятно, если честно. С такой формулой мы можем получить два числа (и дату и время) больше 65535, а сетевая переменная 16 бит, то есть по сети передать в таких случаях не получится. Или я не прав?
вопрос, время двумя словами соответствует формату double в языках C# или Delphi ?
Doubletime
Ревака Юрий
09.09.2016, 15:53
В ближайшее время появится макрос для программируемых реле с часами реального времени, выход которого будет содержать время упакованное в UNIX формат, надеюсь данный макрос окажется полезен.
В ближайшее время появится макрос для программируемых реле с часами реального времени, выход которого будет содержать время упакованное в UNIX формат, надеюсь данный макрос окажется полезен.
а внутри то ПР как процесс происходит, в отдельные переменные unix формат преобразовывается? Может не макрос нужен а сразу время в секундах выддавать
Ревака Юрий
09.09.2016, 16:11
а внутри то ПР как процесс происходит, в отдельные переменные unix формат преобразовывается? Может не макрос нужен а сразу время в секундах выддавать
Этот вопрос требует уточнения, и даже если и можно напрямую с процессора вытянуть эту переменную, то это потянет за собой большую работу, а с помощью макроса можно быстро получить переменную и с ней работать.
ни водном процессоре не обрабатывается время по отдельности, это одна целочисленная переменная, предлагаемый Вами макрос это реверс, получается две "больших" работы
Ревака Юрий
09.09.2016, 16:23
ни водном процессоре не обрабатывается время по отдельности, это одна целочисленная переменная, предлагаемый Вами макрос это реверс, получается две "больших" работы
По быстрому загуглив регистры часов в процессорах STM увидел что там тоже нет unix формата, там данные упакованы в BCD.
а разве bcd это не представление обычного целочисленного? как hex или dec
представление, только там нет A,B,C,D,E,F
Ревака Юрий
09.09.2016, 16:46
а разве bcd это не представление обычного целочисленного? как hex или dec
Я к тому, что у процессора нет конкретного регистра который можно прочитать и там будет время в unix формате, изначально разговор был про двойную работу и реверс, но на самом деле получается что это не так, т.е внутри STM такой же примерно формат часов реального времени как если бы мы поставили рядом отдельную МС например DS1307, там похожий набор регистров календаря. В любом случае нужно преобразование для получения unix времени, в данном случае я это реализовал за пределами процессора.
Я к тому, что у процессора нет конкретного регистра который можно прочитать и там будет время в unix формате
что касается STM, а как же регистр TR, я может ничего в этом не понимаю(не программирую их), но на форумах озабочены как раз именно получением отдельных значений времени из счетчика секунд. Тоже бегло пробежался и в SPL есть функции RTC->CNTL,RTC->CNTH, RTC_GetCounter()
Уж не знаю баг и фича ,но если выводить на экран сетевые переменные или внутренне переменные на индикаторе разные значения получаются
Сетевые наверное просто обрезаются до одного регистра
float точно не обрезается. 2 регистра, 4 байта как в аптеке.
В ближайшее время появится макрос для программируемых реле с часами реального времени, выход которого будет содержать время упакованное в 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.
Теперь можно и в обратную сторону преобразовать:rolleyes:
26306
26307
А так же сегодня "насочинял" отдельных макросов для работы со временем Unix.
26308
Часть из них используется в макросе DT_to_UTC. Все эти макросы можно использовать и по отдельности, когда совсем не обязательно иметь все распакованные поля Дата_Время.
26309
26310
Сделаю описание и выложу отдельно
Готовые макросы здесь http://www.owen.ru/forum/showthread.php?t=25068&p=219996&viewfull=1#post219996
И теперь главный вопрос к разработчикам: КОГДА же уже можно будет корректировать системное время ПР из программы?!!
И теперь главный вопрос к разработчикам: КОГДА же уже можно будет корректировать системное время ПР из программы?!!
С экрана что ли ???
Ревака Юрий
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.
Спасибо за труд, Вы прям мои мысли прочитали, как раз над обратным преобразованием я еще не начал работать, думаю теперь это будет намного легче сделать. Подгруппа "Дата и время" в ближайшее время пополнится новыми макросами.
С экрана или по сетитак если работать только с Юникс-временем, то достаточно в энергонезависимую ячейку занести смещение относительно внутренних часов, и работать только с "новым" временем.
ну и не использовать встроенных функциональных блоков CLOCK*
так если работать только с Юникс-временем, то достаточно в энергонезависимую ячейку занести смещение относительно внутренних часов, и работать только с "новым" временем.
ну и не использовать встроенных функциональных блоков CLOCK*
Ну это всё костыли, а хотелось бы...
Сергей0308
12.09.2016, 10:25
Добрый день.
1) Необходимо передать из ПР200 в ПК дату и время часов реального времени через сетевые переменные наименьшим кол-вом сетевых переменных
2) Необходимо обратно в ПР200 из компьютера посредством сетевых переменных получить дату и время наименьшим кол-вом сетевых переменных и если дата и время совпадает - запустить программу реле
Есть ли макрос для передачи даты и времени наименьшим кол-вом сетевых переменных используя PUTBIT -EXTRACT ?
можно без секунд.
Для сильно "экономных", позволяет передавать две 15 битных или одну 30 битную переменную одним регистром:
26347
Демонстрация:
26348
Надеюсь, идея понятна?!
Вот, не сдержался, чуть усовершенствовал:
32980
И теперь главный вопрос к разработчикам: КОГДА же уже можно будет корректировать системное время ПР из программы?!!
так это, можно ведь его из настроек задавать (меню по удержанию ALT) , жаль зима-лето нет перехода, но это мелочи
Объект может быть удалённым, без обслуживающего персонала. По сети было бы удобно в данном случае выполнять коррекцию
Сергей0308
05.09.2017, 12:28
Объект может быть удалённым, без обслуживающего персонала. По сети было бы удобно в данном случае выполнять коррекцию
Так вроде это возможно, совсем недавно подобную тему обсуждали и выкладывали таблицу с регистрами даты, времени и их можно не только читать, но и писать:
32972
Сергей0308 просто красиво, когда передаешь 2 регистра, а время корректируется полностью. Например unix time передал, а в программе все распихалось по полочкам.
Сергей0308
05.09.2017, 19:56
Сергей0308 просто красиво, когда передаешь 2 регистра, а время корректируется полностью. Например unix time передал, а в программе все распихалось по полочкам.
Здесь выбора нет, как есть, так и есть, да и смысла особого не вижу в вашей крысоте! Раз в 5 лет?!
Если нужна синхронизация то это далеко не 5 лет, а не менее раза в сутки.
Сергей0308
06.09.2017, 10:22
Если нужна синхронизация то это далеко не 5 лет, а не менее раза в сутки.
И что за сутки у Вас время на год убегает, я к тому, что в этом случае достаточно секунды синхронизировать, в крайнем случае ещё и минуты, батарейка в ПР200 5 лет прослужит, как заявляет производитель, даже наверно больше!
Так вроде это возможно, совсем недавно подобную тему обсуждали и выкладывали таблицу с регистрами даты, времени и их можно не только читать, но и писать:
32972
Оу! Как то я упустил этот момент. Спасибо большое
Сергей0308 вы забываете об одной вещи, чтобы синхронизировать время по секундам и в крайнем случае минутам придется выполнять соответствующие проверки в скриптах scada системы. В случае передачи полного времени ныне в DoubleTime или на худой конец UNIX Time (что будет жить всего до 2038 года) просто передается одна переменная без всяких проверок. То есть ПК со scada синхронизируется через интернет и раз в сутки (час) отправляет время в ПР. НИикаких тебе проверок секунд, минут и прочего не требуется, как в первом случае. Достаточно привести к выбранному типу, который заложен в ПР (ПЛК)
Вариант 1 - это костыль с точки зрения программирования и прошивки прибора
Вариант 2 - это правильный вариант, так как нет необходимости сверять, высчитывать и так далее.
да, из программы было бы удобнее записывать. но хоть так можно, уже хоть что-то
Ревака Юрий
11.09.2017, 10:56
Сергей0308 или на худой конец UNIX Time (что будет жить всего до 2038 года) просто передается одна переменная без всяких проверок. То есть ПК со scada синхронизируется через интернет и раз в сутки (час) отправляет время в ПР. НИикаких тебе проверок секунд, минут и прочего не требуется, как в первом случае. Достаточно привести к выбранному типу, который заложен в ПР (ПЛК)
Вы оптимист однако:) Используя unix_to_DT можно и сейчас делать синхронизацию по сети, ничего не выщитывая, или речь о чем-то другом.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot