记录|C#连接PLC通讯

news2024/9/17 7:41:48

参考视频C#连接S71200PLC
参考资料

目录

  • 前言
  • 一、使用工具
  • 二、博图PLC
    • 1.创建好PLC设备
      • Step1. 创建新设备
      • Step2. 自动配置CPU
      • Step3. 配置IP协议和连接机制
      • 隐藏步骤:重置解决PLC硬件版本和PLCSim创建的PLC版本不兼容
      • Step4. 通过HslDemo来测试是否连通
      • Step5. 配置DB数据块【连通后才有意义,之后配置好后只需写入设备】
      • 问题:如何将DB块下载到设备中
  • 三、VS控制台连接
    • Step1 新建项目
    • Step2. 编写
      • 补充:DB块知识
      • 特别注意
  • 四、VS的窗口连接
    • 1. 创建Windows窗体项目
    • 2. 配置连接
    • 3. 按钮进行读写控制
        • `效果展示`
        • `开关按钮`
        • `定时器`
        • `修改数据按钮`
        • `显示文本`
  • C#中的部分问题解决【持续补充
    • 1. textbox无法调整大小
    • 2. Boolean对象强制转换String对象错误
    • 3. Read()方法使用
    • 4. Write()方法使用
  • 更新时间线


前言

学习完了如何用LabVIEW连接PLC后,进行下一步如何使用C#连接PLC。
这里会进行”控制台连接“和”窗口连接“两种方式。
在这里插入图片描述


一、使用工具

  • 软件:
    • Visual Studio2022,
    • HslCommunication【VS插件】
    • 博图PLCSim V16
  • 硬件:
    • PLC硬件
    • 网线

二、博图PLC

1.创建好PLC设备

Step1. 创建新设备

在这里插入图片描述

Step2. 自动配置CPU

  • 对于创建的空白CPU,我们直接点击“获取”。【这里的前提是,已经有实体PLC,并且PLC通过网线和电脑相连接】。
  • 在新界面中,选择好接口,点击搜索,最后点击检测,就能实现根据实际PLC硬件来配备CPU。

在这里插入图片描述

Step3. 配置IP协议和连接机制

在这里插入图片描述

隐藏步骤:重置解决PLC硬件版本和PLCSim创建的PLC版本不兼容

点击“在线连接”后,会自动断开,并出现下面的标志,就代表版本不兼容。
在这里插入图片描述
首先,选择CPU,右击“更改设备“,擦看版本是否对。我这里明显需要4.2版本的。【这里版本需要小伙伴自己确认】
在这里插入图片描述
之后点击”在线“查看
在这里插入图片描述

如果还是没解决,那么最后一招:重置
在这里插入图片描述

Step4. 通过HslDemo来测试是否连通

在这里插入图片描述

Step5. 配置DB数据块【连通后才有意义,之后配置好后只需写入设备】

对数据块配备数据的时候,必须将属性中的优化和指定访问可去掉。
在这里插入图片描述

问题:如何将DB块下载到设备中

【如下图】我遇到了DB块下载不进设备中的问题:
在这里插入图片描述
右击“数据块_1[DB1]”,选择实际值的快照。
在这里插入图片描述
【第二次下载数据到设备中时,将出现下面数据库重新初始化的问题】
在这里插入图片描述
这里可以先选择”将快照值复制到起始值中“
在这里插入图片描述


三、VS控制台连接

Step1 新建项目

在这里插入图片描述
对于新建的项目,添加个S7.net插件。【下图所示:
在这里插入图片描述
在项目文件中导入using S7.Net;

在这里插入图片描述
在这里插入图片描述
编写测试连接程序:
在这里插入图片描述
上面的Read()方法只是简单演示,这么用不够高效,可以看Read()方法使用
结果显示为:
在这里插入图片描述

Step2. 编写

依据

Read()方法使用

结合我在PLC中DB块中设置的内容,C#编程中的Read()内容修改为如下【个人认为比DBX,DBB,DBW这些表示好懂多了】

using S7.Net;

namespace C__Link_S71200
{

    internal class Program
    {
    //实例化的同时,建立和PLC的连接
        static Plc my1200 = new Plc(CpuType.S71200,"192.168.0.10",0,1);
       
