记录|.NET上位机开发和PLC通信的实现

news2024/11/15 11:44:30

本文记录源自:B站视频
实验结果:跟视频做下来是没有问题的。能运行。

目录

  • 前言
  • 一、项目
    • Step1. 创建项目
    • Step2. 创建动态图片展示
    • Step3. 创建图片型按钮
    • Step4. 创建下拉框
    • Step1~4的效果展示
    • Step5. 编程
      • `实体类`
      • `操作类`
      • `Main函数`
    • Step1~5的效果展示
      • `Main函数`
    • 最终效果:
  • 二、补充内容
    • 1. FlatStyle属性
  • 更新时间线


前言

在练习完基本的C#和.NET使用后,做下了记录|C#连接PLC通讯
现在打算跟B站视频做一个简单的C#项目。这篇文章做这个记录。
在这里插入图片描述


一、项目

Step1. 创建项目

  • 是个Windows窗口(.NET framework)

Step2. 创建动态图片展示

  • 首先,在自己项目的Debug文件位置处,去建立个images文件,用于存放图片【其中,Debug文件是指自己调试的程序;Release文件是指上线使用的程序】
    在这里插入图片描述
  • 动图需要准备一张.png和一张.gif
  • 在使用PictureBox组件,将图片添加进去,将组件的属性中的SizeMode改为Zoom
    在这里插入图片描述

Step3. 创建图片型按钮

  • 目的:实现一个具有图片的按钮【本质是button控件】
  • 先对button中FlatSytle属性改为Flat,之后才能使用Image属性。
    在这里插入图片描述
    据此创建出两个图片按钮:
  • 连接PLC按钮
  • 启动设备按钮
    在这里插入图片描述

Step4. 创建下拉框

  • ComboBox组件
    在里面提前设定好两个值:S71200和S71500
    在这里插入图片描述

Step1~4的效果展示

在这里插入图片描述


Step5. 编程

实体类

  • 创建Models文件夹,存放实体类EquipState。
  • 实体类类名:EquipState
  • 只存放方法名,等待实现

EquipState类:

namespace thinger.ProjectDemo
{
    /// <summary>
    /// 生产设备状态实体类
    /// </summary>
    internal class EquipState
    {
        public bool Start { get; set; }//设备启动

        public bool Stop { get; set; }//停止

        public bool Task1 { get; set; }//任务1

        public bool Task2 { get; set; }
        public bool Task3 { get; set; }
        public bool RunState { get; set; }//运行状态:1,正常   0 报警
        public ushort RunModel { get; set; }//运行模式:1,普通 2,加速    3,满载
        public float SiteData1 { get; set; }//位置数据1
        public float SiteData2 { get; set; }//位置数据2
        public float SiteData3 { get; set; }//位置数据3
        public float SpeedData1 { get; set; }//速度数据1
        public float SpeedData2 { get; set; }//速度数据2
    }
}

操作类

  • 创建个Manager文件,该文件夹下面创建EquipControlManager类
  • 类中的基本3个方法:ConnectPLC、ClosePLC、WriteDataToPLC
  • ConnectPLC,实现对PLC的连接并返回提示。因此,返回类型位string。

EquipControlMananger类:

namespace thinger.ProjectDemo.Manager
{
    /// <summary>
    /// 设备操作类
    /// </summary>
    internal class EquipControlManager
    {
        //先对Plc对象进行声明
        private Plc s7NetPlc = null;

        /// <summary>
        /// 连接PLC
        /// </summary>
        /// <param name="ipAddress"></param>
        /// <param name="cpuType"></param>
        /// <returns></returns>
        public string ConnectPLC(string ipAddress, string cpuType)
        {
            try
            {
                //CpuType是个enum,枚举类型,因此,需要对string类型进行转换
                CpuType currentCpuType = (CpuType)Enum.Parse(typeof(CpuType), cpuType, true);

                s7NetPlc = new Plc(currentCpuType, ipAddress, 0, 0);
                s7NetPlc.Open();
                return "PLC连接成功";
            }
            catch (Exception ex)
            {
                return $"PLC连接失败,{ex.Message}";
            }

        }

