亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于C#實現(xiàn)ModbusTCP服務(wù)器接口的方法

 更新時間:2025年01月17日 10:29:35   作者:上位機付工  
ModbusTCP服務(wù)器的本質(zhì)就是TCP服務(wù)器,根據(jù)識別ModbusTCP請求報文,返回對應的ModbusTCP報文,今天給大家分享一下,如何基于C#來ModbusTCP服務(wù)器接口,需要的朋友可以參考下

一、NModbus4

ModbusTCP服務(wù)器的本質(zhì)就是TCP服務(wù)器,根據(jù)識別ModbusTCP請求報文,返回對應的ModbusTCP報文。

雖然原理很容易理解,但是自己開發(fā)還是需要一點時間的,當然我們也可以通過開源庫來實現(xiàn),我們這里采用的是NModbus4。

NModbus4是一個開放源碼的Modbus庫。

我們通過Nuget搜索NModbus4即可搜索安裝。

二、ModbusTCPServer

安裝好NModbus4后,我們進行封裝一下,創(chuàng)建一個ModbusTCPServer類,對于進行封裝,封裝了以下幾個方法:

方法一:開啟服務(wù)

//ModbusTcpSlave對象
private ModbusTcpSlave modbusTcpSlave = null;
//TcpListener對象
private TcpListener tcpListener;
public void StartServer(string ip, int port)
{
    tcpListener = new TcpListener(IPAddress.Parse(ip), port);
    modbusTcpSlave = ModbusTcpSlave.CreateTcp(1, tcpListener);
    modbusTcpSlave.Listen();
}

方法二:關(guān)閉服務(wù)

 public void StopServer()
 {
     modbusTcpSlave?.Dispose();
 }

方法三:向保持寄存器存儲區(qū)中寫入數(shù)據(jù)

public void SetHoldingRegisterFloatValue(int offset, float value)
{
    byte[] buffer = BitConverter.GetBytes(value);
    ushort highValue = BitConverter.ToUInt16(buffer, 0);
    ushort lowValue = BitConverter.ToUInt16(buffer, 2);
    //獲取保持型寄存器存儲區(qū)
    ModbusDataCollection<ushort> data = modbusTcpSlave.DataStore.HoldingRegisters;
    data[offset] = lowValue;
    data[offset + 1] = highValue;
}
public void SetHoldingRegisteUShortValue(int offset, ushort value)
{
    //獲取保持型寄存器存儲區(qū)
    ModbusDataCollection<ushort> data = modbusTcpSlave.DataStore.HoldingRegisters;
    data[offset] = value;
}

方法四:如果需要獲取報文,可以添加一些事件

public event Action<object, ModbusSlaveRequestEventArgs> ModbusSlaveRequestReceived;
private void ModbusTcpSlave_ModbusSlaveRequestReceived(object sender, ModbusSlaveRequestEventArgs e)
{
    ModbusSlaveRequestReceived?.Invoke(sender,e);
}
public event Action<object, ModbusSlaveRequestEventArgs> ModbusSlaveWriteComplete; 
private void ModbusTcpSlave_WriteComplete(object sender, ModbusSlaveRequestEventArgs e)
{
    ModbusSlaveWriteComplete?.Invoke(sender, e);
}

三、案例應用

有了以上方法后,編寫一個案例來進行功能測試。

開啟服務(wù)和關(guān)閉服務(wù)代碼很簡單,就是調(diào)用ModbusTCPServer及其中的對應方法即可。

private ModbusTCPServer modbusTCPServer = new ModbusTCPServer();
private void btn_Start_Click(object sender, EventArgs e)
{
    if (this.btn_Start.Text == "開啟服務(wù)")
    {
        try
        {
            int port = Convert.ToInt32(this.txt_Port.Text);
            modbusTCPServer.StartServer(this.txt_IP.Text, port);
            AddLog("開啟服務(wù)成功");
            this.btn_Start.Text = "關(guān)閉服務(wù)";
        }
        catch (Exception ex)
        {
            AddLog("開啟服務(wù)失敗:" + ex.Message);
        }
    }
    else
    {
        modbusTCPServer.StopServer();
        this.btn_Start.Text = "開啟服務(wù)";
    }
}

