国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C#使用NModbus4讀寫(xiě)Modbus數(shù)據(jù)

這篇具有很好參考價(jià)值的文章主要介紹了C#使用NModbus4讀寫(xiě)Modbus數(shù)據(jù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

? ?Modbus是一個(gè)免費(fèi)的協(xié)議,協(xié)議設(shè)計(jì)簡(jiǎn)單,有很多成熟的庫(kù)支持。比如C#版本的NModubs4就很好,入門(mén)簡(jiǎn)單,使用方便。

首先,在工程中使用NuGet添加NModbus4的包。

在使用文件中,添加引用。不同的接口模式,引用對(duì)象不同,Modbus Slave TCP模型需要以下幾項(xiàng):

using System.Net;
using System.Net.Sockets;

using Modbus.Data;
using Modbus.Device;

初始化大概有幾個(gè)步驟:創(chuàng)建TCP Listener對(duì)象、創(chuàng)建ModbusTcpSalve對(duì)象、啟動(dòng)偵聽(tīng)服務(wù)。

  TcpListener listener = new TcpListener(IPAddress.Parse("0.0.0.0"), 502);
  listener.Start();
  ModbusTcpSlave modbusSlave = ModbusTcpSlave.CreateTcp(1, listener);
  //創(chuàng)建寄存器存儲(chǔ)對(duì)象
  modbusSlave.DataStore = DataStoreFactory.CreateDefaultDataStore();

Modbus有個(gè)DataStore對(duì)象,用來(lái)存儲(chǔ)數(shù)據(jù),對(duì)應(yīng)的狀態(tài)的地址如下:

//01 Coil Status, Addr: 00001
ModbusDataCollection<bool> coilDiscretes = modbusSlave.DataStore.InputDiscretes;

//02 Input Status, Addr: 10001
ModbusDataCollection<bool> inputDiscretes = modbusSlave.DataStore.CoilDiscretes;

//03 Holding Register, Addr: 40001
ModbusDataCollection<ushort> holdingRegisters = modbusSlave.DataStore.HoldingRegisters;

//04 Input Register, Addr: 30001
ModbusDataCollection<ushort> InputRegisters = modbusSlave.DataStore.InputRegisters;

定義之后,就可以直接通過(guò)這些對(duì)象讀寫(xiě)數(shù)據(jù)了。

NModbus4庫(kù)已經(jīng)封裝了對(duì)于TCP訪(fǎng)問(wèn)數(shù)據(jù)的封裝,服務(wù)端只需要維護(hù)數(shù)據(jù)更新即可。

受Modbus協(xié)議限制,HoldingRegisters和InputRegisters每個(gè)地址僅16位2個(gè)字節(jié)長(zhǎng)度。當(dāng)實(shí)際數(shù)據(jù)值超過(guò)2個(gè)字節(jié)時(shí),需要占用多個(gè)地址空間。比如int32,float都需要4個(gè)字節(jié),兩個(gè)地址。這些數(shù)據(jù)怎么存放,高低位怎么對(duì)齊,就產(chǎn)生了所謂的ABCD、CDAB等轉(zhuǎn)換,這個(gè)Master與Slave一致就可以。

Int32等類(lèi)型數(shù)據(jù)更新時(shí),需要同時(shí)對(duì)多個(gè)存儲(chǔ)地址進(jìn)行更新,而master可能還在高速并發(fā)讀數(shù)據(jù),需要注意使用一個(gè)同步鎖,避免數(shù)據(jù)更新一半就被讀取,產(chǎn)生數(shù)據(jù)不一致問(wèn)題。

        //將float類(lèi)型分解成兩個(gè)ushort類(lèi)型
        public void SetValue32(ModbusDataCollection<ushort>data,int offset, float value)
        {
            lock (modbusSlave.DataStore.SyncRoot)
            {
                data[offset] = BitConverter.ToUInt16(BitConverter.GetBytes(value), 0); 
                data[offset + 1] = BitConverter.ToUInt16(BitConverter.GetBytes(value), 2); 
            }
        }
        //將int32類(lèi)型分解成兩個(gè)ushort類(lèi)型
        public void SetValue32(ModbusDataCollection<ushort> data, int offset, Int32 value)
        {
            lock (modbusSlave.DataStore.SyncRoot)
            {
                data[offset] = BitConverter.ToUInt16(BitConverter.GetBytes(value), 0);
                data[offset + 1] = BitConverter.ToUInt16(BitConverter.GetBytes(value), 2);
            }
        }

