做什么何时:
在上周的博客中,我们涵盖了如何在PAC控制器中设置实时时钟(RTC)使用SNTP通过Internet提供准确的时间服务器。现在我们的控制器知道现在几点了,我们如何在凌晨6:00打开该泵?
像编程的大多数方面一样,有几种不同的方法可以实现相同的结果,因此,在本周的博客中加入我,同时我们研究一种管理实时时间表的方法。
自午夜以来的几秒钟:
序言:请记住,在代码中执行很多任务没有硬正确或错误的方法。我经常(可能是错误的)认为编程与科学一样多。也许这就是为什么我编写比好代码更多的错误!
PAC控制中有许多与时间相关的命令。请查看精美的手册对于完整的破产,但简而言之,我们可以一次获得日期和时间,或获得时间,一年中的一天,一周,小时,会议记录,秒和数字自午夜以来的几秒钟。将其视为较粗糙的时间到美好的时间,一年一直降至几秒钟。有了这些选项,这仅仅取决于您手头任务和代码舒适度级别所需的解决方案,以便在正确的时间完成该任务。
让我们仔细研究自午夜以来使用几秒钟的工作。
如果您的任务只是在凌晨6:00打开泵(即打开数字输出),那么这很简单,就像寻找午夜以来的秒数是否等于21,600,如果是的话,请这样做。代码可能看起来像这样:
//测试我们所需的按时。
if(getecondssincemidnight()== 21600)
Turnon(pump_101);
万一
我敢肯定,如果您在OptoScript中不舒服,可以将其转换为流程图。但是要让你前进,这是一个大纲。唯一要注意的是“自午夜以来获得秒数”中的额外步骤。我们必须将自午夜价值以来的秒数放在变量中,因为流程图将不允许我们像OptoScript一样允许我们进行检查。在此示例中,我称为变量SSM。
提示:请确保此OptoScript或Flowchart代码在至少每一秒。更少的,您可能会错过捕获您要检查的秒钟表中的几秒钟。我们如何确定它是否经常运行?查看您的代码,并确保至少每500毫秒至少每500毫秒运行以来的秒数。只需检查代码的全部流程是否延迟,并确保它们都不会使新部分无法频繁运行。
计算自午夜以来的秒数。
由于我们谈论以来固定时间点(午夜)以来的秒数,因此在一天中的任何时候都要执行任务很容易。例如,如果我们需要在上午6:30而不是上午6:00启动泵,则您的代码应针对23400的值进行测试。
如您所见,将所需的小时转换为数学:几分钟:自午夜以来的几秒钟,因此,任何任务都可以在几秒钟内非常快地完成。这是我在那里工作时在医院做定期安排的任务的主要方式。这是公式:
(小时 * 3600) +(分钟 * 60) +(秒)=自午夜以来
提示:由于一天中有86400秒,结果将始终是0到86399之间的值。
如果您想让任务暂时运行一定的时间,则可以使用相同的想法,但是说实话,计时器可能会更好(编程;它和科学一样多)。如果您自午夜以来确实使用秒数作为计时器,请记住,几秒钟将返回到零,然后重新计数。因此,如果您的任务要在午夜门槛上运行,请确保并在代码中检查该内容。
用户界面(UI)中的时间。
如果您有需要用户界面来处理计划任务的情况,则自午夜以来,用户将所有时间转换为几秒钟可能会有些问题。解决方案也许是在简单的UI或简单代码之间进行选择的问题。我是什么意思?如果您的用户可以在一个字段中输入小时时间,而在另一个字段中的分钟,则您的代码只需检查控制器小时值是否等于UI小时,如果是的,则在UI分钟内测试实时分钟。
这是在Groov中的一个非常快的示例。小时和分钟是两个不同的文本输入区域。两者都是整数,每个都有自己的变量名称。
If you don’t want to test the real time against the UI hours and minutes, then you could plug these values into a bit of code that calculates the Seconds Since Midnight from the hours and minutes entered in groov (or whatever your UI happens to be), and you will have the SSM value to test against:
//小时分钟sec = SSM
(21 * 3600) +(30 * 60) +(0)= 77400
If on the other hand your UI requires that the time be entered something like "21:30" or "2130", then you’ll need to write some code to first convert the hours and minutes as a string or integer into a Seconds Since Midnight (SSM) integer value that can be tested against in the controller. The key is to remember that when testing time, it has got to be integers against integers. (Broadly speaking; but in case you are wondering, yes, you can test if two strings are equal. We will talk more about time as a string in a future blog).
在限制内检查时间。
自午夜以来使用秒的另一种方法是测试时间是否在两个值之间。这样,我们可以拥有一个简单的代码结构来打开点和离开。这是OptoScript中的一个示例:
//如果时间是凌晨6点至晚上9.30,请打开泵
如果(iSwithinimits(getecondssincemidnight(),21600,77400),则
Turnon(pump_101);
else //我们在运行时间外。
转盘(泵_101);
万一
请注意,此代码将在那段时间内一遍又一遍地打开泵,并在这些时间外面一遍又一遍地将其关闭。通常,对于本地I/O点来说,这不是问题,但是如果泵数字点远离运行代码的控制器,请记住它。
在午夜的中风:
我们真的只是用PAC控制中的基于时间的命令刮擦了表面。有关自午夜以来几秒钟工作的更多灵感,请查看关于该主题的Opto 22论坛。
直到下周,欢呼伴侣。