接口超时后程序还会继续执行嘛_答网友问:分析一段STL程序,并就如何读懂一段程序谈几点感想...
在文章《S7-300/400進階筆記5.1:300系列PLC的裝載存儲器的類別及方法》一文后,有小伙伴在評論區提了個問題,駝子決定有必要寫一篇文章,和大家一起討論一下。也希望小伙伴們能向"@maintenance喬"學習,有問題及時提出來,大家一起討論、一起進步。
程序如下:
注意:原問題的紅框部分是:置位指令"S #OUT7"。由于只給了我部分程序,沒有復位"#OUT7"的指令,信號無法翻轉,因此為了方便仿真測試和理解,這里將程序略作改動。
一、相關參數說明
程序編寫在一個FC中,接口定義如下:
二、捋一捋主邏輯
其實,本程序的難點如圖中的"紅框"所示。如果將其"注釋"掉(即在指令前面打"//",使該指令不執行),則程序就編程簡單的邏輯控制指令了,如下圖所示。
邏輯比較簡單,不需要贅述了。重點分析一下注釋掉的判斷與跳轉指令。
三、判斷與跳轉指令
在解讀程序之前,先解釋幾個STL語句。
狀態字寄存器是一個16位的寄存器,用于存儲CPU執行指令時的狀態。狀態字的某些位用于決定某些指令是否執行和以什么方式執行,執行指令時可能改變狀態字中的某些位,用位邏輯指令和字邏輯指令可以訪問和檢測它們。
本程序主要用到了其中的兩位:溢出位OV和二進制結果位BR。
(1)二進制結果位BR
二進制結果位BR用來表示操作結果是否正確。用戶編寫的FB、FC程序,最好對BR位進行管理,功能塊正確執行后,BR為1,否則為0。
(2)溢出位OV
如果算術運算、浮點數比較指令執行時出現錯誤(例如溢出、非法操作和不規范的格式),溢出位被置1。如果后面的同類指令執行結果正常,該為被清0。
本例程序中,用"OV"位來判斷整數運算的運算結果是否溢出。結合"SAVE"指令,在BR中保存正確的邏輯。
2、SAVE指令
SAVE指令用于將RLO存入BR中。
3、JNB指令
當邏輯運算結果為0時,JNB就中斷線性程序掃描,并跳轉到指定的位置繼續執行。同時將RLO位的內容復制到BR位中。
對于該跳轉程序,當"#temp13"為0時,RLO=0,JNB指令生效,將程序跳轉到"M002"的位置,繼續執行。同時,將RLO的內容復制到BR位中。從"M002"開始的指令,將BR的值讀出來,與后續邏輯進行"與"運算。
當"#temp13"為1時,JNB指令不滿足跳轉條件,程序從"L #IN3"處繼續執行,執行整數的加法運算,即:
"#temp23"的值與"#IN2"做比較,也可作為"#OUT7"狀態的邏輯依據。
由于"@maintenance喬"同學只給了一段程序,沒有上下文做參考,因此,本段程序暫時不能完全解讀。但大概的邏輯是:
"#IN3"是某工藝參數的實際值,"#IN2"端是給定了其上限值,"#OUT7"用于控制某設備的啟停,當實際值小于上限值時,"#OUT7"才為1,相應的設備方能啟動。
四、寫在最后
由于程序不完整,最終也沒解讀出個所以然來。但駝子想通過本例表達的是:
遇到一段復雜的程序,要懂得合理的拆分它們,先從主體框架上弄懂程序想“干什么”,然后,再逐步分解每一個邏輯。精力允許的話,可以借助仿真手段,測試程序,驗證自己的猜想。
總結
以上是生活随笔為你收集整理的接口超时后程序还会继续执行嘛_答网友问:分析一段STL程序,并就如何读懂一段程序谈几点感想...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql递归查询所有上下节点_【转】M
- 下一篇: 下qemu模拟arm9_QEMU搭建树莓