[英]Combining four 16 bit UINT to one 64 bit UINT in Codesys
我試圖在 codesys 中將四個 16 位 UINT 組合成一個 64 位 UINT。 我可以在 C 中執行此操作,但我無法弄清楚 Codesys 中的語法。 我有一個數組的四個元素,它們是 16 位 UINT 值。
如果有人知道將這些結合起來的方法,請告訴我。 非常感謝。
VAR
// Array
UTCdataArray : ARRAY [0..3] OF UINT;
//16 bit UINT elements
UTCval0: UINT := 0;
UTCval1: UINT := 0;
UTCval2: UINT := 0;
UTCval3: UINT := 0;
// 64 bit ULINT
UTCval: ULINT := 0;
END_VAR
// 16 bit UINT array
UTCval0 := UTCdataArray[0];
UTCval1 := UTCdataArray[1];
UTCval2 := UTCdataArray[2];
UTCval3 := UTCdataArray[3];
// Combine 16 bit UINT array elements into 64 bit ULINT
//This is something I would do in C
UTCval := UTCval0 << 0;
UTCval := UTCval1 << 16;
UTCval := UTCval2 << 32;
UTCval := UTCval3 << 48;
有幾種方法可以將數據類型組合/划分為更大/更小的類型。
正如kolyur所提到的,其中之一是使用移位運算符:
UTCval := UINT_TO_ULINT(UTCval0) + SHL(UINT_TO_ULINT(UTCval1), 16) + SHL(UINT_TO_ULINT(UTCval2), 32) + SHL(UINT_TO_ULINT(UTCval3), 48);
雖然我個人從來沒有使用過那個。
或者,您可以使用數組和指針將數組“轉換”為更大的類型:
(*
_arr: ARRAY [0..3] OF UINT;
_p_ulint: POINTER TO ULINT;
*)
_arr[0] := UTCval0;
_arr[1] := UTCval1;
_arr[2] := UTCval2;
_arr[3] := UTCval3;
_p_ulint := ADR(_arr);
UTCval := _p_ulint^;
或者將較大的類型值轉換為較小的類型數組:
(* _p_uint: POINTER TO UINT; *)
_p_uint := ADR(UTCval);
_p_uint[0] := UTCval0;
_p_uint[1] := UTCval1;
_p_uint[2] := UTCval2;
_p_uint[3] := UTCval3;
最后,您可以使用聯合來避免使用指針:
(*
TYPE WORDS64 :
UNION
words: ARRAY [0..3] OF WORD; // WORD <=> UINT (16 bit unsigned)
word64: LWORD; // LWORD <=> ULINT (64 bit unsigned)
END_UNION
END_TYPE
*)
(* _words64: WORDS64; *)
_words64.words[0] := UTCval0;
_words64.words[1] := UTCval1;
_words64.words[2] := UTCval2;
_words64.words[3] := UTCval3;
UTCval := _words64.word64;
我認為左移位 ( SHL
) 是你要找的。
UTCval:= UINT_TO_ULINT(UTCval0) + SHL(UINT_TO_ULINT(UTCval1),16) + SHL(UINT_TO_ULINT(UTCval2),32) + SHL(UINT_TO_ULINT(UTCval3),48);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.