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

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

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

一、NModbus4

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

雖然原理很容易理解,但是自己開(kāi)發(fā)還是需要一點(diǎn)時(shí)間的,當(dāng)然我們也可以通過(guò)開(kāi)源庫(kù)來(lái)實(shí)現(xiàn),我們這里采用的是NModbus4。

NModbus4是一個(gè)開(kāi)放源碼的Modbus庫(kù)。

我們通過(guò)Nuget搜索NModbus4即可搜索安裝。

二、ModbusTCPServer

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

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

//ModbusTcpSlave對(duì)象
private ModbusTcpSlave modbusTcpSlave = null;
//TcpListener對(duì)象
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();
 }

方法三:向保持寄存器存儲(chǔ)區(qū)中寫(xiě)入數(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);
    //獲取保持型寄存器存儲(chǔ)區(qū)
    ModbusDataCollection<ushort> data = modbusTcpSlave.DataStore.HoldingRegisters;
    data[offset] = lowValue;
    data[offset + 1] = highValue;
}
public void SetHoldingRegisteUShortValue(int offset, ushort value)
{
    //獲取保持型寄存器存儲(chǔ)區(qū)
    ModbusDataCollection<ushort> data = modbusTcpSlave.DataStore.HoldingRegisters;
    data[offset] = value;
}

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

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)用

有了以上方法后,編寫(xiě)一個(gè)案例來(lái)進(jìn)行功能測(cè)試。

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

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

服務(wù)開(kāi)啟后,可以通過(guò)按鈕向指定寄存器中寫(xiě)入數(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("寫(xiě)入地址:" + address + "  浮點(diǎn)數(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("寫(xiě)入地址:" + address + "  整數(shù):" + value);
 }

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

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

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

相關(guān)文章

最新評(píng)論

祥云县| 和田县| 商南县| 广昌县| 福鼎市| 清新县| 兴海县| 临潭县| 吐鲁番市| 读书| 兴安盟| 镇安县| 自贡市| 定远县| 玛纳斯县| 东兴市| 云霄县| 鄂托克旗| 吉木乃县| 巫溪县| 三门县| 北宁市| 柞水县| 松江区| 长治县| 湄潭县| 梁山县| 龙胜| 昭平县| 教育| 天长市| 九龙县| 桐庐县| 嘉鱼县| 铜川市| 福建省| 秦皇岛市| 泸溪县| 当雄县| 左权县| 海盐县|