最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中的modbus Tcp協(xié)議的數(shù)據(jù)抓取和使用解析

 更新時(shí)間:2022年07月19日 17:19:14   作者:???  
這篇文章主要介紹了C#中的modbus Tcp協(xié)議的數(shù)據(jù)抓取和使用解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

C# modbus Tcp協(xié)議數(shù)據(jù)抓取和使用

基于Modbus tcp 協(xié)議的數(shù)據(jù)抓取,并解析,源碼使用C#開發(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("開始發(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í)長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("開始!");
            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讀寫數(shù)據(jù)

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

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

using HslCommunication.ModBus;
using HslCommunication;

3.在使用讀寫功能之前必須先進(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.

  • 模擬器模擬的是西門子PLC 有四種類型
  • 地址以0開頭的是可讀可寫線圈
  • 地址以1開頭的是只讀線圈
  • 地址以4開頭的是可讀可寫寄存器(string/float/int/ushort/short等都可以放在這里面)
  • 地址以3開頭的是只讀寄存器
  • 我們讀取的時(shí)候只看后四位0001,就是1,但是庫里面是從0開始讀的,所以對(duì)應(yīng)的就要減一

5.讀取寄存器的一個(gè)值

        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的線圈數(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.寫入一個(gè)(線圈)(寄存器)

        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);
        }

-

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#判斷某程序是否運(yùn)行的方法

    C#判斷某程序是否運(yùn)行的方法

    這篇文章主要介紹了C#判斷某程序是否運(yùn)行的方法,代碼結(jié)構(gòu)簡單功能實(shí)用,需要的朋友可以參考下
    2014-09-09
  • C#多線程系列之資源池限制

    C#多線程系列之資源池限制

    這篇文章介紹了C#多線程的資源池限制,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • C#生成PDF文件流

    C#生成PDF文件流

    這篇文章主要為大家詳細(xì)介紹了C#生成PDF文件流的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • C#中關(guān)于可空類型的小知識(shí)

    C#中關(guān)于可空類型的小知識(shí)

    這篇文章主要介紹了C#中關(guān)于可空類型的小知識(shí),本文講解可空類型運(yùn)算的小技巧,需要的朋友可以參考下
    2015-04-04
  • 剖析設(shè)計(jì)模式編程中C#對(duì)于組合模式的運(yùn)用

    剖析設(shè)計(jì)模式編程中C#對(duì)于組合模式的運(yùn)用

    這篇文章主要介紹了設(shè)計(jì)模式編程中C#對(duì)于組合模式的運(yùn)用,理論上來說組合模式包含抽象構(gòu)件、樹葉構(gòu)件和樹枝構(gòu)件三個(gè)角色,需要的朋友可以參考下
    2016-02-02
  • C#使用PdfiumViewer庫處理PDF文件的實(shí)踐方法

    C#使用PdfiumViewer庫處理PDF文件的實(shí)踐方法

    PdfiumViewer 是一個(gè)基于 Google PDFium 引擎 的 .NET 封裝庫,在 C# 項(xiàng)目中處理 PDF 是一個(gè)高頻但復(fù)雜的需求,因此本文介紹了C#中使用PdfiumViewer庫處理PDF文件的實(shí)踐方法,需要的朋友可以參考下
    2026-01-01
  • 淺析WPF中Binding的數(shù)據(jù)校驗(yàn)和類型轉(zhuǎn)換

    淺析WPF中Binding的數(shù)據(jù)校驗(yàn)和類型轉(zhuǎn)換

    在WPF開發(fā)中,Binding實(shí)現(xiàn)了數(shù)據(jù)在Source和Target之間的傳遞和流通,那在WPF開發(fā)中,如何實(shí)現(xiàn)數(shù)據(jù)的校驗(yàn)和類型轉(zhuǎn)換呢,下面就跟隨小編一起學(xué)習(xí)一下吧
    2024-03-03
  • C#并行庫Parallel類介紹

    C#并行庫Parallel類介紹

    這篇文章介紹了C#并行庫Parallel類,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#Process的OutputDataReceived事件不觸發(fā)問題及解決

    C#Process的OutputDataReceived事件不觸發(fā)問題及解決

    這篇文章主要介紹了C#Process的OutputDataReceived事件不觸發(fā)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#中計(jì)數(shù)排序算法的原理及實(shí)現(xiàn)

    C#中計(jì)數(shù)排序算法的原理及實(shí)現(xiàn)

    計(jì)數(shù)排序是一種線性時(shí)間復(fù)雜度的排序方法,主要通過統(tǒng)計(jì)元素出現(xiàn)的次數(shù)實(shí)現(xiàn)排序,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10

最新評(píng)論

湘潭县| 育儿| 赤峰市| 鄂州市| 治多县| 抚顺市| 宿州市| 威海市| 三明市| 仁布县| 中西区| 兴宁市| 多伦县| 淄博市| 乡城县| 阿拉尔市| 江源县| 怀安县| 湖口县| 克拉玛依市| 兖州市| 错那县| 长阳| 永城市| 呼图壁县| 茂名市| 永宁县| 奉贤区| 东阳市| 莆田市| 宽甸| 塔城市| 泽库县| 岐山县| 黄陵县| 景谷| 玉门市| 江口县| 宁安市| 民丰县| 五寨县|