Modbus對(duì)于字符串,并沒(méi)有明確約定。推進(jìn)使用Unicode編碼,首先是與OPC的默認(rèn)字符串編碼格式一致,其次的每個(gè)中英文都占用一個(gè)地址2個(gè)字節(jié),方便計(jì)算長(zhǎng)度。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-532825.html

        public void SetValueString(ModbusDataCollection<ushort> data, int offset, string value)
        {
            const int maxStringLen = 20;
            lock (modbusSlave.DataStore.SyncRoot)
            {

                byte[] dst = new byte[appConfigModbus.StringLen * 2];
                byte[] bb = Encoding.Unicode.GetBytes(value);
                for (int i = 0; i < bb.Length && i < dst.Length; i++)
                {
                    dst[i] = bb[i];
                }
                for (int i = 0; i < maxStringLen; i += 2)
                {
                    data[offset + i / 2] = BitConverter.ToUInt16(dst, i);
                }
            }
        }

到了這里,關(guān)于C#使用NModbus4讀寫(xiě)Modbus數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C#、JAVA讀寫(xiě)PLC物聯(lián)網(wǎng)Modbus

    C#、JAVA讀寫(xiě)PLC物聯(lián)網(wǎng)Modbus

    Modbus協(xié)議是一種常用于工業(yè)自動(dòng)化領(lǐng)域的通信協(xié)議,它使用簡(jiǎn)單、易實(shí)現(xiàn)、可靠的特點(diǎn)得到了廣泛應(yīng)用。物聯(lián)網(wǎng)中的設(shè)備也需要使用Modbus協(xié)議進(jìn)行通信。本文將介紹物聯(lián)網(wǎng)Modbus通信的相關(guān)內(nèi)容。 一、Modbus協(xié)議簡(jiǎn)介 Modbus協(xié)議是一種串行通信協(xié)議,它最初由Modicon公司在1979年發(fā)布

    2024年02月10日
    瀏覽(23)
  • Java實(shí)現(xiàn)Modbus讀寫(xiě)數(shù)據(jù)

    Java實(shí)現(xiàn)Modbus讀寫(xiě)數(shù)據(jù)

    由于當(dāng)時(shí)項(xiàng)目周期趕,引入了一個(gè)PLC4X組件,上手快。接下來(lái)就是使用這個(gè)組件遇到的一些問(wèn)題: 關(guān)閉連接NioEventLoop沒(méi)有釋放導(dǎo)致oom 設(shè)計(jì)思想是一個(gè)設(shè)備一個(gè)連接,而不是一個(gè)網(wǎng)關(guān)一個(gè)連接 連接斷開(kāi)后客戶(hù)端無(wú)從感知 前兩個(gè)問(wèn)題解決方案參考上篇文章,最后一個(gè)問(wèn)題雖然可

    2024年02月09日
    瀏覽(26)
  • C#上位機(jī)與三菱PLC的通信07--使用第3方通訊庫(kù)讀寫(xiě)數(shù)據(jù)

    C#上位機(jī)與三菱PLC的通信07--使用第3方通訊庫(kù)讀寫(xiě)數(shù)據(jù)

    mcprotocol 是一個(gè)基于 Node.js 的三菱 PLC MC 協(xié)議通信庫(kù),具有以下特點(diǎn): 支持多種三菱 PLC MC 協(xié)議的設(shè)備,如 FX3U、Q03UDECPU、QJ71E71 等。 支持多種功能碼和數(shù)據(jù)類(lèi)型,如讀取線(xiàn)圈(M)、讀取寄存器(D)、寫(xiě)入寄存器(D)、讀取擴(kuò)展寄存器(D*)、讀取位寄存器(X/Y)、讀取字寄

    2024年02月19日
    瀏覽(240)
  • C# Modbus通信從入門(mén)到精通(11)——調(diào)試軟件Modbus Slave和Modbus Poll的使用

    C# Modbus通信從入門(mén)到精通(11)——調(diào)試軟件Modbus Slave和Modbus Poll的使用

    我們?cè)陂_(kāi)發(fā)Modbus程序的時(shí)候,會(huì)需要測(cè)試以下我們寫(xiě)的Modbus程序有沒(méi)有問(wèn)題,這時(shí)候就需要使用到Modbus Slave和Modbus Poll這兩個(gè)軟件,Modbus Slave是模擬Modbus從站,Modbus Poll是模擬Modbus從站主站的, 一般情況下我們開(kāi)發(fā)的Modbus主站程序,當(dāng)我們沒(méi)有硬件作為從站的時(shí)候,我們可以

    2024年02月06日
    瀏覽(96)
  • C# Modbus通信從入門(mén)到精通(1)——虛擬串口調(diào)試工具的使用

    C# Modbus通信從入門(mén)到精通(1)——虛擬串口調(diào)試工具的使用

    由于我們?cè)陂_(kāi)發(fā)程序時(shí)經(jīng)常是沒(méi)有硬件給我們測(cè)試的,所以我們?cè)陂_(kāi)發(fā)ModbusRTU以及ModbusASCII程序時(shí),可以使用虛擬串口調(diào)試工具來(lái)虛擬出來(lái)一對(duì)串口方便我們進(jìn)行測(cè)試,訂閱本專(zhuān)欄后,加入vip專(zhuān)屬的qq群,在群資料里面就能找到虛擬串口工具 第1步、雙擊vspd.exe安裝 第2步、 打

    2024年02月06日
    瀏覽(105)
  • C# 中,使用OpcUaHelper讀寫(xiě)OPC服務(wù)器

    C# 中,使用OpcUaHelper讀寫(xiě)OPC服務(wù)器

    nuget包 幫助類(lèi): Winform: KepServer 設(shè)置: 結(jié)果:

    2024年02月10日
    瀏覽(18)
  • 《C#零基礎(chǔ)入門(mén)之百識(shí)百例》(九十六)本地?cái)?shù)據(jù)交互 -- 讀寫(xiě)Excel表格文件

    本文屬于 C#零基礎(chǔ)入門(mén)之百識(shí)百例 系列文章。此系列文章旨在為學(xué)習(xí)C#語(yǔ)言的童鞋提供一套系統(tǒng)的學(xué)習(xí)路徑。此系列文章都會(huì)通過(guò)【知識(shí)點(diǎn)】【練習(xí)題】的形式呈現(xiàn)。有任何問(wèn)題

    2024年02月08日
    瀏覽(19)
  • C# Modbus通信從入門(mén)到精通(22)——Modbus TCP(0x01功能碼與C#代碼實(shí)現(xiàn))

    C# Modbus通信從入門(mén)到精通(22)——Modbus TCP(0x01功能碼與C#代碼實(shí)現(xiàn))

    使用該功能碼能從遠(yuǎn)程地址中讀取1到2000個(gè)線(xiàn)圈的狀態(tài),每個(gè)線(xiàn)圈的狀態(tài)只能是0或者1,讀取的線(xiàn)圈數(shù)量由主站讀取時(shí)指定。 MBAP報(bào)文頭格式如下: 更詳細(xì)的格式如下: MBAP報(bào)文頭+功能碼+起始地址高位+起始地址低位+線(xiàn)圈數(shù)量高位+線(xiàn)圈數(shù)量低位,一共12個(gè)字節(jié)。 更詳細(xì)的格式

    2024年02月07日
    瀏覽(96)
  • C# Modbus通信從入門(mén)到精通(29)——Modbus TCP(0x10功能碼與C#代碼實(shí)現(xiàn))

    C# Modbus通信從入門(mén)到精通(29)——Modbus TCP(0x10功能碼與C#代碼實(shí)現(xiàn))

    使用該功能碼能將多個(gè)保持寄存器的值寫(xiě)入到遠(yuǎn)程地址中 更詳細(xì)的格式如下: MBAP報(bào)文頭+功能碼+寄存器起始地址高字節(jié)+寄存器起始地址低字節(jié)+寄存器數(shù)量高字節(jié)+寄存器數(shù)量低字節(jié)+字節(jié)計(jì)數(shù)(1個(gè)字節(jié))+寄存器1高字節(jié)+寄存器1低字節(jié)+…+寄存器N高字節(jié)+寄存器N低字節(jié)+CRC,一

    2024年02月06日
    瀏覽(366)
  • S7-200SMART 實(shí)現(xiàn)MODBUS TCP通信的具體方法示例(客戶(hù)端讀寫(xiě)+服務(wù)器響應(yīng))

    S7-200SMART 實(shí)現(xiàn)MODBUS TCP通信的具體方法示例(客戶(hù)端讀寫(xiě)+服務(wù)器響應(yīng))

    前面和大家介紹了MODBUS TCP的基本使用方法,具體可參考以下鏈接中的內(nèi)容: S7-200SMART實(shí)現(xiàn)MODBUS TCP通信(客戶(hù)端+服務(wù)器)的具體方法和步驟示例 本次繼續(xù)和大家分享S7-200SMART 中實(shí)現(xiàn)MODBUS TCP通信的具體方法 , 任務(wù)要求:

    2024年02月16日
    瀏覽(51)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包