ShIoTiny:绘图程序的节点、链接和事件或功能

ShIoTiny:绘图程序的节点、链接和事件或功能

要点或本文的内容

文章主题是可视化PLC编程 什洛蒂尼 对于此处描述的智能家居: ShIoTiny:小型自动化、物联网或“假期前六个月”.

非常简短 诸如此类的概念 , 关系, 发展,以及加载和执行可视化程序的功能 ESP8266,这是PLC的基础 什洛蒂尼.

简介或几个组织问题

在上一篇关于我的开发的文章中,我简单概述了控制器的功能 什洛蒂尼.

奇怪的是,公众表现出了相当浓厚的兴趣,并向我提出了很多问题。 有些朋友甚至立即提出向我购买控制器。 不,我不反对赚一点钱,但我的良心不允许我去卖一些在软件方面还很粗糙的东西。

因此,我在 GitHub 上发布了固件二进制文件和设备图: 固件+最短指令+图表+示例.

现在每个人都可以刷入 ESP-07 并自行使用固件。 如果有人真的想要与照片中完全相同的板,那么我有几个。 通过电子邮件写信 [电子邮件保护]。 但是,正如令人难忘的奥古尔佐夫曾经说过的那样:“我不对任何事情负责!”

那么,让我们进入正题:什么是“节点“(节点)和”事件“? 程序是如何执行的?

像往常一样,让我们​​按顺序开始:下载程序。

程序是如何加载的

让我们从按下按钮时会发生什么开始 上传 在编辑器中 绘图 我们的电路程序由美丽的方块组成,飞入设备中。

首先,根据我们绘制的图表,建立其文本形式的描述。
其次,它检查所有节点输入是否都连接到输出。 不应有“悬挂”入口。 如果检测到这样的输入,电路将不会加载到ShIoTiny中,并且编辑器将显示相应的警告。

如果一切顺利,编辑器会一次向 ShIoTiny 发送一个电路节点的文本描述。 当然,ShIoTiny 的现有电路首先被移除。 生成的文本描述存储在闪存中。

顺便说一句,如果您想从设备中删除电路,只需将空电路加载到其中(不包含单个节点元素)即可。

一旦整个电路程序被加载到ShIoTiny PLC中,它就开始“执行”。 这是什么意思?

请注意,打开电源时从闪存加载电路的过程与从编辑器接收电路时的过程是相同的。

首先,根据节点对象的描述创建节点对象。
然后在节点之间建立连接。 也就是说,生成输出到输入以及输入到输出的链接。

只有在这一切之后,主程序执行周期才开始。

我写了很长时间,但对于 60-80 个节点的电路来说,整个过程——从闪存“加载”电路到启动主周期——只需要不到一秒的时间。

主循环如何工作? 很简单。 首先他等待出现 发展 在某个节点,然后处理该事件。 如此无休无止。 好吧,或者直到他们将新方案上传到 ShIoTiny。

我已经多次提到过类似的事情 发展, и 关系。 但从软件的角度来看这是什么? 今天我们就来说说这个。

节点、连接和事件

只需查看电路程序示例即可 什洛蒂尼了解该图仅由两个实体组成 - 节点(或元素)以及它们之间的连接。

节点, 但是,是的 или 电路元件 是某些的虚拟表示 活动 超过数据。 这可以是算术运算、逻辑运算或我们想到的任何运算。 最主要的是节点有入口和出口。

入口 - 这是节点接收数据的地方。 输入图像是始终位于节点左侧的点。

退出 - 这是检索节点操作结果的地方。 输出图像是始终位于节点右侧的点。

有些节点没有输入。 这些节点在内部生成结果。 例如,恒定节点或传感器节点:它们不需要其他节点的数据来报告结果。

相反,其他节点没有输出。 例如,这些节点显示执行器(继电器或类似的东西)。 它们接受数据,但不生成可供其他节点使用的计算结果。

此外,还有一个独特的评论节点。 它什么都不做,没有输入或输出。 其目的是对图表进行解释。

发生了什么事 ”事件“? 事件 是任意节点中新数据的出现。 例如,事件包括:输入状态的改变(节点 输入),从另一个设备(节点 MQTT и UDP),指定时间段到期(节点 定时器 и 延迟)等等。

活动有什么用? 是的,为了确定在哪个节点中出现了新数据以及需要根据新数据的接收来改变哪些节点的状态。 可以说,事件沿着节点链“传递”,直到绕过所有需要检查和更改状态的节点。

所有节点可以分为两类。
让我们调用可以生成事件的节点”活动节点“。
我们将无法生成事件的节点称为“被动节点“。

当节点生成事件时(即,新数据出现在其输出处),那么在一般情况下,连接到事件生成器节点的输出的整个节点链的状态会发生变化。

为了清楚起见,请考虑图中的示例。

ShIoTiny:绘图程序的节点、链接和事件或功能

这里的活动节点是Input1、Input2和Input3。 其余节点是被动的。 让我们考虑一下当一个或另一个输入关闭时会发生什么。 为了方便起见,结果总结在表格中。

