手摸手教你撕碎西门子S7通讯协议02--socket连接

1、S7协议通讯流程回顾

1)建立Socket连接:进行TCP三次握手 

这里是指要建立socket的tcp连接,是tcp连接而不是udp连接,tcp连接是可靠连接,tcp连接就是要有稳定的IP地址,它是通过字节方式进行通讯,在程序中就是要创建socket对象,利用socket的方式来实现字节的发送和接收,包括解析数据,这个socket是连接谁呢?肯定是连接plc设备,所以plc设备必须有IP地址,端口号,那么谁去连接了,当然是我们的PC电脑,电脑在这个场景下就是我们的上位机,软件工程师通过开发应用程序来与PLC通讯,模型如下:

2)COTP的握手请求(请求建立通信)

在“握手”之后,并不能马上进行数据交换,需要进行这一步的操作,即客户端发送COTP报文给服务端,在COTP报文中包含“连接请求”和“Destination TSAP”,以明确CPU的机架号和槽号;服务端应答COTP报文,包含“连接确认”;这样服务端就清楚了客户端需要和哪个CPU来进行数据通讯。在这个过程中,有非常标准和严重要求的报文格式,这个过程会有22个字节,每个报文的字段内容代表不同的含义,千万不能搞错,否则服务器,也就是PLC就会不搭理你。报文信息如下,搞不懂没有关系,后面的文章会详细介绍,手摸手教,服务到位,包你满意。

3)S7COMM的握手请求(请求建立操作通信)

在成功完成上面的COTP请求后,现在客户端发送S7 Communicaton报文给服务端,在S7Communicaton报文中包含“通讯请求”; 服务端反馈S7 Communicaton报文。同样的报文中每个字段都有含义,必须严格遵守,这个过程是交换通信信息,共25个字节,报文信息如下:搞不懂没有关系,后面的文章会详细介绍,手摸手教,服务到位,包你满意。

4) 进行读写操作(S7协议报文)

 在成功完成上面的1,2,3的三个过程后,现在才是读、写、PLC启停、时间、上传下载等,读取的报文比写入的报文要简单些,但报文结构确实复杂,需要大师给你开光,现在搞不懂没有关系,后面的文章会详细介绍,手摸手教,服务到位,包你满意。

2、开搞socket连接 

1)安装西门子博途v15环境

应用环境要求是win10企业版,搭建这个西门子PLC的环境还是蛮消耗时间,精力和能力,耐心的,要求也高,这个事情必须做好,不能偷懒,绝不能失败,否则整个系列的内容就实现不了,具体安装过程请看下面文章,这里不展示,因为过程实在是众多,需要细致。

windows10企业版安装西门子博途V15---01准备环境_博途v15.1安装需求-CSDN博客

windows10企业版安装西门子博途V15---02安装软件_博图v15软件安装步骤-CSDN博客

windows10企业版安装西门子博途V15---03安装仿真软件_西门子v15仿真软件-CSDN博客

windows10企业版安装西门子博途V15---04连接测试_博图v15第一次连接plc步骤-CSDN博客

1)西门子PLC存储区简介

I:数字量输入(DI)

Q:数字量输出

AI:模拟量输入

AQ:模拟量输出

V:变量存储区

M:位存储区

T:定时器存储区

C:计数器存储区

HC:高速计数器

AC:累加器

SM:特殊存储器

L:局部存储区

S:顺序控制继电器

DB:数据块

2)访问规则:bit、B、W、D B:byte W:word ->2byte D:double->4byte Bit: I0.0

DataType:

0x01 - BIT:一个无符号的bit
0x02 - BYTE:一个8位的数字
0x03 - CHAR:一个字符
0x04 - WORD:两个字节宽的无符号整数
0x05 - INT:两个字节宽的有符号整数。
0x06 - DWORD:四字节宽的无符号整数
0x07 - DINT:四字节宽的有符号整数
0x08 - REAL:四个字节宽的IEEE浮点数
0x1c - COUNTER:PLC程序计数器使用的计数器类型
示例:变量的示例地址是DB123X 2.1,它访问DB块123的第3个Byte的第2个Bit。 

3)在本应用中,创建了一个192.168.1.66的PLC设备和hnplc项目,如图

2)创建vs项目

 

 

