PLC結構化文字(ST)——結構體屬性外部呼叫(Issue)

J_Sheng發表於2024-09-11

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吧。

相關文章