C++上位软件通过Snap7开源库访问西门子S7-200/LOGO PLC/合信M226ES PLC V存储区的方法

news/2024/7/10 21:09:17 标签: c++, 开源, 开发语言, visual studio, windows, mfc

前言

        在前面例程中谈到了C++ 通过Snap7开源库S7通信库跟西门子S7-1200PLC/S7-1500PLC以及合信CTMC M226ES PLC/CPU226 PLC通信的方式方法和应用例程。但是遗憾的是Snap7中根据官方资料显示只能访问PLC的 DB区、MB区、C区、T区 、I区、Q区,并没有提到有关如何访问S7-200/S7-200SMART/MT226ES/CPU226等200系列PLC的方式和方法。
       1、 以下为Snap7官方封装好的函数列表。

        2、以下为Snap7官方有关Snap7开源通信库访问PLC存储区的类型定义及数据长度说明。

        3、Snap7官方有关Snap7连接的机架号和PLC槽位号介绍。
        4、由以上可看出Snap7中并未介绍如何访问PLC V存储区的方式和方法,虽然Snap7并未介绍,但是Snap7是肯定支持此功能的,不然S7-200PLC和S7-200PLC之间的通信是如何实现的呢?本人使用三方设备也支持S7-200PLC 的S7通信,再有就是M226ES也支持S7主从站通信这个前面例程已经介绍过。感兴趣的可以看下本人下面这篇文章。

        https://blog.csdn.net/lzc881012/article/details/135356054?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://blog.csdn.net/lzc881012/article/details/135356054?spm=1001.2014.3001.5501

        5、经过不屑的努力和查阅资料终于有了写的发现,正可谓功夫不负有心人。查阅了大量的资料后发现网上有关Snap7访问S7-200PLC V存储区的文章是几乎没有,要吗就是东扯一句西扯一句根本无法参考。

        

        6、饶了一圈最终回到了Snap7的官方说明手册,如上图所示的Overview中提到了LOGO 0BA7/0BA8两款PLC,应该是LOGO plc只有这两款支持Snap7,好像是说LOGO plc早期版本不带网络通信口,此时比较惊喜那就继续往下看。

        7、在Snap7官方手册的第76也找到了Logo PLC 的相关说明,顺着文章一直往下看。

        8、下面这段话非常重要,这里主要说的意思是HMI 设备和Snap7 都是通过DB1 来读写LOGO V存储区的。那就意味着LOGO/S7-200PLC的V存储区就是DB1。是不是恍然大悟?。惊不惊喜?意不意外?
        9、C++上位软件编程,编写方法这里不再介绍,可以参考前面两篇有关Snap7 的文章。

#include <iostream>
#include"snap7.h"
#include <ctime> 

using namespace std;

unsigned char Snap7Rcv[100];
unsigned char Snap7RcvM226Es[100];
unsigned char Snap7RcvM226Esvb[100];
bool          Snap7RcvM226EsBitS[100];
TS7Client* mClient;
void mSnap7GetDataFromS71200Db()
{
    mClient = new TS7Client;
    mClient->ConnectTo("192.168.2.202", 0, 1);
    mClient->DBRead(9,0,100,&Snap7Rcv);
    mClient->Disconnect();
    delete mClient;
}

void mSnap7GetDataFromM226EsMbBlock()
{
    mClient = new TS7Client;
    mClient->ConnectTo("192.168.2.201", 0,0);
    mClient->MBRead(500,100, &Snap7RcvM226Es);
    mClient->Disconnect();
    delete mClient;
}
void mSnap7GetDataFromM226EsVbBlock()
{
    mClient = new TS7Client;
    mClient->ConnectTo("192.168.2.201", 0, 0);
    mClient->DBRead(1, 2000,100, &Snap7RcvM226Esvb);
    mClient->Disconnect();
    delete mClient;
}

void  Delay(int time)
{
    clock_t now = clock();
    while (clock() - now < time);
}
int main()
{
    while (true)
    {
        mSnap7GetDataFromS71200Db();
        mSnap7GetDataFromM226EsMbBlock();
        mSnap7GetDataFromM226EsVbBlock();
       
        Delay(1000);
        for (int i = 0; i < 100; i++)
        {
            //cout << "mSnap7GetDataFromS71200Db-Snap7DB.Snap7Byte" << "[" << i << "]" << "="  << (int)Snap7Rcv[i] << endl;
            //cout << "mSnap7GetDataFromM226ES_MB-Snap7MB" << "[" << 500 + i << "]" << "=" << (int)Snap7RcvM226Es[i] << endl;
            cout << "mSnap7GetDataFromM226ES_VB-Snap7VB"  << 2000 + i << "=" << (int)Snap7RcvM226Esvb[i] << endl;
          
        }
    }
   
}

