0

我試圖通過CAN通信(IFM)發送32位實數,但CAN通信只接受16位值。將32位實數轉換爲2x 16位字節

如果我試圖發送的值高於255,它將重置爲0並繼續以該模式繼續。因此,我需要將32位實數值分成兩個16位值,然後在通信的另一端重新組合。

我似乎無法理解如何在結構化文本中做到這一點。

任何幫助,將不勝感激

回答

1

我知道我有點遲到了,但想補充這是一個解決方案。

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的直接檢索信息。

+0

這與我現在使用的方法幾乎相同 – SilverShotBee

1

首先。我沒有使用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 
+0

我得到的錯誤:'MEMCPY是沒有函數,當試圖使用這個,我想我沒有它的庫? - 更新,但是在結構化文本中,它不喜歡使用它 – SilverShotBee

+0

可能值得一提的是,我使用的是Codesys 2.3,UNION不可用 – SilverShotBee

+0

我不知道MEMCPY在您身邊,但另一個想法是使用指針來解釋變量的不同。因此我編輯了答案 –