0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

快速开发一个简单的ModBus TCP主站上位机(附源码)

亿佰特物联网应用专家 2024-04-12 08:20 次阅读

现如今,ModBus协议可以说是工业控、现场数据采集邻域各种控制设备与传感器应用最为广泛的数据交互协议,不管是简单方便的串口,还是高速稳定的以太网,ModBus协议都有相应的适配其传输特点的协议。

虽然目前主流的ModBus人机交互主站是组态王或者各种工控厂家生产的触摸屏,但如果你想做一些带逻辑控制或者界面比较自由的上位机,那么该文章将在Visual Studio集成开发环境下,使用C#语言和Visual Studio的Winform框架,从环境安装、创建工程、ModBus库的安装、代码编写和程序调试等几个步骤,带你快速开发出一个Window平台环境下的ModBus主站上位机demo。(该文档以Visual Studio 2017为例)

搭建开发环境

Visual Studio 社区版下载地址:

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

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

7bb74668-f862-11ee-9118-92fbcf53809c.png

创建工程

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

7bc19c58-f862-11ee-9118-92fbcf53809c.png

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

7bc587fa-f862-11ee-9118-92fbcf53809c.png

ModBus库的安装

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

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

EasyModBusTCP的特点如下:

(1)简单易用:EasyModBusTCP提供了简单易用的API,使得用户可以轻松地实现与ModBus设备的通信

(2)支持多种编程语言:EasyModBusTCP支持多种编程语言,如C#、VB.NET、Java、C++以及更多C#的变体,如Unity、Mono、.NET Core等。

(3)支持多种ModBus协议:EasyModBusTCP不仅支持ModBus TCP协议,还支持ModBus UDP和ModBus RTU协议。

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

(5)支持ModBus报文两种类型:EasyModBusTCP支持ModBus报文的两种类型,包括读取请求和写入请求。读取请求用于获取服务器上的数据,写入请求用于向服务器写入数据。

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

7bc96988-f862-11ee-9118-92fbcf53809c.png

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

7bd881f2-f862-11ee-9118-92fbcf53809c.png

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

7bef43ce-f862-11ee-9118-92fbcf53809c.png

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

7bf5d3ce-f862-11ee-9118-92fbcf53809c.png

代码编写

(1)界面设计

7bff7050-f862-11ee-9118-92fbcf53809c.png

(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

{

}

}

}

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2548

    文章

    50642

    浏览量

    751718
  • MODBUS
    +关注

    关注

    28

    文章

    1759

    浏览量

    76820
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1348

    浏览量

    78979
收藏 人收藏

    评论

    相关推荐

    基于QT的Modbus RTU站上位工具设计

    Modbus种常见的工业系统通讯协议。在我们的设计开发工作中经常使用到它。在这篇中我们将简单实现
    的头像 发表于 12-13 14:39 4254次阅读
    基于QT的<b class='flag-5'>Modbus</b> RTU<b class='flag-5'>主</b><b class='flag-5'>站上位</b>工具设计

    求基于Modbus/tcp协议的上位

    现在在做基于MODBUS/Tcp协议的上位,求大家能给我教程!不胜感激!实在不会!来个例子也不错!
    发表于 05-20 15:50

    【NanoPi M2试用体验】之Modbus-TCP开发Modbus协议二)

    的测试成功了。NanoPi M2结合QT、串口、MySQL、Modbus-RTU、Modbus-TCP,已经可是实现功能强大的工业现场数据采集了,只要我们认真去发掘,其实小小的卡片
    发表于 05-29 18:51

    Modbus站问题

    ModbusRTU两站之间如何交互数据? 工业控制中,般都是主从通讯方式居多,有时也会碰到两站之间通讯。例如某工作站上位
    发表于 11-24 16:36

    TCP通信协议-Labview上位

    现在用单片进行信息采集,通过GPRS模块上传到PC,用Labview做上位TCP通信协议,想请教下,
    发表于 12-10 08:58

    基于Modbus TCP的MCGS上位软件教程

    配置设备参数图1.IP地址配置成上位一个网段,例如安装上位软件的上位
    发表于 08-09 14:24

    如何快速实现Modbus RTU和Modbus TCP协议转换?

    Modbus协议是工业现场串口设备之间常用的连接方式,其中最常见的就是Modbus RTU和Modbus TCP两种。许多工厂需要将现场各种不同型号设备的数据都能够通过
    发表于 08-18 18:36

    labview涂料串口DIY上位源码

    labview 涂料串口,自己做的上位源码,通过串口控制机械臂。
    发表于 01-19 14:41 10次下载

    EPSON机器人如何与视觉上位实现TCP通信

    上位开发中经常会有机器人通信,今天跟大家分享下,EPSON机器人如何与视觉上位实现
    发表于 10-10 15:35 1624次阅读

    ModBus RTU 与 ModBus TCP

    、两密切相关的协议:RTU 与 TCP ModBus RTU和ModBus TCP作为
    的头像 发表于 02-07 10:05 2961次阅读

    上位开发新手指南(二)上位通信

    上位开发中,串口通信和TCP通信是两种常见的通信方式。串口通信是指通过串口将数据发送和接收到控制器或其他外设中,TCP通信则是通过网络将
    发表于 05-08 11:37 5次下载
    <b class='flag-5'>上位</b><b class='flag-5'>机</b><b class='flag-5'>开发</b>新手指南(二)<b class='flag-5'>上位</b><b class='flag-5'>机</b>通信

    上位的入门

    开发上位前,我们应该准备好三软件modbus poll, modbus Salve, Configure VirtualSerialPo
    发表于 05-08 11:40 1次下载
    <b class='flag-5'>上位</b><b class='flag-5'>机</b>的入门

    基于QT的简单上位

    。同样的,我们也从编写简单的基于QT的上位来体会体会上位
    发表于 05-08 10:57 16次下载
    基于QT的<b class='flag-5'>简单</b>的<b class='flag-5'>上位</b><b class='flag-5'>机</b>

    QT|编写简单上位

    QT | 编写简单上位 时间 :2023-03-19文章目录QT | 编写
    发表于 05-08 10:12 3次下载
    QT|编写<b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>简单</b>的<b class='flag-5'>上位</b><b class='flag-5'>机</b>

    EtherCAT站网关HT5S-ECM-MTP接半导体用空气流量计与MODBUS TCP上位通讯测试

    EtherCAT站网关HT5S-ECM-MTP接半导体用空气流量计与MODBUS TCP上位通讯测试 HT5S-ECM-MTP 是
    的头像 发表于 06-12 15:43 344次阅读
    EtherCAT<b class='flag-5'>主</b>站网关HT5S-ECM-MTP接半导体用空气流量计与<b class='flag-5'>MODBUS</b> <b class='flag-5'>TCP</b><b class='flag-5'>上位</b><b class='flag-5'>机</b>通讯测试