MFC Socket和合信CTMC M266ES 运动控制型PLC通信进行数据交换

前言

         1、前两篇文章通过对Snap7和S7-1200/S7-1500PLC的通信进行了详细的介绍。Snap7的优点开源性强、使用方便易于上手,跨平台和可移植性性强。但是Snap7也有个缺点就是只能访问PLC的DB、MB、I、Q区进行数据读写,不能对V区进行读写,有人说可以读写V区,但是目前我还没有得到可靠的验证。

        2、ModbusTCP/ModbusRTU协议,通过开源的Libmodbus库和西门子S7-1200/S7-1500PLC通信进行数据交换。Libmodbus可以对PLC的DB、VB、MB、I、Q区进行读写操作,效率较高、开放性好,缺点就是如果用户要按位操作V区就存在安全隐患。操作流程为:先读取V区,因为Modbus协议得读写操作都是以字为单位,比较V区数据,把要改变得位数据置位或复位后再写入到PLC中,一个流程要对PLC进行2次操作,一次读操作,一次写操作。安全隐患主要存在读过程,如果读取后PLC内数据得某个位发生了变化,再去进行PLC数据得写操作过程就会存在安全隐患。
SOCKET
        3、Socket通信,Socket通信得有点也是开放性较好,速度较快,缺点十Socket通信得数据是以CHAR类型ASCII码得形式进行,所以对数据需要转换为ASII。
        有关Socket的详细介绍可以参考以下文章。

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

合信MT226ES程序

PLC的实数转ASCII码指令说明及使用

http://www.a766.com/plc/112387.htmlicon-default.png?t=N7T8http://www.a766.com/plc/112387.html

        具体的使用和介绍可参考如上连接或到西门子官网进行学习,合信PLC指令和西门子PLC指令完全一致,不分机型也可以直接用Step7microWin进行编程。

SOCKET上位C++软件

        上位C++软件采用之前的例程中的Socket客户端进行测试和介绍,原文章连接如下:

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

        设置好IP参数和端口后进行连接PLC服务器,连接后PLC侧如下图所示。会显示当前连接的客户端的IP地址。

        

        数据读写操作,此例程只写了PLC侧发送数据ASCII码格式转换,读取ASCII码格式转换没有写,以后有时间再慢慢测试。

        经过简单的测试可得出结论就是上位软件通过SOCKET对PLC进行数据读写比较麻烦,需要编写大量的数据转换指令。并且PLC侧的ASCII转换指令比较浪费内存。因此实用性较差。以下为socket接收数据程序。
BOOL CMFCApplicationSocketClientDemoDlg::ConnectServerSocket(CMFCApplicationSocketClientDemoDlg* pClient)
{CSoceketInitConfig ClientSockInit(2,2);m_pClientSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (m_pClientSock==NULL){MessageBox(_T("ClientSocket创建失败!"),_T("信息提示:"),MB_OKCANCEL|MB_ICONERROR);return FALSE;}sockaddr_in ServerAddr_in;ServerAddr_in.sin_family = AF_INET;int m_SerPort = GetDlgItemInt(IDC_EDITSERVERPORT);CString StrSerIp;GetDlgItemText(IDC_IPADDRESS_SERVER,StrSerIp);if (StrSerIp==_T("0.0.0.0")||m_SerPort > 65535 || m_SerPort < 1024|| m_SerPort==0){MessageBox(_T("请输入正确端口(1024-65535)或IP地址,重新连接!"), _T("信息提示:"), MB_OK | MB_ICONINFORMATION);SetRevTextMsg(_T("请输入正确端口IP地址,重新连接"));return FALSE;}char* pStrIP = CstringToWideCharArry(StrSerIp);ServerAddr_in.sin_port = htons(m_SerPort);ServerAddr_in.sin_addr.S_un.S_addr = inet_addr(pStrIP);if (SOCKET_ERROR==connect(m_pClientSock, (sockaddr*)&ServerAddr_in, sizeof(ServerAddr_in))){MessageBox(_T("服务器连接失败,请检查你填写的IP和端口是否错误!"), _T("信息提示:"), MB_OK | MB_ICONWARNING);SetRevTextMsg(_T("服务器连接失败,请检查你填写的IP和端口是否错误!"));return FALSE;}pClient->SetRevTextMsg(_T("连接服务器成功"));pClient->m_CutDownConnect.EnableWindow( TRUE);pClient->m_ConnectServer.EnableWindow(FALSE);m_ServerConnectSucced = TRUE;CString RevMsg;while (true){if (socket_Select(m_pClientSock,100,TRUE)){char recvBuff[MaxBufSize] = { 0 };int iRead = recv(m_pClientSock, recvBuff, sizeof(recvBuff), 0);if (iRead > 0){RevMsg = CharArryToCstring(recvBuff);pClient->SetRevTextMsg(StrSerIp + _T(">>") + RevMsg);for (int i = 0; i < iRead; i++){printf("recvBuff[%d]=%d\n",i, int(recvBuff[i]));}}else{pClient->SetRevTextMsg(_T("已断线,请重新连接"));pClient->m_CutDownConnect.EnableWindow(FALSE);pClient->m_ConnectServer.EnableWindow(TRUE);m_ServerConnectSucced = FALSE;return TRUE;}}}return TRUE;
}

        通信线程

