当前位置: 首页 >应用方案 >技术应用 >

0基础5分钟快速搭建modbus主站上位机教程

如何在Windows平台上面快速搭建一个Modbus TCP/UDP主站上位机demo

现如今,Modbus协议可以说是工业控制,现场数据采集邻域各种控制设备与传感器应用最为广泛的数据交互协议,不管是简单方便的UART串口通信,还是高速稳定的以太网,Modbus协议都有相应的适配其传输特点的协议。虽然目前主流的Modbus人机交互主站是组态王或者各种工控厂家生产的触摸屏,但如果你想做一些带逻辑控制,或者界面比较自由的上位机,那么该文章将在Visual Studio集成开发环境下,使用C#语言和Visual StudioWinform框架,从环境安装,创建工程,Modbus库的安装,代码编写,程序调试等几个步骤,带你快速开发出一个Window平台环境下的Modbus主站上位机demo(该文档以Visual Studio 2017为例)

一、搭建开发环境

“工作负荷”菜单处勾选“.NET桌面开发”(已省略安装具体步骤)与你需要的其他组件。

安装完成后,我们进入下一步。

搭建开发环境

二、创建工程

1、打开Visual Studio依次点击“文件”->“新建”->“项目”

创建工程1

2、创建Visual C#Windows窗体应用,按如下步骤创建Windows窗体应用,下面第四步我们可以自定义工程名称,这里我将该工程命名成“Modbus Master”,完成后点击“确定。

创建工程2

三、安装Modbus

工程创建完成后,中间红色部分窗体就是我们该工程默认生成的界面,默认程序运行起来后会加载该界面,但我们先不管界面,我们先为工程安装Easy ModbusTcp库。

Easy Modbus TCP是基于.NET FrameworkJava平台上的Modbus TCP/UDP/RTU通讯协议库。它主要用于工业自动化领域,帮助用户实现远程控制和数据采集。

EasyModbusTCP的特点如下:

简单易用:EasyModbusTCP提供了简单易用的API,使得用户可以轻松地实现与Modbus设备的通信。

支持多种编程语言:EasyModbusTCP支持多种编程语言,如C#VB.NETJavaC++以及更多C#的变体,如UnityMono.NET Core等。

支持多种Modbus协议EasyModbusTCP不仅支持Modbus TCP协议,还支持Modbus UDPModbus RTU协议。

支持点对点通信:EasyModbusTCP支持点对点通信,每个设备都有一个唯一的IP地址,使得用户可以直接与特定设备进行通信。

支持Modbus报文两种类型EasyModbusTCP支持Modbus报文的两种类型,包括读取请求和写入请求。读取请求用于获取服务器上的数据,写入请求用于向服务器写入数据。

可靠的数据传输:EasyModbusTCP使用TCP连接来确保可靠的数据传输。在通信之前,需要建立TCP连接,并在通信结束后关闭连接。

安装Modbus库1

1、在上图红色区域点击鼠标右键然后点击“查看代码”(或者键盘单机“F7”),进入工程代码文件,然后点击”项目”->“管理NuGet程序包”

安装Modbus库2

2、“浏览”菜单栏的搜索框中输入“easy modbusTCP”,找到如下图扩展库后点击“下载”

安装Modbus库3

3、安装成功后我们可以在解决方案资源管理器中,引用中找到该扩展库

安装Modbus库4

四、代码编写

1、界面设计

代码编写

2、源码

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using EasyModbus;


namespace ModbusMaster

{    public partial class Form1 : Form

   {        public Form1()

       {            InitializeComponent();

           this.Master = new ModbusClient();

           this.slaveIP.Text = "192.168.3.7";

           this.serverPort.Text = "502";

           Master.UnitIdentifier = 2;        }

       EasyModbus.ModbusClient Master = null;

       private bool SlaveCoilWrite(int regaddr , bool status)

       {            try

           {                Master.WriteSingleCoil(regaddr, status);            }

          catch

           {                return false;            }

           return true;        }

       private void btn_connect_Click(object sender, EventArgs e)

       {            if (Master.Connected) return;

            Master.Connect(this.slaveIP.Text, int.Parse(this.serverPort.Text));        }

       private void Form1_FormClosing(object sender, FormClosingEventArgs e)

       {            Master.Disconnect();        }

       private void btn_do1_on_Click(object sender, EventArgs e)

       {            SlaveCoilWrite(0, true);        }

       private void btn_do2_on_Click(object sender, EventArgs e)

       {            SlaveCoilWrite(1, true);        }

       private void btn_do3_on_Click(object sender, EventArgs e)

       {            SlaveCoilWrite(2, true);        }

       private void btn_do4_on_Click(object sender, EventArgs e)

       {            SlaveCoilWrite(3, true);        }

       private void btn_do1_4_on_Click(object sender, EventArgs e)

       {            //for (int i = 0; i < 4; i++)

           //{            //    SlaveCoilWrite(i, true);            //}

           bool[] sta = new bool[4] { true , true , true , true};

           try

           {                Master.WriteMultipleCoils(0, sta);            }

           catch

           {

           }

       }


       private void btn_do1_off_Click(object sender, EventArgs e)

       {            SlaveCoilWrite(0, false);        }

       private void btn_do2_off_Click(object sender, EventArgs e)

       {            SlaveCoilWrite(1, false);        }


       private void btn_do3_off_Click(object sender, EventArgs e)

       {            SlaveCoilWrite(2, false);        }

       private void btn_do4_off_Click(object sender, EventArgs e)

       {            SlaveCoilWrite(3, false);       }

       private void btn_do1_4_off_Click(object sender, EventArgs e)

       {           //for (int i = 0; i < 4; i++)

           //{            //    SlaveCoilWrite(i, false);            //}

           bool[] sta = new bool[4] { false, false, false, false };

           try

           {                Master.WriteMultipleCoils(0, sta);            }

           catch

           {

           }

       }

   }

}

今天的分享就到这里啦,EBYTE每一天都致力于更好的助力物联化、智能化、自动化的发展,提升资源利用率,更多产品更多资料,感兴趣的小伙伴可以登录我们的亿佰特官网和企业公众号(微信号:cdebyte进行了解,也可以直接拨打400电话咨询技术专员!

https://www.wjx.cn/jq/84863372.aspx