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.5502https://blog.csdn.net/lzc881012/article/details/127737864?spm=1001.2014.3001.5502

合信MT226ES程序

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

http://www.a766.com/plc/112387.htmlhttp://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.5502https://blog.csdn.net/lzc881012/article/details/127775714?spm=1001.2014.3001.5502

设置好IP参数和端口后进行连接PLC服务器,连接后PLC侧如下图所示。会显示当前连接的客户端的IP地址。
数据读写操作,此例程只写了PLC侧发送数据ASCII码格式转换,读取ASCII码格式转换没有写,以后有时间再慢慢测试。
经过简单的测试可得出结论就是上位软件通过SOCKET对PLC进行数据读写比较麻烦,需要编写大量的数据转换指令。并且PLC侧的ASCII转换指令比较浪费内存。因此实用性较差。以下为socket接收数据程序。
cpp 复制代码
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;
}

通信线程

cpp 复制代码
DWORD WINAPI ConnectServerThread(LPCVOID lParam)
{
	CMFCApplicationSocketClientDemoDlg* pClient = (CMFCApplicationSocketClientDemoDlg*)lParam;
	if (pClient->ConnectServerSocket(pClient))
	{

	}
	return 0;
}
相关推荐
天之涯上上13 分钟前
JAVA开发 在 Spring Boot 中集成 Swagger
java·开发语言·spring boot
2402_8575834914 分钟前
“协同过滤技术实战”:网上书城系统的设计与实现
java·开发语言·vue.js·科技·mfc
蟾宫曲16 分钟前
Node.js 工具:在 Windows 11 中配置 Node.js 的详细步骤
windows·npm·node.js·前端工具
爱学习的白杨树21 分钟前
MyBatis的一级、二级缓存
java·开发语言·spring
OTWOL26 分钟前
两道数组有关的OJ练习题
c语言·开发语言·数据结构·c++·算法
问道飞鱼30 分钟前
【前端知识】强大的js动画组件anime.js
开发语言·前端·javascript·anime.js
拓端研究室30 分钟前
R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别
android·开发语言·kotlin
Code成立31 分钟前
《Java核心技术I》Swing的网格包布局
java·开发语言·swing
Auc2436 分钟前
使用scrapy框架爬取微博热搜榜
开发语言·python
QQ同步助手43 分钟前
C++ 指针进阶:动态内存与复杂应用
开发语言·c++