snap7-c++/MFC开发笔记

书接上文,通过对python-snap7的库的研究,笔者掌握了上位机与plc通讯的基本原理与方法,然工业现场上位机的用户界面基本上是以c++为底层语言制作的,python在工业应用中似乎不太吃香。因此,笔者针对基于c++的snap7进行了一段时间的学习,完成了以下的学习笔记,在此感谢部门的硬件支持及两位不愿意透露姓名的朱工与胡工的技术支持。

前文补充

前文主要内容为基于python-snap7的上位机与plc通讯模块,首先,环境配置方面需要注意,snap7安装结束后需要把snap7-full-1.4.2\release\Windows\Win32目录下的dll文件和lib文件放至Anaconda的安装目录和系统windows下的SysWOW64下。此段中win32文件夹并非绝对,若python与系统版本为64位,则该文件夹为win64而非win32。其次,对前文关于python-snap7模块无法直接读写plc中某一位开关量的特性进行说明,snap7是基于c++进行封装的,而笔者后来在对snap7.dll的应用中发现,其中并没有支持位读取的相关类,因此,python-snap7是不支持plc位信号开关量的直接读写的。

前置技术支持

掌握本文技术所需的技术为c++和MFC,本文不再对相关基础技术作过多解释。

环境配置

笔者使用vs2019,需要vs2019具备MFC的开发的接口,需要将前文提及的snap7-full文件中的snap7.lib、snap7.h、snap7.cpp拷贝至项目文件夹根目录,添加至项目并且在窗体头文件中引入;将snap7.dll拷贝至debug目录。


此外,插个题外话,如果通讯失败,请仔细检查plc与上位机的网络是否连通。

使用方法

工业应用中上位机与plc的通讯主要是通过db块数据读取实现,因此本文对M/Q/I区函数不再赘述,有兴趣的小伙伴可以自行进行实验。
以下为主要函数说明

ConnectTo(const char *RemAddress,int Rack, int Slot);
//通过PLC的IP地址*RemAddress建立连接。
// *RemAddress PLC的IP地址,
// Rack  PLC的齿数,一般为0
// Slot  PLC的槽数Disconnect();
//断开PC与PLC的连接DBRead(int DBNumber, int Start, int Size, void *pUsrData);
//读DB区的Byte值
//DBNumber为DB块识别号码
//Start为PLC的起始地址
//Size为PLC的字节个数
//*pUsrData数据缓冲区地址,函数读到的数据存在这个缓冲区内DBWrite(int DBNumber, int Start, int Size, void *pUsrData);
//写DB区的Byte值MBRead(int Start, int Size, void*pUsrData);
//读M区的Byte值MBWrite(int Start, int Size, void*pUsrData);
//写M区的Byte值ABRead(int Start, int Size, void*pUsrData);
//读I区的Byte值ABWrite(int Start, int Size, void*pUsrData);
//写I区的Byte值EBRead(int Start, int Size, void*pUsrData);
//读O区的Byte值EBWrite(int Start, int Size, void *pUsrData);
//写O区的Byte值

需要注意的是,上述函数中读写都是以byte类型为基础的,如果读者对基于字节的读写有疑问,请参考上一篇博文对字节读写的描述,本文不再赘述。

示例展示

本例直接使用MFC对snap7进行实验

窗口初始化


创建窗口,创建两个编辑框IDC_EDIT1与IDC_EDIT2与一个按钮
编辑框关联两个整型变量,一个用来显示PLC的数值,一个用来确认按钮状态。

窗体头文件中定义一个snap7的类名与一个用于存储读取数据的byte数组和一个显示按钮状态的布尔量:

public:afx_msg void OnBnClickedButton1();int nPlcCom;int nReadNum;bool bArrIfStart;TS7Client* pMyPlc;byte nRead[2];

窗口初始化函数中定义snap7的类并且创建plc连接,至此,已经创建连接的pMyPlc类可以在全局中调用并读取plc中的数据:

// TODO: 在此添加额外的初始化代码pMyPlc = new TS7Client;pMyPlc->ConnectTo("192.168.0.10", 0, 1);

功能模块

按钮的触发函数如下,该按钮实现的功能为:点击切换读取状态(其实这个功能可以不要),点击读取plc中db1004的心跳文,该心跳文为两个字节大小,并将心跳文显示到之前创建的文本编辑框中。

void CMFCApp032101Dlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码if (bArrIfStart == FALSE){bArrIfStart = TRUE;nPlcCom = 10;}else {bArrIfStart = FALSE;nPlcCom = 5;}pMyPlc->DBRead(1004, 0, 2, &nRead);nReadNum = nRead[0] * 256 + nRead[1];UpdateData(FALSE);
}

运行效果



