手摸手教你撕碎西门子S7通讯协议12--使用第3方通讯库读写数据

1、概述

前面通过坚强的努力,实现了多种数据类型的读写,发现还是灰常棒的,但也显示了它的不灵活性,伙伴们肯定有很多疑问,比如如何做到一个简单的命令实现读写,而不是自己拼接那些非常复杂的报文,这对开发者是很困难的,是的,这个都会解决,那就是自己动手搞通讯库开发,实现高大上的目标,但在自己动手开发通讯库之前,我们先来了解使用别人已经写好的工具,也就是通讯库S7.NET,下节开始我们来搞自己的通讯库开发,实现顶峰。

2、S7.NET通讯库介绍 

S7.NET是一个广泛应用于.NET平台的西门子PLC通信库,在使用西门子PLC进行工业自动化控制的过程中,经常利用这个工具实现与PLC进行数据交换。它为开发者提供了一系列的API函数,以便在C#、VB.NET等.NET语言中轻松实现与西门子PLC的数据交互。不过要注意的是,他仅支持以太网连接,这就表示你的设备PLC必须profinet cpu或profine外部卡,这个库采用C#编写,是基于.NET Framework或.NET Core的通信库,它通过一系列的COM组件或直接引用Native DLL文件,提供了与西门子S7系列PLC进行数据交换的接口,因此可以轻松进行调用。s7.net支持以下PLC:s7-200,s7-300,s7-400,s7-1200,s7-1500。

3、一起来

1、确保PLC硬件工作正常

这点要注意,很多人在执行程序时候,发现 代码完全没有问题,就是总异常,PLC连接失败,因此要保证前期搭建的西门子博途环境都是正常的

2、创建VS项目

这里为了展示方便,采用winform而不是控制台程序来实现应用

 

 

3、UI布局

布局方面没有精致设计,时间精力有限,要美化效果,出颜值的话需要使用另外的WINFORM控件框架,这里核心是通信操作,目前这样子,也不算差,基本效果有了,可以交差。

4、引入通讯库

 

5、连接与断开

6、产品号读取(字符串)

 

7、状态读取(bool)

8、水量读取(short)

9、液位读取(float)

 全部代码 