3、连接代码   

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace west.siemenscomm
{internal class Program{/// <summary>/// plc的ip地址/// </summary>static string _ip="192.168.1.66";/// <summary>/// 端口号/// </summary>static int _port=102;/// <summary>/// 机柜号,插槽号/// </summary>static byte _rack=0, _slot=1;/// <summary>/// socket对象/// </summary>static Socket socket = null;/// <summary>/// 时间事件/// </summary>static ManualResetEvent TimeoutObject = new ManualResetEvent(false);/// <summary>/// 连接状态 /// </summary>static bool connectState = false;static void Main(string[] args){Connect();Console.ReadKey();} private static void Connect(int timeout = 50){TimeoutObject.Reset();try{socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);socket.BeginConnect(_ip, _port, callback =>{connectState = false;var cbSocket = callback.AsyncState as Socket;if (cbSocket != null){connectState = cbSocket.Connected;if (cbSocket.Connected)cbSocket.EndConnect(callback);}TimeoutObject.Set();}, socket);TimeoutObject.WaitOne(2000, false);}catch (SocketException ex){if (ex.ErrorCode == 10060)Console.WriteLine(ex.Message);}if (socket == null || !socket.Connected || ((socket.Poll(200, SelectMode.SelectRead) && (socket.Available == 0)))){Console.WriteLine("网络连接失败");}Console.WriteLine(connectState==true?"连接成功":"连接失败");}}
}

 一定注意一个问题,看这里

4)运行测试 

3、小结

 这就是第一个流程,建立TCP的三次握手,它是通过socket对象通讯实现的,小伙伴们,明白了不?下节继续硬起来。

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无心剑七绝《潘展乐神》

七绝潘展乐神 潘江陆海忘情游 展志凌云筑玉楼 乐创全球新纪录 神姿英发舞金钩 2024年8月1日 平水韵十一尤平韵 潘展乐神&#xff0c;这四个字&#xff0c;如同四座矗立的丰碑&#xff0c;分别代表了潘展乐在游泳领域的卓越成就、豪情壮志、快乐创新和非凡风采。无心剑的这首…

C:图案打印

引言 本篇文章讲了一些常见的图形编程题&#xff0c;并总结了一些规律。 1、打印空心正方形 1.1 代码展示&#xff1a; #include<stdio.h> int main() {int a 0;//边长初始化scanf("%d", &a);//输入边长的值{int i 0;for (i 0; i < a; i)//控制行…

【实战】SpringBoot整合ffmpeg实现动态拉流转推

SpringBoot整合ffmpeg实现动态拉流转推 在最近的开发中&#xff0c;遇到一个 rtsp 协议的视频流&#xff0c;前端vue并不能直接播放&#xff0c;因此需要对流进行处理。在网上查阅后&#xff0c;ffmpeg和webrtc是最多的解决方案&#xff0c;但是使用webrtc的时候没成功&#x…

layui table 重新设置表格的高度

在layui的table模块中&#xff0c;如果使用table.render({})渲染了一个表格实例时&#xff0c;确定了height配置&#xff0c;后续用table.resize(id)方法重置表格尺寸时&#xff0c;表格的高度是不会变化的&#xff08;如果我的理解没有错的话&#xff09;。 有时我们希望根据…

k8s核心知识总结

写在前面 时间一下子到了7月份尾&#xff1b;整个7月份都乱糟糟的&#xff0c;不管怎么样&#xff0c;日子还是得过啊&#xff0c; 1、7月份核心了解个关于k8s&#xff0c;iceberg等相关技术&#xff0c;了解了相关的基础逻辑&#xff0c;虽然和数开主线有点偏&#xff0c;但是…

传统自然语言处理(NLP)与大规模语言模型(LLM)详解

自然语言处理&#xff08;NLP&#xff09;和大规模语言模型&#xff08;LLM&#xff09;是理解和生成人类语言的两种主要方法。本文将介绍传统NLP和LLM的介绍、运行步骤以及它们之间的比较&#xff0c;帮助新手了解这两个领域的基础知识。 传统自然语言处理&#xff08;NLP&…

OpenEuler安装部署教程

目录 OpenEuler安装部署教程 MobaXterm一款全能的远程工具 yum安装软件 vim编辑器&#xff08;了解&#xff09; 防火墙 常用命令 网络工具netstat & telnet 进程管理工具top ps 磁盘free、fdisk 用户、组&#xff08;了解&#xff09; 权限&#xff08;了解&am…

君正T41开发板环境搭建_串口登陆_配置IP_telnet登陆_mount挂载_安装交叉编译工具链

目录 1 开发板外观 2 串口连接 3芯片内存情况 4 配置IP地址 5 telnet登陆 6 mount挂载目录 7 安装交叉编译工具链 1 开发板外观 2 串口连接 我直接用MobaXterm连接&#xff0c;虽然我还没有文档&#xff0c;但是我觉得波特率大概率就是115200&#xff0c;试了下确实可以…

