C#使用NModbus4读写Modbus数据

这篇具有很好参考价值的文章主要介绍了C#使用NModbus4读写Modbus数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

   Modbus是一个免费的协议,协议设计简单,有很多成熟的库支持。比如C#版本的NModubs4就很好,入门简单,使用方便。

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

在使用文件中,添加引用。不同的接口模式,引用对象不同,Modbus Slave TCP模型需要以下几项:

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

using Modbus.Data;
using Modbus.Device;

初始化大概有几个步骤:创建TCP Listener对象、创建ModbusTcpSalve对象、启动侦听服务。

  TcpListener listener = new TcpListener(IPAddress.Parse("0.0.0.0"), 502);
  listener.Start();
  ModbusTcpSlave modbusSlave = ModbusTcpSlave.CreateTcp(1, listener);
  //创建寄存器存储对象
  modbusSlave.DataStore = DataStoreFactory.CreateDefaultDataStore();

Modbus有个DataStore对象,用来存储数据,对应的状态的地址如下:

//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;

定义之后,就可以直接通过这些对象读写数据了。

NModbus4库已经封装了对于TCP访问数据的封装,服务端只需要维护数据更新即可。

受Modbus协议限制,HoldingRegisters和InputRegisters每个地址仅16位2个字节长度。当实际数据值超过2个字节时,需要占用多个地址空间。比如int32,float都需要4个字节,两个地址。这些数据怎么存放,高低位怎么对齐,就产生了所谓的ABCD、CDAB等转换,这个Master与Slave一致就可以。

Int32等类型数据更新时,需要同时对多个存储地址进行更新,而master可能还在高速并发读数据,需要注意使用一个同步锁,避免数据更新一半就被读取,产生数据不一致问题。

        //将float类型分解成两个ushort类型
        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类型分解成两个ushort类型
        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对于字符串,并没有明确约定。推进使用Unicode编码,首先是与OPC的默认字符串编码格式一致,其次的每个中英文都占用一个地址2个字节,方便计算长度。文章来源地址https://www.toymoban.com/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);
                }
            }
        }

到了这里,关于C#使用NModbus4读写Modbus数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#、JAVA读写PLC物联网Modbus

    Modbus协议是一种常用于工业自动化领域的通信协议,它使用简单、易实现、可靠的特点得到了广泛应用。物联网中的设备也需要使用Modbus协议进行通信。本文将介绍物联网Modbus通信的相关内容。 一、Modbus协议简介 Modbus协议是一种串行通信协议,它最初由Modicon公司在1979年发布

    2024年02月10日
    浏览(42)
  • Java实现Modbus读写数据

    由于当时项目周期赶,引入了一个PLC4X组件,上手快。接下来就是使用这个组件遇到的一些问题: 关闭连接NioEventLoop没有释放导致oom 设计思想是一个设备一个连接,而不是一个网关一个连接 连接断开后客户端无从感知 前两个问题解决方案参考上篇文章,最后一个问题虽然可

    2024年02月09日
    浏览(41)
  • C#上位机与三菱PLC的通信07--使用第3方通讯库读写数据

    mcprotocol 是一个基于 Node.js 的三菱 PLC MC 协议通信库,具有以下特点: 支持多种三菱 PLC MC 协议的设备,如 FX3U、Q03UDECPU、QJ71E71 等。 支持多种功能码和数据类型,如读取线圈(M)、读取寄存器(D)、写入寄存器(D)、读取扩展寄存器(D*)、读取位寄存器(X/Y)、读取字寄

    2024年02月19日
    浏览(84)
  • C# Modbus通信从入门到精通(11)——调试软件Modbus Slave和Modbus Poll的使用

    我们在开发Modbus程序的时候,会需要测试以下我们写的Modbus程序有没有问题,这时候就需要使用到Modbus Slave和Modbus Poll这两个软件,Modbus Slave是模拟Modbus从站,Modbus Poll是模拟Modbus从站主站的, 一般情况下我们开发的Modbus主站程序,当我们没有硬件作为从站的时候,我们可以

    2024年02月06日
    浏览(56)
  • C# Modbus通信从入门到精通(1)——虚拟串口调试工具的使用

    由于我们在开发程序时经常是没有硬件给我们测试的,所以我们在开发ModbusRTU以及ModbusASCII程序时,可以使用虚拟串口调试工具来虚拟出来一对串口方便我们进行测试,订阅本专栏后,加入vip专属的qq群,在群资料里面就能找到虚拟串口工具 第1步、双击vspd.exe安装 第2步、 打

    2024年02月06日
    浏览(68)
  • C# 中,使用OpcUaHelper读写OPC服务器

    nuget包 帮助类: Winform: KepServer 设置: 结果:

    2024年02月10日
    浏览(41)
  • 《C#零基础入门之百识百例》(九十六)本地数据交互 -- 读写Excel表格文件

    本文属于 C#零基础入门之百识百例 系列文章。此系列文章旨在为学习C#语言的童鞋提供一套系统的学习路径。此系列文章都会通过【知识点】【练习题】的形式呈现。有任何问题

    2024年02月08日
    浏览(41)
  • C# Modbus通信从入门到精通(22)——Modbus TCP(0x01功能码与C#代码实现)

    使用该功能码能从远程地址中读取1到2000个线圈的状态,每个线圈的状态只能是0或者1,读取的线圈数量由主站读取时指定。 MBAP报文头格式如下: 更详细的格式如下: MBAP报文头+功能码+起始地址高位+起始地址低位+线圈数量高位+线圈数量低位,一共12个字节。 更详细的格式

    2024年02月07日
    浏览(67)
  • C# Modbus通信从入门到精通(29)——Modbus TCP(0x10功能码与C#代码实现)

    使用该功能码能将多个保持寄存器的值写入到远程地址中 更详细的格式如下: MBAP报文头+功能码+寄存器起始地址高字节+寄存器起始地址低字节+寄存器数量高字节+寄存器数量低字节+字节计数(1个字节)+寄存器1高字节+寄存器1低字节+…+寄存器N高字节+寄存器N低字节+CRC,一

    2024年02月06日
    浏览(103)
  • S7-200SMART 实现MODBUS TCP通信的具体方法示例(客户端读写+服务器响应)

    前面和大家介绍了MODBUS TCP的基本使用方法,具体可参考以下链接中的内容: S7-200SMART实现MODBUS TCP通信(客户端+服务器)的具体方法和步骤示例 本次继续和大家分享S7-200SMART 中实现MODBUS TCP通信的具体方法 , 任务要求:

    2024年02月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包