通过编程改变Beckhoff控制器的系统时间

时间:2015-07-09 10:36:21

标签: plc twincat iec61131-3 structured-text

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

有关详细信息:我已将示例代码包括在内:


    /**
    Declaration Part
    **/
     fbLocalSystemTime:FB_localSystemTime;
     fbSetLocalTime:NT_SetLocalTime;
     newTime:TIMESTRUCT:=(wHour:=5);



    /**
    DEFINITION PART
    **/

    fbLocalSystemTime(); /*This gives system time */
    fbSetLocalTime.TIMESTR:=newTimne; /* New time to set */
    fbSetLocalTime.START:=TRUE;
    fbSetLocalTime();  /** This does NOT set the system time which I guess should set **/

4 个答案:

答案 0 :(得分:0)

我理解这个问题,但不幸的是我对beckhoff plcs没有多少经验。你试过打电话给他们的支持线吗?这应该是一个非特定于应用程序的问题,应该很容易帮助您。

答案 1 :(得分:0)

您可以考虑以下面所示的方式使用FB_LocalSystemTime。这将使本地PLC时间与系统同步,并将给定的AMS ID传递给参数 sNetID 。如果未传递 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=> );

答案 2 :(得分:0)

你是对的。您应该使用 NT_SetLocalTime

如果打开功能块fbSetLocalTime(),您将意识到您的功能块返回错误ID为1862的错误。

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

1862意味着win32系统出错。

这是因为TIMESTRUCT由年,月,周等组成,但你只将小时初始化为5.这意味着其他东西将变为0.年份需要在1970年到2106年之间,并且有很多东西遵循,如下所示:

enter image description here

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

答案 3 :(得分:0)

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