
要点或本文的主题
本文的主题是此处描述的用于智能家居的
ShIoTiny PLC的可视化编程:
ShIoTiny:小型自动化,物联网或“假期前六个月” 。
简要介绍了 节点 ,
通信 ,
事件以及在
ESP8266上加载和执行可视程序的功能等
概念 ,这是
ShIoTiny PLC的基础。
ShIoTiny项目现场介绍或几个组织问题
在上一篇有关我的开发的文章中,我简要介绍了
ShIoTiny控制器的功能。
奇怪的是,公众表现出了浓厚的兴趣,并问了我很多问题。 一些同志甚至立即提议我购买控制器。 不,我不反对赚一点钱,但是我的良心不允许我出售仍然非常粗糙的程序。
因此,我在GitHub上发布了固件二进制文件和设备图:
固件+最短指令+电路+示例 。
现在,每个人都可以刷ESP-07并自己玩固件。 如果有人真的想要照片中的木板,那么我有几个。 写信给
shiotiny@yandex.ru 。 但是,就像令人难忘的黄瓜曾经说过的那样:“我对任何事情都不负责!”
那么,让我们直达主题:什么是“
节点 ”(node)和“
事件 ”? 程序如何执行?
和往常一样-让我们按顺序开始:下载程序。
程序如何加载
首先,当我们单击
ElDraw编辑器中的“上
载”按钮并且我们的程序方案(由漂亮的正方形组成)飞入设备时会发生什么。
首先,根据我们绘制的图表,以文本形式进行描述。
其次,检查节点的所有输入是否都连接到输出。 不应有“悬挂”输入。 如果检测到此类输入,ShIoTiny中的电路将不会加载,并且编辑器将显示警告。
如果一切顺利,编辑器会将电路的文本描述发送到ShIoTiny中的一个节点。 当然,ShIoTiny中的现有架构先前已被删除。 结果文本说明将保存在闪存中。
顺便说一句,如果您要从设备中删除电路,则只需将一个空电路(其中不包含任何节点元素)装入其中。
一旦将整个程序电路加载到ShIoTiny PLC中,它就会开始“运行”。 这是什么意思?
请注意,打开电源时以及从编辑器接收电路时,从闪存中加载电路的过程是相同的。
首先是根据节点对象的描述创建节点对象。
然后进行节点之间连接的布置。 即,生成输出到输入的链接以及输入到输出的链接。
并且只有在所有这些之后,才启动主程序执行周期。
我写了很长时间,但是整个过程-从FLASH存储器“加载”电路到主循环的开始-对于60-80个节点的电路来说,花费的时间只是一秒钟。
主循环如何工作? 很简单 首先,他等待
事件在任何节点中
发生 ,然后处理此事件。 等无止境。 好吧,或者直到他们将新方案上载到ShIoTiny。
我已经好几次提到
事件 ,
节点和
连接之类的东西。 但是从软件角度来看又是什么呢? 今天我们将讨论这个。
节点,连接和事件
只需查看
ShIoTiny的电路程序示例,即可了解电路仅包含两个实体-节点(或元素)以及它们之间的关系。
节点 ,
节点或
电路元素是对数据的某些
动作的虚拟表示。 这可能是算术运算,逻辑运算或任何我们发生的运算。 最主要的是,节点具有输入和输出。
输入是节点接收数据的地方。 输入图像是始终位于节点左侧的点。
输出是从中提取节点操作结果的位置。 输出图像是始终位于节点右侧的点。
一些节点没有输入。 这样的节点在自己内部产生结果。 例如,恒定节点或传感器节点:它们不需要来自其他节点的数据来报告结果。
相反,其他节点没有出口。 这些是显示例如执行器(继电器或某些其他类似设备)的节点。 它们接受数据,但不生成其他节点可用的计算结果。
此外,还有一个唯一的注释节点。 他什么都不做,既没有投入也没有产出。 其目的是作为图中的解释。
什么是“
事件 ”?
事件是节点中新数据的出现。 例如,事件包括:更改输入状态(
输入节点),从另一个设备接收数据(
MQTT和
UDP节点),指定时间段的到期(
计时器和
延迟节点)等等。
活动有什么用? 是的,为了确定新数据出现在哪个节点以及与新数据的接收相关的哪些节点的状态需要更改。 事件实际上沿节点链“通过”,直到它绕过了所有必须检查和更改状态的节点为止。
所有节点可以分为两类。
可以生成事件的节点称为“
活动节点 ”。
无法生成事件的
节点称为“
被动节点 ”。
当节点生成事件(即,新数据出现在其输出上)时,通常,连接到事件生成器节点输出的整个节点链的状态都会更改。
为了清楚起见,请考虑图中的示例。

这里的活动节点是Input1,Input2和Input3。 其余节点是被动的。 考虑一下当此输入关闭时会发生什么。 为方便起见,将结果列表化。

