利用C#和Snap7工具模拟S7通信(包含DB地址讲解)

之前写过一篇用KepServerEx做模拟S7的通信数据,参考链接:

通过C#和KepServer完成模拟S7协议通信_c# 与kepserver-CSDN博客

但KepServerEx是收费的,而且模拟的DB块超过64就不行了,当然Snap7在本文中也是只能模拟DB1、DB2和DB3的数据,但Snap7提供了C#版的运行程序,完全可以根据需要修改源码完成要模拟的DB块(由于有一个项目需要,我已经尝试过修改源码成功模拟DB100、DB101、DB102和DB103的数据,后面有空再把代码分享出来)

本文中Snap7工具下载链接:https://download.csdn.net/download/zxy13826134783/89451661

如果失效了也可以从官网下载:Snap7 Homepage

下载1.4.1版本

里面有很多东西,本文只用到clientdemo.exe和serverdemo.exe,通过搜索文件夹就能找到

准备工作完毕,正式开始本文的内容,步骤如下:

1  打开serverdemo.exe程序,然后点击start,如下图:

可以看到下面输出"Server started"的字样,表示启动成功了,但我在虚拟机中点击Start会报没有权限的错误,防火墙也关了,具体原因不明,如下图:

先来熟悉一下serverdemo.exe中的DB块,可以看到可以模拟DB1、DB2和DB3的数据

上图中第1个红色方框的十六进制地址为0000,第2个红色方框十六进制的地址为000F,第3个红色方框十六进制的地址为0012,地址排布相信你能看得懂

2 接着打开客户端工具clientdemo.exe,验证serverdemo.exe是不是好使,输入本机ip: 127.0.0.1,然后点击Connect按钮,如下图:

接着往erverdemo.exe端的DB1中的地址0000写入4,在clientdemo中的具体操作如下:

3  打开visual studio 

3.1 新建名为S7Demo的控制台项目,.net framework选择4.8

3.2 通过nuget安装S7netplus,版本选择最新,如下图:

3.3  新增测试代码如下:

class Program{static void Main(string[] args){Plc plc = new Plc(CpuType.S7400, "127.0.0.1", 0, 0);plc.Open();if (plc.IsConnected){Console.WriteLine("连接成功");byte b = 22;plc.Write("DB1.DBB0", b);Console.WriteLine("修改后的值为:" + plc.Read("DB1.DBB0"));}else{Console.WriteLine("连接失败");}Console.ReadLine();}}

代码中的地址"DB1.DBB0"代表的含有如下:

解释:

DB1:表示编号为1的数据块

DBB:是“Data Block Byte”的缩写,表示数据块中的字节

0:是字节的偏移地址。在数据块中,每个字节都有一个唯一的偏移地址,从0开始

注意:1个字节等于8个bit(位)

对应到的地址是DB1地址块的十六进制地址0000,erverdemo工具是这个位置:

运行C#程序,运行结果如下:

erverdemo工具的16是十六进制的,对应到的10机制数是22

当然咯,换成如下的代码,结果也是一样的

class Program{static void Main(string[] args){Plc plc = new Plc(CpuType.S7400, "127.0.0.1", 0, 0);plc.Open();if (plc.IsConnected){Console.WriteLine("连接成功");byte b = 22;//plc.Write("DB1.DBB0", b);//Console.WriteLine("修改后的值为:" + plc.Read("DB1.DBB0"));plc.WriteBytes(DataType.DataBlock, 1, 0, new byte[] { b });}else{Console.WriteLine("连接失败");}Console.ReadLine();}}

4  把前面的变量b的类型从bool 修改为int,再来观察一下结果,先把serverdemo中的数据还原为0,代码如下:

static void Main(string[] args){Plc plc = new Plc(CpuType.S7400, "127.0.0.1", 0, 0);plc.Open();if (plc.IsConnected){Console.WriteLine("连接成功");int b = 22;plc.Write("DB1.DBB0", b);Console.WriteLine("修改后的值为:" + plc.Read("DB1.DBB0"));}else{Console.WriteLine("连接失败");}Console.ReadLine();}

运行结果如下:

从上图中可以看出,十进制值22已经写到DB1块中的地址0003了,为什么呢?因为C#中的int类型的数据是占4个字节的,S7netplus库会自动识别对应的数据类型,然后进行写入。

5  往地址DB1.DBX1.1写入数据

DB1.DBX1.1地址解释:

DB1 是数据块的编号

DBX 表示数据块中的位(Data Block Bit),第一个1 是字节的偏移地址,而第二个 1 是该字节中的位偏移,即为地址DB1.DBB1的第二位(由于1个字节有8位)

(大白话解释为操作DB1数据块的第2个字节中的第2位)

C#代码如下:

