【應用筆記】【AN003】VC++環境下基於乙太網的4-20mA電流採集

XiaomaGee發表於2015-11-23

簡介

4-20mA電流環具有廣泛的應用前景,在許多行業中都發揮著重要作用。本文主要介紹了乙太網介面的4-20mA電流採集模組在VC++環境下進行溫度採集,實現WINDOWS平臺對資料的採集、分析及顯示。

系統組成及工作原理

系統組成主要包括PT100鉑電阻、SBWZ溫度變送器、4-20mA電流採集模組(GM4008)以及上位機軟體組成,如圖1所示。

 

PT100鉑電阻溫度感測器:利用鉑金屬阻值隨溫度的變化而變化的特性製成的一種溫度感測器,主要用來測量溫度的變化量。

SBWZ溫度變送器:一種現場安裝式溫度變送單元,主要將鉑電阻的訊號變換成線性的4-20mA的輸出訊號。

4-20mA電流採集模組(GM4008):乙太網介面的GM4008電流採集模組,主要實現資料的傳輸,並通過乙太網介面與上位機進行通訊。

上位機:製作上位機介面,實現被測資料的採集、分析和顯示。

系統工作過程中,當溫度發生變化時,PT100鉑電阻溫度感測器的電阻值發生變化,其阻值經過SBWZ溫度變送器轉換為

 4-20mA的電流訊號,並通過4-20mA電流採集模組(GM4008)與上位機通訊,從而實現溫度的採集、分析及顯示。

電流採集模組

系統採用乙太網介面的8通道4-20mA電流採集模組(GM4008),不僅能更加快速、精確的把測量資料傳送給上位機,保證系統的效率,而且可以使系統的資訊傳輸更加穩定。

GM4008簡介

GM4008 8通道4-20mA電流採集模組(以下簡稱模組)採用全電器隔離方案,配合高效能微處理器及8通道12位ADC在較小的體積下完成了電流測量功能。

模組內建高效能電源變換電路,供電電壓範圍寬至7.5V-36V,且效率高達90%以上。此特性為長時間使用的電源穩定性提供保障。模組內建1500V雙隔離電源模組,使得供電輸入、模擬測量精度、模組穩定性及通用性提供保證。

模組內建百兆乙太網電路,可完成遠距離4-20mA資料採集功能。長時間使用穩定可靠,抗干擾強、不掉線。

模組內建32位的高效能ARM微處理器,它不但完成8通道、12位電流採集,而且支援韌體升級功能,為後期功能升級和bug修復提供技術保證。

VC++上位機程式設計

VC++環境的介紹

該通訊測試介面採用Visual Studio2015  (VC++)實現,軟體介面如圖2所示。Visual Studio2015是微軟公司推出的開發軟體,具有基本完整的開發工具集,包括瞭如UML工具、程式碼管控工具、整合開發環境等工具,可實現基於C++的Modbus串列埠通訊,該介面設計簡潔清晰,操作簡單。

 

圖2 軟體介面

軟體使用方法

軟體介面如圖2所示,操作方法如下:

  1. 1.         在IP Address裡設定IP;
  2. 2.         在Port裡面設定埠,一般固定為502埠;
  3. 3.         點選connect按鍵,此時會自動連線乙太網,此按鍵變為disconnect;
  4. 4.         點選start按鍵,開始採集電流;
  5. 5.         點選stop按鍵,停止採集;
  6. 6.         點選disconnect按鍵後,則斷開乙太網,清除資料。

軟體的核心程式碼

(1)Modbus function3功能讀取保持暫存器

Modbus讀取資料程式如附件1所示,該段程式由一個Modbus3函式組成,程式先是對的第324至342行,是對暫存器的設定。第346至第358行,是資料的傳送與讀取方式。第360至362行是資料的型別轉換。

(2)顯示通道資料

顯示通道資料程式碼如附錄2所示,此段程式主要為8個通道資料顯示。每個通道都是從暫存器讀取資料再顯示出來。

測量採集演示及說明

配備工具或軟體

  1. 1.         12V直流電源;
  2. 2.         兩個PT100鉑電阻溫度感測器;
  3. 3.         兩個SBWZ溫度變送器;
  4. 4.         一個乙太網介面8通道4-20mA電流採   集模組(GM4008);
  5. 5.         Aligent 34401A臺式六位半數字萬用表;
  6. 6.         開發環境:Visual Studio 2015(所需軟體由使用者自行下載);
  7. 7.         作業系統:WIN7以上。

系統連線方法

本次實驗主要採集兩個通道的電流資料,為了保持圖片連線清楚整潔,只接入1個SBWZ,另一個連線方式相同。系統主要硬體連線如圖3所示。

 

圖3 系統主要硬體連線圖

測試步驟

  1. 1.         根據系統主要硬體連線圖(圖3)連線各元件;
  2. 2.         接入兩個溫度變送器,GM4008配置兩個通道,將CH0設定為打火機火焰測試資料採集通道,CH1設定為熱水資料採集通道;
  3. 3.         然後在程式介面設定好IP以及埠;
  4. 4.         將兩個溫度變送器的PT100鉑電阻分別放入熱水中與打火機火焰中(具體操作為點選介面的connect按鈕,連線以後點start按鈕,系統會自動連線乙太網採集資料,操作簡單方便)。

測試結果

實驗採集到的資料如圖4所示,為了證明測試結果的準確性以及得到準確的溫度,進行精度驗證與實驗驗證算兩個步驟。

 

圖4 實驗採集資料圖

(1)精度驗證

