前幾天讀書群中有小夥伴提出一個實際項目的客戶需求:在HMI屏幕上顯示當前系統的子站狀态,比如哪些站點已經組态?哪些站點在報錯?這涉及到如何對PROFINET子站進行診斷。今天這篇文章,我給出一種解決方案。
在西門子S7-1200/1500硬件條件下,我們可以使用診斷指令“DeviceStates”來實現對子站的診斷功能,具體方法如下:
在博途指令列表的“擴展指令”→“診斷”中找到DeviceSTATEs指令,其基本語法如下:
DeviceStates(LADDR:=_hw_iosystem_in_, MODE:=_uint_in_, STATE:=_variant_inout_)
指令中各參數含義如下表所示:
名稱 |
類别 |
數據類型 |
說明 |
LADDR |
輸入 |
HW_IOSYSTEM |
PROFINET IO硬件标識符 |
MODE |
輸入 |
UInt |
要讀取的狀态信息類别 |
STATE |
輸入/輸出 |
Variant |
狀态緩存區 |
參數MODE有如下幾種取值:
- 1=已經組态的I/O設備;
- 2=出現故障的I/O設備;
- 3=被禁用的I/O設備;
- 4=存在的I/O設備或者說找到的I/O設備;
- 5=出問題的I/O設備,比如不可用,不可訪問的;
STATE是布爾型數組,其第0個元素表示組的狀态,若其值=1,則表示數組中至少有一個數據滿足查詢要求;從1個元素開始,表示相應編号的子站是否滿足查詢要求,1=滿足,0=不滿足。
回到文章開頭的問題,我們使用DeviceStates來查詢三種狀态:已經組态的子站(MODE=1)、成功找到的子站(MODE=4)及出現故障的子站(MODE=2),将指令執行的結果存放到全局數據塊中。
為了方便,新建用戶自定義數據類型:typeNetDiagnostic,它是布爾型數組,如下圖所示:
新建全局數據塊NetDiagnosticDB,其元素IODeviceState是有三個元素的數組,其數據類型為用戶自定義類型typeNetDiagnostic,如下圖所示:
新建函數塊FB5009_NetDiagnostic,其參數如下:
代碼如下:
在主程序中調用該函數塊,并對參數進行賦值,代碼如下:
說明:參數“270”是當前組态的PROFINET的硬件标識符。
編譯下載程序運行,在線查看運行結果。
在我的當前系統中組态了三個子站,站号分别是11,13和16,如下圖所示:
已經成功找到的站點也是11,13和16 ,如下圖所示:
出故障/在報錯的站點是11,如下圖所示:
這樣就可以通過觸摸屏(HMI)向外展現站點的診斷信息,可以通過動畫演示,讓人一目了然的看到所有站點的狀态。
好了,關于PROFINET子站的診斷就先介紹到這裡。我的書《西門子S7-1200/1500 PLC SCL語言編程 ——從入門到精通》的第11.5.3節也對這個指令有詳細的介紹,還配有相關的視頻。如果你感興趣的話,可以看看下面的鍊接:
,