void mSnap7GetDataFromM226EsVbBlock()
{
    mClient = new TS7Client;
    mClient->ConnectTo("192.168.2.201", 0, 0);
    mClient->DBRead(1, 2000,100, &Snap7RcvM226Esvb);
    mClient->Disconnect();
    delete mClient;
}
        10、函数mSnap7GetDataFromM226EsVbBlock()主要功能是读取M226ES PLC V存储区的功能。mClient->DBRead(1, 2000,100, &Snap7RcvM226Esvb);此句的意思是读取VB2000开始100个Byte。因为DNumber为1就代表访问PLC的V存储区。如下图所示是DBRead函数的官方说明。

        

        11、程序测试,运行C++上位软件进行测试。测试结果如下图所示。通过测试结果可以看到PLC状态监控表中的VB2000开始的100个Byte数据和C++软景通过Snap7开源库读取到的数据完全相同,到此Snap7的使用算是画上了圆满的句号。

        

以往有关Snap7的连接

https://blog.csdn.net/lzc881012/article/details/135356054?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://blog.csdn.net/lzc881012/article/details/135356054?spm=1001.2014.3001.5501https://blog.csdn.net/lzc881012/article/details/135345037?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://blog.csdn.net/lzc881012/article/details/135345037?spm=1001.2014.3001.5501


http://www.niftyadmin.cn/n/5316132.html

相关文章

C++20:从0到1学懂concept

目录 1.concept语法 1.1 替换typename1.2 requires关键字1.4 concept与auto2.编译器支持3.总结 C20引入了concept(概念)&#xff0c;是对模板参数(编译时评估)的一组约束。你可以将它们用于类模板和函数模板来控制函数重载和特化。一些优点包括&#xff1a; 对模版参数强制类型…

Java:爬虫htmlunit实践

之前我们已经讲过使用htmlunit及基础&#xff0c;没有看过的可以参考Java&#xff1a;爬虫htmlunit-CSDN博客 我们今天就来实际操作一下&#xff0c;爬取指定网站的数据 1、首先我们要爬取一个网站数据的时候我们需要对其数据获取方式我们要进行分析&#xff0c;我们今天就拿双…

【调研】人工智能(大模型)生成内容AIGC检测

本篇文章分享近期人工智能生成内容AIGC检测的相关工作,主要介绍大模型的文本生成检测和图片生成检测 目录 1. AI-Generated Content 人工智能生成内容2. 大语言模型LLM生成内容检测方法分类黑盒检测方法论文举例白盒检测方法论文举例3. 大模型图片生成检测论文举例1. AI-Gene…

计算机网络——多路复用技术

1. 定义 多路复用是一种技术&#xff0c;允许在一个传输介质上传输多个信号或信息流。这种技术对于优化资源使用和增加网络的传输能力至关重要。 2. 分类 以下是对所提到的不同类型的多路复用的详细解释&#xff1a; 2.1 频率分割多路复用 (FDM - Frequency Division Multipl…

Linux驱动学习—输入子系统

1、什么是输入子系统&#xff1f; 输入子系统是Linux专门做的一套框架来处理输入事件的&#xff0c;像鼠标&#xff0c;键盘&#xff0c;触摸屏这些都是输入设备&#xff0c;但是这邪恶输入设备的类型又都不是一样的&#xff0c;所以为了统一这些输入设备驱动标准应运而生的。…

IOS 查看安装包的公钥 SHA1等信息

iOS应用获取App特征信息指导 访问Apple Developer (简体中文)&#xff0c;使用App对应的iOS开发者账号登录。 Bundle ID获取&#xff1a;在计划资源中查看标识符&#xff0c;其中IDENTIFIER列对应的就是Bundle ID。 公钥与签名SHA1值获取&#xff1a;在计划资源中查看证书…

【开源】基于JAVA、微信小程序的音乐平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首音乐4.2 新增音乐4.3 新增音乐订单4.4 查询音乐订单4.5 新增音乐收藏 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的音乐平台&#xff0c;包含了音乐…

Apache Doris 入门 10 问

基于 Apache Doris 在读写流程、副本一致性机制、 存储机制、高可用机制等方面的常见疑问点进行梳理&#xff0c;并以问答形式进行解答。在开始之前&#xff0c;我们先对本文相关的名词进行解释&#xff1a; FE&#xff1a;Frontend&#xff0c;即 Doris 的前端节点。主要负责接…