西门子s7协议

 S7Comm(S7 Communication)是西门子专有的协议,是西门子S7通讯协议簇里的一种。
 S7通信协议是西门子S7系列PLC内部集成的一种通信协议,是S7系列PLC的精髓所在。 它是一种运行在传输层之上的(会话层/表示层/应用层)、经过特殊优化的通信协议,其信息传输可以基于MPI网络、PROFIBUS网络或者以太网
 S7在TCP连接上后还需要进行两次握手
 S7协议的TCP/IP实现依赖于面向块的ISO传输服务。S7协议被封装在TPKT和ISO-COTP协议中,这使得PDU(协议数据单元)能够通过TCP传送。

  s7协议
   1需要通过socket三次握手,不用写握手过程
   目前提供设备型号s71200 cpu:1212c
   电压是24vDC

  建立连接过程

 TcpClient client = new TcpClient();client.Connect("ip地址",端口号);//连接PLC网络地址// 2第一次请求连接 发送请求帧为// 总共22字节byte[] bs1 = new byte[]{0x03,//1字节版本号 默认是030x00,//保留值默认为00x00,0x16,//2字节 报文的总长度0x11,// 1字节 从该字节往后字节个数 十进制是170xE0,//PDU 类型0x00,0x00,//DST引用 默认值0x00,0x01,//src引用0x00,//采用默认值0xc1,// 上位机参数0x02,// 参数长度0x10,0x00,//0x10代表双边通信 0x00机架号和插槽号0xC2,//plc参数0x02,//长度0x03,0x01,//0x01和0x00共同控制机架号和插槽0xC0,0x01,0x0A,//TPDU长度};client.GetStream().Write(bs1,0,bs1.Length);//第二次请求连接 发送请求帧为bs1 = new byte[]{0x03,//版本号0x00,//保留值默认为00x00,0x19,//整个报文的长度0x02,//COTP当前字节后的字节数0xF0,//PUD类型0x80,//最高十进制1280x32,//协议ID,固定值0x01,//工作类型 0x01主站发送请求0x00,0x00,0x00,0x00,0x00,0x08,//参数长度0x00,0x00,//数据长度0xF0,//功能码0x00,//保留值0x00,0x03,//允许操作最大工作队列0x00,0x03,0x03,0xc0//允许处理最大字节数};client.GetStream().Write(bs1,0,bs1.Length);MessageBox.Show("连接成功");

读取过程

  读取数据必须知道:
  1 plc存储那个区里面
  0x83 M存储之间
  0x84 DB块
  0x81 I存储空间
  0x82 Q输出存储空间

  2数据存储在那个地址上 00 03 20

  3读取数据的长度
   03 00 00 1F 02 F0 80 30 01 0 00 00 01 00 0E 00 00 04 01 012 0A 10 02 00 02 00 00 83 00 03 20

先连接进行socket三次握手在判断是否连接成功 在进行读取显示label

 Socket socket;
//连接按钮事件private void button1_Click(object sender, EventArgs e){//socket三次握手socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);socket.Connect("ip地址", 端口号);if (socket.Connected)//连接成功{StartReceive();//接收数据}//两次连接请求//第一次连接请求byte[]bs=new byte[]{0x03,// 1字节版本号 默认是030x00,// 1字节 保留值 默认00x00, 0x16,//2字节 报文的总长度0x11,//1字节从该字节往后字节个数 十进制是170xE0,//PDU 类型0x00,0x00,// DST引用 默认值0x00,0x01,//src引用0x00,//采用默认值0xc1,// 上位机参数0x02,// 参数长度0x10,0x00, // 0x10 代表双边通信  0x00机架号和插槽号0xC2, // plc参数0x02 ,// 长度0x03,0x01,// 0x01和0x00 共同控制机架号和插槽0xC0,0x01,0x0A //TPDU长度};socket.Send(bs);//第一次发送bs = new byte[]{0x03,///1字节版本号 默认是030x00,// 1字节 保留值 默认00x00, 0x19,//2字节 报文的总长度0x02,//当前字节后的字节数0xF0,//PDU类型 数据传输0x80,//最高是十进制128 0x32,//协议ID,固定值0x01,//工作类型 0x01 主站发送请求0x00,0x00,0x00,0x00,0x00,0x08,//参数长度0x00,0x00,//数据长度0xF0,//功能码0x00,//Reserved保留值0x00,0x03,// 允许操作最大工作队列0x00,0x03,0x03,0xc0 //运行处理最大字节数组};socket.Send(bs);//第二次发送MessageBox.Show("连接成功");}//读取private void button2_Click(object sender, EventArgs e){//发送请求帧  请求M14数据 地址从14开始 读取一个数据byte[] data = new byte[]{//TPKT:版本号 预留号 总字节长度0x03,//版本号0x00,//预留号0x00,0x1F,//总长度//COTP块:0x02,//往下的长度0xF0,//PDU类型  数据传输0x80,//目标引用//s7-header s7头0x32,//协议id默认0x01,//主站开始发请求0x00,0x00,//预留位置0x03,0x7d,//随机生成的数字 每次在基础之上递增0x00,0x0e,//参数长度0x00,0x00,//数据长度//s7-参数部分0x04,//功能码 读取功能0x01,//如果涉及多读的时候 设置为10x12,//结构标识 一般默认120x0a,//往后的字节长度0x10,//寻址模式0x02,//读取的数据类型 02是字节类型0x00,0x01,//读取长度0x00,0x00,//读取不是DB区0x83,//0x83M存储区 ,0x84DB块0x00,0x00,0x70//开始数据的地址//例如 M3000,实际地址是30000*8=2400000 把转成三个字节 转成16进制3a980 对应三个地址,0x03,0xA9 0x80//例如数据DB块的数据,DB21234.4000,其中DB号是21234 转成16进制0x52F2,DB区改为0x52,02 F2//4000*8=32000,转成16进制7d00转成三个字节变成 0x00,0x7d,0x00};socket.Send(data);}void StartReceive(){Task.Run(() =>{byte[] bs1 = new byte[1024];while (true){int count= socket.Receive(bs1);if (count == 0){break;}//前两次弹出的是连接的响应//读取的响应 FF(读取成功的标志) 04(读取数据的类型) 00 08(数据的长度) 0C(数据)MessageBox.Show(BitConverter.ToString(bs1, 0, count));label1.Invoke((Action)(() =>{label1.Text = bs1[25].ToString();}));}});}

