Изменить системное время контроллера Beckhoff путем программирования
Последние пару часов я сталкиваюсь с проблемами при изменении системной даты и времени с помощью структурированного текстового программирования. Я использовал функциональный блок FB_LocalSystemTime, где я могу прочитать системное время. Но я не смог найти ни одну функцию или функциональный блок для записи нового системного времени. Я проверил NT_SetLocalTime, который также не работал. У вас есть идеи, как я могу это сделать?
Для получения дополнительной информации: я включил пример кода, как:
/ ** Часть декларации ** / fbLocalSystemTime: FB_localSystemTime; fbSetLocalTime: NT_SetLocalTime; newTime: TIMESTRUCT: = (wHour: = 5); / ** ОПРЕДЕЛЕНИЕ ЧАСТЬ ** / fbLocalSystemTime (); / * Это дает системное время */ fbSetLocalTime.TIMESTR:=newTimne; /* Новое время для установки */ fbSetLocalTime.START:=TRUE; fbSetLocalTime(); /** Это НЕ устанавливает системное время, которое, я думаю, должно установить ** /
4 ответа
Я понимаю вопрос, но, к сожалению, у меня нет большого опыта работы с beckhoff plcs. Вы пытались позвонить в их службу поддержки? Это должен быть вопрос, не относящийся к конкретному приложению, с которым им будет легко помочь.
Вы можете рассмотреть возможность использования FB_LocalSystemTime способом, указанным ниже. Это синхронизирует локальное время ПЛК с системой с заданным идентификатором AMS, переданным параметру sNetID. Если вы не передадите параметр sNetID, локальная система ОС будет использоваться в качестве эталона для установки локального времени ПЛК. Время будет синхронизировано по переднему фронту сигнала bEnable, а затем в интервале, заданном параметром dwCycle
VAR
{attribute 'hide'}
LocalSysTime : FB_LocalSystemTime;
SynchNodeAmsId : STRING := '10.10.10.1.1.1';
END_VAR
LocalSysTime(
sNetID:= SynchNodeAmsId,
bEnable:= TRUE,
dwCycle:= 60,
dwOpt:= ,
tTimeout:= ,
bValid=> ,
systemTime=> ,
tzID=> );
Была похожая проблема с использованием TwinCat3. Иногда это работает, чтобы изменить локальное системное время, иногда нет. Я использую небольшой конечный автомат для решения этой проблемы (также может быть более продвинутое решение) - просто напишите 3 раза новое время....
Вот пример кода:
VAR
nState : BYTE := 0; //local state machine
ntSetLocalTime : Tc2_Utilities.NT_SetLocalTime;
tTimestructSet : Tc2_Utilities.TIMESTRUCT; // time to set
nErrId : UDINT;
nRetryCnt : BYTE := 0;
и конечный автомат:
CASE nState OF
0: //wait for change
bBusy := FALSE;
nRetryCnt := 0;
1: //trigger change
bBusy := TRUE;
ntSetLocalTime(
NETID:= '',
TIMESTR:= tTimestructSet,
START:= TRUE,
TMOUT:= ,
BUSY=> ,
ERR=> ,
ERRID=> );
nState := 2; //wait for writing
2: //wait till written
ntSetLocalTime(
START:= FALSE,
ERRID => nErrId);
IF NOT ntSetLocalTime.BUSY THEN
nState := 3;
END_IF
3: //retry and after some retries go back to init
nRetryCnt := nRetryCnt + 1;
IF nRetryCnt >=3 THEN
nState := 0;
ELSE
nState := 1;
END_IF
END_CASE
В противном случае вы могли бы позвонить на горячую линию Beckhoff, в большинстве случаев они имеют действительно хорошую поддержку.
Ты прав. Вы должны использовать NT_SetLocalTime.
Если вы откроете функциональный блок fbSetLocalTime(), вы поймете, что ваш функциональный блок возвращает ошибку с идентификатором ошибки 1862.
Определение ошибок можно найти здесь: https://infosys.beckhoff.com/english.php?content=../content/1033/tcplclib_tc2_utilities/18014398544490635.html&id=
1862 означает ошибку в системе win32.
Это потому, что TIMESTRUCT состоит из года, месяца, недели и т. Д., Но вы только инициализируете час как 5. Это означает, что другие вещи станут равными 0. Год должен быть между 1970 и 2106, и есть много вещей, которым нужно следовать, показано ниже:
После того, как вы используете допустимую переменную TIMESTRUCT, ваш код сможет работать без проблем, и ваша компьютерная система будет изменена.