簡體   English   中英

在 Codesys 中將四個 16 位 UINT 組合成一個 64 位 UINT

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM