我正在使用结构化文本编程语言在 PLC 中开发一个简单的机器项目。现在,我想在按下启动命令后计算机器的运行时间(小时、分钟和秒)。因为我是新手,所以我很难提出一个想法。我试图通过每秒钟、分钟和小时使用 3 个计数器来做到这一点。但未能取得实实在在的结果。您能否分享一下如何计算 PLC(ST 或 FB)上机器的运行时间?
问问题
51 次
1 回答
0
这里有两个问题:
- 正确处理增量时间
- 使用数据类型对您有利
由于您想要自启动命令以来的时间,因此您需要首先存储按下启动命令的时间。然后计算增量时间(当前时间 - 开始时间)以获得经过的秒数。然后计算经过的秒数,得到你的小时、分钟、秒。您甚至可以为此简单地使用 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 回答