 class Program{static void Main(string[] args){Plc plc = new Plc(CpuType.S7400, "127.0.0.1", 0, 0);plc.Open();if (plc.IsConnected){Console.WriteLine("连接成功");bool b =true;plc.Write("DB1.DBX1.1", b);Console.WriteLine("修改后的值为:" + plc.Read("DB1.DBX1.1"));}else{Console.WriteLine("连接失败");}Console.ReadLine();}}

程序运行结果如下:

图中的十六进制02转换为二进制为00000010,刚好是DB1数据块的第2个字节中的第2位为1。

由于是对二进制的位进行操作,修改的值只能是true或者false值,如果把上面的b变量的bool类型修改为int类型则代码会报错

好了,本文的内容到此结束。

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

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

相关文章

举个栗子!Tableau 技巧(277):创建径向 WIFI 信号图

之前为大家分享了 🌰:学做径向柱状图(Radial Column Chart)。在此基础上,我们又做了进一步的延展:径向 WIFI 信号图。 它的用法和径向柱状图一致,区别在于它将柱体分切成多个弧线(内…

自监督几何引导:开启单目视觉里程计的鲁棒新时代

论文标题: Self-Supervised Geometry-Guided Initialization for Robust Monocular Visual Odometry 论文作者: Takayuki Kanai, Igor Vasiljevic, Vitor Guizilini, Kazuhiro Shintani 导读: 本文提出了一种用于单目视觉里程计的自监督几…

新火种AI|Sora发布半年之后,AI视频生成领域风云再起

作者:一号 编辑:美美 AI视频最近有些疯狂,Sora可能要着急了。 自OpenAI的Sora发布以来,AI视频生成技术便成为了科技界的热门话题。尽管Sora以其卓越的性能赢得了广泛关注,但其迟迟未能面向公众开放,让人…

[渗透测试学习] BoardLight-HackTheBox

BoardLight-HackTheBox 信息搜集 nmap扫描一下 nmap -sV -v 10.10.11.11扫描结果如下 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.41 ((Ubuntu))80端口有h…

【vue baidu-map】解决更新数据,bm-marker显示不完全问题

实现效果&#xff1a; 问题&#xff1a;切换上面基地tab键&#xff0c;导致地图图标展示不完全&#xff1b;刷新页面就可以正常展示。判断是<bm-marker>标记元素没有动态刷新dom元素引起的问题。 方案&#xff1a;this.$nextTick({}) this.$nextTick(()>{this.equipm…

用户需求分析揭秘:最佳实践与策略

大多数产品团队都有自己处理客户需求的一套流程。但是那些潜在的客户和他们的需求呢&#xff1f;如果在产品管理上已经有一定的资历&#xff0c;很可能对此见惯不怪了。 通常&#xff0c;这些需求是销售人员跑来告诉你的&#xff0c;大概就是说&#xff1a;“超棒的潜在客户一…

Airbind - hackmyvm

简介 靶机名称&#xff1a;Airbind 难度&#xff1a;中等 靶场地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmAirbind 本地环境 虚拟机&#xff1a;vitual box 靶场IP&#xff08;Airbind&#xff09;&#xff1a;192.168.56.121 跳板机IP(windows 11)&…

Java开发的构建神器:Maven以及如何安装部署Maven

目录 一、Maven引言1.1 Maven的核心概念✍. POM (Project Object Model)✌. 依赖管理✍. 生命周期与构建阶段✌. 插件系统 1.2 Maven的工作流程✍. 读取POM文件&#xff1a;✌. 依赖解析&#xff1a;✍. 构建生命周期&#xff1a;✌. 插件执行&#xff1a;✍. 构建输出&#xf…

C++使用教程

目录 一、软件使用 二、C基础规则补充 关键字 整型取值范围 浮点型取值范围 字符型使用规则 字符串型使用规则 布尔类型 常用的转义移字符 三、数组、函数、指针、结构体补充 1.数组 2.函数 声明&#xff1a; 分文件编写&#xff1a; 值传递&#xff1a; 3.指…

Coursera耶鲁大学金融课程:Financial Markets 笔记Week 02

Financial Markets 本文是学习 https://www.coursera.org/learn/financial-markets-global这门课的学习笔记 这门课的老师是耶鲁大学的Robert Shiller https://en.wikipedia.org/wiki/Robert_J._Shiller Robert James Shiller (born March 29, 1946)[4] is an American econom…

Vue3鼠标悬浮个人头像时出现修改头像,点击出现弹框,上传头像使用cropperjs可裁剪预览

实现效果&#xff1a; 鼠标悬浮到头像上&#xff0c;下方出现修改头像 点击修改头像出现弹框&#xff0c;弹框中可上传头像&#xff0c;并支持头像的裁剪及预览 实现方式&#xff1a; 1.tempalte中 <div class"img-box"><img v-if"avatarImgUrl&qu…

常见的网络设备

引入 园区网络安全部署场景 1、路由器&#xff1a; 跨网段通信设备 。 2、交换机&#xff1a; 同网段或跨网段通信设备。 3、AntiDDoS &#xff1a; DDoS 防御系统&#xff0c;通常旁挂部署于网络出口处&#xff0c; 位于防火墙上游&#xff0c;用于减轻防火墙报文处理负担。 …

CENTOS7.9下服务器双网卡bond模式6配置示例

​1.bond口的特点 bond口通过将多个网口进行聚合&#xff0c;多个网口聚合后一方面实现了大带宽传输&#xff0c;另外多网口聚合后也同时具有冗余特性&#xff0c;当其中一个网口down掉后&#xff0c;其他网口会继续转发流量&#xff0c;不会导致流量中断。 2.使用条件 当环境…

CAD二次开发(10)-单行文字的添加+图形修改

1. 单行文字的添加 第一步&#xff1a; 首先在CAD中新增中文样式 输入ST命令&#xff1a; 第二步&#xff1a;代码开发 /// <summary>/// 添加文本信息/// </summary>[CommandMethod("AddText")]public void AddText(){var doc Application.DocumentM…

全氟己酮自动灭火材料表现亮眼!手把手教你自动灭火毯的使用方法

灭火毯的使用方法是什么&#xff1f;很多朋友在购买灭火毯之前&#xff0c;都比较关心这个问题。在这里&#xff0c;我们可以把灭火毯分为两种。一种是传统灭火毯&#xff0c;还有一种是近年来兴起的高科技产品—全氟己酮自动灭火毯。这两种灭火毯的使用方法大有不同&#xff0…

[算法刷题—二分法]寻找插入位置

题目展示: 本道题本身并不是很难,主要是学习和分析二分查找插入位置的方法。 首先大体上分为两种情况: 一.target在待查找的数组之中,返回对应值的下标索引。 二.target不在待查找的数组之中&#xff0c;需要返回target插入位置的索引(原数组有序) 第一种情况不难&#xff…

WordPress 站点 Wp-Login.Php 登录页面,防止被机器扫描爆破终极方法

最近好像不少的 WordPress 站点又迎来了一波疯狂的 wp-login.php 登录页面暴力破解,明月使用的 Dragon 主题也迅速的做出了安全防范响应,第一时间就增强了代码上的安全防御能力。明月代运维的几个站点也在这方面加强了防范措施,基本上实现了永久解决这一顽疾的目标,今天明月…

基于minhook的Windows HOOK

MinHook是一个基于微软Detours技术的可移植Hook库&#xff0c;它允许开发者在运行时更改函数定义&#xff0c;而无需修改原始函数代码。以下是关于MinHook的详细介绍&#xff1a; 基本概念 定义&#xff1a;MinHook使用内存污染和跳转技术来实现Hook&#xff0c;使得开发者能…

视频汇聚安防综合管理平台EasyCVR支持GA/T 1400视图库标准及设备接入配置

一、概述 视频汇聚安防综合管理平台EasyCVR视频监控系统已经与公安部GA/T 1400视图库标准协议实现了对接&#xff0c;即《公安视频图像信息应用系统》。 安防监控系统EasyCVR支持采用GA/T 1400进行对接&#xff0c;可实现人脸数据使用的标准化、合规化。其采用统一接口对接雪…

分布式技术导论 — 探索分析从起源到现今的巅峰之旅(流式处理到微批处理)

探索分析从起源到现今的巅峰之旅 流式计算回顾流式服务结合分布式特性 流式计算组成部分监控数据处理进度流式分析案例流转数据的衍生存储确认器采取高效策略确认器异常应对策略工作节点故障的处理&#xff08;精确一次处理&#xff09;确认器故障的处理&#xff08;恰好一次处…