分享缩略图

分享到:
链接已复制
首页> 新闻中心>

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。

【责任编辑:新华网】
返回顶部