如您所见,当事件发生时,会从事件的源节点到末端节点建立一条链。 那些不属于链的节点的状态不会改变。
提出了一个合理的问题,但是如果同时发生两个甚至几个事件,将会发生什么?
作为格莱布·安菲洛夫(Gleb Anfilov)作品的爱好者,我很想派一个好奇的提问者到他的书《意外中的飞行》中。 这就是这样的“相对论最小论”,其中很好地告诉了什么是“同时”以及如何生活。
但是,几乎几乎所有事情都简单得多:当发生两个甚至几个事件时,每个事件源中的所有链条都会依次依次构建和处理,没有任何奇迹。
好奇的读者接下来要问的一个合理问题是,如果节点成环连接会发生什么? 或者,按照惯例,在您的这些明智行为中说出反馈。 即,将节点之一的输出与前一个节点的输入连接,以便该节点的输出状态影响其输入的状态。
ElDraw编辑器不允许您直接将节点输出连接到其自己的输入。 但是可以间接地(如下图所示)完成此操作。
那么在这种情况下会是什么呢? 答案将是“确定的”:取决于哪个节点。 考虑图中的示例。

当输入Input1的触点在节点A-0的上部输入处断开时。在节点A的输出处也为0。在节点B-1的输出处。最后,在节点A-1的下部输入处。 对于谁还不清楚-请在下面查找有关节点“ AND”和“ NOT”如何工作的描述。
现在关闭输入Input1的触点,也就是说,我们将为节点A的上部输入提供一个。 那些熟悉电子学的人都知道,实际上我们得到了经典的逻辑发生器电路。 从理论上讲,这种方案应该在元素A和B的输出中无休止地产生序列1-0-1-0-1-0...。 和0-1-0-1-0-1-1 .... 毕竟,事件应不断改变节点A和B的状态,并以2-3-2-3- ...为圈运行!
但这实际上并没有发生。 电路将进入随机状态-或继电器将保持打开或关闭状态,或者可能会连续几次出现轻微的嗡嗡声。 这完全取决于火星南极的天气。 这就是为什么这种情况发生。
来自节点Input1的事件会在一个圆圈中多次更改节点A的状态,然后更改节点B的状态,依此类推。 该程序确定事件的“循环”并强制终止此狂欢。 此后,将阻止节点A和B的状态更改,直到发生新事件为止。 程序决定的时刻-“停止旋转一圈!” -在一般情况下,它取决于许多因素,可以认为是随机的。
环形连接节点时要小心-效果并不总是显而易见的! 好好想象一下,为什么做!
但是是否可以在我们可以访问的节点上构建生成器? 是的,你可以! 但这需要一个本身知道如何生成事件的节点。 有一个这样的节点-这是一条“延迟线”。 在下图中,让我们看看生成器如何工作6秒钟。

生成器的关键元素是节点A,即延迟线。 如果将延迟线的输入状态从0更改为1,则输出1不会立即出现,而只会在指定的时间之后出现。 在我们的情况下,是3秒。 同样,如果将延迟线的输入状态从1更改为0,则在3秒钟后输出将出现0。 延迟时间设置为十分之一秒。 即,该值为30,表示-3秒。
延迟线的一个特征是它会在延迟时间过去之后生成一个事件。
假设最初延迟线的输出为0。经过节点B后,反相器的0变为1并到达延迟线的输入。 马上什么都没有发生。 在延迟线的输出处,将保持原样为0,但随后打开延迟时间倒计时。 这需要3秒钟。 然后延迟线生成一个事件。 在输出端,她为1。该单元通过节点B后,反相器变为0,然后进入延迟线的输入。 再过3秒...然后重复该过程。 即,每隔3秒,延迟线的输出状态从0变为1,然后从1变为0。继电器发出喀哒声。 发电机正在工作。 脉冲周期为6秒(0的输出为3秒,3的输出为1)。
但是,在实际电路中,通常不需要使用此示例。 有一些特殊的定时器节点,它们可以完美地在没有外部帮助的情况下生成给定周期的脉冲序列。 这些脉冲中“零”和“单位”的持续时间等于周期的一半。
要设置定期操作,请使用计时器节点。
我注意到,这样的数字信号,其“零”和“单位”的持续时间相等,被称为“弯道”。
我希望我对问题如何在节点之间分配以及不应该做什么做一些澄清。
结论与参考
文章虽然简短,但本文是对节点和事件提出的问题的解答。
随着固件的发展和新示例的出现,我将撰写有关如何编写
ShIoTiny小文章的文章,只要它对人们来说很有趣。
和以前一样,方案,固件,示例,节点描述以及
其他所有
内容都在这里 。
问题,希望,批评-这是这里:
shiotiny@yandex.ru