我試圖通過CAN通信(IFM)發送32位實數,但CAN通信只接受16位值。將32位實數轉換爲2x 16位字節
如果我試圖發送的值高於255,它將重置爲0並繼續以該模式繼續。因此,我需要將32位實數值分成兩個16位值,然後在通信的另一端重新組合。
我似乎無法理解如何在結構化文本中做到這一點。
任何幫助,將不勝感激
我試圖通過CAN通信(IFM)發送32位實數,但CAN通信只接受16位值。將32位實數轉換爲2x 16位字節
如果我試圖發送的值高於255,它將重置爲0並繼續以該模式繼續。因此,我需要將32位實數值分成兩個16位值,然後在通信的另一端重新組合。
我似乎無法理解如何在結構化文本中做到這一點。
任何幫助,將不勝感激
我知道我有點遲到了,但想補充這是一個解決方案。
VAR
rRealVar : REAL;
awWordArray : ARRAY[0..1] OF WORD;
pTemp : POINTER TO REAL;
pTemp2 : POINTER TO REAL;
END_VAR
// Get a pointer to the REAL variable
pTemp := ADR(rRealVar);
// Get a pointer to the ARRAY base
pTemp2 := ADR(awWordArray);
// Assign the value of the REAL variable into the ARRAY base
pTemp2^ := pTemp^;
(* Index 0 := Bits 15-0
Index 1 := Bits 31-16
這類似於菲利克斯Keil的答案,但它使用2個pointer
變量和word array
的直接檢索信息。
首先。我沒有使用CAN的經驗,我不知道您使用哪些FB發送它們。但是,如果它重置255以上,似乎只能發送8位值(字節)而不是16位。
第二。我建議使用UNION解決方案(REAL_BYTE_SIZE = 4):
UNION中的變量共享相同的內存。因此,他們可以用不同的方式
TYPE U_RealForCanBus :
UNION
rValue : REAL;
arrbyBytes : ARRAY[1..REAL_BYTE_SIZE] OF BYTE;
END_UNION
END_TYPE
解釋如果要聲明
uRealToSendOverCan : U_RealForCanBus;
可以設置uRealToSendOverCan.rValue和讀取uRealToSendOverCan.arrbyBytes
或者你可能只是這樣做,如果MEMCPY你不想讓變量共享內存:
rValue : REAL;
arrbyToSend : ARRAY[1..REAL_BYTE_SIZE] OF BYTE;
MEMCPY(ADR(arrbyToSend),ADR(rValue),REAL_BYTE_SIZE);
或者你可以隨時使用指針來解釋記憶以不同的方式:
rValue : REAL;
parrbyToSend : POINTER TO ARRAY[1..REAL_BYTE_SIZE] OF BYTE;
parrbyToSend := ARD(rValue); //Initialize pointer
parrbyToSend^[2] ... //Second Byte of rValue
我得到的錯誤:'MEMCPY是沒有函數,當試圖使用這個,我想我沒有它的庫? - 更新,但是在結構化文本中,它不喜歡使用它 – SilverShotBee
可能值得一提的是,我使用的是Codesys 2.3,UNION不可用 – SilverShotBee
我不知道MEMCPY在您身邊,但另一個想法是使用指針來解釋變量的不同。因此我編輯了答案 –
這與我現在使用的方法幾乎相同 – SilverShotBee