纯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[
posted @ 2023-11-18 09:09  一个野指针  阅读(5)  评论(0)    收藏  举报  来源