RS-232讀取問題

各位前輩好:

使用LabVIEW對機器讀取數值,請教關於通訊寫入讀取問題

小弟目前能寫入指令,機器有收到也有回傳

但是LabVIEW伏法能正確讀取、顯示

懇請前輩們,指點迷津,底下是小弟寫的程式

RS232.vi (13.5 KB)

  1. 通訊問題: 先檢查看看byte at ports,確認有沒有東西傳進來
  2. 讀取問題: 是否會time out? 讀取速率是否過快/慢?
  3. 顯示問題: 檢查Normal/ HEX display

大概這幾個方向, 內文訊息有點少, 再試試看囉

1個讚

前輩好,

請問byte at ports如何觀看資料有沒有接收到?

我用Bus Hound有看到機器有回傳資料

Hi Amaze,

先看看這邊有沒有數值吧, 如果沒有但是其他程式有那就看看serial port設定

如果有就是讀出來看看數值對不對。image

前輩好,

請問另一問題,通訊讀回的16進制資料,

如何取出片段資料呢?

例如,資料為0103 0400 0008 A13C 4B,想取出有效資料為00 0008 A1

HI 假如字串位置固定,數位置就OK囉
兩個16位元數字就是1個位元,一個位元就是一個字元
所以像你目前讀取的0003 0400 0008 A13C 4B
以字元來說就是00 03 04 00 00 08 A1 3C 4B
所以你要的文字位置就是位置3取4個字元

2個讚

Hi Jackylin 你好,

請問取出的字元會變成字串嗎?

因為我將字元取出後用 Scan Value Function 轉換十進制,但轉出的數值都不正確

電路與測試如下所示,麻煩前輩指導,謝謝

RS 485資料轉換
RS 485資料轉換-1

value應該為0x36 = 54,但轉出後顯示為0
value應該為0xFF = 255,但轉出後顯示為6

主因是這邊有字碼轉換的問題要先處理掉
假如你直接轉換會是錯誤的
可以參考以下作法
Hex字串==>Hex數值==>Dec字串

1個讚

Hi Jackylin 你好,

感謝提供的範例,請問字串轉數值時,有不使用Array的方式嗎?

我找了幾天都沒找到

有甚麼原因導致不希望使用到Array嗎
目前我這邊應該是沒有其他方法做轉換

想使用Formula Node編寫程式,

由設備讀取出的溫度數位值,比對矩陣後

找出數值最相近的矩陣位置,顯示實際溫度

底下是目前撰寫的程式:
RS 485_Motor Temperature.vi (34.2 KB)
預計使用Formula Node編成的程式如下:
unsigned char i;

static unsigned char NetPos;
static unsigned char Pos;
static const unsigned int *TempPoint;

if(!Mode)
TempPoint=&TempInverterCmp[0];
else
TempPoint=&TempBoostCmp[0];

Pos=60;
NetPos=60;

if(Adc<=TempPoint[0])
{
for(i=0;i<6;i++)
{
NetPos=(NetPos+1)>>1;
if(TempPoint[Pos]<=Adc)
Pos=Pos-NetPos;
else
Pos=Pos+NetPos;
}

if(TempPoint[Pos]>=Adc)
	Pos++;
return (Pos-20);

}
else
return (-20);

HI 可能要麻煩你降轉
我這邊版本是2018

Hi
麻煩你了

RS 485_Motor Temperature.vi (29.6 KB)

這邊基本上你的TempCal是你的計算結果資料格式為Arrary
但你看起來只是想做成純量去
跟你的Table做比較
這邊只要把Arrary透過Index取值就可以囉
我這邊提供你另一種資料轉換方式你可以參考看看
RS 485_Motor Temperature (1).vi (28.8 KB)

1個讚

Hi Jackylin,

感謝提供資料轉換方式,目前已可使用,但出現另一個我想不到原因的問題

如下圖所示,我將取回的數值描繪出圖形,但總會不定時的出現一固定的數值

如果是通訊資料沒接收完全,應該不可能每次都是固定的數值?

通訊數值異常

HI 通常這種字碼傳輸最後兩碼會帶有驗證碼,驗證碼可以做為是否正確讀取的依據,這部分可能會稍微複雜,你可以學習看看,或使用網路上的相關資源。假如你的異常值結果的驗證碼也是正確的,那就表示是設備給予的值,那可能就要用程式方式解決這個問題了

Hi,

通訊會有CRC驗證我知道

我有使用邏輯分析儀跟Bus Hound確認傳送 / 接收命令

命令都是正確的

LabVIEW執行過程中會有抓到如下圖所示;看起來像是上一次的數值,程式沒有把命令一次抓取完

123-1

6D為某一次程式未取出的CRC_High Bytes,導致後續取出的值異常,

應該是取出 0x064F做運算,但因為6D導致取出的值為0x0406,所以才會異常數值都固定為某個數值

請問抓取的暫存器有辦法在每次都歸零嗎?

假設出現這種狀況你的CRC計算就會有問題
你的程式是透過延遲時間與讀取暫存器當前字數並取得,所以會出現這種狀況
嘗試拉長讀寫之間的間隔時間處裡可能會是比較好
時間長度你可以做測試,在延遲時間與擷取速度達到一個平衡