現(xiàn)如今,ModBus協(xié)議可以說(shuō)是工業(yè)控、現(xiàn)場(chǎng)數(shù)據(jù)采集鄰域各種控制設(shè)備與傳感器應(yīng)用最為廣泛的數(shù)據(jù)交互協(xié)議,不管是簡(jiǎn)單方便的串口,還是高速穩(wěn)定的以太網(wǎng),ModBus協(xié)議都有相應(yīng)的適配其傳輸特點(diǎn)的協(xié)議。
雖然目前主流的ModBus人機(jī)交互主站是組態(tài)王或者各種工控廠(chǎng)家生產(chǎn)的觸摸屏,但如果你想做一些帶邏輯控制或者界面比較自由的上位機(jī),那么該文章將在Visual Studio集成開(kāi)發(fā)環(huán)境下,使用C#語(yǔ)言和Visual Studio的Winform框架,從環(huán)境安裝、創(chuàng)建工程、ModBus庫(kù)的安裝、代碼編寫(xiě)和程序調(diào)試等幾個(gè)步驟,帶你快速開(kāi)發(fā)出一個(gè)Window平臺(tái)環(huán)境下的ModBus主站上位機(jī)demo。(該文檔以Visual Studio 2017為例)
搭建開(kāi)發(fā)環(huán)境
Visual Studio 社區(qū)版下載地址:
在“工作負(fù)荷”菜單處勾選“.NET桌面開(kāi)發(fā)”(已省略安裝具體步驟)與你需要的其他組件。
安裝完成后,我們進(jìn)入下一步。
創(chuàng)建工程
1、打開(kāi)Visual Studio依次點(diǎn)擊“文件”->“新建”->“項(xiàng)目”
創(chuàng)建Visual C#的 Windows窗體應(yīng)用,按如下步驟創(chuàng)建Windows窗體應(yīng)用,下面第四步我們可以自定義工程名稱(chēng),這里筆者將該工程命名成“ModBusMaster”,完成后點(diǎn)擊“確定。
ModBus庫(kù)的安裝
工程創(chuàng)建完成后,中間紅色部分窗體就是我們?cè)摴こ棠J(rèn)生成的界面,默認(rèn)程序運(yùn)行起來(lái)后會(huì)加載該界面,但我們先不管界面,我們先為工程安裝Easy ModBusTcp庫(kù)。
EasyModBusTCP是基于.NET Framework和Java平臺(tái)上的ModBus TCP/UDP/RTU通訊協(xié)議庫(kù)。它主要用于工業(yè)自動(dòng)化領(lǐng)域,幫助用戶(hù)實(shí)現(xiàn)遠(yuǎn)程控制和數(shù)據(jù)采集。
EasyModBusTCP的特點(diǎn)如下:
(1)簡(jiǎn)單易用:EasyModBusTCP提供了簡(jiǎn)單易用的API,使得用戶(hù)可以輕松地實(shí)現(xiàn)與ModBus設(shè)備的通信。
(2)支持多種編程語(yǔ)言:EasyModBusTCP支持多種編程語(yǔ)言,如C#、VB.NET、Java、C++以及更多C#的變體,如Unity、Mono、.NET Core等。
(3)支持多種ModBus協(xié)議:EasyModBusTCP不僅支持ModBus TCP協(xié)議,還支持ModBus UDP和ModBus RTU協(xié)議。
(4)支持點(diǎn)對(duì)點(diǎn)通信:EasyModBusTCP支持點(diǎn)對(duì)點(diǎn)通信,每個(gè)設(shè)備都有一個(gè)唯一的IP地址,使得用戶(hù)可以直接與特定設(shè)備進(jìn)行通信。
(5)支持ModBus報(bào)文兩種類(lèi)型:EasyModBusTCP支持ModBus報(bào)文的兩種類(lèi)型,包括讀取請(qǐng)求和寫(xiě)入請(qǐng)求。讀取請(qǐng)求用于獲取服務(wù)器上的數(shù)據(jù),寫(xiě)入請(qǐng)求用于向服務(wù)器寫(xiě)入數(shù)據(jù)。
(6)可靠的數(shù)據(jù)傳輸:EasyModBusTCP使用TCP連接來(lái)確保可靠的數(shù)據(jù)傳輸。在通信之前,需要建立TCP連接,并在通信結(jié)束后關(guān)閉連接。
在上圖紅色區(qū)域點(diǎn)擊鼠標(biāo)右鍵然后點(diǎn)擊“查看代碼”(或者鍵盤(pán)單機(jī)“F7”),進(jìn)入工程代碼文件,然后點(diǎn)擊”項(xiàng)目”->“管理NuGet程序包”。
在“瀏覽”菜單欄的搜索框中輸入“easy ModBusTCP”,找到如下圖擴(kuò)展庫(kù)后點(diǎn)擊“下載”;
安裝成功后我們可以在解決方案資源管理器中,引用中找到該擴(kuò)展庫(kù)。
代碼編寫(xiě)
(1)界面設(shè)計(jì)
(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
{
}
}
}
}
-
傳感器
+關(guān)注
關(guān)注
2557文章
51758瀏覽量
758935 -
MODBUS
+關(guān)注
關(guān)注
28文章
1869瀏覽量
77799 -
TCP
+關(guān)注
關(guān)注
8文章
1390瀏覽量
79654
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
基于QT的Modbus RTU主站上位工具設(shè)計(jì)

Modbus TCP Server程序開(kāi)發(fā)與Yocto系統(tǒng)構(gòu)建

求基于Modbus/tcp協(xié)議的上位機(jī)
【NanoPi M2試用體驗(yàn)】之Modbus-TCP主站開(kāi)發(fā)(Modbus協(xié)議二)
Modbus多主站問(wèn)題
TCP通信協(xié)議-Labview上位機(jī)
基于Modbus TCP的MCGS上位機(jī)軟件教程
如何快速實(shí)現(xiàn)Modbus RTU和Modbus TCP協(xié)議轉(zhuǎn)換?
labview涂料機(jī)串口DIY上位機(jī)源碼
EPSON機(jī)器人如何與視覺(jué)上位機(jī)實(shí)現(xiàn)TCP通信
上位機(jī)開(kāi)發(fā)新手指南(二)上位機(jī)通信

上位機(jī)的入門(mén)

基于QT的簡(jiǎn)單的上位機(jī)

QT|編寫(xiě)一個(gè)簡(jiǎn)單的上位機(jī)

EtherCAT主站網(wǎng)關(guān)HT5S-ECM-MTP接半導(dǎo)體用空氣流量計(jì)與MODBUS TCP上位機(jī)通訊測(cè)試

評(píng)論