利用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类型则代码会报错

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML 全局属性介绍及示例

HTML 全局属性是一组可以在任何HTML元素中使用的属性。这些属性提供了一种方式来定义元素的通用行为或外观。以下是一些常见的HTML全局属性及其示例。 id id 属性为元素提供了一个唯一的标识符。它不能在 <head>, <html>, <meta>, <script>, <sty…

数据压缩还能这么玩,国产数据库有救了!

页级压缩 opengauss数据库是以数据页面&#xff08;Page&#xff09;为单位进行压缩解压&#xff0c;本特性自openGauss 3.0.0版本开始引入&#xff0c;通过对数据页的透明页压缩和维护页面存储位置的方式&#xff0c;做到高压缩、高性能。提高数据库对磁盘的利用率。 页级压缩…

FL Studio没有声音怎么办 FL Studio声音卡顿怎么办

FL Studio是一款综合创作歌曲的宿主软件&#xff0c;这款软件的里面内置了很多效果器和插件&#xff0c;非常适合创作电子音乐&#xff0c;很多创作电子音乐的小伙伴都喜欢使用此款软件。不过有些刚接触FL Studio的小伙伴&#xff0c;在使用此软件的时候&#xff0c;会出现一些…

openh264 帧间预测编码原理:WelsMdP16x16函数

openh264 帧间预测编码 帧间预测编码是视频压缩技术中的关键方法之一&#xff0c;它主要用于减少视频序列中时间维度上的冗余。这种编码方式依赖于视频帧之间的空间相关性&#xff0c;通过预测和补偿来减少数据量&#xff0c;从而实现高效的视频压缩。帧间预测编码广泛应用于各…

短路是怎么形成的

1. 短路分为电源短路和用电器短路。 电源短路&#xff1a;电流不经过任何用电器&#xff0c;直接由正极经过导线流向负极&#xff0c;由于电源内阻很小&#xff0c;导致短路电流很大&#xff0c;特别容易烧坏电源。 用电器短路&#xff1a;也叫部分电路短路&#xff0c;即一根…

全国产城市轨道交通运营公安AI高清视频监控系统

方案简介 城市轨道交通运营公安高清视频监控系统解决方案针对运营部门和公安部门的安保需求&#xff0c;选用华维视讯的各类前端和视频编解码、控制产品&#xff0c;通过统一平台提供视频监控服务和智能应用&#xff0c;满足轨道交通运营业主客运组织和抢险指挥的需求&#xff…

【idea】解决springboot项目中遇到的问题

一、Maven报错Could not find artifact com.mysql:mysql-connector-j:pom:unknown in aliyunmaven解决及分析 报错 创建springboot项目&#xff0c;勾选数据库驱动&#xff0c;springboot版本为3&#xff0c;现在改成了2.7.2&#xff0c;Maven就发生了报错Could not find art…

从兼职到大神:新手必看的UE材质原理讲解

对于刚接触UE的同学来说&#xff0c;材质篇章往往是令人望而生畏的一大板块。但材质的一些基本原理其实并不难&#xff0c;只要稍作理解便可以轻松入门。接下来我们便分为材质类型和节点类型两个知识板块来介绍材质的相关内容。 材质类型 材质分类 金属&#xff1a;金属材质一…

【C语言】数组参数和指针参数详解

在写代码的时候难免要把【数组】或者【指针】传给函数&#xff0c;那函数的参数该如何设计呢&#xff1f; 1 一维数组传参 #include <stdio.h> void test(int arr[])//ok? {} void test(int arr[10])//ok? {} void test(int* arr)//ok? {} void test2(int* arr[20])…

单载波水声通信技术研究【附MATLAB代码】

文章来源&#xff1a;​微信公众号&#xff1a;EW Frontier 摘要 水下无线通信因其在海洋科研、国防、救援及资源开发等方面的关键作用而备受关注。声波作为水中信息传输的有效载体&#xff0c;推动了水声通信技术的发展&#xff0c;其中单载波调制技术由于其高频谱利用率、结…

Vue60-TodoList案例-全局事件总线