using S7.Net;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TrackBar;namespace west.s7siemenstest
{public partial class Form1 : Form{//1 ip地址  端口号   机架号 0  插槽 1int port;short rack = 0;short slot = 1;string ip = "";//2.plc实例Plc plc = null;//CPU型号CpuType cpuType = CpuType.S71500;public Form1(){InitializeComponent();}/// <summary>/// 连接PLC/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnConne_Click(object sender, EventArgs e){ip = txtip.Text.Trim();port = Convert.ToInt32(txtport.Text.Trim());//创建plc实例plc = new Plc(cpuType, ip, port, rack, slot);if (plc != null ){plc.Open();//打开连接if (plc.IsConnected){this.btnConne.Enabled = false;textBox1.Text = "连接PLC成功";MessageBox.Show("连接PLC成功."); } }}/// <summary>/// 断开/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnClose_Click(object sender, EventArgs e){if (plc == null){MessageBox.Show("PLC没有连接.");return;}if (plc.IsConnected){plc.Close();//关闭textBox1.Text = "已断开PLC";MessageBox.Show("已断开PLC");this.btnConne.Enabled = true;} }/// <summary>/// 读取字符串/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button9_Click(object sender, EventArgs e){if (plc == null){MessageBox.Show("请先连接PLC");return;}if (plc.IsConnected){var totalcount = plc.Read(DataType.DataBlock, 1, 22, VarType.Byte, 1);var lengthcount = plc.Read(DataType.DataBlock, 1, 23, VarType.Byte, 1);int length = Convert.ToInt32(lengthcount);string textname = plc.Read(DataType.DataBlock, 1, 24, VarType.String, length).ToString();textBox1.Text = textname;MessageBox.Show(textname,"产品号:");} }/// <summary>/// bool读取/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){if (plc == null){MessageBox.Show("请先连接PLC");return;}if (plc.IsConnected){var varaddr = "DB1.DBX0.0";var obj = plc.Read(varaddr);textBox1.Text = obj.ToString();MessageBox.Show(obj.ToString());}}private void button2_Click(object sender, EventArgs e){if (plc == null){MessageBox.Show("请先连接PLC");return;}if (plc.IsConnected){var varaddr = "DB1.DBX0.1";var obj = plc.Read(varaddr);textBox1.Text = obj.ToString();MessageBox.Show(obj.ToString());}}/// <summary>/// short读取水量/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){Button mybtn = (Button)sender;string tag = mybtn.Tag.ToString();string varaddr = ""; switch (tag){case "pum1water":varaddr = "DB1.DBW2";string str = plc.Read(varaddr).ToString() ;int cc = Convert.ToInt32(str); byte[] objbyte = BitConverter.GetBytes(cc);//转成字节数组short te = BitConverter.ToInt16(objbyte, 0);//将字节数组转成shorttextBox1.Text = te.ToString();MessageBox.Show(te.ToString()); break;case "pum2water":varaddr = "DB1.DBW4";var  obja = plc.Read(varaddr);textBox1.Text = obja.ToString();MessageBox.Show(obja.ToString());break;default:break;} }/// <summary>/// float读取/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button5_Click(object sender, EventArgs e){Button mybtn = (Button)sender;string tag = mybtn.Tag.ToString();string varaddr = "";switch (tag){case "pat1":varaddr = "DB1.DBD6"; break;case "pat2":varaddr = "DB1.DBD10"; break;case "pbt1":varaddr = "DB1.DBD14"; break;case "pbt2":varaddr = "DB1.DBD18"; break;default:break;}  var obj = plc.Read(varaddr);//返回的是uintbyte[] objbyte = BitConverter.GetBytes((uint)obj); float objfloat = BitConverter.ToSingle(objbyte, 0); textBox1.Text = objfloat.ToString();MessageBox.Show(objfloat.ToString());}}
}

4、小结

掌握西门子S7.NET通信库的使用,可以帮助开发者更高效地进行工业自动化控制系统的开发和维护。通过本文的学习,希望读者能够掌握S7.NET通信库的基本使用方法,并在实际的开发工作中灵活运用, 在实际应用中,开发者需要根据PLC的具体型号和配置,以及数据块的结构,来正确地选择数据块和读取数据。在使用S7.NET通信库时,需要注意的是,读操作的性能和效率非常重要,尤其是在工业现场,可能会涉及到大量的数据读写。因此,合理地设计程序结构,优化数据读取方式,对于保证系统的稳定性和实时性至关重要。此外,当进行PLC编程和通信时,安全性和可靠性也是不可忽视的因素。确保通信过程中的数据完整性和正确性,以及对PLC编程的规范性,都是保证控制系统安全可靠运行的关键。

这个通讯库还是蛮厉害的,真的香啊,下节来搞自己的通讯库,开发自己的通讯库,冲击奥运金牌,坐宝马开飞机。

原创不易,打字截图不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,动动你的金手指,早日实现财务自由

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

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

相关文章

在 Elasticsearch 中实现采集自动扩展

作者&#xff1a;来自 Elastic Pooya Salehi, Henning Andersen, Francisco Fernndez Castao 正确调整 Elasticsearch 集群的大小并不容易。集群的最佳大小取决于集群正在经历的工作负载&#xff0c;而工作负载可能会随着时间的推移而变化。自动扩展会自动调整集群大小以适应工…

【建议收藏】大数据Hadoop实战入门手册,配套B站视频教程1小时速通

大数据Hadoop入门实战专栏 大数据技术概述大数据简介Hadoop简介 大数据集群环境搭建环境搭建概述虚拟机准备集群搭建Java开发环境准备 分布式文件系统HDFS学习前期概述HDFS Shell命令HDFS可视化界面HDFS Java API编程环境初始化API基本使用创建目录更改目录权限上传文件查看目录…

新版HAP应用市场即将推出,诚邀意向开发者提前入驻,抢占先机

新版HAP应用市场简介 今年Q4&#xff0c;明道云HAP将会发布全新的应用市场。任何企业和个人&#xff0c;无论是明道云客户、伙伴&#xff0c;甚至是自由职业者&#xff0c;都可以入驻成为应用市场的开发者&#xff0c;上传独创的应用、插件、API&#xff0c;自由定价售卖并获得…

数说故事 | 社媒聆听“顶流”红山动物园UGC声量

7月&#xff0c;CASETiFY和南京红山森林动物园联名啦&#xff0c;一个号称“手机壳中的爱马仕”&#xff0c;一个是“动物园顶流”&#xff0c;两大IP梦幻联动&#xff0c;推出了“明星动物”系列手机壳&#xff0c;CASETiFY还解锁“饲养员”身份&#xff0c;认养了酷酷的美洲豹…

深度学习Day-27:生成对抗网络(GAN)入门

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 要求&#xff1a; 了解什么是生成对抗网络生成对抗网络结构是怎么样的学习本文代码&#xff0c;并跑通代码调用训练好…

抖音开放平台API接口如何开发||抖音相关接口数据采集数据分析 【附实例】

抖音开放平台提供了多种接口&#xff0c;包括授权登录、用户信息、视频管理、评论互动、消息通知、数据分析等。 以下是开发抖音接口的一些步骤&#xff1a; 1. 注册开发者账号&#xff1a;在抖音开放平台上注册开发者账号&#xff0c;获取开发者身份认证。 2. 创建应用&…

Oracle VM VirtualBox 异常退出,如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【Linux】进程间通信 —— 管道与 System V 版本通信方式

目录 为什么有进程间通信&#xff1f;进程间通信的目的是什么&#xff1f; 管道 匿名管道 父子进程共享管道 命名管道 共享内存 概念 原理 共享内存和内存映射&#xff08;文件映射&#xff09;的区别 使用 消息队列 概念 使用 信号量 概念 使用 IPCS 命令 S…

Docker Compose方式部署Ruoyi-前后端分离版本

目录 一. 环境准备 二. 制作一个jdk8u202环境的镜像 三. 制作nginx镜像 四. 对项目文件做修改 五. 项目打包 1. 前端打包 2. 后端打包 六. 编写docker-compose.yml 一. 环境准备 主机名IP系统软件版本配置信息localhost192.168.226.25Rocky_linux9.4 git version 2.…

码农职场:一本专为IT行业求职者量身定制的指南

目录 写在前面 推荐图书 推荐理由 写在后面 写在前面 本期博主给大家推荐一本专为IT行业求职者量身定制的指南&#xff1a;《码农职场》。 推荐图书 https://item.jd.com/14716160.html 内容简介 这是一本专为广大IT 行业求职者量身定制的指南&#xff0c;提供了从职前…

黑马JavaWeb后端案例开发(包含所有知识点!!!)

目录 1.准备工作 环境搭建 开发规范 REST&#xff08;REpresentation State Transfer&#xff09;,表述性状态转换&#xff0c;它是一种软件架构风格 注意事项 统一响应结果 2.部门管理功能 查询部门 删除部门 新增部门 RequestMapping 3.员工管理功能 分页查询 批…

单细胞|MEBOCOST·基于代谢物的细胞通讯预测(一)

import os,sys import scanpy as sc import pandas as pd import numpy as np from matplotlib import pyplot as plt import seaborn as sns from mebocost import mebocost 1. 创建 mebocost 对象 adata sc.read_h5ad(data/demo/raw_scRNA/demo_HNSC_200cell.h5ad) ## che…

开发无人带货直播插件

在当今快速发展的电商行业中&#xff0c;直播带货已成为推动销售增长的重要力量&#xff0c;然而&#xff0c;随着直播市场的日益饱和和消费者需求的不断变化&#xff0c;如何在保持直播互动性的同时&#xff0c;实现高效、低成本的运营成为许多商家关注的焦点。 无人带货直播…

springboot 微信消息推送 springboot sse推送

目录 一、springboot 微信消息推送 springboot sse推送 1、在 Spring 框架中实现 2、传统的 Servlet 中实现 一、springboot 微信消息推送 springboot sse推送 关于 SSE SSE 全程 Server Send Event&#xff0c;是 HTTP 协议中的一种&#xff0c;Content-Type 为 text/event…

Android 自定义圆形进度条样式

效果 代码 主要是设置属性indeterminateDrawable <ProgressBarandroid:id"id/iv_progress"android:layout_width"20dp"android:layout_height"20dp"android:layout_gravity"center"android:layout_marginStart"15dp"and…

清爽简洁!这可能是开源界功能最强大的项目开发管理系统

&#x1f482; 个人网站: IT知识小屋&#x1f91f; 版权: 本文由【IT学习日记】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录 写在前面项目简介项目特点设计思想技术栈项目展示项目获取 写在前…

❤️‍FlyFlow:新增表格布局表单

FlyFlow 介绍 官网地址&#xff1a;www.flyflow.cc ElementPlus演示网址&#xff1a;pro.flyflow.cc AntDesign演示网址&#xff1a;ant.flyflow.cc FlyFlow 借鉴了钉钉与飞书的界面设计理念&#xff0c;致力于打造一款用户友好、快速上手的工作流程工具。相较于传统的基于 …

21. Hibernate 性能之数据库连接池

1. 前言 从本节课程开始&#xff0c;和大家一起聊聊 Hibernate 中的性能问题&#xff0c;面对开发者&#xff0c;Hibernate 表现出卓越的数据库操作能力。 使用框架最大的优势就是带来操作的快捷、便利。同时&#xff0c;因为框架的封装性&#xff0c;其性能往往比原生开发要…

【PostGresql】---- pgSql 将列中合并字符串拆分为多行 实例代码

-- 将 AQY_ID,AQY 中的字符串拆分为多行 SELECT"ID","AQY_ID","AQY",UNNEST ( string_to_array( "AQY_ID", , ) ) AS "AQY_ID_1",UNNEST ( string_to_array( "AQY", , ) ) AS "AQY_1" FROM"JF_SGC…

30.jdk源码阅读之ReentrantReadWriteLock

1.写在前面 ReentrantReadWriteLock 是 Java 并发包中的一个读写锁实现&#xff0c;它允许多个读线程同时访问共享资源&#xff0c;但在写线程访问时&#xff0c;所有的读线程和其他写线程都会被阻塞。不知道大家在日常工作中这个类使用的多不多&#xff0c;对于它的底层实现有…