zoukankan      html  css  js  c++  java
  • C#与西门子PLC通信完整实例

    参考网址: https://zhuanlan.zhihu.com/p/221840154?ivk_sa=1024320u

    据某份数据不完全统计,目前中国市场十大国际PLC品牌如下(避免争议,排名不分先后):

    西门子、施耐德、欧姆龙、三菱、罗克韦尔、松下、ABB、倍福、艾默生、GE

    再盘点一下中国市场十大国内PLC品牌:

    和利时、台达、汇川、信捷、永宏、丰炜、南大傲拓、厦门海为、黄石科威、上海正航

    当代电气工程师之所以这么厉害(Ku Bi),很大一部分原因就是PLC品牌太多了,终其一生,可能学不完所有。

    以上均为有感而发,不作为今天的主题,今天的主题主要是跟大家介绍一下,如何站在电气工程师的角度上,实现C#/.NET与西门子PLC之间的通信。

    1、准备工作

    如果想实现C#/.NET与西门子PLC之间的通信,首先要对西门子PLC有一定的了解,西门子PLC目前市场上主要使用的PLC型号包括:S7-200、S7-200Smart、S7-300、S7-400、S7-1200、S7-1500,西门子PLC的主要存储区包括V区(在通信协议里V区即DB1)、M区、I区、Q区、DB区,其他的C区和T区,由于用得比较少,而且可以通过程序中转,暂不涉及。

    对于西门子PLC,如果手头没有PLC,可以通过仿真的方式搭建环境,参考下方链接:

    需要注意以下几个地方:

    (1)PLC配置中,必须勾选允许来自远程对象的PUT/GET通信访问。

    允许Put Get访问

    (2)如果需要访问DB块,必须将DB块属性中的优化的块访问勾选去除。

    DB块去优化访问

    (3)如果是通过PLCSIM-Advanced搭建的仿真环境,必须将整个解决方案的属性中,保护栏里的块编译时支持仿真勾选上。

    块编译支持仿真

    (4)对于读取的地址,一定要是PLC中存在的地址:

    以M存储区为例,一般M区最大字节是8192个,所以如果你读取MD9000,一定是读不到的。

    以DB存储区为例,如果你尚未创建DB1,你读取DB1.DBD0,一定也是读不到的。

    以DB存储区为例,如果你DB1只有200个字节范围,你读取DB1.DBD200,也是读不到的。

    只要遵从以上四个原则,西门子PLC通信基本上就不存在硬件或者配置上的问题了。

    2、PLC基础通信

    本节中提到的基础通信,主要是指针对PLC的地址进行单个或者多个连续的进行读取及写入,下面直接利用刚刚搭建好的仿真环境来做测试,当然,使用实际PLC也是完全没问题的。前提先将博途中的DB1.DBD0、DB1.DBD4、DB1.DBD8、DB1.DBD12分别改成1.2、3.4、5.6、7.8:

    DB1变量数值DB1字符串数据

    1. 单个变量的读取

    通过C#调用通信库xktComm.dll(Nuget搜索xktComm下载安装),实现对PLC单个变量的读取,结果如下图所示:

    说明:西门子PLC通信只需要IP地址和CPU类型即可,不需要端口号,因为S7协议的端口号是固定值102,之所以要选择CPU类型,是因为不同型号的CPU,握手报文是不一样的。

    PLC单个读取PLC单个字符串读取

    (2)单个变量的写入:

    对于单个变量的写入,也非常方便,直接输入地址、类型及写入值即可,下面分别将这4个地址写入1.0、2.0、3.0、4.0,结果如下图所示:

    PLC单个写入PLC单个字符串写入

    (3)多个变量的读取:

    对于多个变量的读取,需要填写读取长度,下面通过将读取长度改成4,一次性将DB1.DB0-DB1.DBD12读取出来,结果如下图所示:

    PLC多个读取

    (4)多个变量的写入:

    对于多个变量的写入,则不需要填写读取长度,直接在写入数值中,用空格分隔,写入相应的数值,下面以将DB1.DBD0-DB1.DBD12改成1.2、3.4、5.6、7.8为例,将写入数值改成1.2 3.4 5.6 7.8,结果如下图所示:

    PLC多个写入

    3、PLC高级通信

    如果PLC基础通信就能满足大家的项目需求的话,那么PLC高级通信一定可以让大家喜出望外。

    PLC高级通信主要应用场合是对于多个不连续的存储区或者多个不连续的变量进行一次性读取和写入,这一点,似乎只有西门子S7协议支持,其他品牌PLC均不支持。

    1. 多个不连续变量读取

    在下图中,连接上PLC后,通过输入变量地址及变量类型,然后点击添加至读取区,会将想要读取的变量加载到右边的读取区中,读取区以JSON形式进行显示,右侧显示耗时时间,添加完成后,通过点击读取数据,会将想要读取的数据展示在日志框中,这些变量是可以不连续的变量。

    下面以读取MD10、MD100、MD200、DB1.DBD0、DB1.DBD8为例,进行测试,测试结果如下图所示:

    PLC多变量同时读取PLC监控表

    (2)写入个不连续变量读取

    在上图读取的基础上,分别将MD10、MD100、MD200、DB1.DBD0、DB1.DBD8写入1.0 2.0 3.0 4.0 5.0,仍然采用同样的方式,填写写入的变量地址、变量类型及写入值,点击添加至写入区,最后点击写入数据,判断是否可以将这些数据同时写入,测试结果如下图所示:

    PLC多变量同时写入PLC多变量写入结果对比

    通过写入反馈及PLC数据对比,实测可以一次将多个变量同时写入PLC,通过判断耗时仅11ms,说明是一次报文写入的,PLC高级通信的合理应用会大大提高上位机的通信效率。

    4、整体总结

    本文主要针对C#与西门子PLC通信做了较为详细的描述,相信对于很多电气工程师,尤其是以西门子PLC为主的电气工程师来说,会有很大帮助。近几年随着人工智能、物联网的流程,工控行业发生了很大的变化,每一位电气工程师都应该及时作出调整,至少学习一门高级编程语言,未雨绸缪,以更好的姿态来应对即将到来的智能制造2025。

  • 相关阅读:
    hdu 1425 sort 解题报告
    codeforces B. Jeff and Periods 解题报告
    codeforces A. Jeff and Digits 解题报告
    codeforces B. Xenia and Spies 解题报告
    Python 条件判断的使用
    Python Apache日志处理脚本(初稿)
    Python函数定义
    Python多条件配合使用
    Python循环的使用(2)
    NavigationController导航栏中添加多个UIBarButtonItem
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15320858.html
Copyright © 2011-2022 走看看