当前位置: 代码网 > it编程>编程语言>Asp.net > 基于C#实现ModbusTCP服务器接口的方法

基于C#实现ModbusTCP服务器接口的方法

2025年01月18日 Asp.net 我要评论
一、nmodbus4modbustcp服务器的本质就是tcp服务器,根据识别modbustcp请求报文,返回对应的modbustcp报文。虽然原理很容易理解,但是自己开发还是需要一点时间的,当然我们也

一、nmodbus4

modbustcp服务器的本质就是tcp服务器,根据识别modbustcp请求报文,返回对应的modbustcp报文。

虽然原理很容易理解,但是自己开发还是需要一点时间的,当然我们也可以通过开源库来实现,我们这里采用的是nmodbus4。

nmodbus4是一个开放源码的modbus库。

我们通过nuget搜索nmodbus4即可搜索安装。

二、modbustcpserver

安装好nmodbus4后,我们进行封装一下,创建一个modbustcpserver类,对于进行封装,封装了以下几个方法:

方法一:开启服务

//modbustcpslave对象
private modbustcpslave modbustcpslave = null;
//tcplistener对象
private tcplistener tcplistener;
public void startserver(string ip, int port)
{
    tcplistener = new tcplistener(ipaddress.parse(ip), port);
    modbustcpslave = modbustcpslave.createtcp(1, tcplistener);
    modbustcpslave.listen();
}

方法二:关闭服务

 public void stopserver()
 {
     modbustcpslave?.dispose();
 }

方法三:向保持寄存器存储区中写入数据

public void setholdingregisterfloatvalue(int offset, float value)
{
    byte[] buffer = bitconverter.getbytes(value);
    ushort highvalue = bitconverter.touint16(buffer, 0);
    ushort lowvalue = bitconverter.touint16(buffer, 2);
    //获取保持型寄存器存储区
    modbusdatacollection<ushort> data = modbustcpslave.datastore.holdingregisters;
    data[offset] = lowvalue;
    data[offset + 1] = highvalue;
}
public void setholdingregisteushortvalue(int offset, ushort value)
{
    //获取保持型寄存器存储区
    modbusdatacollection<ushort> data = modbustcpslave.datastore.holdingregisters;
    data[offset] = value;
}

方法四:如果需要获取报文,可以添加一些事件

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

三、案例应用

有了以上方法后,编写一个案例来进行功能测试。

开启服务和关闭服务代码很简单,就是调用modbustcpserver及其中的对应方法即可。

private modbustcpserver modbustcpserver = new modbustcpserver();
private void btn_start_click(object sender, eventargs e)
{
    if (this.btn_start.text == "开启服务")
    {
        try
        {
            int port = convert.toint32(this.txt_port.text);
            modbustcpserver.startserver(this.txt_ip.text, port);
            addlog("开启服务成功");
            this.btn_start.text = "关闭服务";
        }
        catch (exception ex)
        {
            addlog("开启服务失败:" + ex.message);
        }
    }
    else
    {
        modbustcpserver.stopserver();
        this.btn_start.text = "开启服务";
    }
}

服务开启后,可以通过按钮向指定寄存器中写入数据,这里已经封装好了方法,直接调用即可。

 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("写入地址:" + address + "  浮点数:" + 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("写入地址:" + address + "  整数:" + value);
 }

最终实现效果如下所示:

用modbus poll软件读取结如下:

到此这篇关于基于c#实现modbustcp服务器接口的方法的文章就介绍到这了,更多相关c# modbustcp服务器接口内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com