DWORD WINAPI ConnectServerThread(LPCVOID lParam)
{CMFCApplicationSocketClientDemoDlg* pClient = (CMFCApplicationSocketClientDemoDlg*)lParam;if (pClient->ConnectServerSocket(pClient)){}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/334499.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis主从复制、哨兵及集群

目录 简介 主从复制 哨兵 集群 1.Redis 主从复制 主从复制的作用 主从工作原理 主从复制搭建 安装redis 修改redis配置文件Master节点操作 修改 Redis 配置文件slave节点操作 验证主从效果 2.Redis 哨兵模式 哨兵模式的作用 哨兵结构组成部分 故障转移机制 主…

【数据库】mysql事务

一、事务的基本概念 1、事务的定义 事务可由一条非常简单的SQL语句组成&#xff0c;也可以由一组复杂的SQL语句组成。。 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务处理可以用来维护数据库的完整性&#xff0c;保证成批的 SQL 语句要么全部执行&…

Java学习笔记-day05-响应式编程初探-自定义实现Reactive Streams规范

最近在学响应式编程&#xff0c;这里先记录下&#xff0c;响应式编程的一些基础内容 1.名词解释 Reactive Streams、Reactor、WebFlux以及响应式编程之间存在密切的关系&#xff0c;它们共同构成了在Java生态系统中处理异步和响应式编程的一系列工具和框架。 Reactive Streams…

vue3 组合式 API 在 onMounted 中调用 dom 报错 Initialize failed: invalid dom.

问题 在开发的过程中&#xff0c;项目中需要用到 echarts&#xff0c;引入后在渲染的过程中报错了&#xff1a;Initialize failed: invalid dom. 这个报错表示元素在未渲染完成的情况下就被调用了&#xff0c;作者在以前也遇到过这种情况&#xff0c;在 vue2 中正常来说将 ech…

Parallel patterns: convolution —— An introduction to stencil computation

在接下来的几章中&#xff0c;我们将讨论一组重要的并行计算模式。这些模式是许多并行应用中出现的广泛并行算法的基础。我们将从卷积开始&#xff0c;这是一种流行的阵列操作&#xff0c;以各种形式用于信号处理、数字记录、图像处理、视频处理和计算机视觉。在这些应用领域&a…

C/C++学习笔记 vcpkg使用备忘及简要说明

一、简述 vcpkg 是一个免费的 C/C 包管理器&#xff0c;用于获取和管理库。从 1500 多个开源库中进行选择&#xff0c;一步下载并构建&#xff0c;或者添加您自己的私有库以简化构建过程。由 Microsoft C 团队和开源贡献者维护。 官方教程 vcpkg 文档 | Microsoft Learnvcpkg …

玩转硬件之玩改朗逸中控设备

这是一个有关一件被拆卸的朗逸中控设备的故事。这个设备已经闲置多年&#xff0c;但是它的命运发生了转变。它被改装成了一台收音机和MP3播放器。 这个设备曾经是一辆朗逸的中控屏幕&#xff0c;就是因为它没有倒车影像&#xff0c;它就被拆了下来&#xff0c;被扔在了一个角落…

Realm Management Extension领域管理扩展之安全状态

RME基于Arm TrustZone技术。TrustZone技术在Armv6中引入,提供以下两个安全状态: 安全状态(Secure state)非安全状态(Non-secure state)以下图表显示了在AArch64中的这两个安全状态以及通常在每个安全状态中找到的软件组件: 该架构将在安全状态运行的软件与在非安全状态运…

03.SpringCloud服务间远程调用

一、Feign远程调用 feign是基于nacos&#xff0c;所以需要先引入对应的依赖。 先来看我们以前利用RestTemplate发起远程调用的代码&#xff1a; 存在下面的问题&#xff1a; 代码可读性差&#xff0c;编程体验不统一 参数复杂URL难以维护 Feign是一个声明式的http客户端…

探索Java中的Map:领略键值对的无限魅力

目录 1、前言 2、介绍Map 2.1 什么是Map 2.2 Map的特点 3、常用的Map实现类 3.1 HashMap 3.2 TreeMap 3.3 LinkedHashMap 3.4 Hashtable 3.5 ConcurrentHashMap 4、操作Map的常用方法 5、Map的应用场景 5.1 缓存 5.2 数据存储 5.3 计数器 6、常见问题解答 6.1…

【漏洞复现】锐捷EG易网关cli.php后台命令执行漏洞

Nx01 产品简介 锐捷EG易网关是一款综合网关&#xff0c;由锐捷网络完全自主研发。它集成了先进的软硬件体系架构&#xff0c;配备了DPI深入分析引擎、行为分析/管理引擎&#xff0c;可以在保证网络出口高效转发的条件下&#xff0c;提供专业的流控功能、出色的URL过滤以及本地化…

极海APM32F003通过IEC 60730/60335功能安全认证,为产品安全保驾护航

近日&#xff0c;极海APM32F003系列工业级超值型MCU&#xff0c;已顺利通过IEC 60730/60335功能安全认证&#xff0c;并可提供符合CLASS B标准的功能安全设计套件&#xff0c;有助于客户减少认证时间与成本&#xff0c;快速推出稳定可靠的终端产品。 *VDE是德国的一个权威性电气…