0

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

有关更多信息:我已包含示例代码,例如:

    /**
    声明部分
    **/
     fbLocalSystemTime:FB_localSystemTime;
     fbSetLocalTime:NT_SetLocalTime;
     新时间:TIMESTRUCT:=(wHour:=5);



    /**
    定义部分
    **/

    fbLocalSystemTime(); /*这给出了系统时间*/
    fbSetLocalTime.TIMESTR:=newTimne; /* 设置新时间 */
    fbSetLocalTime.START:=TRUE;
    fbSetLocalTime(); /** 这并没有设置我猜应该设置的系统时间 **/

4

4 回答 4

0

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

于 2015-07-10T12:57:19.657 回答
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 热线,在大多数情况下,他们会提供非常好的支持。

于 2017-02-16T15:44:43.983 回答
0

你是对的。您应该使用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 变量后,您的代码应该能够毫无问题地执行,并且您的计算机系统将被更改。

于 2016-10-17T14:42:31.000 回答
0

您可以考虑按以下方式使用 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=> );
于 2016-04-10T06:40:06.963 回答