写入数据 如写M14地址1个字节 M2000地址4字节

byte[] value = BitConverter.GetBytes(int.Parse(textBox1.Text));
//写入M14地址 写一个字节36
//写入M2000地址 写入4个字节
//生成写的报文
byte[] bs = new byte[]
{//会话层0x03,//版本号0x00,//预留号0x00,0x24,//M14地1个字节址  报文总长度360x00,0x27,//M2000地址  4个字节报文长度为39//COPT 表示层0x02,//长度0xF0,//PDU类型  数据传输0x80,//目标引用//s7-header0x32,//协议id0x01,//主站开始请求0x00,0x00,//预留部分0x03,0x7d,//随机生成0x00,0x0E,//参数长度// 0x00,0x05,//参数数据长度 M140x00,0x08,//参数数据长度//s7-参数0x05,//功能码 05代表写, 04代表读取0x01,//通信项数 可以支持多写0x12,//变量指定0x0A,//后面长度0x10,0x02,//传输的数据类型 字节// 0x00,0x01,M14  //操作数据的长度0x00,0x04,//写入M20000x00,0x00,//M区 不是DB区0x83,//M区//0x00,0x00,0x70,//开始写入M14地址0x00,0x3E,0x80,//2000写入地址0x00,0x04,//字节类型// 0x00,0x08,  M14// 写入数据的长度 8位一个0x00,0x20,//M2000 写入数据的长度 8位一个 4*8=32 16进制20//  byte.Parse(this.textBox1.Text),//写入数据value[3],value[2],value[1],value[0]//写入M2000写入4个
};
tcp.Send(bs);
type = RequestType.Write;

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

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

相关文章

速记Java八股文——并发编程篇

前言 分类汇总 20 常见的 Java集合 经典后端面试题,并对题目进行了精炼总结,旨在帮助大家高效记忆,在面试中游刃有余,不至于陷入词穷的窘境。 Java 并发编程 多线程怎么使用的? 继承 Thread 类。实现 Runnable 接口。…

STL 简介(标准模板库)

前言 通过对C的特性,类和对象的学习和C的内存管理对C基本上有了全面的认识,但是C的核心在于STL 一、STL简介 什么是STL C STL(Standard Template Library,标准模板库)是C编程语言中一个功能强大的模板库,…

【Linux】CentOS更换国内阿里云yum源(超详细)

目录 1. 前言2. 打开终端3. 确保虚拟机已经联网4. 备份现有yum配置文件5. 下载阿里云yum源6. 清理缓存7. 重新生成缓存8. 测试安装gcc 1. 前言 有些同学在安装完CentOS操作系统后,在系统内安装比如:gcc等软件的时候出现这种情况:&#xff08…

前端 socket.io 跨域

