S7.Net与西门子PLC通讯——纯新手必看
前言
本文档适合从未接触过PLC的.NET开发程序员入门查看。(其实看完了之后,PLC开发也就那样)
PLC通讯入门比较难,需要关注的细节比较多。一边学习一边举一反三多思考,一定要自己创建Demo跟着步骤
由于项目还未开发完成,准备空抽补充陆续完成这篇博客,更好的设计思路也能给自己加深印象。
近期公司有一个跟雷达、光电、干扰炮等设备通讯的项目,让我来负责,整个项目只有我一个人且没有PLC开发经验的同事,这对于从未接触过PLC开发的我来说,无疑是一团迷雾,不知从何入手。公司之前也没有PLC开发经验和项目, 头大。。。
正所谓“没有撤退可言,只有活下来的人才有资格清兵线!”
开始在网上找各种资料,在此记录一下学习的过程和踩过的坑
1. 快速锁定有效文章,对于初学来说,先看理论,有些花里胡哨且乱的资料直接关闭
2. 尽量能找到可以理解的demo,觉得有用但还看不懂的可以先notepad做下笔记
3. 如果有人在看 WinTcpS7_1K.dll 的,赶紧关闭,并送到回收站快速清理,收费的。1500授权3台电脑(这个家伙广告特别多,涉及各个论坛,还要CSDN下载积分,注意看评论),最主要封装的还很难用
4. 最后的最后找到 S7NetPlus ,成功实现了PLC的通讯,博客也会总结对 S7NetPlus 的使用
5. 要有中心思路,不要一会这个,一会看那个
由于也是初学,如有讲错或不到位的地方还望大佬指教,及时修正!
先发个视频,这是我在Youtube上找到的一系列视频中的一个,作者通过S7.net的dll控件实现了与西门子S7系列的PLC通信的功能
链接:https://pan.baidu.com/s/1g3wo4e1HEiuwrzXYD-dSGA
提取码:lllg
开发环境准备
同时由于设备还未采购,没有设备进行测试开发,会安装一个仿真模拟器进行调试。(真心的,谁想到还能仿真模拟设备)
需要安装的软件包括
◦TIA Portal V14
◦S7-PLCSIM V14
◦NetToPLCsim-S7o-v-1-2-2-0
TIA Portal
西门子官方管理设备数据块的客户端,每一个项目等同于一个设备型号,可以理解为是我们经常使用的数据块客户端

S7-PLCSIM
创建一个仿真的模拟环境,使用TIA Portal进行调用,控制仿真设备的运行停止

NetToPLCsim
提供本地服务去连接到仿真设备,和PLCsim之间建立网络通讯

安装完TIA之后,有两处需要进行设置(重要!)
1. 选中组态的PLC设备,常规下找到防护与安全,选择允许从远程伙伴使用PUT/GET通信访问

2. 建立的数据块文件,右键属性,需要取消优化的块访问选项,使用绝对地址

软件交互使用
第一步: TIA Portal 新建项目,选择需要通讯的设备型号

第二步:添加数据块

第三步:添加数据类型之后,点击编辑,生成偏移量(Offset),后面获取单个数值时需要

第四步:开始仿真,点击之后会自动打开S7-PLCSIM,根据提示点击“装载”,点“完成”

第五步:在S7-PLCSIM上点击RUN,运行设备仿真环境

第六步:设置 NetToPLCsim
6.1 点击 Add,添加连接到PLCSIM环境
6.2 NetWork IP Address 手写填为本机(127.0.0.1)
6.3 Plcsim Ip Address 点击后面两点,选择192.168.0.1 TCP/IP,必须要在仿真环境运行之后才能选择
6.4 根据不同设备型号设置 Rack / Slot ,我是S7-1200,设置 0 / 1

第七步:开启服务,这里也很坑! 如果没有按顺序操作,也能Start Server,但是编码时连接不到。最开始不懂仿真设备,在这里研究了好久,Demo硬是连不上

