C#使用开源库EasyModbusTCP和PLC通信开发步骤
2025-06-24 11:49:42
来源:新华网
非标准自动化系统开发一般涉及的知识包括后台、前台、手持终端、客户端软件等功能模块的开发,后台程序连接数据库,前台Vue界面,Android手持终端程序客户端C#软件将与后台接口程序进行数据交换。
本文主要讨论C#客户端软件和PLC通信技术c;我们将PLC作为TCP服务器访问,数据通信通过IP地址和502端口进行c;如果你没有PLC硬件,也可以下载Modbuss Slave软件可以模拟一个真正的PLC硬件进行通信测试。
使用C#和Modbus Slave软件通信测试的主要步骤如下:
一、在Modbus 连接和从机设置Slave软件。
1.1、点击Conection-Conect菜单或按F3快捷键设置TCP服务器IP地址和端口号。
1.2、点击Setup-Slave Definition...按F8快捷键设置菜单或访问从机号码、线圈或寄存器地址。
二、打开Visual Studio 2019软件,新建相应的测试项目进行通信测试。
2.1、新建NET FrameWork 4.6客户端测试项目。
2.2、右键点击解决方案中的相应测试项目,选择【管理Nuget程序包】菜单。
2.3、搜索安装EasyModbustcp对应的程序包。
2.4、设计界面拖动相应的控制器,通信测试。
2.5、编写相应的代码。
using EasyModbus;using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Net.Sockets;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace ModbusEasyTest{ public partial class Form1 : Form { private ModbusClient mc; public Form1() { InitializeComponent(); } #region 连接TCP服务器 /// /// 连接TCP服务器 /// /// /// private void btnConn_Click(object sender, EventArgs e) { try { mc = new ModbusClient(); mc.IPAddress = txtServerIP.Text;//服务器IP地址 mc.Port = Convert.ToInt32(txtServerPort.Text);//端口号 mc.Connect(); // 建立连接 MessageBox.Show("成功连接"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } #endregion #region 读取输入线圈状态 /// /// 读取输入线圈状态 /// /// /// private void btnReadOther_Click(object sender, EventArgs e) { try { richtextbox.Clear(); bool[] b = mc.ReadDiscreteInputs(Convert.ToInt32(txtReadAddr.Text), Convert.ToInt32(txtReadLength.Text)); for (int i = 0; i < b.Length; i++) { richtextbox.AppendText(b[i].ToString() + "\r\n"); } MessageBox.Show("阅读成功"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } #endregion #region 写入寄存器 /// /// 写入寄存器 /// /// /// private void btnWriteRegister_Click(object sender, EventArgs e) { try { int add = Convert.ToInt32(txtStartAddr.Text); int num = Convert.ToInt32(txtWriteData.Text); mc.WriteSingleRegister(add, num); MessageBox.Show("成功"写入;); } catch (Exception ex) { MessageBox.Show(ex.Message); } } #endregion #region 写入单个输入线圈状态 /// /// 写入单个输入线圈状态功能码:0x05 (写单线圈寄存器) /// /// /// private void btnWriteData_Click(object sender, EventArgs e) { try { int add = Convert.ToInt32(txtStartAddr.Text); bool num = Convert.ToBoolean(txtWriteData.Text); mc.WriteSingleCoil(add, num); MessageBox.Show("成功"写入;); } catch (Exception ex) { MessageBox.Show(ex.Message); } } #endregion #region 读取输出线圈状态 /// /// 读取输出线圈状态功能代码:0x01 (读线圈寄存器) /// /// /// private void btnReadData_Click(object sender, EventArgs e) { try { this.richtextbox.Clear(); bool[] b = mc.ReadCoils(Convert.ToInt32(txtReadAddr.Text), Convert.ToInt32(txtReadLength.Text)); for (int i = 0; i < b.Length; i++) { richtextbox.AppendText(b[i].ToString() + "\r\n"); } MessageBox.Show("阅读成功"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } #endregion }}。
2.6、操作程序点击[连接]按钮,点击[线圈读取]按钮,进行测试。
2.6、操作程序点击[连接]按钮,点击[线圈读取]按钮,测试
从地址0开始,阅读8位对比左右两侧的结果,结果是正确的。
项目测试下载地址:https://download.csdn.net/download/xqf2222/8992701。