可以发现,每次点击按钮,编辑框1的数字变化显示按钮状态,编辑框2则读取了plc中的心跳文并显示。

总结

至此,基于c++MFC的snap7实验基本成功,上位机与PLC的通讯其本质就是对内存区数据的读写,该技术的完整掌握可以写出便于windows系统运行的窗口程序。
此外,snap7目前笔者还没研究透反馈机制,在c++中即使读取错误程序也不会报错,因此无法确定读取状态,snap7的官方文档中有类似错误码返回的机制但是其demo中并未展示,所以笔者一直没找到正确的使用方法,替代方案是:在plc中固定地址存入一个常量让snap7去读取,若读取数值不一致则判断读取错误。如果有小伙伴知道错误码返回机制的使用方法也欢迎联系我。

snap7-c++/MFC开发笔记相关推荐

  1. 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理

    本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7405479 作者:毛星云    邮箱: happyl ...

  2. [置顶]       【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7318264 作者:毛星云    邮箱: h ...

  3. 【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类

    本系列文章由zhmxy555编写,转载请注明出处. http://qianmo.blog.51cto.com/5127279/875711 作者:毛星云 邮箱: happylifemxy@qq.com ...

  4. 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理

    上一节我们讲解了键盘消息处理相关的知识.键盘加鼠标作为目前人机交互方式依旧的主流,在讲完键盘消息处理之后接着讲鼠标消息处理,自然是理所当然的. 这一节主要介绍各种鼠标消息的处理方式以及一些相关函数的运 ...

  5. .Net Winform 开发笔记(四) 透过现象看本质

    写在前面: 从一个窗体的创建显示,再到与用户的交互,最后窗体关闭,这中间经历过了一系列复杂的过程,本文将从Winform应用程序中的Program.cs文件的第一行代码开始,逐步分析一个Winform ...

  6. C++ MFC 学习笔记+小型通讯录系统实现

    MFC 最详细入门教程 [MFC常用函数总结](https://www.cnblogs.com/jiu0821/p/4606639.html) [C++ & MFC]https://www.c ...

  7. 罗技方向盘SDK开发笔记

    这段时间因为项目需求,接触到了罗技G29方向盘的SDK开发,能够参考的资料比较有限,一路磕磕碰碰遇见不少问题,硬着头走了下去,不过最后还是成功了,写下这篇笔记来记录下我的开发过程,也给有需要的人参考, ...

  8. 【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/7318264 作者:毛星云(浅墨)  ...

  9. python-snap7开发笔记

    开发笔记1.0 如何通过python与西门子1500plc进行通讯 anaconda与snap7的安装 snap7库使用详解 read_area() 地址信息: DB块地址: 字节地址: 字节长度: ...

最新文章

  1. 利用java多线程向MongoDB中批量插入静态文件
  2. html 跳转或打开新网页
  3. eclipse 启动 找不到 JRE JDK的解决方法
  4. 【Android 高性能音频】Oboe 播放器开发 ( 为 OpenSL ES 配置参数以获得最佳延迟 | Oboe 音频流 | Oboe 音频设备 )
  5. nyoj3533D dungeon
  6. Javascript 获取字符串字节数的多种方法
  7. 属性编辑器未在PropertyEditorManager中注册?
  8. Bootstrap之栅格系统
  9. mysql basic_MySQL Basic Learning (二)
  10. Linux学习笔记---使用BusyBox创建根文件系统(一)
  11. 实战Makefile
  12. 微型计算机及接口技术考试卷,微机原理与接口技术考试试题及答案 2
  13. linux系统微信怎么放桌面上,Linux 安装微信/QQ
  14. 重标极差分析 Hurst指数计算
  15. android 字符串大小写转换
  16. 计算机基础必修上课是上机吗,关于大学计算机基础论文范文集,与上海财经大学国际工商管理学院相关毕业论文范文...
  17. android内存dump分析,闭眼能敲,Android内存分析command
  18. 百度云盘 油猴下载助手脚本【绝对可用】
  19. 自然语言处理入门学习笔记3:词向量
  20. 解决Hander dispatch failed;nested exception is java .lang. AbstractMethodError:Method com/mchange/v2/c

热门文章

  1. nodejs 在执行 npm install 的时候出现问题
  2. Java Double类型精确运算解决
  3. 2021资源网源码二开模板
  4. Deep Knowledge Tracing with Transformers论文阅读
  5. iOS UIWebView 缩放
  6. 在本地如何搭建WAP环境?
  7. 机械师怎么打开计算机管理,详解机械师win10打开fn热键功能教程
  8. 第001天:第一行Android代码
  9. %3c韩非子%3e语言研究pdf,《韩非子》精华译评-张觉编著.pdf
  10. CSS字体的连写方式