纯C++ 三菱FX5系列PLC通信实现源码
与三菱PLC通信走MC协议,看了一下三菱通信方面文档,用C++写了一个通信类,目前实现读取M,X,Y,D区数据,写入M和D区数据(都可批量读写)
根据三菱 MELSEC iQ-FFX5用户手册(SLMP篇) 实现



具体需要看三菱文档
VS2022 纯C++版本源码
代码实现:
tcpclient.h
#ifndef TCPCLIENT_H
#define TCPCLIENT_H
#include <WinSock2.h>
#include <string>
using namespace std;
const int PORT = 4997;
#define MaxBufSize 2048
#define _CRT_SECURE_NO_WARINGS
enum COMMAND {
READ,
WRITE
};
enum SUB_COMMAND {
SUB_BIT,
SUB_WORD
};
enum TYPE {
XType,
YType,
MType,
DType
};
class TcpClient
{
public:
TcpClient();
public:
int slot_Connect(string ip,int port);
int ReadD(int address,int size,void *pData);
int ReadM(int address,int size,void *pData);
int ReadX(int address,int size,void *pData);
int ReadY(int address,int size,void *pData);
int WriteD(int address,int size,void *pData);
int WriteM(int address,int size,void *pData);
char* build(int address,int size,int command,int sub_command,int type);
int ResDataLen(char* data);
int ResError(char* data);
void ReConnect();
int ConnectStatus();
size_t customStrlen(const char* data);
private:
SOCKET SocketClient;
SOCKADDR_IN ClientAddr; //地址
int nNum = 0;
int nConnected = 1;
};
#endif // TCPCLIENT_H
tcpclient.cpp
#include "tcpclient.h"
#include <cstdio>
#include<iostream>
#include<string>
#include<WinSock2.h>
#include <cstring>
#include <WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
TcpClient::TcpClient()
{
}
int TcpClient::slot_Connect(string ip, int port)
{
WSADATA wsd;
WSAStartup(MAKEWORD(2, 2), &wsd);
SocketClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ClientAddr.sin_family = AF_INET;
// in_addr addr;
inet_pton(AF_INET, ip.c_str(), &ClientAddr.sin_addr.S_un.S_addr);//ClientAddr.sin_addr.S_un.S_addr
ClientAddr.sin_port = htons(port);
int n = 0;
n = connect(SocketClient, (struct sockaddr*)&ClientAddr, sizeof(ClientAddr));
if (n == SOCKET_ERROR) {
nConnected = 1;
closesocket(SocketClient);
return 1;
}
nConnected = 0;
nNum = 0;
return 0;
}
int TcpClient::ReadD(int address, int size, void *pData)
{
int nAllLen = 9;
char* data = build(address,size,READ,SUB_WORD,DType);
int nLen = 21;
//char buf[data.size()];
//memcpy(buf,data.data(),data.size());
int nReg;
nReg = send(SocketClient,data, nLen, 0);
if (nReg < 0) {
//qDebug() << "Faile" << endl;
delete [] data;
nConnected = 1;
// ReConnect();
return 1;
}
Sleep(5);
nReg = 0;
char RecvBuff[MaxBufSize];
nReg = recv(SocketClient, RecvBuff, sizeof(RecvBuff), 0);
if(nReg > 0) {
char* revData = new char[nReg];
//revData.resize(nReg);
memcpy(revData,RecvBuff,nReg);
int nLen = ResDataLen(revData);
nAllLen += nLen;
if(0 != ResError(revData)) {
delete[] data;
delete[] revData;
return 1;
}
memcpy(pData,revData+11,nLen-2);
delete[] data;
delete[] revData;
return 0;
} else {
delete[] data;
return 1;
}
delete[

浙公网安备 33010602011771号