        static void Main(string[] args)
        {
            my1200.Open();
            do
            {
                int db = 1;
                var readValue = my1200.Read(DataType.DataBlock,db,2,VarType.Int,1);
                Console.WriteLine($"从偏移量为2的位置开始,读取1个Int类型的数据,值为:{readValue}");

                readValue = my1200.Read(DataType.DataBlock, db, 4, VarType.Int, 1);
                Console.WriteLine($"从偏移量为4的位置开始,读取1个Int类型的数据,值为:{readValue}");

                
                Thread.Sleep(3000);
                Console.Clear();

            } while (true);
        }
    }
}

我的VS运行后的结果为:
在这里插入图片描述

补充:DB块知识

参考文章:《西门子DB》

  • DB数据块

  • DB100:指编号为100的数据块;

    • DBX0.0:在数据块中,第一个字的第一个位。
    • DB100.DBX0.0:编号为100的数据块中,第一个字节的第一位的值
  • DBW2,第二个字,一个字2个字节,共16位。存储Int数据。
    DBX0,一个字节,存储Bool类型数据。
    DB0,32位,存储Real类型数据。

特别注意

  • 编程中的int是32位。而PLC中的Int和Word型都是16位。【天坑】

四、VS的窗口连接

1. 创建Windows窗体项目

在这里插入图片描述
在这里插入图片描述


2. 配置连接

在这里插入图片描述

在这里插入图片描述

3. 按钮进行读写控制

效果展示

在这里插入图片描述


开关按钮
  • 功能:控制PLC连接,依据是否连接更改按钮的颜色
  • 绿色代表连接上;灰色表示未连接上【这一步在定时器中做了,也可以在按钮中做】
    代码 :
        private void button1_Click(object sender, EventArgs e)
        {
            //关闭连接,按钮变银色;建立连接,按钮变绿色【颜色变化在定时器中做了,也可以在这里的按钮做】
            if (my1200.IsConnected)
            {
                my1200.Close();
            }
            else
            {
                my1200.Open();
            }

        }

定时器
  • 功能:设定多长时间后执行什么动作。
  • 这里设定500ms后进行连接按钮的颜色变化。-在这里插入图片描述

代码:

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (my1200.IsConnected)
            {
                button1.BackColor = Color.Green;
                button1.Text = "已连接";
            }
            else
            {
                button1.BackColor = Color.Gray;
                button1.Text = "未连接";
            }
        }

修改数据按钮
  • 功能:根据点击按钮,实现更改DB块中DB1.DBX0.0的位置的值
        private void button2_Click(object sender, EventArgs e)
        {
            bool value = (bool)my1200.Read("DB1.DBX0.0");
            //更改后的值为1,那么按钮显示绿色,否则显示为灰色。
            button2.BackColor = !value ? Color.Green : Color.Gray;
            my1200.Write("DB1.DBX0.0", !value);
            textBox1.Text = "DB1.DBX0.0的值:" + my1200.Read("DB1.DBX0.0").ToString();

        }
显示文本
  • 功能:显示文本内容。这里面我们不用写任何代码,直接用textBox1.Text直接赋值即可。调用代码已经在上面的"修改数据按钮"的代码中出现了。

C#中的部分问题解决【持续补充

1. textbox无法调整大小

在这里插入图片描述
在这里插入图片描述


2. Boolean对象强制转换String对象错误

在这里插入图片描述
解决方法:
用ToString()解决

textBox1.Text = my1200.Read("DB1.DBX0.0").ToString();

3. Read()方法使用

参考文章c#使用s7netplus读取plc数据
其中:

  • db=1,代表DB1
    在这里插入图片描述
  • DataBlock是默认值

简单用例:
单个值读写

int db = 1;
//读取bool
//参数分别为数据块类型,数据块,偏移量,读取类型,读取个数
var boolDemo = plc.Read(DataType.DataBlock, db,  0, VarType.Bit,  1);
 
Console.WriteLine("bool值打印:" + boolDemo);

//写入bool
plc.Write(DataType.DataBlock, db, 0, false);//false表示写入的值

多个值读写【数组

short[] arr_short_int = new short[10];

arr_short_int = (short[])my1200.Read(DataType.DataBlock, db, 2, VarType.Int, 10);

Console.WriteLine("从偏移量为2的位置开始,连续读取10个数据,值为:");
foreach(var value in arr_short_int)
 {
   Console.WriteLine(value);
 }

