当前位置: 首页 > news >正文

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

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

相关文章:

  • B端业务需求分析的3大注意事项
  • 栈帧浅析,堆栈漏洞概述——【太原理工大学软件安全期末补充】
  • HarmonyOS开发日记 :自定义节点,实现 UI 组件 动态创建、更新
  • 279 基于matlab的粒子群集法对铁路电能质量控制系统的容量避行优化设计
  • 一文读懂OpenGVLab带来的最新视觉预训练框架
  • 【idea】解决springboot项目中遇到的问题
  • 智能网站管理系统
  • C语言运算中的临时匿名变量
  • JY-156/1静态电压继电器 板前接线 约瑟JOSEF
  • 人工智能中实现自动化决策与精细优化的核心驱动力
  • MySQL:概念、逻辑与物理结构设计详解
  • 【npm】console工具(含胶囊,表格,gif图片)
  • Http协议:Http缓存
  • VST3音频插件技术介绍
  • RequestHeader 异常拦截机制
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • centos安装java运行环境jdk+tomcat
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • echarts的各种常用效果展示
  • javascript 哈希表
  • MySQL的数据类型
  • PHP面试之三:MySQL数据库
  • react-native 安卓真机环境搭建
  • Redis 中的布隆过滤器
  • text-decoration与color属性
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Vue2 SSR 的优化之旅
  • Wamp集成环境 添加PHP的新版本
  • 初识 beanstalkd
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 当SetTimeout遇到了字符串
  • 基于Android乐音识别(2)
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 世界上最简单的无等待算法(getAndIncrement)
  • 微信公众号开发小记——5.python微信红包
  • 学习Vue.js的五个小例子
  • 译有关态射的一切
  • 用jQuery怎么做到前后端分离
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 数据库巡检项
  • ​第20课 在Android Native开发中加入新的C++类
  • ​业务双活的数据切换思路设计(下)
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • ## 基础知识
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • $.ajax()参数及用法
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (安卓)跳转应用市场APP详情页的方式
  • (剑指Offer)面试题34:丑数
  • (蓝桥杯每日一题)love
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)Neo4j下载安装以及初次使用
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)