ShIoTiny:绘图程序的节点、链接和事件或功能

可以看到,当事件发生时,会从事件的源节点到结束节点构建一条链。 那些不属于链的节点的状态不会改变。

一个合理的问题出现了:如果两个甚至几个事件同时发生会发生什么?

作为格列布·安菲洛夫(Gleb Anfilov)作品的爱好者,我很想向他的书《逃离惊喜》发出一个好奇的提问者。 这是“小孩子的相对论”,它很好地解释了“同时”的含义以及如何接受它。

但实际上一切都简单得多:当两个甚至多个事件发生时,来自每个事件源的所有链都会按顺序构建并依次处理,不会出现奇迹。

好奇的读者提出的下一个完全合理的问题是,如果节点连接成环会发生什么? 或者,正如你们这些聪明人所说的那样,引入反馈。 即,将其中一个节点的输出连接到前一个节点的输入,使得该节点的输出状态影响其输入的状态。 编辑器不允许您直接将节点的输出连接到其输入。 绘图。 但间接地,如下图所示,这是可以做到的。

那么在这种情况下会发生什么呢? 答案将非常“确定”:取决于哪些节点。 我们看一下图中的例子。

ShIoTiny:绘图程序的节点、链接和事件或功能

当Input1的输入触点打开时,节点A的上输入为0。节点A的输出也为0。节点B的输出为1。最后,节点A的下输入为1。一切都是清除。 对于那些不清楚的人,请查看下面有关“AND”和“NOT”节点如何工作的描述。

现在我们关闭Input1输入的触点,也就是说,我们对节点A的上输入应用1。 熟悉电子学的人都知道,实际上我们会得到一个使用逻辑元件的经典发生器电路。 理论上,这样的电路应该在元件 A 和 B 的输出处不断地产生序列 0-1-0-1-0-0…。 和 1-0-1-0-1-2-...。 毕竟,事件必须不断改变节点A和B的状态,循环运行3-2-3-XNUMX-...!

但实际上这并没有发生。 电路将陷入随机状态 - 或者继电器将保持打开或关闭状态,或者可能连续几次轻微地打开和关闭。 这一切都取决于火星南极的天气。 这就是为什么会发生这种情况。

来自节点 Input1 的事件会改变节点 A 的状态,然后改变节点 B 的状态,如此循环数次。 程序检测到事件“循环”,强行停止了这场狂欢。 此后,节点 A 和 B 的状态变化将被阻止,直到新事件发生。 程序决定“停止原地打转!”的那一刻- 一般来说,它取决于许多因素,可以认为是随机的。

将结连接成环时要小心 - 效果并不总是那么明显! 清楚地了解自己在做什么以及为什么这样做!

是否仍然可以在我们可用的节点上构建生成器? 是的你可以! 但这需要一个可以自己生成事件的节点。 而有这样一个节点——这就是“延迟线”。 让我们看看下图中周期为 6 秒的生成器是如何工作的。

ShIoTiny:绘图程序的节点、链接和事件或功能

生成器的关键元件是节点 A - 延迟线。 如果将延迟线的输入状态从 0 更改为 1,则 1 不会立即出现在输出中,而是仅在指定时间后出现。 在我们的例子中是 3 秒。 同样,如果将延迟线的输入状态从 1 更改为 0,则同样 0 秒后输出处将出现 3。 延迟时间设置为十分之一秒。 也就是说,值 30 表示 3 秒。

延迟线的一个特殊功能是,它会在延迟时间到期后生成事件。

我们假设最初延迟线的输出为 0。经过节点 B(反相器)后,该 0 变为 1 并进入延迟线的输入。 什么都不会立即发生。 在延迟线的输出端,它将保持为 0,但延迟时间将开始倒计时。 3秒过去了。 然后延迟线生成一个事件。 在其输出处显示 1。该单元在经过节点 B(反相器)后变为 0 并进入延迟线的输入。 又过了 3 秒……这个过程不断重复。 也就是说,每 3 秒延迟线输出的状态从 0 变为 1,然后从 1 变为 0。继电器发出喀哒声。 发电机正在工作。 脉冲周期为 6 秒(输出 3 处 3 秒,输出 XNUMX 处 XNUMX 秒)。

但是,在实际电路中,通常不需要使用这个例子。 有一些特殊的计时器节点可以在没有外部帮助的情况下完美地生成具有给定周期的脉冲序列。 这些脉冲中“零”和“一”的持续时间等于周期的一半。

要设置定期操作,请使用计时器节点。

我注意到这种“零”和“一”持续时间相等的数字信号被称为“曲折”。

我希望我已经澄清了一些关于事件如何在节点之间传播以及不应该做什么的问题?

结论和参考文献

这篇文章很短,但本文是对有关节点和事件的问题的回答。

随着固件的发展和新示例的出现,我将撰写有关如何编程的文章 什洛蒂尼 小文章只要能引起人们的兴趣。

和以前一样,图表、固件、示例、组件描述等等 剩下的就在这里.

问题、建议、批评 - 请移至此处: [电子邮件保护]

来源: habr.com

添加评论