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

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

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

一、NModbus4

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

雖然原理很容易理解,但是自己開發(fā)還是需要一點時間的,當(dāng)然我們也可以通過開源庫來實現(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);
}

三、案例應(yīng)用

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

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

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)文章

  • c#使用nsoup解析html亂碼解決方法分享 nsoup教程

    c#使用nsoup解析html亂碼解決方法分享 nsoup教程

    NSoup是JSoup的Net移植版本。使用方法基本一致。如果項目涉及HTML的處理,強烈推薦NSoup。但是遺憾的是NSoup默認的編碼是UTF-8,處理中文有亂碼,下面給出二種解決方法
    2014-01-01
  • C#自定義日志記錄

    C#自定義日志記錄

    這篇文章主要為大家詳細介紹了C#自定義日志記錄的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • C#實現(xiàn)給PDF文檔設(shè)置過期時間

    C#實現(xiàn)給PDF文檔設(shè)置過期時間

    我們可以給一些重要文檔或者臨時文件設(shè)置過期時間和過期信息提示來提醒讀者或管理者文檔的時效性,并及時對文檔進行調(diào)整、更新等。下面本文將介紹如何通過C#來給PDF文檔設(shè)置過期時間的方法。需要的可以參考一下
    2022-01-01
  • C#使用DateTime獲取日期和時間的實現(xiàn)

    C#使用DateTime獲取日期和時間的實現(xiàn)

    在C#中,DateTime類是用來處理日期和時間的類,它具有許多屬性和方法,用于操作和獲取日期和時間的不同部分,本文就來介紹一下C#使用DateTime獲取,感興趣的可以了解一下
    2023-11-11
  • 基于C#實現(xiàn)rar文件密碼破解工具

    基于C#實現(xiàn)rar文件密碼破解工具

    這篇文章主要為大家詳細介紹了如何基于C#實現(xiàn)一個rar文件密碼破解工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-07-07
  • C# WPF自制白板工具

    C# WPF自制白板工具

    著電子屏幕技術(shù)的發(fā)展,普通的黑板已不再適用現(xiàn)在的教學(xué)和演示環(huán)境,電子白板應(yīng)運而生,本文將通過C# WPF自制一個白板工具,感興趣的可以了解下
    2024-11-11
  • C#中List<T>存放元素的工作機制

    C#中List<T>存放元素的工作機制

    這篇文章介紹了C#中List<T>存放元素的工作機制,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • C#程序中session的基本設(shè)置示例及清除session的方法

    C#程序中session的基本設(shè)置示例及清除session的方法

    這篇文章主要介紹了C#程序中session的基本設(shè)置示例及清除session的方法,是C#入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-04-04
  • 使用C#實現(xiàn)高效刪除Word文檔中的指定頁或空白頁

    使用C#實現(xiàn)高效刪除Word文檔中的指定頁或空白頁

    在處理?Word?文檔時,我們經(jīng)常會遇到不需要的頁面,本文將介紹如何使用?C#?刪除?Word?文檔中的空白頁和指定頁面,并提供實用的代碼示例,有需要的小伙伴可以了解下
    2026-01-01
  • 解析從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動態(tài)擴容機制的詳解

    解析從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動態(tài)擴容機制的詳解

    本篇文章是對從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動態(tài)擴容機制進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

宝坻区| 定日县| 江口县| 区。| 霍邱县| 忻州市| 甘洛县| 乐陵市| 牡丹江市| 厦门市| 铅山县| 鹤庆县| 玉树县| 商都县| 威远县| 武功县| 镇赉县| 南郑县| 土默特左旗| 肃宁县| 吉首市| 瓦房店市| 蓬安县| 佛教| 蒙山县| 黔西县| 拜城县| 武冈市| 滨海县| 五家渠市| 凤山县| 漳浦县| 波密县| 昌邑市| 咸宁市| 阿合奇县| 江津市| 抚松县| 岳普湖县| 措勤县| 辉南县|