上一篇說明了基於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