現如今,ModBus協議可以說是工業控、現場數據采集鄰域各種控制設備與傳感器應用最為廣泛的數據交互協議,不管是簡單方便的串口,還是高速穩定的以太網,ModBus協議都有相應的適配其傳輸特點的協議。
雖然目前主流的ModBus人機交互主站是組態王或者各種工控廠家生產的觸摸屏,但如果你想做一些帶邏輯控制或者界面比較自由的上位機,那么該文章將在Visual Studio集成開發環境下,使用C#語言和Visual Studio的Winform框架,從環境安裝、創建工程、ModBus庫的安裝、代碼編寫和程序調試等幾個步驟,帶你快速開發出一個Window平臺環境下的ModBus主站上位機demo。(該文檔以Visual Studio 2017為例)
搭建開發環境
Visual Studio 社區版下載地址:
在“工作負荷”菜單處勾選“.NET桌面開發”(已省略安裝具體步驟)與你需要的其他組件。
安裝完成后,我們進入下一步。
創建工程
1、打開Visual Studio依次點擊“文件”->“新建”->“項目”
創建Visual C#的 Windows窗體應用,按如下步驟創建Windows窗體應用,下面第四步我們可以自定義工程名稱,這里筆者將該工程命名成“ModBusMaster”,完成后點擊“確定。
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連接,并在通信結束后關閉連接。
在上圖紅色區域點擊鼠標右鍵然后點擊“查看代碼”(或者鍵盤單機“F7”),進入工程代碼文件,然后點擊”項目”->“管理NuGet程序包”。
在“瀏覽”菜單欄的搜索框中輸入“easy ModBusTCP”,找到如下圖擴展庫后點擊“下載”;
安裝成功后我們可以在解決方案資源管理器中,引用中找到該擴展庫。
代碼編寫
(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
{
}
}
}
}
-
傳感器
+關注
關注
2553文章
51395瀏覽量
756598 -
MODBUS
+關注
關注
28文章
1820瀏覽量
77312 -
TCP
+關注
關注
8文章
1378瀏覽量
79302
發布評論請先 登錄
相關推薦
評論