一、全局事件总线的适用场景 虽然全局事件总线使用于任意组件之间的通信&#xff0c;但是没有必要处处用它。 数据在哪里&#xff0c;操作数据的方法就在哪里&#xff01; 二、TodoList案例-全局事件总线 适用于全局总线的场景&#xff1a;Item和App&#xff08;爷孙关系&…

RFID期末复习 | 防碰撞算法 | 信源编码 | 差错控制 | 系统调制 | S50卡 | 无源标签 | 工作频率 | 自动识别

防碰撞算法 ALOHA算法 ALOHA算法是一种随机接入方法&#xff0c;其基本思想是采取标签先发言的方式&#xff0c;当标签进入读写器的识别区域内时就自动向读写器发送其自身的ID号&#xff0c;在标签发送数据的过程中&#xff0c;若有其他标签也在发送数据&#xff0c;将会发生…

深度神经网络——什么是降维?

引言 什么是降维&#xff1f; 降维是用于降低数据集维度的过程&#xff0c;采用许多特征并将它们表示为更少的特征。 例如&#xff0c;降维可用于将二十个特征的数据集减少到仅有几个特征。 降维通常用于无监督学习任务 降维是一个用于降低数据集维度的过程&#xff0c;采用许…

从0到1,揭秘AI产品经理的高薪秘诀,转型之路与实战资源全解析

前言 随着算法模型的日益精进、计算能力的显著提升以及海量数据的积累&#xff0c;人工智能领域正以前所未有的速度蓬勃发展。 在国家政策的积极推动、社会资本的强劲注入下&#xff0c;人工智能产业正处于技术快速进步的黄金时期&#xff0c;其影响力广泛渗透至教育智能化、…

dmhs同步因目的端表自增列报错解决方法

dmhs同步因目的端表自增列报错解决方法 1 dmhs copy 装载数据时报错 HY000 CODE:-27232 配置源端捕获器cpt 1 dmhs copy 装载数据时报错 HY000 CODE:-2723 ERR:Only if specified in the column list and SET IDENTITY INSERT is ON, then identity column could be assigned …

栈帧浅析,堆栈漏洞概述——【太原理工大学软件安全期末补充】

在上一篇文章中我说实验一不重要&#xff0c;确实没必要完全按照实验内容逐字逐句理解&#xff0c;但是这里我们补充一个知识点 栈帧&#xff08;Stack Frame&#xff09;是计算机程序执行过程中&#xff0c;调用栈&#xff08;Call Stack&#xff09;中的一个单元&#xff0c;…

存储文件夹下所有.cpp和.h的代码到对应的txt文件里

最近大半年刷了160多天的题&#xff0c;每次刷的时候都要新建一个VS文件&#xff0c;所以文件内存太大了&#xff0c;又舍不得删&#xff0c;就用ai整了一个脚本&#xff0c;可将当前路径下的所有文件里的.cpp和.h文件储存到相应名字的txt文件里&#xff0c;若文件夹下还有文件…

跟TED演讲学英文:A tale of mental illness -- from the inside by Elyn Saks

A tale of mental illness – from the inside Link: https://www.ted.com/talks/elyn_saks_a_tale_of_mental_illness_from_the_inside Speaker: Elyn Saks Date: June 2012 文章目录 A tale of mental illness -- from the insideIntroductionVocabularySummaryTranscriptA…

从零开始理解 XML 和 JSON 的区别

在这篇文章中&#xff0c;我们将深入探讨XML和JSON这两种数据格式的关键异同点&#xff0c;以便读者可以根据项目需求做出明智的技术选择。 了解XML XML&#xff08;Extensible Markup Language&#xff09;是一种用于数据定义的标记语言&#xff0c;最初由万维网联盟&#x…

uniapp使用伪元素实现气泡

uniapp使用伪元素实现气泡 背景实现思路代码实现尾巴 背景 气泡效果在开发中使用是非常常见的&#xff0c;使用场景有提示框&#xff0c;对话框等等&#xff0c;今天我们使用css来实现气泡效果。老规矩&#xff0c;先看下效果图&#xff1a; 实现思路 其实实现这个气泡框的…