西门子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.rhkb.cn/news/386920.html

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

相关文章

【JavaScript】函数声明和函数表达式的区别

文章目录 一、函数声明1. 定义方式2. 作用域提升(Hoisting)3. 块级作用域 二、函数表达式1. 定义方式2. 作用域提升(Hoisting)3. 自引用 三、其他区别1. 函数名2. 可读性和代码组织3. 使用场景 四、总结函数声明函数表达式 在Java…

【大模型系列】Video-LaVIT(2024.06)

Paper:https://arxiv.org/abs/2402.03161Github:https://video-lavit.github.io/Title:Video-LaVIT: Unified Video-Language Pre-training with Decoupled Visual-Motional TokenizationAuthor:Yang Jin, 北大&#x…

Java面试八股之@Qualifier的作用

Qualifier的作用 Qualifier 是 Spring 框架中的一个非常有用的注解,它主要用于解决在依赖注入过程中出现的歧义问题。当 Spring 容器中有多个相同类型的 Bean 时,Qualifier 可以帮助指明应该使用哪一个具体的 Bean 进行注入。 Qualifier 的作用&#x…

外设购物平台

目 录 一、系统分析 二、系统设计 2.1 系统功能设计 2.2 数据库设计 三、系统实现 3.1 注册功能 3.2 登录功能 3.3 分页查询所有商品信息功能 3.4 分页条件(精确、模糊)查询商品信息功能 3.5 购物车功能 3.6 订单管理功能 四、项…

【Opencv】模糊

消除噪声 用该像素周围的平均值代替该像素值 4个函数 blur():最经典的 import os import cv2 img cv2.imread(os.path.join(.,dog.jpg)) k_size 7 #窗口大小,数字越大,模糊越强 img_blur cv2.blur(img,(k_size,k_size)) #窗口是正方形&#xff…

云计算实训16——关于web,http协议,https协议,apache,nginx的学习与认知

一、web基本概念和常识 1.Web Web 服务是动态的、可交互的、跨平台的和图形化的为⽤户提供的⼀种在互联⽹上浏览信息的服务。 2.web服务器(web server) 也称HTTP服务器(HTTP server),主要有 Nginx、Apache、Tomcat 等。…

C#使用csvhelper实现csv的操作

新建控制台项目 安装csvhelper 33.0.1 写入csv 新建Foo.cs namespace CsvSut02;public class Foo {public int Id { get; set; }public string Name { get; set; } }批量写入 using System.Globalization; using CsvHelper; using CsvHelper.Configuration;namespace Csv…

[数据集][目标检测]金属罐缺陷检测数据集VOC+YOLO格式8095张4类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):8095 标注数量(xml文件个数):8095 标注数量(txt文件个数):8095 标注…

使用Process Explorer和Dependency Walker排查dll动态库加载失败的问题

目录 1、问题描述 2、如何调试Release版本的代码? 3、使用Process Explorer查看exe主程序加载的dll库列表,发现mediaplay.dll没有加载起来 4、使用Dependency Walker查看rtcmpdll.dll的库依赖关系和接口调用情况,定位问题 4.1、使用Depe…

Javascript面试基础6【每日更新10】

Gulp gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成 Gulp的核心概念:流 流,简单来说就是建立在面向对象基础上的一种抽象的…

多微信聚合神器:高效沟通,一个界面全搞定!

大家都知道,频繁的来回切换微信,不仅浪费时间,还容易错过重要的信息。 今天,我要向大家推荐一款多微信管理神器——个微管理系统,助你实现统一管理,聚合聊天,让沟通变得更加高效。 1、网页扫码…

基于MindIE实现通义千问Qwen推理加速

一、昇腾开发者平台申请镜像 登录Ascend官网昇腾社区-官网丨昇腾万里 让智能无所不及 二、登录并下载mindie镜像 #登录docker login -u XXX#密码XXX#下载镜像docker pull XXX 三、下载Qwen的镜像 使用wget命令下载Qwen1.5-0.5B-Chat镜像,放在/mnt/Qwen/Qwen1.5-…

【无标题】Git(仓库,分支,分支冲突)

Git 一种分布式版本控制系统,用于跟踪和管理代码的变更 一.Git的主要功能: 二.准备git机器 修改静态ip,主机名 三.git仓库的建立: 1.安装git [rootgit ~]# yum -y install git 2.创建一个…

【策略工厂模式】记录策略工厂模式简单实现

策略工厂模式 1. 需求背景2. 代码实现2.1 定义基类接口2.2 排序策略接口定义2.3 定义抽象类,实现策略接口2.4 具体的排序策略实现类2.5 实现策略工厂类2.6 控制类 3. 启动测试4. 总结 1. 需求背景 现在需要你创建一个策略工厂类,来根据策略实现各种排序…

【JAVA】记录一次前端无能造成的 线上bug

有一个需求是 当方式切换 垫资时 清空 当前所选细单商品 但是前端的奇葩 操作是,只是在页面上清空 细单。 不请求 后台删除 细单 让前端 必须 清空同时 请求后台 删除细单 但是 该前端 技术不行, 嫌麻烦 不做 只好 后台 判断该类型时 进行删除操作…

AutoMQ 开源可观测性方案:夜莺 Flashcat

01 引言 在现代企业中,随着数据处理需求的不断增长,AutoMQ [1] 作为一种高效、低成本的流处理系统,逐渐成为企业实时数据处理的关键组件。然而,随着集群规模的扩大和业务复杂性的增加,确保 AutoMQ 集群的稳定性、高可…

权限管理的概述以及vue开发前端的路由、菜单、按钮权限控制实现方案

1. 权限管理概念 1.1 权限定义 权限管理是确保用户只能访问被授权资源的机制。在计算机系统中,权限通常指对特定数据或功能的访问权。权限的设置和控制对于保护数据安全和系统安全至关重要。 1.2 前端权限控制重要性 前端权限控制是用户与应用交互的第一道防线。…

黑马头条Day12-项目部署_持续集成

一、今日内容介绍 1. 什么是持续集成 持续集成(Continuous integration,简称CI),指的是频繁地(一天多次)将代码集成到主干。 持续集成的组成要素: 一个自动构建过程,从检出代码、…

jdk版本管理利器-sdkman

1.什么是sdkman? sdkman是一个轻量级、支持多平台的开源开发工具管理器,可以通过它安装任意主流发行版本(例如OpenJDK、Kona、GraalVM等等)的任意版本的JDK。通过下面的命令可以轻易安装sdkman: 2.安装 curl -s "https://…

什么是 5G?

什么是 5G? 5G 是第五代无线蜂窝技术,与以前的网络相比,它提供了更高的上传和下载速度、更一致的连接以及更高的容量。5G 比目前流行的 4G 网络更快、更可靠,并有可能改变我们使用互联网访问应用程序、社交网络和信息的方式。例如…