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,如下图所示:

C#实现ModbusRTU详解【五】—— NModbus4的使用_第1张图片


窗体界面

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

C#实现ModbusRTU详解【五】—— NModbus4的使用_第2张图片


读写方法

首先我们需要引入NModbusRTU。

using Modbus.Device;

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

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

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

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

/// 
/// 写入单个线圈
/// 
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);
}

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

    List result = new List();

    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());
}

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

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

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

    List result = new List();

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

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

/// 
/// 读取输出线圈
/// 
//

你可能感兴趣的:(面试,学习路线,阿里巴巴,c#,开发语言,java,安全)