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

前言

在前面例程中谈到了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.5501https://blog.csdn.net/lzc881012/article/details/135356054?spm=1001.2014.3001.5501

5、经过不屑的努力和查阅资料终于有了写的发现,正可谓功夫不负有心人。查阅了大量的资料后发现网上有关Snap7访问S7-200PLC V存储区的文章是几乎没有,要吗就是东扯一句西扯一句根本无法参考。
9、C++上位软件编程,编写方法这里不再介绍,可以参考前面两篇有关Snap7 的文章。
cpp 复制代码
#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;
          
        }
    }
   
}
cpp 复制代码
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.5501https://blog.csdn.net/lzc881012/article/details/135356054?spm=1001.2014.3001.5501https://blog.csdn.net/lzc881012/article/details/135345037?spm=1001.2014.3001.5501https://blog.csdn.net/lzc881012/article/details/135345037?spm=1001.2014.3001.5501

相关推荐
桀人2 分钟前
C++——string类的详细介绍
开发语言·c++
橙子进阶之路5 分钟前
Java线程(CompletableFuture)
java·开发语言
2601_9618752416 分钟前
法考备考计划表|学习计划|资料已整理
java·开发语言·学习·eclipse·tomcat·c#·hibernate
青春:一叶知秋16 分钟前
【Python】python基本语法和使用
开发语言·python
caimouse16 分钟前
Reactos 第 9 章 设备驱动 — 9.13 同步I/O与异步I/O
windows
caimouse19 分钟前
Reactos 第 9 章 设备驱动 — 9.10 磁盘的Miniport驱动模块
windows·嵌入式硬件
SilentSamsara22 分钟前
向量数据库实战:Chroma/Milvus/Qdrant 选型与语义搜索应用
开发语言·数据库·人工智能·python·青少年编程·milvus
AI人工智能+电脑小能手30 分钟前
【大白话说Java面试题 第115题】【并发篇】第15题:说一下悲观锁和乐观锁的区别?
java·开发语言·面试
插件开发34 分钟前
vs2015 cuda c++ cdpSimplePrint范例,递归功能实现演示
linux·c++·算法
lijgvnns38 分钟前
个人AI编程工具的vibe coding实践:从爬虫到导出Excel的全流程
开发语言·javascript·ecmascript