        /// <summary>
        /// 关闭PLC
        /// </summary>
        public void ClosePLC()
        {
            s7NetPlc.Close();
        }

        /// <summary>
        /// 按照指定地址,写入数据【位、字节、字、双字】
        /// </summary>
        /// <param name="varAddress"></param>
        /// <param name="varValue"></param>
        /// <returns></returns>
        public string WriteDataToPLC(string varAddress, object varValue)
        {
            lock (this)
            {
                try
                {
                    this.s7NetPlc.Write(varAddress, varValue);
                    return "写入数据成功";
                }
                catch (Exception ex)
                {
                    return $"写入数据失败,{ex.Message}";
                }

            }
        }
    }
}

Main函数

namespace thinger.ProjectDemo
{
    public partial class FrmMain : Form
    {
        private EquipControlManager controlManger=new EquipControlManager();
        public FrmMain()
        {
            InitializeComponent();
        }
        
        /// <summary>
        /// 打开和关闭PLC
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPLCConnect_Click(object sender, EventArgs e)
        {
            //Tag记录的是之前的开关状态,只有off和on
            //如果之前off,那么改为on
            if (this.btnPLCConnect.Tag.ToString().Equals("off"))
            {
                string connectManager = controlManger.ConnectPLC("192.168.0.10", this.cbbPLCType.Text);
                this.btnPLCConnect.Tag = "on";
                this.btnPLCConnect.Image = Image.FromFile("images/plcOpen.png");
                MessageBox.Show(connectManager);
            }
            else
            {
                controlManger.ClosePLC();
                this.btnPLCConnect.Tag="off";
                this.btnPLCConnect.Image = Image.FromFile("images/plcClose.png");
            }
        }
    }
}

Step1~5的效果展示

在这里插入图片描述


Main函数

  • 添加了修改操作
       /// <summary>
       /// 操作设备
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void btnSwitch_Click(object sender, EventArgs e)
       {
           if (this.btnPLCConnect.Tag.ToString().Equals("off"))
           {
               MessageBox.Show("请先连接PLC", "操作提示");
               return;
           }
           //获取Tag中的地址值
           string[] tags = this.btnSwitch.Tag.ToString().Split('-');

           if (tags[0].Equals("off"))
           {
               //打开冷却泵
               this.pictureBox1.Image = Image.FromFile("images/电机.gif");
               this.btnSwitch.Image = Image.FromFile("images/btnOn.png");
               this.btnSwitch.Tag = $"on-{tags[1]}";
               //修改PLC中的值
               controlManger.WriteDataToPLC(tags[1], true);
           }
           else
           {
               this.pictureBox1.Image = Image.FromFile("images/电机.png");
               this.btnSwitch.Image = Image.FromFile("images/btnOff.png");
               this.btnSwitch.Tag = $"off-{tags[1]}";
               //修改PLC中的值
               controlManger.WriteDataToPLC(tags[1], false);
           }

       }

最终效果:

在这里插入图片描述


二、补充内容

1. FlatStyle属性

  • 功能:设置Windows Forms控件(如:按钮、标签等)。
  • Flat:产生“平面”效果,将空间的边框移除
  • Standard:默认,三维效果。

更新时间线

  • 2024.07.15:创建文章

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

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

相关文章

[Python学习篇] Python PyMysql

什么是PyMysql PyMysql是一个纯 Python 实现的 MySQL 客户端库&#xff0c;允许你在 Python 程序中与 MySQL 数据库进行交互。 安装PyMysql PyMysql地址&#xff1a;https://pypi.org/project/PyMySQL/ pip install pymysql 使用PyMysql 连接mysql import pymysql# 数据库连…

