C#利用开源库EasyModbusTCP跟PLC举行通讯开发步骤

打印 上一主题 下一主题

主题 827|帖子 827|积分 2481

     利用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、编写对应代码
  1. using EasyModbus;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Net.Sockets;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows.Forms;
  12. namespace ModbusEasyTest
  13. {
  14.     public partial class Form1 : Form
  15.     {
  16.         private ModbusClient mc;
  17.         public Form1()
  18.         {
  19.             InitializeComponent();
  20.         }
  21.         #region 连接Tcp服务器
  22.         /// <summary>
  23.         /// 连接Tcp服务器
  24.         /// </summary>
  25.         /// <param name="sender"></param>
  26.         /// <param name="e"></param>
  27.         private void btnConn_Click(object sender, EventArgs e)
  28.         {
  29.             try
  30.             {
  31.                 mc = new ModbusClient();
  32.                 mc.IPAddress = txtServerIP.Text;//服务器IP地址
  33.                 mc.Port = Convert.ToInt32(txtServerPort.Text);//端口号
  34.                 mc.Connect(); // 建立连接
  35.                 MessageBox.Show("连接成功");
  36.             }
  37.             catch (Exception ex)
  38.             {
  39.                 MessageBox.Show(ex.Message);
  40.             }
  41.         }
  42.         #endregion
  43.         #region 读取输入线圈状态
  44.         /// <summary>
  45.         /// 读取输入线圈状态
  46.         /// </summary>
  47.         /// <param name="sender"></param>
  48.         /// <param name="e"></param>
  49.         private void btnReadOther_Click(object sender, EventArgs e)
  50.         {
  51.             try
  52.             {
  53.                 richTextBox1.Clear();
  54.                 bool[] b = mc.ReadDiscreteInputs(Convert.ToInt32(txtReadAddr.Text), Convert.ToInt32(txtReadLength.Text));
  55.                 for (int i = 0; i < b.Length; i++)
  56.                 {
  57.                     richTextBox1.AppendText(b[i].ToString() + "\r\n");
  58.                 }
  59.                 MessageBox.Show("读取成功");
  60.             }
  61.             catch (Exception ex)
  62.             {
  63.                 MessageBox.Show(ex.Message);
  64.             }
  65.         }
  66.         #endregion
  67.         #region 写入寄存器
  68.         /// <summary>
  69.         /// 写入寄存器
  70.         /// </summary>
  71.         /// <param name="sender"></param>
  72.         /// <param name="e"></param>
  73.         private void btnWriteRegister_Click(object sender, EventArgs e)
  74.         {
  75.             try
  76.             {
  77.                 int add = Convert.ToInt32(txtStartAddr.Text);
  78.                 int num = Convert.ToInt32(txtWriteData.Text);
  79.                 mc.WriteSingleRegister(add, num);
  80.                 MessageBox.Show("写入成功");
  81.             }
  82.             catch (Exception ex)
  83.             {
  84.                 MessageBox.Show(ex.Message);
  85.             }
  86.         }
  87.         #endregion
  88.         #region 写入单个输入线圈状态
  89.         /// <summary>
  90.         /// 写入单个输入线圈状态功能码:0x05 (写单个线圈寄存器)
  91.         /// </summary>
  92.         /// <param name="sender"></param>
  93.         /// <param name="e"></param>
  94.         private void btnWriteData_Click(object sender, EventArgs e)
  95.         {
  96.             try
  97.             {
  98.                 int add = Convert.ToInt32(txtStartAddr.Text);
  99.                 bool num = Convert.ToBoolean(txtWriteData.Text);
  100.                 mc.WriteSingleCoil(add, num);
  101.                 MessageBox.Show("写入成功");
  102.             }
  103.             catch (Exception ex)
  104.             {
  105.                 MessageBox.Show(ex.Message);
  106.             }
  107.         }
  108.         #endregion
  109.         #region 读取输出线圈状态
  110.         /// <summary>
  111.         /// 读取输出线圈状态功能码:0x01 (读线圈寄存器)
  112.         /// </summary>
  113.         /// <param name="sender"></param>
  114.         /// <param name="e"></param>
  115.         private void btnReadData_Click(object sender, EventArgs e)
  116.         {
  117.             try
  118.             {
  119.                 this.richTextBox1.Clear();
  120.                 bool[] b = mc.ReadCoils(Convert.ToInt32(txtReadAddr.Text), Convert.ToInt32(txtReadLength.Text));
  121.                 for (int i = 0; i < b.Length; i++)
  122.                 {
  123.                     richTextBox1.AppendText(b[i].ToString() + "\r\n");
  124.                 }
  125.                 MessageBox.Show("读取成功");
  126.             }
  127.             catch (Exception ex)
  128.             {
  129.                 MessageBox.Show(ex.Message);
  130.             }
  131.         }
  132.         #endregion
  133.     }
  134. }
复制代码
2.6、运行程序,先点击【连接】按钮,之后点击【线圈读取】按钮,举行测试。


从地点0开始,读取8位,从左右两侧结果对比来看的结果正确。
项目测试下载地点:https://download.csdn.net/download/xqf222/89922701

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表