C#中的modbus Tcp協(xié)議的數(shù)據(jù)抓取和使用解析
C# modbus Tcp協(xié)議數(shù)據(jù)抓取和使用
基于Modbus tcp 協(xié)議的數(shù)據(jù)抓取,并解析,源碼使用C#開(kāi)發(fā)
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; namespace modbus { class Program { #region 字節(jié)轉(zhuǎn)換為16進(jìn)制字符 /// <summary> /// 字節(jié)轉(zhuǎn)換為16進(jìn)制字符 /// </summary> /// <param name="data"></param> /// <returns></returns>jiang static string ByteToHexString(byte[] data) { string strTemp = ""; for (int i = 2; i < data.Length; i++) { string a = Convert.ToString(data[i], 16).PadLeft(2, '0'); strTemp = strTemp + a; } return strTemp.Substring(0, 100); } #endregion #region 16進(jìn)制字符轉(zhuǎn)換為字節(jié) /// <summary> /// 16進(jìn)制字符轉(zhuǎn)換為字節(jié) /// </summary> /// <param name="hs"></param> /// <returns></returns> static byte[] HexString(string hs) { hs = hs.Replace(" ", ""); string strTemp = ""; byte[] b = new byte[hs.Length / 2]; for (int i = 0; i < hs.Length / 2; i++) { strTemp = hs.Substring(i * 2, 2); b[i] = Convert.ToByte(strTemp, 16); } return b; } #endregion #region 發(fā)送、接收?qǐng)?bào)文并返回報(bào)文 /// <summary> /// 發(fā)送或接受風(fēng)機(jī)指令 /// </summary> /// <param name="sendCodeMeg">指令</param> /// <param name="IpAddress">IP地址</param> /// <param name="panelIP">面板IP</param> /// <returns></returns> static string SendPack(string sendCodeMeg, string IpAddress, int port) { IPAddress ip = IPAddress.Parse(IpAddress); Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { Console.WriteLine("開(kāi)始發(fā)送數(shù)據(jù)。。。"); clientSocket.Connect(new IPEndPoint(ip, port)); //配置服務(wù)器ip和端口 //TcpClient tcpClient = new TcpClient(); Console.WriteLine("服務(wù)器連接成功"); } catch { Console.WriteLine("連接服務(wù)器失敗\n"); return null; } try { string sendMessage = sendCodeMeg; // "6B 00 00 00 00 06 02 06 05 10 00 01"; //發(fā)送到服務(wù)端的內(nèi)容 var sendData = HexString(sendMessage); string recvStr = null; int bytes; try { Console.WriteLine("發(fā)送報(bào)文:{0}", sendMessage); clientSocket.Send(sendData);//向服務(wù)器發(fā)送數(shù)據(jù) byte[] recvBytes = new byte[1024]; //連接時(shí)長(zhǎng)500ms clientSocket.ReceiveTimeout = 5000; bytes = clientSocket.Receive(recvBytes, recvBytes.Length, 0); //服務(wù)端接受返回信息 recvStr += ByteToHexString(recvBytes); } catch (Exception ex) { Console.WriteLine("出現(xiàn)錯(cuò)誤!\n{0}\n\n", ex); recvStr = null; } if (recvStr != null) { Console.WriteLine("獲取成功!\n 獲得數(shù)據(jù):{0}\n\n", recvStr); } clientSocket.Close();//關(guān)閉連接釋放資源 //Console.ReadLine(); return recvStr; } catch { Console.WriteLine("出現(xiàn)錯(cuò)誤!\n"); return null; } } #endregion //主函數(shù) static void Main(string[] args) { Console.WriteLine("開(kāi)始!"); string IP = "10.139.49.61"; int port = 502; int fnu = 4; string a = fnu.ToString("x2"); string sendCodeMeg1 = "02 00 00 00 00 06 01 03 01 10 00 02"; string sendCodeMeg2 = "03 00 00 00 00 06 01 03 01 0A 00 02"; string data1 = null; string data2 = null; for (int num = 0; num < 5; num++) { Console.WriteLine("第{0}次調(diào)用Get_Fan函數(shù)!\n", num + 1); data1 = SendPack(sendCodeMeg1, IP, port); if (data1 != null) { break; } } for (int num = 0; num < 5; num++) { Console.WriteLine("第{0}次調(diào)用Get_Fan函數(shù)!\n", num + 1); data2 = SendPack(sendCodeMeg2, IP, port); if (data2 != null) { break; } } Console.WriteLine("結(jié)束"); Console.ReadKey(); } } }
C# modbus tcp讀寫(xiě)數(shù)據(jù)
1.引用-添加引用-HslCommunication.dll
2.ModBus組件所有的功能類(lèi)都在 HslCommunication.ModBus命名空間,所以再使用之前先添加
using HslCommunication.ModBus; using HslCommunication;
3.在使用讀寫(xiě)功能之前必須先進(jìn)行實(shí)例化:
private ModbusTcpNet busTcpClient = new ModbusTcpNet("192.168.3.45", 502, 0x01); // 站號(hào)1
上面的實(shí)例化指定了服務(wù)器的IP地址,端口號(hào)(一般都是502),以及自己的站號(hào),允許設(shè)置為0-255,后面的兩個(gè)參數(shù)有默認(rèn)值,在實(shí)例化的時(shí)候可以省略。
private ModbusTcpNet busTcpClient = new ModbusTcpNet("192.168.3.45"); // 端口號(hào)502,站號(hào)1
4.
- 模擬器模擬的是西門(mén)子PLC 有四種類(lèi)型
- 地址以0開(kāi)頭的是可讀可寫(xiě)線(xiàn)圈
- 地址以1開(kāi)頭的是只讀線(xiàn)圈
- 地址以4開(kāi)頭的是可讀可寫(xiě)寄存器(string/float/int/ushort/short等都可以放在這里面)
- 地址以3開(kāi)頭的是只讀寄存器
- 我們讀取的時(shí)候只看后四位0001,就是1,但是庫(kù)里面是從0開(kāi)始讀的,所以對(duì)應(yīng)的就要減一
5.讀取寄存器的一個(gè)值
private void button1_Click(object sender, EventArgs e) { bool coil100 = busTcpClient.ReadCoil("0").Content; // 讀取線(xiàn)圈1的通斷 int int100 = busTcpClient.ReadInt32("0").Content; // 讀取寄存器1-2的int值 float float100 = busTcpClient.ReadFloat("0").Content; // 讀取寄存器1-2的float值 double double100 = busTcpClient.ReadDouble("0").Content; // 讀取寄存器1-3的double值 }
6.讀取寄存器的一組值(一組線(xiàn)圈)(一組float值)
private void button3_Click(object sender, EventArgs e) { //讀取地址為0,長(zhǎng)度為3的線(xiàn)圈數(shù)量 OperateResult<bool[]> read = busTcpClient.ReadCoil("0", 3); if (read.IsSuccess) { for (int i = 0; i < read.Content.Length; i++) { Console.WriteLine(read.Content[i]); } } else { MessageBox.Show(read.ToMessageShowString()); } //讀取(一組)寄存器數(shù)據(jù) OperateResult<float[]> result = busTcpClient.ReadFloat("0", 4); if (result.IsSuccess) { //Console.WriteLine(result.Content[0]); //Console.WriteLine(result.Content[1]); //Console.WriteLine(result.Content[2]); for (int i = 0; i < result.Content.Length; i++) { Console.WriteLine(result.Content[i]); } } else { MessageBox.Show(result.ToMessageShowString()); } }
7.寫(xiě)入一個(gè)(線(xiàn)圈)(寄存器)
private void button2_Click(object sender, EventArgs e) { busTcpClient.WriteCoil("0", true);// 寫(xiě)入線(xiàn)圈1為通 busTcpClient.Write("0", 123.456);// 寫(xiě)入寄存器1-2為123.456 }
8.批量寫(xiě)入一組(線(xiàn)圈)(寄存器)
private void button9_Click(object sender, EventArgs e) { //寫(xiě)入一組線(xiàn)圈 bool[] value = new bool[] { true, true, false, true, false }; busTcpClient.WriteCoil("0", value); } private void button10_Click(object sender, EventArgs e) { //寫(xiě)入一組寄存器 float[] value = new float[] {1.1F, 1.2F, 1.3F, 1.4F, 1.5F }; busTcpClient.Write("0", value); }
-
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)分治算法求解股票問(wèn)題
本文主要介紹了C#實(shí)現(xiàn)分治算法求解股票問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04詳解C#如何實(shí)現(xiàn)讀寫(xiě)ini文件
.ini?文件是Initialization?File的縮寫(xiě),即初始化文件,是windows的系統(tǒng)配置文件所采用的存儲(chǔ)格式,統(tǒng)管windows的各項(xiàng)配置。本文將介紹C#讀寫(xiě)ini文件的方法,需要的可以參考一下2022-01-01Unity3D實(shí)現(xiàn)物體旋轉(zhuǎn)縮放移動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)物體旋轉(zhuǎn)縮放移動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02C#中==(雙等于號(hào))與equals()區(qū)別詳解
這兩種方式也是大家在日常編碼工作當(dāng)中用的比較多的判斷方式,本文就詳細(xì)的介紹一下C# 雙等于號(hào)與equals()區(qū)別,方便大家理解2021-05-05使用checked語(yǔ)句防止數(shù)據(jù)溢出的解決方法
本篇文章是對(duì)用checked語(yǔ)句防止數(shù)據(jù)溢出的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05