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

news2024/10/28 13:58:16

     使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2225470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于知识图谱的紧急事故决策辅助系统

现代社会紧急事故频发&#xff0c;而处理这些突发事件的效率直接决定了后续影响的大小。这时候&#xff0c;数据智能的解决方案会显得尤为重要&#xff01;今天为大家分享一个用【知识图谱】技术驱动的紧急事故决策辅助系统&#xff0c;不仅能帮助你快速处理事故信息&#xff0…

当有违法数据时,浏览器不解析,返回了undefined,导致数据不解析

现象&#xff1a;页面上没有看到数据 排查&#xff1a;断点到线上的源码里&#xff1a;1、协议回调确实没有拿到数据是个undefined 2、network里看服务确实响应了数据 3、控制台没有任何报错。 心情&#xff1a;莫名其妙的现象 我本地有json格式化工具&#xff0c;copy进去后&…

STM32硬件平台

STM32 系列是 STMicroelectronics 设计的高度灵活、广泛应用的微控制器&#xff08;MCU&#xff09;系列&#xff0c;支持从低功耗应用到高性能处理的需求&#xff0c;适用于工业、汽车、消费电子和物联网等广泛领域。STM32 系列具有广泛的硬件种类和丰富的功能&#xff0c;以下…

uniapp 引入了uview-ui后,打包错误,主包过大解决方案

原因&#xff1a;由于使用uniapp来设计小程序&#xff0c;使用uview的组件库&#xff0c;导致了主包过大&#xff0c;无法打包 前提条件&#xff1a;已经完成了分包&#xff0c;如果还没有分包的先分包&#xff0c;需要上传代码时用到 1. 通常情况&#xff0c;大多数都是通过点…

VUE3实现古典音乐网站源码模板

文章目录 1.设计来源1.1 网站首页页面1.2 古典音乐页面1.3 著名人物页面1.4 古典乐器页面1.5 历史起源页面1.6 登录页面1.7 注册页面 2.效果和源码2.1 动态效果2.2 目录结构 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xc…

MIT 6.824 Lab1记录

MapReduce论文阅读 1. 编程模型 Map 函数&#xff08;kv -> kv&#xff09; Map 函数将输入的键值对处理为一系列中间值&#xff08;键值对&#xff09;&#xff0c;并将所有的中间结果传递给 Reduce 处理。 map(String key, String value):// key: document name// val…

PHP员工管理系统小程序

&#x1f4bc;高效管理&#xff0c;从“员工管理系统”开始&#x1f4bc; &#x1f4cb;【一键录入&#xff0c;信息整合】&#x1f4cb; 你是否还在为整理员工信息而手忙脚乱&#xff1f;纸质档案易丢失、电子表格易混乱&#xff0c;这些问题在“员工管理系统”面前都将迎刃…

如何使用ssm实现电商扶贫平台网站

TOC 10929ssm电商扶贫平台网站 第1章 绪论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于电商扶贫平台网站 所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;首页、个人中心、商品分类管理、热门商品管理、用户管理、系…

Android 应用申请 Google MBA权限

​ Google Case链接&#xff1a;89 > 34810 > 30025 > 155353 > Handheld > MBA Policies 按照指引填写模板 This bug is for the approval of MBAs under [13.2.2 Pregrant permissions policy](https://docs.partner.android.com/gms/policies/domains/mba#m…

DS3231时钟芯片全解析——概况,性能,MCU连接,样例代码

DS3231概述&#xff1a; 数据&#xff1a; DS3231是一个超高精度I2C实时时钟芯片&#xff0c;带有集成的温度补偿晶振。误差范围&#xff1a;温度范围为0摄氏度到40摄氏度&#xff08;2PPM&#xff09;&#xff0c;温度范围为-40摄氏度到85摄氏度&#xff08;3.5PPM&#xff0c…

栈和队列-栈的练习题

