C#中的modbus Tcp协议的数据抓取和使用解析

目录
  • C# modbus Tcp协议数据抓取和使用
  • C# modbus tcp读写数据

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace modbus
{
    class Program
    {
        #region 字节转换为16进制字符
        /// <summary>
        /// 字节转换为16进制字符
        /// </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进制字符转换为字节
        /// <summary>
        /// 16进制字符转换为字节
        /// </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 发送、接收报文并返回报文
        /// <summary>
        /// 發送或接受風機指令
        /// </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("開始發送數據。。。");
                clientSocket.Connect(new IPEndPoint(ip, port)); //配置服务器ip和端口
                //TcpClient tcpClient = new TcpClient();
                Console.WriteLine("服务器连接成功");
            }
            catch
            {
                Console.WriteLine("连接服务器失败\n");
                return null;
            }
            try
            {
                string sendMessage = sendCodeMeg; // "6B 00 00 00 00 06 02 06 05 10 00 01"; //发送到服务端的内容
                var sendData = HexString(sendMessage);
                string recvStr = null;
                int bytes;
                try
                {
                    Console.WriteLine("发送报文:{0}", sendMessage);
                    clientSocket.Send(sendData);//向服务器发送数据
                    byte[] recvBytes = new byte[1024];
                    //连接时长500ms
                    clientSocket.ReceiveTimeout = 5000;
                    bytes = clientSocket.Receive(recvBytes, recvBytes.Length, 0); //服务端接受返回信息
                    recvStr += ByteToHexString(recvBytes);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("出现错误!\n{0}\n\n", ex);
                    recvStr = null;
                }
                if (recvStr != null)
                {
                    Console.WriteLine("获取成功!\n 获得数据:{0}\n\n", recvStr);
                }
                clientSocket.Close();//关闭连接释放资源
                                     //Console.ReadLine();
                return recvStr;
            }
            catch
            {
                Console.WriteLine("出现错误!\n");
                return null;
            }
        }
        #endregion
        //主函数
        static void Main(string[] args)
        {
            Console.WriteLine("开始!");
            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}次调用Get_Fan函数!\n", num + 1);
                data1 = SendPack(sendCodeMeg1, IP, port);
                if (data1 != null)
                {
                    break;
                }
            }
            for (int num = 0; num < 5; num++)
            {
                Console.WriteLine("第{0}次调用Get_Fan函数!\n", num + 1);
                data2 = SendPack(sendCodeMeg2, IP, port);
                if (data2 != null)
                {
                    break;
                }
            }
            Console.WriteLine("结束");
            Console.ReadKey();
        }
    }
}

C# modbus tcp读写数据

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

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

using HslCommunication.ModBus;
using HslCommunication;

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

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

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

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.读取寄存器的一个值

        private void button1_Click(object sender, EventArgs e)
        {
		    bool coil100 = busTcpClient.ReadCoil("0").Content;   // 读取线圈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.读取寄存器的一组值(一组线圈)(一组float值)

        private void button3_Click(object sender, EventArgs e)
        {
            //读取地址为0,长度为3的线圈数量
            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());
            }

           	//读取(一组)寄存器数据
            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.写入一个(线圈)(寄存器)

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

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

        private void button9_Click(object sender, EventArgs e)
        {
            //写入一组线圈
            bool[] value = new bool[] { true, true, false, true, false };
            busTcpClient.WriteCoil("0", value);
        }
        private void button10_Click(object sender, EventArgs e)
        {
            //写入一组寄存器
            float[] value = new float[] {1.1F, 1.2F, 1.3F, 1.4F, 1.5F };
            busTcpClient.Write("0", value);
        }

-

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

(0)