4. Write()方法使用

特别注意:plc中的int是c#中的short,所以需要进行类型转换,否则将赋0
正确写入如下:
PLC的Int型

my1200.Write(DataType.DataBlock, db, 2, (short)66);

readValue = my1200.Read(DataType.DataBlock, db, 2, VarType.Int, 1);
Console.WriteLine($"从偏移量为2的位置开始,读取1个Int类型的数据,值为:{readValue}");

我的visual studio运行效果为:
在这里插入图片描述
PLC的Real型
不强转的话,就是默认是double型的62.6,double是64位;而Real是32位。

my1200.Write(DataType.DataBlock, db, 62, (float)62.5);

更新时间线

  • 2024-07-11:创建
  • 2024-07-12:VS控制台连接编写
  • 2024-07-15:窗口编程中的textBox无法修改该部件的大小。实际案例。
  • 2024-07-16:补充Real型的Write写法

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

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

相关文章

C语言课程回顾:十、C语言之 指针

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 C语言之 指针 10 指针10.1 地址指针的基本概念10.2 变量的指针和指向变量的指针变量10.2.1 定义一个指针变量10.2.2 指针变量的引用10.2.3 指针变量作为函数参数10.2.4 指针变…

性能测试中唯一标识的JMH测试

前文分享了几种性能测试中常用到的生成全局唯一标识的案例,虽然在文中我猜测了几种方案设计的性能,并根据自己的经验给出了适用的场景。 但对于一个性能测试工程师来讲,有真是测试数据才更有说服力。这让我想起来之前学过的Java微基准测试框…

记录些MySQL题集(2)

MySQL 不使用limit的分页查询 limit问题:limit,offset递增问题。随着offset的增加,条数不变,耗时却增加了。 limit 0,10 耗时1ms limit 300000,10 耗时152ms limit 600000,10 耗时312ms 毫秒级别可能没感觉。假…

java:aocache 与Spring Aop兼容问题

本文适用于所有AspectJ与Spring AOP混用的场景。 Spring AOP 是基于动态代理的实现AOP,基于 JDK代理和CGLib代理实现运行时织入(runtime weaving)。 Spring AOP的切面定义沿用了ASpectJ的注解体系,所以在Spring体系中注解定义切面…

Java 将图片转base64和base64转图片

工具 Base64 和 图片互转。 导入的依赖 <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl --><dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>4.0.5</versi…

【Hot100】LeetCode—118. 杨辉三角

目录 题目1- 思路2- 实现⭐118. 杨辉三角——题解思路 3- ACM 实现 题目 原题连接&#xff1a;118. 杨辉三角 1- 思路 思路 爬楼梯&#xff1a;动规五部曲 2- 实现 ⭐118. 杨辉三角——题解思路 class Solution {List<List<Integer>> res new ArrayList<&g…

嵌入式全栈设计思路:STM32G4+ChibiOS+FreeRTOS+PID控制+PFC算法构建高效智能电源管理系统(附代码示例)

智能电源管理系统是一个基于STM32G4微控制器的高性能数字电源控制解决方案。本项目旨在设计一个功能全面、高效稳定的电源管理系统,可广泛应用于工业控制、新能源、通信设备等领域。 1.1 系统主要特点 高精度数字电源控制&#xff1a;利用STM32G4的高性能ADC和定时器,实现精确…

2024年肥西县“北斗·劳技科普进校园”赛事活动圆满举行

2024年6月13日肥西县“北斗劳技科普进校园”赛事活动在肥西实验高级中学圆满举行。本次赛事由肥西县关心下一代工作委员会和肥西县教育体育局主办&#xff0c;肥西县航空航海模型协会承办&#xff0c;肥西县实验高级中学协办&#xff0c;并得到了赛哆哆、凡尼科技中心和肥西艾瞳…

为什么渲染农场渲染的是帧,而不是视频?

在3D动画产业的壮阔画卷中&#xff0c;渲染农场作为幕后英雄&#xff0c;以其庞大的计算能力支撑起无数视觉奇观的诞生。这些由高性能计算机集群构成的系统&#xff0c;通过独特的逐帧渲染策略&#xff0c;解锁了单机难以企及的创作自由与效率。本文将深入剖析这一策略背后的逻…

