C#实现ModbusRTU详解【五】—— NModbus4的使用

前言

通过前面的四篇文章,我们已经了解到了ModbusRTU具体是什么,以及如何生成正确的报文,也完成了一个完整实现ModbusRTU的Demo。

前面我们的实现方式,是从零开始一点点自己写,所以我们需要完整实现整个串口通讯以及报文的生成与收发。在实际使用的时候,我们其实不需要写那么多东西,GitHub上其实有很多现成的类库,可以直接导入使用,无需自己生成通讯报文。

由于本专栏并非仅仅介绍实际应用,所以前面花费了不少篇幅来讲解ModbusRTU的报文。如果能完全理解前面四篇文章的内容,那么当我们遇到需要使用常用的八种功能码以外的报文的情况的时候,我们也能举一反三地写出对应的程序,而不必依赖他人的类库。

在实际应用的开发过程中,如果充当主站的应用程序与子站直接的物理连接,并非完全是RS485等的串行通讯连接方式,而是中间使用了串口服务器将串行信号转换为以太网信号,那么则需要我们使用Socket通讯的方式将报文发送出去,所以就不能使用NModbus4这样的类库了。在这种情况下,虽然串行信号被转换成了以太网的信号,但是我们需要收发的报文格式是不变的,所以这时,我们只需要用我们前面写好的报文生成和解析的方法,结合Socket通讯,实现数据的请求与解析。

传送门:

C#实现ModbusRTU详解【一】—— 简介及仿真配置

C#实现ModbusRTU详解【二】—— 生成读取报文

C#实现ModbusRTU详解【三】—— 生成写入报文

C#实现ModbusRTU详解【四】—— 通讯Demo


引入类库

以下以Winform为例。创建一个Winform项目,然后在NuGet中安装NModbus4,如下图所示:


窗体界面

根据自己喜好创建布局,参考如下:


读写方法

首先我们需要引入NModbusRTU。

using Modbus.Device;

创建一个串口对象,还有一个ModbusRTU的实例对象。

/// <summary>
/// 私有串口实例
/// </summary>
private SerialPort serialPort = new SerialPort();

/// <summary>
/// 私有ModbusRTU主站字段
/// </summary>
private static IModbusMaster master;

根据八种不同的功能,创建读写方法。

/// <summary>
/// 写入单个线圈
/// </summary>
private void WriteSingleCoil()
{
    bool result = false;
    if (rbxRWMsg.Text.Equals("true", StringComparison.OrdinalIgnoreCase) || rbxRWMsg.Text.Equals("1", StringComparison.OrdinalIgnoreCase))
    {
        result = true;
    }
    master.WriteSingleCoil((byte)nudSlaveID.Value, (ushort)nudStartAdr.Value, result);
}

/// <summary>
/// 批量写入线圈
/// </summary>
private void WriteArrayCoil()
{
    List<string> strList = rbxRWMsg.Text.Split(',').ToList();

    List<bool> result = new List<bool>();

    strList.ForEach(m => result.Add(m.Equals("true", StringComparison.OrdinalIgnoreCase) || m.Equals("1", StringComparison.OrdinalIgnoreCase)));

    master.WriteMultipleCoils((byte)nudSlaveID.Value, (ushort)nudStartAdr.Value, result.ToArray());
}

/// <summary>
/// 写入单个寄存器
/// </summary>
private void WriteSingleRegister()
{
    ushort result = Convert.ToUInt16(rbxRWMsg.Text);

    master.WriteSingleRegister((byte)nudSlaveID.Value, (ushort)nudStartAdr.Value, result);
}

/// <summary>
/// 批量写入寄存器
/// </summary>
private void WriteArrayRegister()
{
    List<string> strList = rbxRWMsg.Text.Split(',').ToList();

    List<ushort> result = new List<ushort>();

    strList.ForEach(m => result.Add(Convert.ToUInt16(m)));

    master.WriteMultipleRegisters((byte)nudSlaveID.Value, (ushort)nudStartAdr.Value, result.ToArray());
}

/// <summary>
/// 读取输出线圈
/// </summary>
//
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值