相关推荐

  • C#操作串口通信协议Modbus的常用方法介绍

    一.读线圈状态 /// <summary> /// 读线圈状态测试 /// </summary> static void Test_0x01() { ushort startAddr = 0; ushort readLen = 10; var a = BitConverter.GetBytes(readLen); // 请求 // byte[] 需要指定长度:不支持Linq List<byte> command = new List<byte>(); com

  • C#使用Socket发送和接收TCP数据实例

    本文实例讲述了Asp.net中C#使用Socket发送和接收TCP数据的方法,分享给大家供大家参考.具体实现方法如下: 具体程序代码如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; namespace ConsoleApplication1 {     public static class So

  • C#基于TCP协议的服务器端和客户端通信编程的基础教程

    运行在TCP之上常见的网络应用协议有比如HTTP.FTP.SMTP.POP3.IMAP. TCP是TCP/IP体系中最重要的传输协议,它提供全双工和可靠交付的服务,是大多数应用协议工作的基础. TCP是一种面向连接(连接导向)的,可靠的,基于字节流的传输层通信协议. TCP的工作过程 建立连接 传输数据 连接的终止 TCP的主要特点 1.TCP是面向连接的协议 2.是端到端的通信.每个TCP连接只能有两个端点,而且只能一对一通信,不能点对多的 的直接通信 3.高可靠性 4.全双工方式传输 5.数

  • C#中的modbus Tcp协议的数据抓取和使用解析

    目录 C# modbus Tcp协议数据抓取和使用 C# modbus tcp读写数据 C# modbus Tcp协议数据抓取和使用 基于Modbus tcp 协议的数据抓取,并解析,源码使用C#开发 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; namespace modbus {

  • 在Python3中使用asyncio库进行快速数据抓取的教程

    web数据抓取是一个经常在python的讨论中出现的主题.有很多方法可以用来进行web数据抓取,然而其中好像并没有一个最好的办法.有一些如scrapy这样十分成熟的框架,更多的则是像mechanize这样的轻量级库.DIY自己的解决方案同样十分流行:你可以使用requests.beautifulsoup或者pyquery来实现. 方法如此多样的原因在于,数据"抓取"实际上包括很多问题:你不需要使用相同的工具从成千上万的页面中抓取数据,同时使一些Web工作流自动化(例如填一些表单然后取回

  • 用javascript解决外部数据抓取中的乱码问题

    我们一般会在两个地方用到外部数据抓取,一个是在asp中,一个是在hta中.如果外部数据是gb2312编码的,就涉及到转码的问题,但是传统的用vbs函数进行处理的方法,运算量比较大,有些特殊字符还会出错.    如果用adodb.stream控件来进行转码,就简单多了,不需要借助vbs的二进制处理函数了,同时速度快了很多. 复制代码 代码如下: <script>  function loadData(sUrl){      var xh      xh=new ActiveXObject(&qu

  • 浅谈Python爬虫原理与数据抓取

    通用爬虫和聚焦爬虫 根据使用场景,网络爬虫可分为通用爬虫和聚焦爬虫两种. 通用爬虫 通用网络爬虫 是 捜索引擎抓取系统(Baidu.Google.Yahoo等)的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份. 通用搜索引擎(Search Engine)工作原理 通用网络爬虫从互联网中搜集网页,采集信息,这些网页信息用于为搜索引擎建立索引从而提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果. 第一步:抓取网页

  • python+mongodb数据抓取详细介绍

    分享点干货!!! Python数据抓取分析 编程模块:requests,lxml,pymongo,time,BeautifulSoup 首先获取所有产品的分类网址: def step(): try: headers = { ..... } r = requests.get(url,headers,timeout=30) html = r.content soup = BeautifulSoup(html,"lxml") url = soup.find_all(正则表达式) for i

  • python数据抓取分析的示例代码(python + mongodb)

    本文介绍了Python数据抓取分析,分享给大家,具体如下: 编程模块:requests,lxml,pymongo,time,BeautifulSoup 首先获取所有产品的分类网址: def step(): try: headers = { ..... } r = requests.get(url,headers,timeout=30) html = r.content soup = BeautifulSoup(html,"lxml") url = soup.find_all(正则表达式

  • python数据抓取3种方法总结

    三种数据抓取的方法 正则表达式(re库) BeautifulSoup(bs4) lxml *利用之前构建的下载网页函数,获取目标网页的html,我们以https://guojiadiqu.bmcx.com/AFG__guojiayudiqu/为例,获取html. from get_html import download url = 'https://guojiadiqu.bmcx.com/AFG__guojiayudiqu/' page_content = download(url) *假设我

  • Python+Tkinter制作股票数据抓取小程序

    目录 程序布局 抓取与保存功能 添加功能 个股查询按钮 批量查询开关 在前面的文章中,我们一起学习了如何通过 Python 抓取东方财富网的实时股票数据,链接如下 用 Python 爬取股票实时数据 今天我们就在这个基础上,实现一个 Tkinter GUI 程序,完成无代码股票抓取! 首先对于 Tkinter 相信大家都是比较了解的,如果有小伙伴对于 Tkinter 的相关用法不是特别熟悉的话,可以看如下文章 Tkinter 入门之旅 首先我们先看一下 GUI 程序的最终效果 该程序共分三个区域

  • 详解Java实现多种方式的http数据抓取

    前言: 时下互联网第一波的浪潮已消逝,随着而来的基于万千数据的物联网时代,因而数据成为企业的重要战略资源之一.基于数据抓取技术,本文介绍了java相关抓取工具,并附上demo源码供感兴趣的朋友测试! 1)JDK自带HTTP连接,获取页面或Json 2) JDK自带URL连接,获取页面或Json 3)HttpClient Get工具,获取页面或Json 4)commons-io工具,获取页面或Json 5) Jsoup工具(通常用于html字段解析),获取页面,非Json返回格式] -------

  • Python数据抓取爬虫代理防封IP方法

    爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息,一般来说,Python爬虫程序很多时候都要使用(飞猪IP)代理的IP地址来爬取程序,但是默认的urlopen是无法使用代理的IP的,我就来分享一下Python爬虫怎样使用代理IP的经验.(推荐飞猪代理IP注册可免费使用,浏览器搜索可找到) 1.划重点,小编我用的是Python3哦,所以要导入urllib的request,然后我们调用ProxyHandler,它可以接收代理IP的参数.代理可以根据自己需要选择,当然免费的也是有

随机推荐