经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
C#中的modbus Tcp协议的数据抓取和使用解析
来源:jb51  时间:2022/7/19 19:04:36  对本文有异议

C# modbus Tcp协议数据抓取和使用

基于Modbus tcp 协议的数据抓取,并解析,源码使用C#开发

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. namespace modbus
  8. {
  9. class Program
  10. {
  11. #region 字节转换为16进制字符
  12. /// <summary>
  13. /// 字节转换为16进制字符
  14. /// </summary>
  15. /// <param name="data"></param>
  16. /// <returns></returns>jiang
  17. static string ByteToHexString(byte[] data)
  18. {
  19. string strTemp = "";
  20. for (int i = 2; i < data.Length; i++)
  21. {
  22. string a = Convert.ToString(data[i], 16).PadLeft(2, '0');
  23. strTemp = strTemp + a;
  24. }
  25. return strTemp.Substring(0, 100);
  26. }
  27. #endregion
  28. #region 16进制字符转换为字节
  29. /// <summary>
  30. /// 16进制字符转换为字节
  31. /// </summary>
  32. /// <param name="hs"></param>
  33. /// <returns></returns>
  34. static byte[] HexString(string hs)
  35. {
  36. hs = hs.Replace(" ", "");
  37. string strTemp = "";
  38. byte[] b = new byte[hs.Length / 2];
  39. for (int i = 0; i < hs.Length / 2; i++)
  40. {
  41. strTemp = hs.Substring(i * 2, 2);
  42. b[i] = Convert.ToByte(strTemp, 16);
  43. }
  44. return b;
  45. }
  46. #endregion
  47. #region 发送、接收报文并返回报文
  48. /// <summary>
  49. /// 發送或接受風機指令
  50. /// </summary>
  51. /// <param name="sendCodeMeg">指令</param>
  52. /// <param name="IpAddress">IP地址</param>
  53. /// <param name="panelIP">面板IP</param>
  54. /// <returns></returns>
  55. static string SendPack(string sendCodeMeg, string IpAddress, int port)
  56. {
  57. IPAddress ip = IPAddress.Parse(IpAddress);
  58. Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  59. try
  60. {
  61. Console.WriteLine("開始發送數據。。。");
  62. clientSocket.Connect(new IPEndPoint(ip, port)); //配置服务器ip和端口
  63. //TcpClient tcpClient = new TcpClient();
  64. Console.WriteLine("服务器连接成功");
  65. }
  66. catch
  67. {
  68. Console.WriteLine("连接服务器失败\n");
  69. return null;
  70. }
  71. try
  72. {
  73. string sendMessage = sendCodeMeg; // "6B 00 00 00 00 06 02 06 05 10 00 01"; //发送到服务端的内容
  74. var sendData = HexString(sendMessage);
  75. string recvStr = null;
  76. int bytes;
  77. try
  78. {
  79. Console.WriteLine("发送报文:{0}", sendMessage);
  80. clientSocket.Send(sendData);//向服务器发送数据
  81. byte[] recvBytes = new byte[1024];
  82. //连接时长500ms
  83. clientSocket.ReceiveTimeout = 5000;
  84. bytes = clientSocket.Receive(recvBytes, recvBytes.Length, 0); //服务端接受返回信息
  85. recvStr += ByteToHexString(recvBytes);
  86. }
  87. catch (Exception ex)
  88. {
  89. Console.WriteLine("出现错误!\n{0}\n\n", ex);
  90. recvStr = null;
  91. }
  92. if (recvStr != null)
  93. {
  94. Console.WriteLine("获取成功!\n 获得数据:{0}\n\n", recvStr);
  95. }
  96. clientSocket.Close();//关闭连接释放资源
  97. //Console.ReadLine();
  98. return recvStr;
  99. }
  100. catch
  101. {
  102. Console.WriteLine("出现错误!\n");
  103. return null;
  104. }
  105. }
  106. #endregion
  107. //主函数
  108. static void Main(string[] args)
  109. {
  110. Console.WriteLine("开始!");
  111. string IP = "10.139.49.61";
  112. int port = 502;
  113. int fnu = 4;
  114. string a = fnu.ToString("x2");
  115. string sendCodeMeg1 = "02 00 00 00 00 06 01 03 01 10 00 02";
  116. string sendCodeMeg2 = "03 00 00 00 00 06 01 03 01 0A 00 02";
  117. string data1 = null;
  118. string data2 = null;
  119. for (int num = 0; num < 5; num++)
  120. {
  121. Console.WriteLine("第{0}次调用Get_Fan函数!\n", num + 1);
  122. data1 = SendPack(sendCodeMeg1, IP, port);
  123. if (data1 != null)
  124. {
  125. break;
  126. }
  127. }
  128. for (int num = 0; num < 5; num++)
  129. {
  130. Console.WriteLine("第{0}次调用Get_Fan函数!\n", num + 1);
  131. data2 = SendPack(sendCodeMeg2, IP, port);
  132. if (data2 != null)
  133. {
  134. break;
  135. }
  136. }
  137. Console.WriteLine("结束");
  138. Console.ReadKey();
  139. }
  140. }
  141. }

