0

我正在使用结构化文本编程语言在 PLC 中开发一个简单的机器项目。现在,我想在按下启动命令后计算机器的运行时间(小时、分钟和秒)。因为我是新手,所以我很难提出一个想法。我试图通过每秒钟、分钟和小时使用 3 个计数器来做到这一点。但未能取得实实在在的结果。您能否分享一下如何计算 PLC(ST 或 FB)上机器的运行时间?

4

1 回答 1

0

这里有两个问题:

  1. 正确处理增量时间
  2. 使用数据类型对您有利

由于您想要自启动命令以来的时间,因此您需要首先存储按下启动命令的时间。然后计算增量时间(当前时间 - 开始时间)以获得经过的秒数。然后计算经过的秒数,得到你的小时、分钟、秒。您甚至可以为此简单地使用 TON FUNCTION_BLOCK - ET 输出是 TIME 数据类型。

日期和时间有许多好的内置数据时间。TOD(或 TIME_OF_DAY)自动为您采用 HH:MM:SS.mmm 格式。如果您的最长经过时间少于 24 小时,则可以使用此格式。如果它可能更长,那么使用 TIME 将转到 49 和某些天,否则 DT (DATE_AND_TIME) 将计数到 2106 年。您将获得 YYYY-MM-DD-HH:MM:SS 格式。

以下是您可以使用的 TON 技巧,假设 49 天或更短时间为真。

PROGRAM PLC_PRG
VAR
   Running   : BOOL := FALSE;
   Start     : BOOL := FALSE;
   MyTimer   : TON;
   Elapsed   : TOD;
   MyEt      : TIME;
END_VAR

//calculate Elapsed time only if running
IF Running THEN
   //ET is in milliseconds, so can easily convert to TOD
   Elapsed := TIME_TO_TOD(MyEt);
ELSE
   Elapsed := TOD#0:0:0.000;
END_IF

//run a TON timer, but set the PT to the absolute limit
//this trick is only valid for 49 days or less!
MyTimer(IN:=Running,PT:=DWORD_TO_TIME(16#FFFFFFFF),ET=>MyEt);

//only start once
IF Start AND NOT Running THEN
   Running := TRUE;
   Start := FALSE;
END_IF

如果您不喜欢这个技巧,您也可以执行以下操作(需要 SysTime 库)。在您的在线调试器中,您将看到 HH:MM:SS 格式的 Elapsed。当然,您应该为此创建一个 FUNCTION_BLOCK。

PROGRAM PLC_PRG
VAR
   Running   : BOOL := FALSE;
   Start     : BOOL := FALSE;
   Now       : ULINT;
   StartTime : ULINT;
   Elapsed   : TOD;
   pResult: SysTimeRtc.RTS_IEC_RESULT;
END_VAR

//get current time (result is in seconds)
Now := DWORD_TO_ULINT(SysTimeRtcGet(pResult));

//calculate Elapsed time only if running
IF Running THEN
   //TOD is in milliseconds, so we x1000
   Elapsed := ULINT_TO_TOD((Now - StartTime) * 1000);
ELSE
   Elapsed := TOD#0:0:0.000;
END_IF

//only start once
IF Start AND NOT Running THEN
   StartTime := Now;
   Running := TRUE;
   Start := FALSE;
END_IF
于 2022-01-29T02:49:06.430 回答