数据库redis命令作业九

1、安装redis&#xff0c;启动客户端、验证。 2、string类型数据的命令操作&#xff1a; &#xff08;1&#xff09; 设置键值&#xff1a; &#xff08;2&#xff09; 读取键值&#xff1a; &#xff08;3&#xff09; 数值类型自增1&#xff1a; &#xff08;4&#xff09; 数…

【单片机毕业设计选题24064】-基于阿里云的鱼塘水质检测系统

系统功能: 主控为STM32F103C8T6&#xff0c;通过PH值传感器、浑浊度传感器、温度传感器采集各项水质数据&#xff0c;系统可设定各参数 的阈值&#xff0c;超过设定的阈值将通过蜂鸣器响来提醒用户做出措施&#xff0c;同时通过ESP-12F WIFI模块将设备连接阿里云 物联网平台…

信通院全景图发布 比瓴科技领跑软件供应链安全,多领域覆盖数字安全服务

近日&#xff0c;中国信息通信研究院在2024全球数字经济大会—数字安全生态建设专题论坛正式发布首期《数字安全护航技术能力全景图》&#xff08;以下简称全景图&#xff09;。 比瓴科技入选软件供应链安全赛道“开发流程安全管控、交互式安全测试、静态安全测试、软件成分分…

rtf是什么格式的文件?rtf格式和word的区别是什么?

RTF是什么格式的文件? RTF&#xff08;富文本格式&#xff0c;Rich Text Format&#xff09;和Word文档&#xff08;以.doc和.docx为扩展名的Microsoft Word文档&#xff09;是两种常用的文本文件格式。它们在文件结构、兼容性、功能和使用场景等方面存在一些显著差异。 比如…

泰迪智能科技江西大数据实验室成功案例介绍说明

高校大数据实验室作为作为支撑高校人培方案实施的核心设施&#xff0c;实验室的建设一定要与学科建设、人才培养充分融合&#xff0c;是一个包含物理空间硬件资源软件资源课程内容的系统化工程。高校在实验室规划过程中&#xff0c;第一要务就是从学科定位出发、结合学校的特色…

ASP.NET MVC-制作可排序的表格组件-PagedList版

环境&#xff1a; win10 参考&#xff1a; 学习ASP.NET MVC(十一)——分页 - DotNet菜园 - 博客园 https://www.cnblogs.com/chillsrc/p/6554697.html ASP.NET MVCEF框架实现分页_ef 异步分页-CSDN博客 https://blog.csdn.net/qq_40052237/article/details/106599528 本文略去…

分布式IO系统BL201 Profinet耦合器

BL201耦合器是一个数据采集和控制系统&#xff0c;基于强大的32 位微处理器设计&#xff0c;采用Linux操作系统&#xff0c;是一种模块化的分布式I/O系统。该系统由3部分组成&#xff1a;现场总线耦合器和各种类型的&#xff08;数字和模拟信号以及特殊功能&#xff09;I/O模块…

部署k8s 1.28.9版本

继上篇通过vagrant与virtualBox实现虚拟机的安装。笔者已经将原有的vmware版本的虚拟机卸载掉了。这个场景下&#xff0c;需要重新安装k8s 相关组件。由于之前写的一篇文章本身也没有截图。只有命令。所以趁着现在。写一篇&#xff0c;完整版带截图的步骤。现在行业这么卷。离…

C#与倍福Plc通信——使用仿真软件模拟倍福PLC运行

前言 我们在编写上位机与倍福PLC通信的过程中,有时候我们没有真实的Plc,但是我们又想提前测试与倍福PLC的通信,那么这个时候我们就可以使用倍福的仿真软件模拟PLC,然后我们上位机就可以与仿真PLC进行通信了,下面进行详细介绍: 1、下载并安装倍福PLC编程软件TwinCAT 安…

Uniapp自定义动态加载组件(2024.7更新)

