Derived Data Type 衍生數據類型

台達伺服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)

tip 台達伺服詳細支援的EDT項目請翻閱手冊

 

一般數據類型(Generic Data Type, GDT)   tip ServoMotion 暫不支援該類型

 

衍生數據類型(Derived Data Type, DDT)

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    tip 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

 

發表迴響