基於C#的Modbus的(NModbus)研究(DTS686電錶)——實現TCP通信連接(二)

上一篇說明了基於nmodbus的rtu的連接,本次來介紹一下TCP實現基於modbus的通信,畢竟以後tcp通過ip地址通信才能更簡單。和上一篇差不多。

一、首先放出參考的有價值的NModbus網站

1.modbus tools 全英解釋 https://modbustools.com/download.html 官方  詳細解釋說明

2.Modbus/Nmodbus  中文繁體版  http://www.icpdas.com/products/PAC/i-8000/modbus_c.htm  官方

3.我所用的測試連通的工具

salve  poll https://download.csdn.net/download/lsc_hei/10709595以及

vspd https://download.csdn.net/download/lsc_hei/10729508工具 

測試串口連通性工具  https://download.csdn.net/download/lsc_hei/10742111

TCp測試網絡是否連通,才測試程序的正確性https://download.csdn.net/download/lsc_hei/10745748

十六進制轉float https://download.csdn.net/download/lsc_hei/10742108

4.NModbus api說明文檔 即本人根據完成的 https://download.csdn.net/download/lsc_hei/10750678這個人認爲很重要

二、實現TCP的通信連接

以本人所使用的VS2013做法示範;
   
  1.首先新建一個工程點擊工具下拉菜單找到--管理NuGet程序包(也可能沒有少一項,搞搞就出來了,很簡單)--然後搜索你需要的包(nmodbus4,記得選擇nuget 不然可能找不到)--點擊安裝即可。安裝完成後引入命名控件using Modbus.Deice 然後去創建你的winform就行了,因爲我是用winform,其他的類似,請自行比對。

在這裏,主站和從站之分便沒有了,有的是服務器和客戶端之分,我使用的是USR-TCP232-304/RS485 TO ETHERNET CONVERTER 連接從電錶分出來的rs485專線口,modbus tcp 沒有主站、從站之分,但是有服務器(Server)與客戶端(Client)之分:發出數據請求的一方爲客戶端(Client),做出數據應答的的一方爲服務器(Server)。服務器(Server)與客戶端(Client)分別類似於modbus rtu從站、主站的作用,但它們之間沒有任何關係。modbus tcp協議modbus協議通過tcp傳輸其實就是同一回事。

電錶連接的那個轉換口,可以作爲服務器也可以作爲客戶端。我將端口數據作爲服務器端,即將pc段自己做的作爲客戶端去觸發服務器端的監聽事件,即服務器端應爲slave作爲監聽,pc端作爲master去觸發監聽得到響應數據。  大家也可以試試把帶有電錶的那一端作爲客戶端試試。。。。

*/*和串口差不多,tcp按理說也應該和串口一致,繁體示範上面也區分了 slave和master 只是設置了一個ip地址   我按照串口的方法改到一起,但是不知道什麼原因,一直連接不成功,不能正常返回數據,找了半天也沒找到原因,master端demo上寫的是讀到服務器ip 然後建立連接,slave端是獲取本地ip然後建立監聽進行響應,這樣一弄就完全混亂了,我該怎麼設置ip等等

源代碼貼出,以備後用https://download.csdn.net/download/lsc_hei/10751379

二‘最後百思不得其解,不行轉換思路,直接做了一個 TCP IP的客戶端,用最簡單的方法實現就是客戶端發送數據socket,得到服務器的響應數據,連多線程都不用,唯一的就是委託,跨控件而已。

唉 當初學tcp的時候怎麼沒想到現在竟然能這麼簡單的用到。。。。

然後對數據進行處理,得到的數據是十進制單位,看返回的有幾個字節,就是幾個十進制,然後按照自己的需求搞

我所運用示例

   txtReceive.Text += "得到的十進制爲" + holdingregister[0].ToString() + "和"+ holdingregister[1].ToString() + ";

同時  將得到的十進制轉化爲16進制然後再轉化爲float進行輸出,看個人需求

  string hexString = Convert.ToString(holdingregister[0], 16) + Convert.ToString(holdingregister[1], 16);
    uint num = uint.Parse(hexString, System.Globalization.NumberStyles.AllowHexSpecifier);
                byte[] floatVals = BitConverter.GetBytes(num);
                float f = BitConverter.ToSingle(floatVals, 0);
                txtReceive.Text += "轉換成的float數爲:" + f;

完成

三、

如圖所示的tcp測試連通性軟件,將本機作爲客戶端。

[發送]94 03 00 00 00 02 D9 0E

[接收]94 03 04 3D 8F 5C 29 FB A3 

說明:設備地址(1字節)+功能號(1)+寄存器起始地址(2字節)+讀取的寄存器數(2)+CRC校驗

說明:設備地址(1字節)+功能號(1)+返回的字節數+數據1+數據2+...+等於字節數+CRC校驗

返回的字節數=2*讀取的寄存器數

四、

哎等有空了 還得仔細研究一下這個,還好網上有這麼多人 站在各位前輩的成果之上 感謝。

源代碼地址:已完成https://download.csdn.net/download/lsc_hei/10751276

https://download.csdn.net/download/lsc_hei/10750738

對了這是官方示例的demo拿好各位https://download.csdn.net/download/lsc_hei/10750717

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章