1. 逆波兰表达式 题目: 给出一个算数式的后缀表达式,我们来求他最后算数值. 在解题之前我们来认识一下中缀表达式,和后缀表达式(逆波兰表达式 我们在写数学遇到的那种形式的算数表达式就是中缀表达式,我们要从中缀表达式变为后缀表达式(逆波兰式),计算机时不知道式子的计算…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-25

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-25 0. 前言 大语言模型在很多领域都有成功的应用&#xff0c;在本期计算机前沿技术进展研究介绍中&#xff0c;我们将带来一篇用大语言模型进行诺贝尔文学作品分析的论文。虽然有一定趁最近诺贝尔奖热潮的意味&…

现代数字信号处理I-极大似然估计 学习笔记

目录 1. 极大似然估计的模型介绍 2. 极大似然估计可以达到CRLB的说明 2.1 前期准备&#xff1a;符号定义及说明 2.2 中心极限定理 2.3 大数定理 2.4 说明思路 2.5 具体过程 说明&#xff1a;此部分内容在2024版本的课程中没有提供&#xff0c;需要参考2023之前的课程&…

R语言笔记(五):Apply函数

文章目录 一、Apply Family二、apply(): rows or columns of a matrix or data frame三、Applying a custom function四、Applying a custom function "on-the-fly"五、Applying a function that takes extra arguments六、Whats the return argument?七、Optimized…

基于贝叶斯优化的K折交叉验证BP回归模型(可预测未来数据)

基于贝叶斯优化的K折交叉验证BP回归模型(可预测未来数据) 目录 基于贝叶斯优化的K折交叉验证BP回归模型(可预测未来数据)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于贝叶斯优化的K折交叉验证BP回归模型的多输入单一输出回归模型 Matlab版本&#xff1a;2020a及以…

深度学习_循环神经网络_预测平安中国股价(文末附带数据集下载链接, 长期有效, 如果有大佬愿意帮忙, 我先在这磕一个,感谢)

简介: 使用循环神经网络RNN对股价进行预测, 也就是搭建循环神经网络对中国平安的收盘股价进行预测 深度学习训练流程 1.数据集导入 2.数据预处理 3.模型训练 模型结构要求: 单层简单R…

U盘恢复数据,这四款软件你必须知道!

不管是哪个行业哪个职位&#xff0c;数据安全都是很重要的。比如说我认识的财务姐姐&#xff0c;每天处理的财务报表、客户信息、合同文件等&#xff0c;都必须确保万无一失&#xff0c;尤其是各种U盘数据。为了防止数据丢失后找不到数据的情况&#xff0c;今天来和大家分享四款…

智能管线巡检系统:强化巡检质量,确保安全高效运维

线路巡检质量的监控是确保线路安全、稳定运行的重要环节。为了有效监控巡检质量&#xff0c;采用管线巡检系统是一种高效、科学的手段。以下是对如何通过管线巡检系统实现线路巡检质量监控的详细分析&#xff1a; 一、巡检速度监控 管线巡检系统能够实时监控巡检人员的巡检速度…

算力引领 智慧安防| Gooxi助力安防行业智慧化转型

安防行业作为AI最为合适生长的天然场域&#xff0c;早在国内AI市场爆发之前就提前进行了“预演”&#xff0c;诞生了AI四小龙。当AIGC赋能安防技术革新&#xff0c;安防再次与AI浪潮撞了个满怀。在这一次大模型的浪潮中&#xff0c;安防场上的老玩家纷纷抢滩大模型。而今&#…

Word中Normal.dotm样式模板文件

Normal.dotm文档 首先将自己电脑中C:\Users\自己电脑用户名\AppData\Roaming\Microsoft\Templates路径下的Normal.dotm文件做备份&#xff0c;在下载本文中的Normal.dotm文件&#xff0c;进行替换&#xff0c;重新打开word即可使用。 字体样式如下&#xff08;可自行修改&#…