在使用Socket.io进行前端跨域通信时,可以通过设置Socket.io的cors选项来允许跨域请求。 以下是一个简单的例子,展示了如何在Node.js的服务器代码中配置Socket.io以允许跨域连接: const express require(express); const http require(http…

【C++进阶学习】第九弹——哈希的原理与实现——开放寻址法的讲解

前言: 在前面,我们已经学习了很多存储机构,包括线性存储、树性存储等,并学习了多种拓展结构,效率也越来越高,但是是否有一种存储结构可以在大部分问题中都一次找到目标值呢?哈希可能能实现 目录…

Vite项目中根据不同打包命令配置不同的后端接口地址,proxy解决跨域

在vite.config.ts同级目录添加两个文件 .env.development #开发环境 VITE_APP_ENV developmentVITE_APP_BASE_API .env.production #生产配置 VITE_APP_ENV productionVITE_APP_BASE_API https://www.bdjw.work代码中使用路径 const request axios.create({baseURL: i…

Maven已经导入Junit包,但是还是无法使用注解

Maven已经导入Junit包&#xff0c;但是还是无法使用注解 背景&#xff1a; 导入了Junit的依赖 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></d…

【Python的GDAL/OGR库】

GDAL/OGR库是一个开源的地理数据处理库&#xff0c;用于读取、写入和转换各种地理数据格式。以下是对GDAL/OGR库的详细解释&#xff1a; GDAL&#xff08;Geospatial Data Abstraction Library&#xff09; 定义&#xff1a;GDAL是一个在X/MIT许可协议下的开源栅格空间数据转…

【初阶数据结构题目】2.移除元素

文章目录 顺序表算法题代码&#xff1a; 顺序表算法题 点击链接做题 移除元素 思路&#xff1a;定义两个变量指向数组第一个位置&#xff0c;判断nums[src]是否等于val 相等&#xff0c;src不相等&#xff0c;nums[dst] nums[src],src,dst 代码&#xff1a; int removeElem…

如何使用CANoe自带的TCP/IP Stack验证TCP的零窗口探测机制

如果想利用CANoe自带的TCP/IP协议栈验证TCP的零窗口探测机制,就必须添加一个网络节点并配置独立的CANoe TCP/IP协议栈,作为验证对象。而与它进行TCP通信的对端也是一个网络节点,但不要配置TCP/IP协议栈,而是使用CAPL代码在底层组装TCP报文模拟TCP通信过程。这样可以尽量减少…

postgrsql——事务概述

事务概述 事务的特性 原子性&#xff08;Atomicity&#xff09;&#xff1a; 事务被视为一个整体&#xff0c;其中的操作要么全部执行成功&#xff0c;要么全部不执行&#xff0c;即不存在部分执行的情况。这确保了事务的完整性和一致性。一致性&#xff08;Consistency&…

C——简介

一、C语言的诞生背景 C语言的诞生并非偶然&#xff0c;它是为了解决当时编程环境中存在的问题而设计的。在C语言出现之前&#xff0c;编程主要依赖于汇编语言&#xff0c;这种语言虽然执行效率高&#xff0c;但编写和维护都极其复杂且容易出错。与此同时&#xff0c;高级语言如…

轻松入门Linux—CentOS,直接拿捏 —/— <1>

一、什么是Linux Linux是一个开源的操作系统&#xff0c;目前是市面上占有率极高的服务器操作系统&#xff0c;目前其分支有很多。是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统 Linux能运行主要的UNIX工具软件、应用程序和网络协议 Linux支持 32…

基于Drone实现CI/CD【0到1架构系列】

CI/CD是持续性集成和持续性部署&#xff0c;简单来讲就是自动化构建和自动化部署。目前有很多集成方案&#xff0c;也有很多组装方案&#xff0c;只要能实现自动化构建出制品&#xff0c;再自动部署到生产环境就行。 目前很多源代码都集成了CI/CD功能&#xff0c;drone也是目前…

还在用JVM跑你的Java代码吗?太慢了,试试Oracle的GraalVM吧

前言 对于Java开发者们来说&#xff0c;几乎每天都在和JVM打交道&#xff0c;然而JVM即将过时了。那些对新技术保持敏锐洞察力的开发者&#xff0c;可能已经在生产环境中部署GraalVM生成的二进制程序了&#xff0c;小伙伴们&#xff0c;你们已经用起来了吗&#xff1f; Graal…

【初阶数据结构题目】3.删除有序数组中的重复项

文章目录 顺序表算法题代码&#xff1a; 顺序表算法题 点击链接做题 删除有序数组中的重复项 思路&#xff1a;定义两个指针变量。dst指向数组第一个位置&#xff0c;src指向数组第二个位置。判断nums[dst]是否等于nums[src] 相等&#xff0c;src不相等&#xff0c;dst,nums[…

Windows 11 桌面模拟

Windows 11 桌面模拟 文章目录 Windows 11 桌面模拟代码结构HTML结构CSS样式JavaScript功能 源码效果图 代码结构 HTML结构 <html>: HTML文档的根元素。<head>: 包含文档的元数据&#xff0c;如标题和样式。<base>: 指定相对URL的基准。<title>: 指定…

力扣刷题160 相交链表

题目 力扣题目地址&#xff0c;点此可直接跳转 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 来源&#xff1a;力扣&…

60、redis安装和部署

一、关系型数据库与非关系型数据库 1.1、关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上一般面向于记录。SQL语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言&#xff0…

Laravel API资源收集器:打造高效数据响应的秘诀

Laravel API资源收集器&#xff1a;打造高效数据响应的秘诀 引言 在构建API时&#xff0c;数据的响应格式对于客户端的易用性和API的可维护性至关重要。Laravel框架提供了一种优雅的方式来处理API响应&#xff0c;即API资源&#xff08;API Resources&#xff09;和资源收集器…