ok ! 现在就可以开始进行编码了,这里重点介绍从[连接]到[读写]的集中方式和介绍
创建连接
以前的历史版本 plc.Open(); 会有一个返回值,可以通过返回值获取 ErrorCode 和 ErrorMessage
我使用了当前最新版(V0.4.0),没有返回值使用 try-catch
using (var plc = new Plc(CpuType.S71200, "127.0.0.1", 0, 1))
{
try
{
plc.Open();
}
catch (Exception)
{
Console.WriteLine($"连接到PLC设备失败:IsConnect={plc.IsConnected},IsAvailable={plc.IsAvailable}");
return;
}
}
读取单个数据项【Read】
代码中用到三种数据获取方式: DBX、DBW、DBD,深入理解的可以查一下网上资料
简单理解就是 DBX读取位,比如bool类型;DBW读取字;DBD读取数值
注释中是对应的 TIA Portal 数据块类型
#region 单个数据项读取
var db1Bool1 = plc.Read("DB1.DBX0.0");
Console.WriteLine("DB1.DBX0.0: " + db1Bool1); bool db1Bool2 = (bool)plc.Read("DB1.DBX0.1");
Console.WriteLine("DB1.DBX0.1: " + db1Bool2); // Int
int intVariable = (ushort)plc.Read("DB1.DBW2.0");
Console.WriteLine("DB1.DBW2.0: " + intVariable);
// Real
var realVariabl = ((uint)plc.Read("DB1.DBD4.0")).ConvertToFloat();
Console.WriteLine("DB1.DBD4.0: " + realVariabl);
// DInt
var dIntVariable = (uint)plc.Read("DB1.DBD8.0");
Console.WriteLine("DB1.DBD8.0: " + dIntVariable);
// DWord
var dWordVariable = (uint)plc.Read("DB1.DBD12.0");
Console.WriteLine("DB1.DBD12.0: " + dWordVariable);
// Word
var wordVariable = (ushort)plc.Read("DB1.DBW16.0");
Console.WriteLine("DB1.DBW16.0: " + wordVariable);
#endregion
另一种方式,通过ReadBytes读取单个数据
// 读取int类型
byte [] int0 = (byte[])plc.ReadBytes(DataType.DataBlock, 1, 2, 2);
byte[] revint0 = int0.Reverse().ToArray();
short f5 = BitConverter.ToInt16(revint0, 0); Console.WriteLine("DB1.DBD2: " + f5);
批量读取数据块【ReadBytes】
看注释
#region 批量数据项读取 / 读取整个DB
// DataType: 数据类型,DB或Memory等
// DB : DataBlock=1,Memory=0
// count : 偏移量(offset),设置多少就获取到具体位置的数据
// eg: 比如最后一个DBW是16,那么数据类型长度为2,count就需要传18才能获取到
var bytes = plc.ReadBytes(DataType.DataBlock, 1, 0, 18);
Console.WriteLine(bytes); var bool1 = bytes[0].SelectBit(0);
Console.WriteLine("DB1.DBX0.0: " + bool1);
var bool2 = bytes[0].SelectBit(1);
Console.WriteLine("DB1.DBX0.0: " + bool2); // Int
int intVariable = S7.Net.Types.Int.FromByteArray(bytes.Skip(2).Take(2).ToArray());
Console.WriteLine("DB1.DBD2.0: " + intVariable);
// Real
Double realVariable = S7.Net.Types.Double.FromByteArray(bytes.Skip(4).Take(4).ToArray());
Console.WriteLine("DB1.DBD4.0: " + realVariable); // DWord
uint dWordVariable = S7.Net.Types.DWord.FromByteArray(bytes.Skip(12).Take(4).ToArray());
Console.WriteLine("DB1.DBD12.0: " + dWordVariable);
// Word
var wordVariable = S7.Net.Types.Word.FromByteArray(bytes.Skip(16).Take(2).ToArray());
Console.WriteLine("DB1.DBW16.0: " + wordVariable);
#endregion
读取数据块到类对象【ReadClass】
创建一个Db1类,数据类型和变量名跟 TAI Portal 数据块里一一对应,这个很简单!
因为作者已经封装好了,底层实现也是上述原理
#region 读取数据块(DB)到实体类
var db1 = new Db1();
plc.ReadClass(db1, 1, 0);
#endregion
多个数据块同时读取 【ReadMultipleVars】
ReadMultipleVars()方法需要构造一个List作为参数,这里留作业
#region 多个数据块(DB)同时读取
plc.ReadMultipleVars();
#endregion
写入单个数据【Write】
看完上面的内容,就很容易理解这里
// 写入数据
plc.Write("DB1.DBX0.1", true);
plc.Write("DB1.DBD12.0", 123457);
我也是第一次接触PLC设备通讯,还有很多没有讲全面,如果有更好的方案或经验欢迎留言一起探讨,感谢!
后续用到本文未提及的地方再回来补充。
补充:
S7.Net 作者的GitHub:github.com/killnine(十个杀九个)
S7.Net与西门子PLC通讯——纯新手必看的更多相关文章
- 新手必看】Highcharts的100个基础问答
新手必看]Highcharts的100个基础问答 2014-12-2 10:59| 发布者: Mr.Zhang| 查看: 2749| 评论: 3|来自: Highcharts中文论坛 摘要: 1. ...
- C#与西门子PLC通讯
1.0 通讯组件概述 通讯组件用于PC与可编程控制器(PLC).智能仪表等进行数据通讯,适用于基于PC高级语言的工业自动化控制系统.组件采用动态链接库文件(*.DLL)的形式,在PC系统的项目工程里 ...
- 常用Java开源库(新手必看)
Jakarta common: Commons LoggingJakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具 ...
- iOS-上架APP之启动页设置(新手必看!)
今天自己做的小作品准备提交,就差一个启动页,各种百度,各种搜,结果还好最后终于出来了,和大家分享一下,这个过程中遇到的各种小问题.(注XCode版本为7.2) 1.启动页一般都是图片,因为苹果有4,4 ...
- [转]Web.config配置文件详解(新手必看)
本文转自:http://www.cnblogs.com/gaoweipeng/archive/2009/05/17/1458762.html 花了点时间整理了一下ASP.NET Web.config配 ...
- 新手必看,老鸟绕道–LAMP简易安装
导读 LAMP是企业中最常用的服务,也是非常稳定的网站架构平台.其中L-指的是Linux,A-指的是Apache,m-指的是mysql或者marriDB,p-php.相信大家对这些都已经非常熟悉了,但 ...
- 转:Web.config配置文件详解(新手必看)
转:http://www.cnblogs.com/gaoweipeng/archive/2009/05/17/1458762.html 花了点时间整理了一下ASP.NET Web.config配置文件 ...
- Web.config配置文件详解(新手必看)
花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点.所以这里只介绍一些比较常用的节点. <? ...
- (转)Web.config配置文件详解(新手必看)
花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点.所以这里只介绍一些比较常用的节点. <? ...
- web.cofing(新手必看)
花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点.所以这里只介绍一些比较常用的节点. <? ...
随机推荐
- leetcode-Linux 简介
https://leetcode-cn.com/leetbook/read/awesome-linux-handbook/eg4ecm/ Linux 系统是一种金字塔模型的系统,如下所示 应用程序发起 ...
- 京东h5st参数js逆向
扣代码的环节挺简单的就不讲了 直接到重点 发现许多包都会有一个h5st的加密参数 那么我们就要看这个参数是怎么生成的 我们可以根据请求堆栈 找到h5st的入口 当然还有一种更简单的方法 就是直接全局搜 ...
- el-table当前行的获取和设置,用于表格行操作
1.在vue的data区声明当前行变量对象,如果当前行的信息用于了按钮的状态则需要赋予默认值,否则会报找不到属性的错误,比如下面会用到当前记录的status属性值控制按钮是否可用. //表格选中的行 ...
- [python]png转webp的命令行工具
前言 网页上使用webp格式的图片更加省网络流量和存储空间,但本地图片一般是png格式的,所以考虑用python的pillow库将png格式的图片转换为webp格式. 需求: 可以在系统任意地方调用. ...
- VXLAN 网络中报文转发过程
本文分享自天翼云开发者社区<VXLAN 网络中报文转发过程>,作者:刘****林 以同网段的 VM 间互通简单介绍 VXLAN 网络中的报文转发过程. 1.VM1 发送目的地址为 VM2 ...
- SDN网络技术在云计算中的应用
本文分享自天翼云开发者社区<SDN网络技术在云计算中的应用>,作者:1****m SDN(软件定义网络)是一种新型的网络架构,其基本思想是将数据平面和控制平面分离,通过集中式的控制器来管理 ...
- Luogu P7250 BalticOI 山峰 题解 [ 蓝 ] [ 模拟 ] [ 并查集 ] [ BFS ]
Luogu P7250 BalticOI 山峰. 一道大模拟,很暴力,也很难写.建议紫或蓝,标签为模拟.广度优先搜索.并查集. 思路 首先观察到答案取决于路线上的最低点,所以我们可以把所有点的高度丢进 ...
- bash 学习
学习bash shell 第一天 在百度百科上找的解释 Bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写.1989年发布第一个正式版本,原先是计划用在GNU操作系 ...
- Vulnhun靶机-kioptix level 4-sql注入万能密码拿到权限ssh连接利用mysql-udf漏洞提权
一.环境搭建 然后选择靶机所在文件夹 信息收集 本靶机ip和攻击机ip 攻击机:192.168.108.130 靶机:192.168.108.141 扫描ip 靶机ip为:192.168.108.14 ...
- Java进阶 - [1-5] 泛型
一.什么是泛型 早期Java是使用Object来代表任意类型的,但是向下转型有强转的问题,这样程序并不安全. 针对List.Set.Map等集合类型,它们对存储的元素类型是没有任何限制的.例如 ...