1.本次介绍如何使用uniapp实现自定义动态加载Loading的组件&#xff0c;可以gif格式&#xff0c;也可以mp4格式等; 编写自定义Loading组件(CustomLoader.vue)&#xff1b;组件中含有“动态接收图片路径”&#xff0c;“10秒超时未false则自动断开关闭Loading”&#xff1b;在全…

基于STC8H4K64TL单片机的触摸功能调试

基于STC8H4K64TL单片机的触摸功能调试 STC8H4K64TL单片机介绍STC8H4K64TL单片机管脚图(48个引脚)STC8H4K64TL单片机串口仿真与串口通信STC8H4K64TL单片机管脚图(32个引脚)STC8H4K64TL单片机管脚图(20个引脚)STC8H系列单片机管脚说明STC8H系列单片机I/O口STC8H系列单片机I…

在MoneyPrinterPlus中使用本地chatTTS语音模型

之前MoneyPrinterPlus在批量混剪,一键AI生成视频这些功能上的语音合成功能都用的是云厂商的语音服务&#xff0c;比阿里云&#xff0c;腾讯云和微软云。 云厂商虽然提供了优质的语音服务&#xff0c;但是用起来还是要收费。 为了各位小伙伴的钱包&#xff0c;现在特意给Money…

基于二次规划优化的OFDM系统PAPR抑制算法的matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于二次规划优化的OFDM系统PAPR抑制算法的matlab仿真. 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 &#xff08;完整程序运行后无水印&#xff09;…

【Springboot】新增profile环境配置应用启动失败

RT 最近接手了一个新的项目&#xff0c;为了不污染别人的环境&#xff0c;我新增了一个自己的环境配置。结果&#xff0c;在启动的时候总是失败&#xff0c;就算是反复mvn clean install也是无效。 问题现象 卡住无法进行下一步 解决思路 由于之前都是能启动的&#xff0c…

zookeeper+kafka的消息队列

zookeeperKafka 两个都是消息队列的工具 消息队列 出现原因&#xff1a;生产者产生的消息与消费者处理消息的效率相差很大。为了避免出现数据丢失而设立的中间件。 在消息的生产者与消费之间设置一个系统&#xff0c;负责缓存生产者与消费者之间的消息的缓存。将消息排序。 优…

nginx生成自签名SSL证书配置HTTPS

一、安装nginx nginx必须有"--with-http_ssl_module"模块 查看nginx安装的模块&#xff1a; rootecs-7398:/usr/local/nginx# cd /usr/local/nginx/ rootecs-7398:/usr/local/nginx# ./sbin/nginx -V nginx version: nginx/1.20.2 built by gcc 9.4.0 (Ubuntu 9.4.0…

MySQL之触发器

1&#xff0c;创建表 CREATE TABLE Product (Id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,Name VARCHAR(20) NOT NULL,Function VARCHAR(50),Company VARCHAR(20) NOT NULL,Address VARCHAR(20) ); CREATE TABLE Operate (Op_id INT(10) NOT NULL AUTO_INCREMENT PRIMAR…

Leetcode—146. LRU 缓存【中等】(shared_ptr、unordered_map、list)

2024每日刷题&#xff08;143&#xff09; Leetcode—146. LRU 缓存 先验知识 list & unordered_map 实现代码 struct Node{int key;int value;Node(int key, int value): key(key), value(value) {} };class LRUCache { public:LRUCache(int capacity): m_capacity(capa…

Spring Boot集成qwen:0.5b实现对话功能

1.什么是qwen:0.5b&#xff1f; 模型介绍&#xff1a; Qwen1.5是阿里云推出的一系列大型语言模型。 Qwen是阿里云推出的一系列基于Transformer的大型语言模型&#xff0c;在大量数据&#xff08;包括网页文本、书籍、代码等&#xff09;进行了预训练。 硬件要求&#xff1a;…