Изменить системное время контроллера 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, ваш код сможет работать без проблем, и ваша компьютерная система будет изменена.

Другие вопросы по тегам