服務(wù)開啟后,可以通過按鈕向指定寄存器中寫入數(shù)據(jù),這里已經(jīng)封裝好了方法,直接調(diào)用即可。

 private void btn_WriteFloat_Click(object sender, EventArgs e)
 {
     int address = Convert.ToInt32(this.txt_Address.Text);
     float value = Convert.ToSingle(this.txt_Value.Text);
     modbusTCPServer.SetHoldingRegisterFloatValue(address, value);
     AddLog("寫入地址:" + address + "  浮點數(shù):" + value);
 }
 private void btn_WriteUShort_Click(object sender, EventArgs e)
 {
     int address = Convert.ToInt32(this.txt_Address.Text);
     ushort value = Convert.ToUInt16(this.txt_Value.Text);
     modbusTCPServer.SetHoldingRegisteUShortValue(address, value);
     AddLog("寫入地址:" + address + "  整數(shù):" + value);
 }

最終實現(xiàn)效果如下所示:

用Modbus Poll軟件讀取結(jié)如下:

到此這篇關(guān)于基于C#實現(xiàn)ModbusTCP服務(wù)器接口的方法的文章就介紹到這了,更多相關(guān)C# ModbusTCP服務(wù)器接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 異步/多線程/任務(wù)/并行編程之一:如何選擇合適的多線程模型?

    異步/多線程/任務(wù)/并行編程之一:如何選擇合適的多線程模型?

    本篇文章小編為大家介紹,異步/多線程/任務(wù)/并行編程之一:如何選擇合適的多線程模型?需要的朋友參考下
    2013-04-04
  • c# 編寫的簡單飛行棋游戲

    c# 編寫的簡單飛行棋游戲

    這個簡單的飛行棋游戲主要是講的方法怎么應用,充分的去理解方法和方法的調(diào)用。整體收獲還是很大的。感興趣的朋友可以參考下
    2021-06-06
  • WPF實現(xiàn)能自由改變形狀的四邊形和六邊形

    WPF實現(xiàn)能自由改變形狀的四邊形和六邊形

    這篇文章主要為大家詳細介紹了WPF如何實現(xiàn)能自由改變形狀的四邊形和六邊形,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-03-03
  • C#使用channel實現(xiàn)Plc異步任務(wù)之間的通信

    C#使用channel實現(xiàn)Plc異步任務(wù)之間的通信

    在C#的并發(fā)編程中,Channel是一種非常強大的數(shù)據(jù)結(jié)構(gòu),用于在生產(chǎn)者和消費者之間進行通信,本文將給大家介紹C#使用channel實現(xiàn)Plc異步任務(wù)之間的通信,文中有相關(guān)的代碼示例供大家參考,感興趣的朋友跟著小編一起來看看吧
    2024-05-05
  • C#實現(xiàn)剪刀石頭布游戲

    C#實現(xiàn)剪刀石頭布游戲

    這篇文章主要為大家詳細介紹了C#實現(xiàn)剪刀石頭布游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C#中數(shù)據(jù)類型的轉(zhuǎn)換介紹

    C#中數(shù)據(jù)類型的轉(zhuǎn)換介紹

    大家好,本篇文章主要講的是C#中數(shù)據(jù)類型的轉(zhuǎn)換介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C#使用Directoryinfo類獲得目錄信息和屬性的方法

    C#使用Directoryinfo類獲得目錄信息和屬性的方法

    這篇文章主要介紹了C#使用Directoryinfo類獲得目錄信息和屬性的方法,涉及C#操作目錄的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • 基于C#中XmlWriter寫入Xml的深入分析

    基于C#中XmlWriter寫入Xml的深入分析

    本篇文章是對C#中XmlWriter寫入Xml進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C#?md5?算法實現(xiàn)代碼

    C#?md5?算法實現(xiàn)代碼

    相對C#來說,md5算法就相對簡單很多,因為?System.Security.Cryptography;?已經(jīng)包含了md5算法。所以我們只需創(chuàng)建MD5類對象即可實現(xiàn)md5算法,今天通過本文給大家介紹C#?md5?算法實現(xiàn),感興趣的朋友一起看看吧
    2022-11-11
  • C#在PDF中繪制不同風格類型的文本方法實例

    C#在PDF中繪制不同風格類型的文本方法實例

    這篇文章主要給大家介紹了關(guān)于C#在PDF中繪制不同風格類型的文本的相關(guān)資料,文中通過圖文以及示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07

最新評論