webstorm配置项目Typescript编译环境

使用npm命令安装typeScript编译器 npm install typescript -g 安装好&#xff0c;在命令行可以查看编译器的版本 tsc --version 用Webstorm打开一个Typescript的项目。为TypeScript文件更改编译设置&#xff0c;File->Settings->toosl -> File Watchers->TypeScri…

Python爬虫入门01:在Chrome浏览器轻松抓包

文章目录 爬虫基本概念爬虫定义爬虫工作原理爬虫流程爬虫类型爬虫面临的挑战 使用Chrome浏览器抓包查看网页HTML代码查看HTTP请求请求头&#xff08;Request Header&#xff09;服务器响应抓包的意义 爬虫基本概念 爬虫定义 爬虫&#xff08;Web Crawler 或 Spider&#xff0…

Vulnhub靶机-Jangow 1.0.1

Vulnhub靶机-Jangow 1.0.1 修改为NAT模式 ?buscarecho <?php eval($_POST[cmd])?> >shell.php后面试了试很多网上的方法反弹shell但都不行

只用一个 HTML 元素可以写出多少形状?——平行四边形篇

您有没有想过一个问题&#xff0c;如果我们只用一个 div 元素&#xff0c;一共可以写出多少种形状呢&#xff1f; 暂停一下&#xff0c;思考三秒钟&#xff0c;默默记下自己的答案&#xff0c;看看自己想到的答案对不对。然后&#xff0c;我们就来一起盘点一下吧…… 今天的主…

java开发环境搭建基础之3----开发工具eclipse中Maven配置

一.背景 公司安排了带徒弟任务&#xff0c;写点基础的环境搭建这些吧。搭建基础开发环境&#xff0c;主要是jdk、eclipse、git、maven、mysql。后续再考虑编写jenkins、nexus、docker、1panel等CI/CD环境搭建。本次主要内容是eclipse中maven环境的配置。我的开发环境&#xff0…

React 学习——路由跳转(Link、useNavigate)、跳转时传递参数(问号传递、path中冒号拼接)

需要四个页面&#xff1a;项目入口index.js文件&#xff0c;router配置路由跳转文件&#xff0c;article组件页面&#xff0c;login组件页面 1、项目入口index.js文件 注意&#xff1a;要安装这个依赖 react-router-dom import React from react import { createRoot } fro…

TZDYM001矩阵系统源码 矩阵营销系统多平台多账号一站式管理

外面稀有的TZDYM001矩阵系统源码&#xff0c;矩阵营销系统多平台多账号一站式管理&#xff0c;一键发布作品。智能标题&#xff0c;关键词优化&#xff0c;排名查询&#xff0c;混剪生成原创视频&#xff0c;账号分组&#xff0c;意向客户自动采集&#xff0c;智能回复&#xf…

vue3使用递归组件渲染层级结构

先看看是不是你想要的&#xff1a; 当有层级去渲染的时候&#xff0c;嵌套的层级不明确&#xff0c;这时只能通过递归组件去渲染。 数据如下&#xff1a; 通过判断subCatalog这个字段的长度是否大于0来确定是否有下级。 上代码&#xff1a;(代码是使用uniapp开发的&#xff0…

简单洗牌算法

&#x1f389;欢迎大家收看&#xff0c;请多多支持&#x1f339; &#x1f970;关注小哇&#xff0c;和我一起成长&#x1f680;个人主页&#x1f680; ⭐目前主更 专栏Java ⭐数据结构 ⭐已更专栏有C语言、计算机网络⭐ 在学习了ArrayList之后&#xff0c;我们可以通过写一个洗…

iOS ------ 持久化

一&#xff0c;数据持久化的目的 1&#xff0c;快速展示&#xff0c;提升体验 已经加载过的数据&#xff0c;用户下次查看时&#xff0c;不需要再次从网络&#xff08;磁盘&#xff09;加载&#xff0c;直接展示给用户 2.节省用户流量 对于较大的资源数据进行缓存&#xff…

C++|设计模式(七)|⭐️观察者模式与发布/订阅模式,你分得清楚吗

本文内容来源于B站&#xff1a; 【「观察者模式」与「发布/订阅模式」&#xff0c;你分得清楚吗&#xff1f;】 文章目录 观察者模式&#xff08;Observer Pattern&#xff09;的代码优化观察者模式 与 发布订阅模式 他们是一样的吗&#xff1f;发布订阅模式总结 我们想象这样一…