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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java 设计模式】23 种设计模式

文章目录 设计模式是什么计算机行业里的设计模式创建型模式&#xff08;共 5 种&#xff09;结构型模式&#xff08;共 7 种&#xff09;行为型模式&#xff08;共 11 种&#xff09; 总结 设计模式是什么 “每一个模式描述了一个在我们周围不断重复发生的问题&#xff0c;以及…

docker打包介绍

最近在做一个开源项目&#xff0c;遇到开发者问各种问题&#xff0c;发现都是系统和软件版本的差异引起的。于是了解了一下docker的使用&#xff0c;发现docker真是个好东东&#xff0c;基本解决了各种版本差异的问题&#xff0c;真正做到了一键部署使用。 先熟悉一下docker里…

c++学习:容器stack栈+queue+map(简易输入法)+deque

目录 stack 模板原型 头文件 模板的成员类型和成员对象和成员函数 栈类模板的容器对象 实例 queue 模板原型 头文件 模板的成员类型和成员对象和成员函数 队列类模板的容器对象 实例 map 模板原型 头文件 模板的成员类型和成员对象和成员函数 关联类模板的容器…

debian cups 打印机共享

apt update apt install -y cups localhost:631 add printer root 密码 添加打印机 然后在windows上设置 http://ip:631/printers/HP_LaserJet_1022

Vue3---安装路由

介绍 在Vue3项目中安装路由 示例 第一步&#xff1a;执行npm命令安装路由 npm install vue-router4第二步&#xff1a;在项目的src文件夹下创建router子文件夹 第三步&#xff1a;创建index.js和routes.js文件&#xff0c;以下为文件的代码 //通过vue-router插件实现模板…

Elementui Radio单选框取消选中

问题&#xff1a; 最近开发一个后台项目的时候用到了单选框&#xff0c;而客户的要求是默认选择一个选项&#xff0c;然后点击可以取消选中。不想自己在手写一个Radio组件&#xff0c;只能在elementui的单选框上修改一下下啦。 1. .native的作用 .native的作用是在给组件添加修…

Typecho 最新XC主题 去除域名授权全解密源码

Typecho 最新XC主题 去除域名授权全解密源码 这是一款多样式主题&#xff0c;首页支持六种主题样式&#xff0c;支持Pjax优化访问速度&#xff0c;多种单页&#xff0c;如友链、说说等。评论支持表情&#xff0c;自定义编辑器&#xff0c;支持其他样式功能。该主题功能性挺高&…

代码随想录算法训练营第二十五天 | 216.组合总和III、17.电话号码的字母组合

216.组合总和III 题目&#xff1a; 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 思路&…

3D Surface Subdivision Methods 3D 曲面细分方法

文章目录 1 介绍2 细分法3 一个简单的例子&#xff1a;Catmull-Clark 细分4 Catmull-Clark 细化5 Refinement Host6 Geometry Policy7 四种细分方法8 示例&#xff1a;自定义细分方法9 实施历史 原文地址: https://doc.cgal.org/latest/Subdivision_method_3/index.html#Chapte…

美创科技葛宏彬:夯实安全基础,对医疗数据风险“逐个击破”

导读 解决医疗机构“临床业务数据合规流动”与“重要数据安全防护”两大难题。 2023年11月11日&#xff0c;在2023年南湖HIT论坛上&#xff0c;HIT专家网联合杭州美创科技股份有限公司&#xff08;以下简称美创科技&#xff09;发布《医疗数据安全风险分析及防范实践》白皮书…

小程序学习基础(页面加载)

打开首页&#xff0c;然后点击第一个按钮进去心得页面 进入心得页面以后 第一个模块是轮播图用的是swiper组件&#xff0c;然后就是四个按钮绑定点击事件&#xff0c;最后就是下拉刷新&#xff0c;下拉滚动&#xff0c;上拉加载。代码顺序wxml,js,wcss,json。 <!--pages/o…

Python——python编译器安装教程

1.前往python官网下载安装程序 python官网 python编译器安装程序下载网站 2.找到自己需要的版本&#xff0c;下载对应的安装程序&#xff0c;运行程序 打开安装包&#xff0c;切记要勾选add python 3.9 to PATH 可选择自动安装&#xff08;Install Now&#xff09;或点击自定义…

Intellij-idea 如何编译maven工程

在IntelliJ IDEA中编译Maven工程的过程如下所示&#xff1a; 打开IntelliJ IDEA并导入Maven工程。选择"File"&#xff08;文件&#xff09;菜单&#xff0c;然后选择"Open"&#xff08;打开&#xff09;或者"Open Project"&#xff08;打开项目…

JVM工作原理与实战(十):类加载器-Java类加载器

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、介绍 二、扩展类加载器 三、通过扩展类加载器去加载用户jar包 1.放入/jre/lib/ext下进行扩展 2.使用参数进行扩展 四、应用程序类加载器 总结 前言 ​JVM作为Java程序的运行…

WPF常用控件-Window

常用属性 这里重点记录一些关键且容易忘记的属性&#xff0c;那些很常用的如Title啥的就不在这里一一说明了。 任务栏按钮 ShowInTaskbar&#xff1a;是否在任务栏中显示应用按钮&#xff0c;默认为True。 层级 Topmost&#xff1a;应用是否始终在所有应用的最上层&#x…

MongoDB分片集群架构详解

分片简介 分片&#xff08;shard&#xff09;是指在将数据进行水平切分之后&#xff0c;将其存储到多个不同的服务器节点上的一种扩展方式。分片在概念上非常类似于应用开发中的“水平分表”。不同的点在于&#xff0c;MongoDB 本身就自带了分片管理的能力&#xff0c;对于开发…

Tensorflow2.0笔记 - 基本数据类型,数据类型转换

【TensorFlow2.0】(1) tensor数据类型&#xff0c;类型转换_tensorflow tensor转int-CSDN博客文章浏览阅读1.5w次&#xff0c;点赞8次&#xff0c;收藏28次。各位同学好&#xff0c;今天和大家分享一下TensorFlow2.0中的tensor数据类型&#xff0c;以及各种类型之间的相互转换方…

【OpenVINO 】在 MacOS 上编译 OpenVINO C++ 项目

前言 英特尔公司发行的模型部署工具OpenVINO™模型部署套件&#xff0c;可以实现在不同系统环境下运行&#xff0c;且发布的OpenVINO™ 2023最新版目前已经支持MacOS系统并同时支持在苹果M系列芯片上部署模型。在该项目中&#xff0c;我们将向大家展示如何在MacOS系统、M2芯片的…

③使用Redis缓存,并增强数据一致性。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 使用Redis缓存&#xff0c;并增强数据一致性。…

1. 认识SPSS

使用的是IBM SPSS statistics 25&#xff0c;参考教材《统计分析与SPSS的应用》 一、安装和启动 具体安装过程是参考spss下载以及安装详细教程这篇文章&#xff0c;下载安装包然后按他的步骤获取用户许可证即可。 二、主要窗口 数据编辑器窗口data editor 是SPSS的主程序窗…