在过去的几个小时里,我遇到了通过结构化文本编程改变系统日期和时间的问题。我使用了功能块 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 **/
答案 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年之间,并且有很多东西遵循,如下所示:
使用有效的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热线,在大多数情况下他们会得到非常好的支持。