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 秒)。

但是,在實際電路中,通常不需要使用這個例子。 有一些特殊的計時器節點可以在沒有外部幫助的情況下完美地產生具有給定週期的脈衝序列。 這些脈衝中「零」和「一」的持續時間等於週期的一半。

若要設定定期操作,請使用計時器節點。

我注意到這種「零」和「一」持續時間相等的數位訊號被稱為「曲折」。

我希望我已經澄清了一些關於事件如何在節點之間傳播以及不應該做什麼的問題?

結論與參考文獻

這篇文章很短,但本文是對節點和事件的問題的回答。

隨著韌體的發展和新範例的出現,我將撰寫有關如何編程的文章 什洛蒂尼 小文章只要能引起人們的興趣。

和以前一樣,圖表、韌體、範例、組件描述等等 剩下的就在這裡.

問題、建議、批評 - 請移至此處: [電子郵件保護]

來源: www.habr.com

添加評論