C# modbus tcp读写数据

1.引用-添加引用-HslCommunication.dll

2.ModBus组件所有的功能类都在 HslCommunication.ModBus命名空间,所以再使用之前先添加

  1. using HslCommunication.ModBus;
  2. using HslCommunication;

3.在使用读写功能之前必须先进行实例化:

  1. private ModbusTcpNet busTcpClient = new ModbusTcpNet("192.168.3.45", 502, 0x01); // 站号1

上面的实例化指定了服务器的IP地址,端口号(一般都是502),以及自己的站号,允许设置为0-255,后面的两个参数有默认值,在实例化的时候可以省略。

  1. private ModbusTcpNet busTcpClient = new ModbusTcpNet("192.168.3.45"); // 端口号502,站号1

4.

  • 模拟器模拟的是西门子PLC 有四种类型
  • 地址以0开头的是可读可写线圈
  • 地址以1开头的是只读线圈
  • 地址以4开头的是可读可写寄存器(string/float/int/ushort/short等都可以放在这里面)
  • 地址以3开头的是只读寄存器
  • 我们读取的时候只看后四位0001,就是1,但是库里面是从0开始读的,所以对应的就要减一

5.读取寄存器的一个值

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. bool coil100 = busTcpClient.ReadCoil("0").Content; // 读取线圈1的通断
  4. int int100 = busTcpClient.ReadInt32("0").Content; // 读取寄存器1-2的int值
  5. float float100 = busTcpClient.ReadFloat("0").Content; // 读取寄存器1-2的float值
  6. double double100 = busTcpClient.ReadDouble("0").Content; // 读取寄存器1-3的double值
  7. }

6.读取寄存器的一组值(一组线圈)(一组float值)

  1. private void button3_Click(object sender, EventArgs e)
  2. {
  3. //读取地址为0,长度为3的线圈数量
  4. OperateResult<bool[]> read = busTcpClient.ReadCoil("0", 3);
  5. if (read.IsSuccess)
  6. {
  7. for (int i = 0; i < read.Content.Length; i++)
  8. {
  9. Console.WriteLine(read.Content[i]);
  10. }
  11. }
  12. else
  13. {
  14. MessageBox.Show(read.ToMessageShowString());
  15. }
  16. //读取(一组)寄存器数据
  17. OperateResult<float[]> result = busTcpClient.ReadFloat("0", 4);
  18. if (result.IsSuccess)
  19. {
  20. //Console.WriteLine(result.Content[0]);
  21. //Console.WriteLine(result.Content[1]);
  22. //Console.WriteLine(result.Content[2]);
  23. for (int i = 0; i < result.Content.Length; i++)
  24. {
  25. Console.WriteLine(result.Content[i]);
  26. }
  27. }
  28. else
  29. {
  30. MessageBox.Show(result.ToMessageShowString());
  31. }
  32. }

7.写入一个(线圈)(寄存器)

  1. private void button2_Click(object sender, EventArgs e)
  2. {
  3. busTcpClient.WriteCoil("0", true);// 写入线圈1为通
  4. busTcpClient.Write("0", 123.456);// 写入寄存器1-2为123.456
  5. }

8.批量写入一组(线圈)(寄存器)

  1. private void button9_Click(object sender, EventArgs e)
  2. {
  3. //写入一组线圈
  4. bool[] value = new bool[] { true, true, false, true, false };
  5. busTcpClient.WriteCoil("0", value);
  6. }
  7. private void button10_Click(object sender, EventArgs e)
  8. {
  9. //写入一组寄存器
  10. float[] value = new float[] {1.1F, 1.2F, 1.3F, 1.4F, 1.5F };
  11. busTcpClient.Write("0", value);
  12. }

-

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号