Просмотр полной версии : СП300 - синхронизация времени
parovoZZ
27.03.2024, 14:53
Всем привет!
Требуется на сабже синхронизировать время с ПЛК. Время на ПЛК синхронизируется с сервером времени.
Системные регистры, содержащие время, только для чтения. Экспорт времени - это только экспорт. А мне нужен импорт с ПЛК.
Не понимаю, есть ли такая возможность?
У меня в библиотеке ГМ есть для этого случая Графический Макрос для автоматической синхронизации часов панели с часами ПЛК.
Панель - мастер, ПЛК - слейв.
В слейве ПЛК нужно шесть регистров с временем по порядку Год, Месяц, День, час, минуты,секунды
Синхронизация происходит ежедневно, ровно в полдень по часам в ПЛК или по команде(через бит управления)
ГМ находится в папке ".\ГМ для СП300\Макро\ДатаВремя\RTC"
74760
Переменные
74761
ДатаВремя в ПЛК - адрес первого регистра из шести, в которых находятся текущие значения (год, месяц, день, час, минуты, секунды) часов ПЛК.
ЗАМЕЧАНИЕ
диапазон значений для года ограничен значениями от 2000 до 2099
диапазон значений для месяца от 1 до 12
диапазон значений для дня от 1 до 31
диапазон значений часов от 0 до 23
диапазон значений для минут и секунд от 0 до 59.
В макросе проверяется диапазон входных переменных и если их значение не укладывается заданные диапазоны, то их значения будут принудительно ограничены максимальным или минимальным значениями.
Т.е. если полученное из ПЛК значение для года будет, например 1998, то будет взято нижнее допустимое значение - 2000. Или если полученное из ПЛК значение для месяца будет, например 100, то будет взято верхнее допустимое значение - 12.
СинхПоКоманде - дополнительный вход для принудительной синхронизации часов, задается битом. Синхронизации будет выполнена по фронту этого бита, например от битовой кнопки с действием ВКЛ. пока нажата. Если дополнительный вход ненужен, следует использовать бит PSB1 - перманентный лог."0".
ЗЫ проект с этим ГМ во вложении
parovoZZ
27.03.2024, 15:35
А этот макрос куда записывает полученные значения?
А этот макрос куда записывает полученные значения?
В RTC (часы реального времени) панели
Значения будут видны в системных регистрах PSW30..35
parovoZZ
27.03.2024, 15:50
Так макрос физически куда пишет? В справке ничего не нашёл про то, как из макроса писать в RTC.
Так макрос физически куда пишет? В справке ничего не нашёл про то, как из макроса писать в RTC.
Я же сказал - физически пишет в RTC !
Я же сказал - физически пишет в RTC !
ЗЫ.
У меня Графический Макрос, про него и подавно в справке ничего нет :p
Вот - прямо в RTC и пишет
74767
74768
parovoZZ
27.03.2024, 16:06
А это откуда картинка? В моём конфигураторе почему такого нет?
А это откуда картинка? В моём конфигураторе почему такого нет?
Вам ехать или шашечки?
74769
parovoZZ
27.03.2024, 16:39
Мне и то, и другое. Ещё и завернуть)
parovoZZ
28.03.2024, 10:09
Вам ехать или шашечки?
Мне, напрмиер, не нужна дата. Как минимум, год и месяц. А только время. Как это исправить?
Писать из панели в ПЛК, а потом читать макросом эти же регистры...ну это же бред?
Хуже всего, когда зависишь от кого-то((
Мне, напрмиер, не нужна дата. Как минимум, год и месяц. А только время. Как это исправить?
Писать из панели в ПЛК, а потом читать макросом эти же регистры...ну это же бред?
Хуже всего, когда зависишь от кого-то((
Читать/писать...
Не все так очевидно.
В регистрах панели время представлено в BCD формате(двоично десятичный формат), а в регистрах слейва ПЛК - в обычном двоичном.
Мой макрос не просто читает из ПЛК 6 регистров, а е еще и преобразует каждое значение в двоично десятичный формат. После чего записывает новые значения в RTC.
Если уже никак нельзя взять дату из ПЛК, то проще подправить мой ГМ, 10 - 15 сек времени потратить
kondor3000
28.03.2024, 12:45
Да ничего не надо подправлять, синхронизацию надо делать и даты и времени.
А брать что надо, нужно только время, берёте 3 регистра времени, час, мин и сек.
parovoZZ
28.03.2024, 12:47
Так а в чём его править?
Так а в чём его править?
В нем же (в конфигураторе) и править
https://owen.ru/forum/attachment.php?attachmentid=74797&d=1711618947
А теперь проверим результат
https://owen.ru/forum/attachment.php?attachmentid=74799&d=1711619304
Этот проект с модифицированным макросом
parovoZZ
28.03.2024, 13:20
В нем же (в конфигураторе) и править
у меня нет такого
74803
parovoZZ
28.03.2024, 13:22
Да ничего не надо подправлять, синхронизацию надо делать и даты и времени.
да что-то лениво писать код для вычисления текущего месяца и даты))
А стандартная SysTimeRtcConvertUtcToLocal из CodeSys вешает контроллер.
у меня нет такого
74803
Самый простой способ - редактировать файл "Option.dat"
Для версии 2D.3к нужно искать его в папке "\xinje\TouchWin" в Application Data в профиле текущего пользователя Windows
Для быстрого перехода в папку Application Data для любой версии Win
1. Запустите окошко «Выполнить», нажав комбинацию клавиш Win+R
2. Введите или скопируйте туда фразу “%appdata%” без кавычек
Папка Application Data откроется, невзирая на то, что она скрытая. Ищите в ней папку xinje\TouchWin.
Открываете в блокноте Option.dat и в секции [software]
пишите ключ
UserMode=1
Если секции [software] нет, то создать ее
[software]
UserMode=1
Однако через редактирование файла "Option.dat" в этой версии конфигуратора полноценно работать в расширенном режиме уже невозможно, все базовые элементы на панелях серые. Можно только редактировать системные экраны и системные окна.
Нужны более кардинальные способы.
Вот в старой версии, V2.D3d, если ее установить в другую папку, можно полноценно работать в расширенном режиме
- найти файл Option.dat, в папке с конфигуратором
- открыть его в Блокноте
- найти секцию
[software] (если ее нет, то создать)
- дописать в секцию [software] ключ
usermode=1
Для возврата в обычный режим, записать
usermode=0
parovoZZ
28.03.2024, 14:03
а как часто вызывается этот макрос?
а как часто вызывается этот макрос?
В посте #2 все расписано
Синхронизация происходит ежедневно, ровно в полдень по часам в ПЛК или по команде(через бит управления)
А через бит управления - с любой частотой
СинхПоКоманде - дополнительный вход для принудительной синхронизации часов, задается битом. Синхронизации будет выполнена по фронту этого бита, например от битовой кнопки с действием ВКЛ. пока нажата. Если дополнительный вход ненужен, следует использовать бит PSB1 - перманентный лог."0".
parovoZZ
28.03.2024, 16:48
А глобальным его надо делать?
А глобальным его надо делать?
Да, конечно
parovoZZ
04.04.2024, 16:37
Удивительно... Оказывается, во внутреннем пространстве панели есть пара регистров PSW220 и PSW221, с помощью которых можно подправить системное время. И ведь нигде в справке про это не сказано.
kondor3000
04.04.2024, 21:58
Удивительно... Оказывается, во внутреннем пространстве панели есть пара регистров PSW220 и PSW221, с помощью которых можно подправить системное время. И ведь нигде в справке про это не сказано.
Страница 199 Руководства по эксплуатации 74975
У меня в библиотеке ГМ есть для этого случая Графический Макрос для автоматической синхронизации часов панели с часами ПЛК.
Панель - мастер, ПЛК - слейв.
В слейве ПЛК нужно шесть регистров с временем по порядку Год, Месяц, День, час, минуты,секунды
Синхронизация происходит ежедневно, ровно в полдень по часам в ПЛК или по команде(через бит управления)
ГМ находится в папке ".\ГМ для СП300\Макро\ДатаВремя\RTC"
74760
Переменные
74761
ДатаВремя в ПЛК - адрес первого регистра из шести, в которых находятся текущие значения (год, месяц, день, час, минуты, секунды) часов ПЛК.
ЗАМЕЧАНИЕ
диапазон значений для года ограничен значениями от 2000 до 2099
диапазон значений для месяца от 1 до 12
диапазон значений для дня от 1 до 31
диапазон значений часов от 0 до 23
диапазон значений для минут и секунд от 0 до 59.
В макросе проверяется диапазон входных переменных и если их значение не укладывается заданные диапазоны, то их значения будут принудительно ограничены максимальным или минимальным значениями.
Т.е. если полученное из ПЛК значение для года будет, например 1998, то будет взято нижнее допустимое значение - 2000. Или если полученное из ПЛК значение для месяца будет, например 100, то будет взято верхнее допустимое значение - 12.
СинхПоКоманде - дополнительный вход для принудительной синхронизации часов, задается битом. Синхронизации будет выполнена по фронту этого бита, например от битовой кнопки с действием ВКЛ. пока нажата. Если дополнительный вход ненужен, следует использовать бит PSB1 - перманентный лог."0".
ЗЫ проект с этим ГМ во вложении
Петр, подскажите, этот макрос только синхронизирует время панели относительно ПЛК или может и наоборот работать, то есть синхронизировать время ПЛК относительно времени панели?
Петр, подскажите, этот макрос только синхронизирует время панели относительно ПЛК или может и наоборот работать, то есть синхронизировать время ПЛК относительно времени панели?
Только время из ПЛК в панель, на оборот не делал
ShmoninEN
17.02.2025, 11:42
А можете сделать подобное, только время панели передавать в ПЛК? Точнее, в ПР103. Раз в сутки или по команде пользователя.
kondor3000
17.02.2025, 12:18
А можете сделать подобное, только время панели передавать в ПЛК? Точнее, в ПР103. Раз в сутки или по команде пользователя.
Это не проблема, Дату и Время в панели можно взять прямо из PSW30-36 регистров 82015
или вывести в любые 7 регистров, поставив галку.
Создать ФО (функц. облать) в ней по биту копировать группу из 7 регистров (или 3 -только время)
в нужные сетевые переменные. В примере есть ГМ для конвертирования времени из HEX в DEC.
ShmoninEN
17.02.2025, 13:01
А как их потом в ПР103 писать, чтобы именно в системное время запись была?
kondor3000
17.02.2025, 13:05
А как их потом в ПР103 писать, чтобы именно в системное время запись была?
А тут и вся загвоздка, в ПР205 есть установка, а ПР103 надо проверять.
ShmoninEN
18.02.2025, 04:17
В ПР103 есть регистр 61553 доступный для записи, это время в секундах с 2000 года. Осталось придумать как преобразовать текущее время с панели в количество секунд с 2000 года с учётом всех високосных годов, а потом писать его в ПР. Есть ли для этого готовый макрос?
Евгений Кислов
18.02.2025, 06:10
В ПР103 есть регистр 61553 доступный для записи, это время в секундах с 2000 года. Осталось придумать как преобразовать текущее время с панели в количество секунд с 2000 года с учётом всех високосных годов, а потом писать его в ПР. Есть ли для этого готовый макрос?
https://ftp.owen.ru/SP300/99_ForumFiles/Example_ToUnixStamp_v3.txp
kondor3000
18.02.2025, 08:07
В ПР103 есть регистр 61553 доступный для записи, это время в секундах с 2000 года. Осталось придумать как преобразовать текущее время с панели в количество секунд с 2000 года с учётом всех високосных годов, а потом писать его в ПР. Есть ли для этого готовый макрос?
Дата, Время и День недели через DT с 2000г. (и с 1970г.)_ https://owen.ru/forum/showthread.php?t=40116#4
ShmoninEN
18.02.2025, 10:03
Спасибо ответившим, буду пробовать. По результатам напишу.
ShmoninEN
27.02.2025, 04:56
https://ftp.owen.ru/SP300/99_ForumFiles/Example_ToUnixStamp_v3.txp
В общем, попробовал я этот макрос. В целом, получилось сформировать необходимое количество секунд, с 2000 года по текущую дату и время, с доработкой макроса. Проблема теперь в другом. Панель никак не может корректно записать эти секунды в регистр 61553 ПР103. Саму запись организовал по кнопке вот таким способом:
PSW[310]=LOWORD(UnixTime);
PSW[311]=HIWORD(UnixTime);
ArrValue[1]=PSW[300];
ArrValue[2]=PSW[301];
Writes(PLC, 1, MODBUS_RTU_REGS_4X, 61553, 2, ArrValue);
Где UnixTime и есть то необходимое количество секунд с 2000 года (не с 1970, уже вычислено).
Если записывать как есть, то дата получается какая-то странная, 2044 год, что неправильно. Если поменять местами регистры в массиве таким образом:
PSW[310]=HIWORD(UnixTime);
PSW[311]=LOWORD(UnixTime);
то дата пишется всегда корректно, но время постоянно какое-то разное. Пробую писать нажимая кнопку подряд примерно каждые 3-4 секунды, время в ПР103 увеличивается на минуты и часы. Такое чувство, что нужно как-то сформировать байты, но пока не знаю как.
Есть ли где-то информация, как именно нужно писать время в регистр 61553? В документации толком ничего про это не написано.
Пишите в [310..], перекладываете куда-то за каким то из [301] из этого "куда то" куда то отправляете.
Чего бы стразу из UnixTime не отправить?
Порядок байт ПР с панелью одинаковый, смотрите форматы. Обратную операцию сделайте для начала
Sergey361
27.02.2025, 08:25
Непонятно, сначала PSW310, а потом PSW300.
82220
В ПР написано, что 61563 регистр это время в мс
Нужен вообще 61568, я думаю
ShmoninEN
27.02.2025, 08:40
Пишите в [310..], перекладываете куда-то за каким то из [301] из этого "куда то" куда то отправляете.
Чего бы стразу из UnixTime не отправить?
Порядок байт ПР с панелью одинаковый, смотрите форматы. Обратную операцию сделайте для начала
Неправильно написал, везде 310, 311. Перекладываю для использования массива, так в справке написано. PSW[310-311] отображаю на экране как беззнаковый DWORD, а массив ArrValue пишу в ПР103, два элемента как два регистра.
Сразу UnixTime не пробовал отправлять, так как в справке пример с массивом приведён.
ShmoninEN
27.02.2025, 08:45
Непонятно, сначала PSW310, а потом PSW300.
82220
В ПР написано, что 61563 регистр это время в мс
Нужен вообще 61568, я думаю
Написал выше, везде 310-311, ошибся когда переписывал сюда код. Регистры 61563 и 61568 судя по этой таблице не имеют функцию записи, значит доступны только для чтения. По регистру 61553 - я его взял из настроек прибора. Если в Owen Logic перейти в настройки прибора, и выбрать раздел где настраивается время, там есть ссылка на этот регистр. И служба поддержки мне ответила, что писать время надо именно туда, в секундах от 2000 года.
Sergey361
27.02.2025, 09:07
А значение UnixTime в Панели равно значению в 61553 ПРки?
ShmoninEN
27.02.2025, 09:30
Изначально нет, там его нету как такового. Есть регистры текущего времени, откуда надо сформировать UnixTime и преобразовать его во время от 2000 года. Вот как я делаю: (код и макроса, который прикреплён несколькими сообщениями выше немного доработанный мной)
wYear = 2000 + (LOBYTE(PSW[30]) / 16) * 10 + LOBYTE(PSW[30]) % 16;
wMonth = (PSW[31] / 16) * 10 + PSW[31] % 16;
wDay = (PSW[32] / 16) * 10 + PSW[32] % 16;
wHour = (PSW[33] / 16) * 10 + PSW[33] % 16;
wMinute = (PSW[34] / 16) * 10 + PSW[34] % 16;
wSecond = (PSW[35] / 16) * 10 + PSW[35] % 16;
//код выше для преобразования, в регистрах панели время выражено в HEX формате, преобразуем в DEC
time_str.tm_year = wYear - 1900;
time_str.tm_mon = wMonth - 1;
time_str.tm_mday = wDay;
time_str.tm_hour = wHour;
time_str.tm_min = wMinute;
time_str.tm_sec = wSecond;
time_str.tm_isdst = -1;
UnixTime_now = mktime(&time_str);
time_str.tm_year = 2000 - 1900;
time_str.tm_mon = 1 - 1;
time_str.tm_mday = 1;
time_str.tm_hour = 0;
time_str.tm_min = 0;
time_str.tm_sec = 0;
UnixTime_2000 = mktime(&time_str);
UnixTime=UnixTime_now - UnixTime_2000;
Итого получается что в переменной UnixTime лежит количество секунд от 2000 года. Их я и пытаюсь записать в ПР103. И когда записываю, то время панели не равно времени ПР, в этом то и дело. Хотя должно быть равно.
Sergey361
27.02.2025, 09:39
А чему равно UnixTime в Панели? И чему равно значение переменной, привязанной к 61553 в ПР, после передачи данных?
ShmoninEN
28.02.2025, 04:33
Разобрался в чём была проблема. Оказалось, что в функции Writes в макросах панели при формировании массива регистров на запись обязательно нужно помнить о том, что последующее обращение к массиву идёт с нулевого элемента! А я начал нумерацию с единицы, поэтому второй регистр у меня не записывался. Сейчас всё в порядке, работает как и задумывалось.
82237
Код макроса:
#include <time.h>
DWORD UnixTime_now;
DWORD UnixTime_2000;
DWORD OwenTime;
struct tm time_str;
WORD wYear; // system date-time
WORD wMonth;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD TimeSec[2];
// get system date-time and convert it from BCD to DEC
wYear = 2000 + (LOBYTE(PSW[30]) / 16) * 10 + LOBYTE(PSW[30]) % 16;
wMonth = (PSW[31] / 16) * 10 + PSW[31] % 16;
wDay = (PSW[32] / 16) * 10 + PSW[32] % 16;
wHour = (PSW[33] / 16) * 10 + PSW[33] % 16;
wMinute = (PSW[34] / 16) * 10 + PSW[34] % 16;
wSecond = (PSW[35] / 16) * 10 + PSW[35] % 16;
PSW[300] = wYear;
PSW[301] = wMonth;
PSW[302] = wDay;
PSW[303] = wHour;
PSW[304] = wMinute;
PSW[305] = wSecond;
time_str.tm_year = wYear - 1900;
time_str.tm_mon = wMonth - 1;
time_str.tm_mday = wDay;
time_str.tm_hour = wHour;
time_str.tm_min = wMinute;
time_str.tm_sec = wSecond;
time_str.tm_isdst = -1;
UnixTime_now = mktime(&time_str);
time_str.tm_year = 2000 - 1900;
time_str.tm_mon = 1 - 1;
time_str.tm_mday = 1;
time_str.tm_hour = 0;
time_str.tm_min = 0;
time_str.tm_sec = 0;
time_str.tm_isdst = -1;
UnixTime_2000 = mktime(&time_str);
OwenTime = UnixTime_now - UnixTime_2000;
PSW[310]=LOWORD(OwenTime);
PSW[311]=HIWORD(OwenTime);
TimeSec[0]=PSW[310];
TimeSec[1]=PSW[311];
Writes(PLC, 1, MODBUS_RTU_REGS_4X, 61553, 2, TimeSec);
Макрос вызывается кнопкой Выполнить на экране. Кнопка с часами вызывает экран установки времени в панели. Так же на экран выведено содержимое регистров панели PSW[310-311] и регистров ПР103 61553-61554, и сделал ещё вывод этих же регистров в двоичном виде индикаторами. Панель Мастер, ПР103 слейв, подключение через RS485. В свойствах подключения обязательно поставить галку "Изменить порядок регистров".
82238
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot