返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#中的modbusTcp协议的数据抓取和使用解析
  • 709
分享到

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

2024-04-02 19:04:59 709人浏览 薄情痞子
摘要

目录C# modbus tcp协议数据抓取和使用C# modbus tcp读写数据C# modbus Tcp协议数据抓取和使用 基于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);
        }

-

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

--结束END--

本文标题: C#中的modbusTcp协议的数据抓取和使用解析

本文链接: https://lsjlt.com/news/164679.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#中的modbusTcp协议的数据抓取和使用解析
    目录C# modbus Tcp协议数据抓取和使用C# modbus tcp读写数据C# modbus Tcp协议数据抓取和使用 基于Modbus tcp 协议的数据抓取,并解析,源码...
    99+
    2024-04-02
  • Linux中如何使用wireshark分析tcpdump抓取的数据包
    这篇文章将为大家详细讲解有关Linux中如何使用wireshark分析tcpdump抓取的数据包,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。很多时候我们的系统部署在Linux系统上面,在一...
    99+
    2023-06-06
  • 异步协程开发技巧:实现高效的数据抓取与解析
    异步协程开发技巧:实现高效的数据抓取与解析,需要具体代码示例随着互联网的迅猛发展,数据变得越来越重要,从中获取和解析数据成为许多应用的核心需求。而在数据抓取和解析过程中,提高效率是开发人员面临的重要挑战之一。为了解决这个问题,我们可以利用异...
    99+
    2023-12-09
    解析 数据抓取 异步协程
  • 怎么解析C#网络编程中的HTTP协议
    这篇文章将为大家详细讲解有关怎么解析C#网络编程中的HTTP协议,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。我们在用Asp.net技术开发Web应用程序后,当用户在浏览器输入一个网址时就是...
    99+
    2023-06-17
  • android使用Jsoup 抓取页面的数据
    jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取...
    99+
    2022-06-06
    jsoup 数据 Android
  • obix协议在java中的配置和使用详解
    前言本文主要给大家介绍的是关于obix协议在java中的配置和使用,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。什么是 oBIX?简单来讲,obix是一种 XML 通讯协议,使用Http Request/Post...
    99+
    2023-05-31
    java obix协议 通讯协议
  • PHP中的数据抓取和爬虫技术
    随着移动互联网和Web2.0时代的发展,人们越来越需要获取和分析互联网上的数据。而在这个过程中,数据抓取和爬虫技术成为了必不可少的工具。在众多语言中,PHP作为一种脚本语言,也能够实现较为简单和高效的数据抓取和爬虫。一、什么是数据抓取和爬虫...
    99+
    2023-05-25
    PHP 数据抓取 爬虫技术
  • 解读python基于netconf协议获取网元的数据
    目录【原理介绍】【开发流程介绍】【网元配置】【python代码示例】【总结】【原理介绍】 通过NETCONF,网管能够用可视化的界面统一管理网络中的设备,并且安全性高、可靠性强、扩展性强。如下图所示,网管与网络中的所...
    99+
    2022-06-02
    python netconf python 网元
  • wireshark工具详解、数据包抓取分析、使用教程
    Wireshark界面 Wireshark查看数据捕获列表 数据包概要信息窗口:描述每个数据包的基本信息。如图,点击某行数据,即可在下方显示该数据包的信息。 数据包解析窗口:显示被选中的数据包的解析信息,包含每个数据包的整体信息、数据链...
    99+
    2023-08-23
    网络 tcp/ip 服务器
  • 使用python抓取B站数据的方法
    这篇文章给大家分享的是有关使用python抓取B站数据的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述可以获取的数据包括:video-视频模块user-用户模块dynamic-动态模块这次用“Runnin...
    99+
    2023-06-15
  • Java中JSON数据的读取和解析
            在做springboot项目时用到了json文件读取和解析,所以在这里记录一下学习过程中总结的一些点,希望对大家有帮助~ 配置fastJson    com.alibaba    fastjson    1.2.35 ...
    99+
    2023-09-11
    java json 开发语言
  • HTTP协议中的状态码,Java中如何处理和解析?
    在互联网应用中,HTTP协议是一种常见的应用层协议,它定义了客户端和服务器之间的通信规范。HTTP协议中的状态码是客户端和服务器之间沟通的关键部分,它告诉客户端请求是否成功,以及失败的原因。本文将介绍HTTP协议中常见的状态码及其含义,并...
    99+
    2023-06-14
    http numpy 索引
  • Golang函数库的使用成本和许可协议
    go 函数库使用成本主要取决于其定价模式,一般分为免费开源和付费许可证两种;许可协议规定了使用条款,常见类型包括 mit、gpl 和 bsd 许可证;在使用函数库前,务必查阅许可协议,如...
    99+
    2024-04-19
    golang 函数库 git
  • C/C++中CJSON的使用(创建与解析JSON数据)
    目录一、cJSON介绍二、JSON简介、语法介绍2.1 JSON是什么?2.2 JSON语法介绍三、cJSON创建简单JSON数据并解析3.1 新建工程3.2 创建JSON数...
    99+
    2024-04-02
  • 【网络层+数据链路层】深入理解IP协议和MAC帧协议的基本原理
    文章目录 前言一、IP协议二、MAC帧协议 1.以太网2.以太网帧(MAC帧)格式报头3.基于协议讲解局域网转发的原理总结 前言 为什么经常将TCP/IP放在一起呢?这是因为IP层的核心工作就是通过IP地址来定位...
    99+
    2023-10-21
    tcp/ip 网络协议 网络 mac 数据链路层 网络层 路由器
  • 解析HTTP协议中4xx状态码的使用案例与解决方法
    探索HTTP协议中4xx状态码的应用场景和解决方案引言:在Web开发中,HTTP协议起着非常重要的作用。它定义了客户端和服务器之间进行通信的规则和约定。其中,状态码是服务器用来向客户端传达请求处理情况的一种标识。在HTTP协议中,4xx状态...
    99+
    2023-12-26
    应用场景 解决方案 xx状态码
  • HTTP协议状态码解析:了解状态码的作用和含义
    HTTP协议是互联网通信中最重要的协议之一,而其中的状态码则是用来表示服务器对请求的处理结果的。在进行Web开发和网络调试过程中,了解状态码的作用和含义是非常重要的。 一、状态码的分类...
    99+
    2024-02-23
    http协议 状态码解析 作用和含义
  • C/C++中的 Qt StandardItemModel 数据模型应用解析
    QStandardItemModel 是标准的以项数据为单位的基于M/V模型的一种标准数据管理方式,Model/View 是Qt中的一种数据编排结构,其中Model代表模型,View...
    99+
    2024-04-02
  • 4xx状态码在HTTP协议中的重要性和影响的深度解析
    深入理解HTTP协议中4xx状态码的重要性和影响,需要具体代码示例随着互联网的不断发展,HTTP协议作为应用层协议,扮演着重要的角色。在HTTP通信中,服务器通过状态码来向客户端传递请求处理的结果。在这些状态码中,4xx状态码通常表示客户端...
    99+
    2023-12-26
    HTTP协议 影响 重要性 xx状态码
  • Python使用Appium在移动端抓取微博数据的实现
    目录使用Appium在移动端抓取微博数据查找Android App的Package和入口记录微博刷新动作爬取微博第一条信息使用Appium在移动端抓取微博数据 Appium是移动端的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作