0


C#使用开源库EasyModbusTCP跟PLC进行通讯开发步骤

 使用C#进行非标自动化系统开发一般涉及的知识包含后台、前台、手持终端、客户端软件等功能模块的开发,其中后台程序连接数据库,而前台Vue界面,手持终端Android程序,客户端C#软件都会跟后台接口程序进行数据交换。

 本文主要讨论C#客户端软件跟PLC通讯技术,我们将PLC当做一个TCP服务器来访问,通过IP地址和502端口进行数据通信,如果你没有PLC硬件,也可以下载Modbus Slave软件来模拟一个真实的PLC硬件进行通信测试。

使用C#和Modbus Slave软件进行通信测试的步骤主要如下:

 一、在Modbus Slave软件中进行连接和从机设置。

1.1、点击Connection-Connect菜单或者按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服务器
        /// <summary>
        /// 连接Tcp服务器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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 读取输入线圈状态
        /// <summary>
        /// 读取输入线圈状态
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnReadOther_Click(object sender, EventArgs e)
        {
            try
            {
                richTextBox1.Clear();
                bool[] b = mc.ReadDiscreteInputs(Convert.ToInt32(txtReadAddr.Text), Convert.ToInt32(txtReadLength.Text));
                for (int i = 0; i < b.Length; i++)
                {
                    richTextBox1.AppendText(b[i].ToString() + "\r\n");
                }
                MessageBox.Show("读取成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        #endregion

        #region 写入寄存器
        /// <summary>
        /// 写入寄存器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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 写入单个输入线圈状态
        /// <summary>
        /// 写入单个输入线圈状态功能码:0x05 (写单个线圈寄存器)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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 读取输出线圈状态
        /// <summary>
        /// 读取输出线圈状态功能码:0x01 (读线圈寄存器)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnReadData_Click(object sender, EventArgs e)
        {
            try
            {
                this.richTextBox1.Clear();
                bool[] b = mc.ReadCoils(Convert.ToInt32(txtReadAddr.Text), Convert.ToInt32(txtReadLength.Text));
                for (int i = 0; i < b.Length; i++)
                {
                    richTextBox1.AppendText(b[i].ToString() + "\r\n");
                }
                MessageBox.Show("读取成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        #endregion
    }
}

2.6、运行程序,先点击【连接】按钮,之后点击【线圈读取】按钮,进行测试。

从地址0开始,读取8位,从左右两侧结果对比来看的结果正确。

项目测试下载地址:https://download.csdn.net/download/xqf222/89922701

标签: c# EasyModbusTcp PLC

本文转载自: https://blog.csdn.net/xqf222/article/details/143221562
版权归原作者 疾风铸境 所有, 如有侵权,请联系我们删除。

“C#使用开源库EasyModbusTCP跟PLC进行通讯开发步骤”的评论:

还没有评论