為了驗證所測電流值的準確度,把Aligent 34401A 六位半高精度萬用表串聯到SBWZ溫度變送器後端的電路中,將萬用表的電流讀數與上位機顯示的電流度數進行對比。實驗結果如表1所示,經過多次實驗,兩組資料結果基本相同。


由SBWZ溫度變送器以及PT100鉑電阻的量程之間的關係,得出實際測得電流與溫度之間符合關係式:
(2)實驗驗證

y=25*x-100

對應測量的電流值對照計算知所測水溫為大約87℃,火焰大約為389℃(由於火焰溫度高於量程,所以到19mA以後停止實驗,以免損壞裝置)與實際相符。

由測試可知:本系統基於VC++開發環境通過乙太網測得的資料是真實可靠的,可應用於實際中。

總結

本文通過Visual studio 2015上位機程式設計實現了VC++環境下乙太網的Modbus通訊,可完成工業自動化控制系統中的遠端資料採集及監測等功能。該通訊系統程式設計模式簡單、易於使用、有較強的實用性。

參考資料

  1.     《Effective C++》;
  2.     《C++程式設計語言》

相關資源下載

1Visual Studio 2015下載地址:

https://www.visualstudio.com/downloads/download-visual-studio-vs

2、GM4008 簡易手冊:

http://files.cnblogs.com/files/xiaomagee/GM4008%E7%AE%80%E6%98%93%E6%89%8B%E5%86%8CV1.0.pdf

3、GM4008 使用者手冊:

http://files.cnblogs.com/files/xiaomagee/GM4008%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8CV1.0.pdf

4、GM4008 購買地址:

https://item.taobao.com/item.htm?id=522185223217

5、本資料原始碼包、PDF 文件下載:

連結: http://pan.baidu.com/s/1sj6Aifj 密碼: jw9g

http://pan.baidu.com/s/1pJnbxvP

 

 

 

附錄1Modbus 功能碼3讀取資料程式

300 //modbus傳送並讀取資料
301 void CmodbusDlg::modbus_fun3(int start_address,int read_number)
302 {
303         static short int id;
304         static int response_length;
305         static int length;
306         char recvbyte[256];
307         char sendbyte[12];
308         short int data[24];
309         float display_value[8];
310         int i;
311         CString str;
312         short int temp;
313         typedef union{
314                 unsigned short int data;
315                 struct {
316                         char a;
317                         char b;
318                 };
319         }
320         TYPE_T;
321         TYPE_T data_value;
322 
323         id++;
324         //事務元表示符
325         sendbyte[0] = (id >> 8) & 0x00ff;
326         sendbyte[1] = id & 0x00ff;
327         //協議表示符
328         sendbyte[2] = 0x00;
329         sendbyte[3] = 0x00;
330         //以下位元組的長度
331         sendbyte[4] = 0x00;
332         sendbyte[5] = 0x06;
333         //單元識別符號
334         sendbyte[6] = 0x01;
335         //功能碼
336         sendbyte[7] = 0x03;
337         //讀取暫存器起始地址
338         sendbyte[8] = (start_address >> 8) & 0x00ff;
339         sendbyte[9] = start_address & 0x00ff;
340         //讀取暫存器數量
341         sendbyte[10] = (read_number >> 8) & 0x00ff;
342         sendbyte[11] = read_number & 0x00ff;
343 
344         response_length = read_number * 2 + 9; 
345         //傳送讀取命令
346         send(s, sendbyte, 12, 0);
347         //讀取資料
348         length = 0;
349         while (length < response_length){
350                 i = recv(s, &recvbyte[0] + length , 256 - length , 0);
351                 length = length + i;
352         }
353 
354         for (i = 0; i < 24; i++) {
355                 data_value.a = recvbyte[i * 2 + 10];
356                 data_value.b = recvbyte[i * 2 + 9];
357                 data[i] = data_value.data;
358         }
359 
360         for (i = 0; i < 8; i++) {
361                 display_value[i] = (float)(data[i * 3 + 2] / 100.0);
362         }
363 

 

附錄2:顯示通道資料程式

 

364         //顯示採集資料
365         m_ch0.SetWindowTextW(_T(""));
366         str.Format(_T("%5.2f"), display_value[0]);
367         m_ch0.ReplaceSel(str);
368 
369         m_ch1.SetWindowTextW(_T(""));
370         str.Format(_T("%5.2f"), display_value[1]);
371         m_ch1.ReplaceSel(str);
372 
373         m_ch2.SetWindowTextW(_T(""));
374         str.Format(_T("%5.2f"), display_value[2]);
375         m_ch2.ReplaceSel(str);
376 
377         m_ch3.SetWindowTextW(_T(""));
378         str.Format(_T("%5.2f"), display_value[3]);
379         m_ch3.ReplaceSel(str);
380 
381         m_ch4.SetWindowTextW(_T(""));
382         str.Format(_T("%5.2f"), display_value[4]);
383         m_ch4.ReplaceSel(str);
384 
385         m_ch5.SetWindowTextW(_T(""));
386         str.Format(_T("%5.2f"), display_value[5]);
387         m_ch5.ReplaceSel(str);
388 
389         m_ch6.SetWindowTextW(_T(""));
390         str.Format(_T("%5.2f"), display_value[6]);
391         m_ch6.ReplaceSel(str);
392 
393         m_ch7.SetWindowTextW(_T(""));
394         str.Format(_T("%5.2f"), display_value[7]);
395         m_ch7.ReplaceSel(str);

 

相關文章