台達伺服ServoMotion框架有支援衍生數據類型(Derived Data Type),它是一種定義在IEC61131-3的數據類型。
本文一開始先大略的簡介IEC61131-3數據類型,隨後將重點聚焦在DDT如何使用與編寫。
IEC61131-3的數據類型可分為基本數據類型(Elementary Data Type, EDT)、一般數據類型(Generic Data Type, GDT)和衍生數據類型(Derived Data Type, DDT)三類。
基本數據類型(Elementary Data Type, EDT)
- Integers (INT, DINT, UINT, … etc)
- Floating points (REAL, LREAL)
- Time (TIME, DATE, … etc)
- Strings (STRING)
- Bit strings (BOOL, BYTE, WORD, … etc)
台達伺服詳細支援的EDT項目請翻閱手冊
一般數據類型(Generic Data Type, GDT) ServoMotion 暫不支援該類型
衍生數據類型(Derived Data Type, DDT)
DDT是建構在基本數據類型的基礎上,由用戶自行根據需求定義數據類型。DDT可分類為5種類型,並且都用 TYPE … END_TYPE的文本結構進行聲明:
1. Direct derivation from elementary types
TYPE PI : REAL48; END_TYPE
2. Enumerated data types
TYPE SWITCH : (OFF, ON); END_TYPE
3. Sub-ranges data types ServoMotion暫不支援該類型
4. Array data types
TYPE ONE_D : ARRAY[10] OF SWITCH; TWO_D : ARRAY[10] OF ONE_D; END_TYPE
5. Structured data types
TYPE MyINT : STRUCT Bits : ARRAY[16] OF SWITCH; Value : INT; END_STRUCT; END_TYPE
使用範例:
// Val : ARRAY[3] OF MyINT // ARR : TWO_D nTmp := 0; nRef := 1; FOR nii := 0 TO 15 DO IF Val[2].Bits[nii] = SWITCH#ON THEN nTmp := nTmp + nRef; END_IF; nRef := nRef * 2; END_FOR; Val[2].Value:= nTmp; ARR[7,2] := SWITCH#ON;
其他補充:
1. DDT的聲明時可使用單/多行註解
2. 遞迴的結構聲明是不被允許的,它將於編譯階段被告知錯誤
TYPE StructureA : STRUCT Element1 : INT; Element2 : StructureA; // legal: sub structure Element3 : BYTE; END_STRUCT; StructureB : STRUCT Element1 : LINT; Element2 : StructureA; (* illegal: recursive to StructureA *) Element3 : WORD; END_STRUCT; END_TYPE