【问题标题】:Change system time of Beckhoff controller by programming通过编程更改 Beckhoff 控制器的系统时间
【发布时间】:2015-09-27 16:18:14
【问题描述】:

在过去的几个小时里,我遇到了通过结构化文本编程更改系统日期和时间的问题。我使用了功能块 FB_LocalSystemTime 可以读取系统时间。但是我找不到任何函数或功能块来编写新的系统时间。我检查了 NT_SetLocalTime,也没有用。你知道我该怎么做吗?

更多信息:我已经包含了示例代码,例如:

/** 声明部分 **/ fbLocalSystemTime:FB_localSystemTime; fbSetLocalTime:NT_SetLocalTime; 新时间:TIMESTRUCT:=(wHour:=5); /** 定义部分 **/ fbLocalSystemTime(); /*这给出了系统时间*/ fbSetLocalTime.TIMESTR:=newTimne; /* 设置新时间 */ fbSetLocalTime.START:=TRUE; fbSetLocalTime(); /** 这并没有设置我猜应该设置的系统时间 **/

【问题讨论】:

标签: plc twincat iec61131-3 structured-text


【解决方案1】:

我理解这个问题,但不幸的是,我对 beckhoff plc 没有太多经验。您是否尝试过拨打他们的支持热线?这应该是一个非特定于应用程序的问题,他们应该很容易为您提供帮助。

【讨论】:

    【解决方案2】:

    您可以考虑按以下方式使用 FB_LocalSystemTime。这将通过传递给参数sNetID 的给定AMS ID 将本地PLC 时间与系统同步。如果不传递sNetID 参数,本地OS 系统将作为设置本地PLC 时间的参考。时间将在信号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=> );
    

    【讨论】:

      【解决方案3】:

      你是对的。您应该使用 NT_SetLocalTime

      如果您打开功能块 fbSetLocalTime(),您会发现您的功能块返回错误 ID 为 1862 的错误。

      错误的定义可以在这里找到:https://infosys.beckhoff.com/english.php?content=../content/1033/tcplclib_tc2_utilities/18014398544490635.html&id=

      1862 表示 win32 系统出错。

      这是因为TIMESTRUCT由Year、Month、Week等组成,而你只是将Hour初始化为5。这意味着其他的东西都会变成0。Year需要在1970到2106之间,还有很多东西跟随,如下图:

      使用有效的 TIMESTRUCT 变量后,您的代码应该能够毫无问题地执行,并且您的计算机系统将发生变化。

      【讨论】:

        【解决方案4】:

        有一个类似的问题,使用 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 热线,在大多数情况下,他们都会得到很好的支持。

        【讨论】:

          猜你喜欢
          • 2011-07-30
          • 1970-01-01
          • 2023-03-31
          • 2018-03-03
          • 1970-01-01
          • 2016-07-20
          • 2013-12-08
          • 1970-01-01
          • 2015-07-26
          相关资源
          最近更新 更多