springcloud使用微服务的搭建

微服务的搭建 1.配置对应信息 Springboot 、springcloud、springcloud alibaba对应关系 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 2.pom.xml的配置 2.1 总项目pom.xml引入依赖 <parent><groupId>org.sprin…

从库存超卖问题分析锁和分布式锁的应用(二)

本文从一个经典的库存超卖问题分析说明常见锁的应用&#xff0c;假设库存资源存储在Redis里面。 假设我们的减库存代码如下&#xff1a; Autowired StringRedisTemplate redisTemplate;public void deduct(){String stock redisTemplate.opsForValue().get("stock"…

docker desktop历史版本安装

1.安装choco Windows安装 choco包管理工具-CSDN博客 2.通过choco安装 下面例子为安装旧版2.3.0.2,其它版本类似 Chocolatey Software | Docker Desktop 2.3.0.2 https://download.docker.com/win/stable/45183/Docker%20Desktop%20Installer.exe choco install docker-des…

linux高级编程(网络)(www,http,URL)

数据的封包和拆包 封包&#xff1a; 应用层数据&#xff08;例如HTTP请求&#xff09;被传递给传输层。传输层&#xff08;TCP&#xff09;在数据前添加TCP头部&#xff08;包含端口号、序列号等&#xff09;。网络层&#xff08;IP&#xff09;在TCP段前添加IP头部&#xff…

【从0到1进阶Redis】主从复制 — 主从机宕机测试

上一篇&#xff1a;【从0到1进阶Redis】主从复制 测试&#xff1a;主机断开连接&#xff0c;从机依旧连接到主机的&#xff0c;但是没有写操作&#xff0c;这个时候&#xff0c;主机如果回来了&#xff0c;从机依旧可以直接获取到主机写的信息。 如果是使用命令行&#xff0c;来…

底软驱动 | 大厂面试爱考的C++内存相关

文章目录 C内存相关C内存分区C对象的成员函数存放在内存哪里 堆和栈的区别堆和栈的访问效率“野指针”有了malloc/free为什么还要new/deletealloca内存崩溃C内存泄漏的几种情况内存对齐柔性数组参考推荐阅读 C内存相关 本篇介绍了 C 内存相关的知识。 C内存分区 在C中&#…

【python学习】numpy第三方库的定义、功能、使用场景和使用以及遇到的一些问题

引言 python学习学习到第三方库知识&#xff0c;首先学习的就是机器学习以及对应的numpy第三方库 文章目录 引言一、numpy第三方库的定义二、numpy第三方库的功能2.1数组操作2.2 线性代数计算2.3 随机数生成2.4 文件读写 三、numpy第三方库的使用场景3.1需要进行数值计算3.2 需…

PyCharm软件初始化配置

安装完pycharm后&#xff0c;需要对其进行个性化设置&#xff0c;分别设置方法如下 目录 一、修改主题二、修改默认字体和大小三、设置拖动滚轮改变字体大小四、常见快捷键 一、修改主题 1、界面右上角点击红框的内容 2、选择Theme选项 3、选择对应的主题 第一二个是白色主题…

通俗易懂多图透彻讲解二叉树的遍历--前序, 中序和后序

二叉树的遍历是一个数据结构中经常会遇到的知识点, 具体又分为前序, 中序和后序三种. 什么是树? 先来理解一下什么是树, 从一个我们相对熟悉的家谱树(Family Tree)说起吧. 家族的根是爷爷, 然后生了两个娃, 大伯和你爸爸. 继续往下, 有堂哥堂姐, 还有你以及你妹, 等等. 一个…

工业智能网关的边缘计算能力赋能工业4.0

边缘计算是将数据处理和分析能力推向网络边缘的技术&#xff0c;使得终端设备能够实时、快速地响应环境变化&#xff0c;并做出相应决策。在智能制造中&#xff0c;通过5G工业网关的边缘计算能力&#xff0c;企业可以实现对生产线上大量传感器数据的实时采集、处理和分析&#…

Linux0715

一切皆文件&#xff0c;文件IO已经学习完毕&#xff0c;这两天完成一个minishell的小项目 文件操作 1. 标准IO 具有缓冲区 是对普通文件的读写 1. fopen ----------------------------->文件流指针 FILE * …