一篇關於如何用廉價的中國設備創建可程式邏輯控制器的文章。 這種設備將在家庭自動化和學校電腦科學的實踐課程中得到應用。
作為參考,預設情況下,Sonoff Basic 程式透過中國雲端服務與行動應用程式搭配使用;在建議的修改後,與該裝置的所有進一步互動都可以在瀏覽器中進行。
第 I 部分. 將 Sonoff 連接到 MGT24 服務
第 1 步:建立控制面板
在網站上註冊
登入
若要為新裝置建立控制面板,請按一下「+」按鈕。
建立面板的範例
建立面板後,它將出現在您的面板清單中。
在建立的面板的「設定」標籤中,找到「裝置 ID」和「授權金鑰」欄位;將來在設定 Sonoff 裝置時將需要此資訊。
選項卡範例
步驟 2. 重新刷新設備
使用實用程序
步驟 3. 設備設置
將設備通電,待 LED 亮起後,按住按鈕直到 LED 開始週期性均勻閃爍。
此時會出現一個名為「PLC Sonoff Basic」的新Wi-Fi網絡,將您的電腦連接到該網路。
LED指示說明
LED指示
設備狀態
週期性雙閃
沒有連接到路由器
持續發光
與路由器建立連接
週期性均勻閃爍
Wi-Fi 存取點模式
熄滅了
無電源
開啟網路瀏覽器並在網址列輸入文字“192.168.4.1”,進入裝置的網路設定設定頁面。
填寫欄位如下:
- 「網路名稱」和「密碼」(將裝置連結到您的家庭 Wi-Fi 路由器)。
- 「設備 ID」和「授權金鑰」(用於在 MGT24 服務上授權設備)。
設定設備網路參數範例
儲存設定並重新啟動裝置。
這裡
步驟 4. 連接感測器(選購)
目前韌體最多支援四個 ds18b20 溫度感測器。 這裡
第二節。 視覺化程式設計
第 1 步:建立腳本
用作程式設計環境
我添加了用於寫入和讀取設備參數的專用區塊。 任何參數都可以透過名稱來存取。 對於遠端設備的參數,使用複合名稱:“參數@設備”。
選項下拉列表
循環開啟和關閉負載 (1Hz) 的範例場景:
同步兩個獨立設備操作的腳本範例。 即,目標設備的繼電器重複遠端設備的繼電器的操作。
恆溫器場景(無遲滯):
若要建立更複雜的腳本,您可以使用變數、迴圈、函數(帶參數)和其他結構。 這裡就不詳細描述了,網路上已經有很多了。
第 2 步:腳本順序
腳本不斷運行,一旦到達終點,就會重新開始。 在這種情況下,有兩個區塊可以暫時暫停腳本,「延遲」和「暫停」。
“延遲”區塊用於毫秒或微秒延遲。 此區塊嚴格保持時間間隔,阻塞整個裝置的運作。
「暫停」區塊用於第二(或更少)延遲,而且它不會阻止裝置中其他進程的執行。
如果腳本本身包含無限循環,且其主體不包含“暫停”,則解釋器會獨立啟動短暫的暫停。
如果分配的記憶體堆疊耗盡,解釋器將停止執行這種耗電的腳本(小心遞歸函數)。
第三步:偵錯腳本
若要偵錯已載入至裝置中的腳本,您可以逐步執行程式追蹤。 當腳本的行為與作者的意圖不同時,這可能非常有用。 在這種情況下,追蹤可以讓作者快速找到問題的根源並修正腳本中的錯誤。
調試模式下計算階乘的場景:
調試工具非常簡單,由三個主要按鈕組成:「開始」、「向前一步」和「停止」(我們也不要忘記「進入」和「退出」調試模式)。 除了逐步追蹤之外,您還可以在任何區塊上設定斷點(透過點擊該區塊)。
若要在監視器中顯示參數(感測器、繼電器)的目前值,請使用「列印」區塊。
這裡
好奇的部分。 引擎蓋下是什麼?
為了使腳本能夠在目標設備上運行,開發了一個字節碼解釋器和一個包含 38 個指令的彙編器。 Blockly 的原始碼內建了一個專門的程式碼產生器,可以將視覺塊轉換為彙編指令。 隨後,該彙編程式被轉換為字節碼並傳輸到設備執行。
這個虛擬機器的架構非常簡單,沒有什麼特別的描述點;在網路上你會找到很多關於設計最簡單的虛擬機器的文章。
我通常為我的虛擬機器的堆疊分配1000字節,這足夠備用。 當然,深度遞歸可以耗盡任何堆疊,但它們不太可能有任何實際用途。
產生的字節碼非常緊湊。 例如,計算相同階乘的字節碼只有 49 個位元組。 這是它的視覺形式:
這是他的彙編程式:
shift -1
ldi 10
call factorial, 1
print
exit
:factorial
ld_arg 0
ldi 1
gt
je 8
ld_arg 0
ld_arg 0
ldi 1
sub
call factorial, 1
mul
ret
ldi 1
ret
如果表示的彙編形式沒有任何實用價值,那麼「javascrit」選項卡恰恰相反,比視覺塊給出了更熟悉的外觀:
function factorial(num) {
if (num > 1) {
return num + factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
關於性能。 當我運行最簡單的閃存腳本時,我在示波器螢幕上看到了 47 kHz 方波(處理器時脈為 80 MHz)。
我覺得這已經是一個不錯的結果了,至少這個速度比之前快了差不多十倍
最後一部分
總而言之,我想說的是,腳本的使用不僅使我們能夠對單獨設備的操作邏輯進行編程,而且還使將多個設備連接到單一機制中成為可能,其中某些設備影響其他設備的行為。
我還注意到,所選的儲存腳本的方法(直接在設備本身中,而不是在伺服器上)簡化了將已經工作的設備切換到另一台伺服器,例如切換到家庭 Raspberry,這裡
僅此而已,我很高興聽到建議和建設性的批評。
來源: www.habr.com