PLC Structured Text Object Oriented Programming
PLC結構化文字(ST)——結構體屬性外部呼叫(Issue)
問題
很久之前在做OOP
程式設計時,遇到過這樣一個問題,建立一個屬性型別是結構體,而我在外部訪問結構體內部成員時編譯器(TwinCAT3
)直接報錯。這應該是系統Bug
,甚至是CODESYS
底層的Bug。
- 結構體
TYPE myStruct :
STRUCT
value1 : INT;
value2 : STRING;
value3 : REAL;
END_STRUCT
END_TYPE
- FB
FUNCTION_BLOCK POU
VAR
mystruct : myStruct;
END_VAR
- 屬性
PROPERTY P_Mystruct : mystruct
// Get方法
P_Mystruct := mystruct;
- Main
PROGRAM MAIN
VAR
pou:POU;
END_VAR
pou.P_Mystruct.value1; // 已經在報錯。
錯誤C0185: It is not possible to perform component access '.', index access '[]' or call '()' on result of function call. Assign result to help variable first.
官方解決方案
最近在虛擬學院逛了逛,突然看到官方給出了這樣的一個解決方案,這裡分享一下。
- 解決方案
在宣告屬性的使用將其設定為REFERENCE TO 結構體,再get中用REF=,就可以了——倍福虛擬學院
- 屬性
// 屬性定義
PROPERTY P_Mystruct : REFERENCE TO mystruct
// Get方法
P_Mystruct REF= mystruct;
- Main
PROGRAM MAIN
VAR
pou:POU;
END_VAR
pou.P_Mystruct.value1 := 1;
pou.P_Mystruct.value2 := 'test';
pou.P_Mystruct.value3 := 3.14;
這個方法的確有效,沒有報錯,但是有沒有發現另一個問題(Issue
)。這裡只使用屬性get
方法為的就是限制訪問(ReadOnly
)。上面測試例程中不僅可以訪問結構體屬性內部成員,而且還可以對結構體屬性內部成員賦值。程式碼安全性大大降低。
總結
綜上所述,結構體屬性內部成員訪問使用官方解決方案確實可以,但在程式編寫階段還需注意自己的變數成員的安全性。最後,還是希望官方趕緊修復這個Bug
吧。