А значение UnixTime в Панели равно значению в 61553 ПРки?
А значение UnixTime в Панели равно значению в 61553 ПРки?
Изначально нет, там его нету как такового. Есть регистры текущего времени, откуда надо сформировать 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. И когда записываю, то время панели не равно времени ПР, в этом то и дело. Хотя должно быть равно.
Последний раз редактировалось ShmoninEN; 27.02.2025 в 09:37.
А чему равно UnixTime в Панели? И чему равно значение переменной, привязанной к 61553 в ПР, после передачи данных?
Разобрался в чём была проблема. Оказалось, что в функции Writes в макросах панели при формировании массива регистров на запись обязательно нужно помнить о том, что последующее обращение к массиву идёт с нулевого элемента! А я начал нумерацию с единицы, поэтому второй регистр у меня не записывался. Сейчас всё в порядке, работает как и задумывалось.
TestTime_1.jpg
Код макроса:
#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. В свойствах подключения обязательно поставить галку "Изменить порядок регистров".
TestTime_1.zip