清楚的瞭解數據類型是編程必備技能
數據類型分三類:(本篇範擴展數據類型)
規範擴展數據類型
基於IEC 61131-3的標準化擴展
UNION(可以在用戶定義類型聲明單元)
例子:
TYPE name: UNION
a : LREAL;
b : LINT;
END_UNION
END_TYPE
ANY_TYPE
可以用數據類型ANY_TYPE聲明函數的輸入。
LTIME
LTIME支持高分辨率定時器的時基。 LTIME大小爲64位分辨率納秒。
句法:
LTIME#<時間聲明>
時間的聲明中包含的時間單位用的時間常數:
"us" : microseconds
"ns" : nanoseconds
例子:
LTIME1 := LTIME#1000d15h23m12s34ms2us44ns
與TIME 相比,它爲32 位 ,分辨率毫秒。
WSTRING
標準的字符串類型(ASCII)不同,在於在萬國碼格式下的獲得解讀以及每個字符需要兩個字節以及2個字節的外加存儲空間(一個字符串只需要一個)
例子:
wstr:WSTRING:="This is a WString";
引用
一個REFERENCE是一個對象的別名 。別名可通過標識符被寫或讀。指針的差別在於指向的值是直接影響並且引用的分配以及值是固定的。引用的地址必須是通過單獨的分配操作設置的。不論一個引用指向一個有效的值(不平等的0)能被通過一個特殊的標識符檢查,見以下:“檢查引用有效性”
一個引用根據下述語法被聲明:
句法:
<identifier> : REFERENCE TO <data ty>
聲明例子:
ref_int : REFERENCE TO INT;
a : INT;
b : INT;
ref_int現已被用作INT類型的變量的別名。
使用例子:
ref_int REF= a; (* ref_int now points to a *)
ref_int := 12; (* a now has value 12 *)
b := ref_int * 2; (* b now has value 24 *)
ref_int REF= b; (* ref_int now points to b *)
ref_int := a / 2; (* b now has value 6 *)
ref_int REF= 0; (* explicit initialization of the reference *)
檢查引用有效性
運算符 "__ISVALIDREF" 能被用於檢查一個引用是否指向有效值,這個值是不等於0的。
句法:
<boolsche Variable> := __ISVALIDREF(identifier, declared with type <mit REFERENCE TO <datatype>);
<boolean variable>如果引用指向一個有效值,其爲真否則爲假。
例子:
聲明:
ivar : INT;
ref_int : REFERENCE TO INT;
ref_int0: REFERENCE TO INT;
testref: BOOL := FALSE;
執行:
ivar := ivar +1;
ref_int REF= hugo;
ref_int0 REF= 0;
testref := __ISVALIDREF(ref_int); (* will be TRUE, because ref_int points to ivar, which is unequal 0 *)
testref0 := __ISVALIDREF(ref_int0); (* will be FALSE, because ref_int is set to 0 *)
指針
當一個應用程序運行的時候,指針可以保存變量、程 序、功能塊、方法和函數的地址。指針可以指向上述 羅列的任何對象或者任何數據類型的變量。 ( 數據類型, 一般) 指針甚至可以 指向用戶定義的數據類型 用戶定義的數據類型。
指針申明的語法:
<identifier>: POINTER TO <data type | function block | program | method | function>;
指針的實現意味着獲得存儲在指針所指向的地址中的當前值。指針被定義以後,通過 內部操作符 "^"指針可以實現 ; 參見下述事例“pt^”的例子。地址操作符 ADR 可 以用來分配指針變量的地址。
示例
VAR
pt:POINTER TO INT; (* Declaration of pointer pt *)
var_int1:INT := 5; (* Declaration of the variables var_int1 and var_int2 *)
var_int2:INT;
END_VAR
pt := ADR(var_int1); (* Address of varint1 is assigned to pointer pt *)
var_int2:= pt^; (* Value 5 of var_int1 is assigned to var_int2 by dereferencing the pointer pt *)
函數指針
對比 CODESYS V2.3 ,取代INDEXOF操作符的函數指針 t也是可行的。這些指針可以被傳遞給外部的函數庫, 但 不可能調用編程系統中應用程序的函數指針 !註冊回調函數(系統庫函數)的運行函數與函數指針相關 ,並且取決於爲 其請求註冊的回調函數,各自的功能將由運行時系統 隱性地調用。(見STOP處示例) 爲了 確保有這樣的系統調用 (運行系統) ,相應的 函數對象property (category "Build") 必須進行設置。
ADR操作符可以用在函數名、程序名、功能塊名和方法名。 見 ADR。 由於函數 可以在實時改動後移動,所得的結果不是函數的地址, 而是指向函數的指針的地址。只要函數存在於目標系 統中,那麼該地址就是有效的。
指針的索引訪問
基於 IEC 61131-3 標準化擴展 索引訪問 "[]" 可 以是指針型變量、字符串型變量或者WSTRING型變量。 見 字符串 or WSTRING。
pint[i] 返回基本的數據類型
指針的索引訪問是數學形式的:如果索引訪問被用於 POINTER TO型的變量,偏移量可以這樣計算: pint[i] = (pint + i * SIZEOF(base type))^索引訪問也可以通過指針隱式實現。結果的類型是該指針的基本類型。注意 pint[7] != (pint + 7)^!
如果索引訪問用於字符串類型的變量,字符是通過偏 移索引表達式獲得的。該結果的類型是字節類型的。str[i]將會以有符號整型(ASCII)返回字符串的第i 個字符。
如果索引訪問是用於WSTRING類型的變量,字符是 通過偏移索引表達式獲得的。該結果的類型是字類型的。wstr[i]將會以整型(Unicode)返回字符串的第i 個字符。
檢查指針功能
爲反映運行期間指針的訪問情況,你可以在每次訪問 指針的地址前使用隱式監控功能也稱 CheckPointer 。 在幫助對話框下,此功能已經作爲 POUs 的隱式檢查的對象被整合到應用中 添加對象。當你標記複選框的類型爲CheckPointer後, 選擇一 種執行語言並確認你的設置爲選擇一 種執行語言並確認你的設置爲 Open,檢查功能將 在相應的編輯器中打開。聲明部分預設爲所有語言, 不得進行修改!只有一個例外情況是允許的:增加本 地變量。然而與其它的檢查功能進行對比, CheckPointer沒有默認的執行;執行是留給用戶做的!
CheckPointer 的功能是檢查傳遞的指針是否指向一個 有效的地址,即保留在有效的存儲範圍內,並且所引 用的存儲器區域的取向是否與指針所指向的變量的數 據類型相符合。如果滿足所有的條件 ,CheckPointer 返回沒有變化的輸入指針。否則,其其應該 執行一個適當的錯誤處理程序。
聲明部分:
// Automatically generated code : DO NOT EDIT
FUNCTION CheckPointer : POINTER TO BYTE
VAR_INPUT
ptToTest : POINTER TO BYTE;
iSize : DINT;
iGran : DINT;
bWrite: BOOL;
END_VAR
實現部分: (不完全!):
// No standard implementationFill in your own code here
CheckPointer := ptToTest;
當被調用時,函數接收下面的輸入參數:
ptToTest:指針的目標地址
iSize:參考變量的長度:其數據類型一定是兼容整數 的, 並且必須包含儲存在指針地址中最大可能的數據 長度。
iGran: 訪問的粒度,也就是用於參考變量中最大的非 標準數據類型;其數據類型一定是兼容整數的。
bWrite:訪問的類型(真=寫訪問,假=讀訪問);其 數據類型一定是布爾類型。
如果是一個肯定的檢查結果,未修改的輸入指針將返 回 (ptToTest)。
BIT
BIT 數據類型只能用於在 結構中的特殊變量。可能的值是TRUE (1)和FALSE (0)。一個 BIT 元素消耗 1 位內存,並且允許處理名稱結構的單獨位,參見 結構中的Bit 訪問。Bit 元素爲一個接着一個的聲明,將被合併在字節中。所有與 布爾類型相比,在任何情況下都保留 8 位,內存的使用將得到優化。需注意另一方面,方位位將需要更多時間! 所以他只在你想要在一個特定的格式下定義數據時建議使用BIT數據類型。