资源简介

使用QT C++,VS基本也能看懂,很多代码按照项目写的比较死,基本思路没问题,需要自己添加 里面包含了三菱MC协议,基恩士的etherNet/IP,基恩士的MC没写 压缩包里也有三菱、基恩士的文档,挺全的

资源截图

代码片段和文件信息

#include “ytplc.h“
#include 
#include 

#pragma comment(lib“ws2_32.lib“)

YtPlc* g_plc = nullptr;

YtPlc::YtPlc()
{
    socket_ = 0;
}

YtPlc::~YtPlc()
{

}

void YtPlc::Startup()
{
    WSADATA  Ws;
    WSAStartup(MAKEWORD(2 2) &Ws);
}

void YtPlc::Cleanup()
{
    WSACleanup();
}

bool YtPlc::Open(const char *addr const int port const int timeout_ms)
{
    if (socket_ > 0)
        return true;

    if (INVALID_SOCKET == (socket_ = socket(AF_INET SOCK_DGRAM IPPROTO_UDP)))
    {
        return false;
    }

    // set block timeout
    setsockopt(socket_ SOL_SOCKET SO_RCVTIMEO (const char*)&timeout_ms sizeof(int));
    setsockopt(socket_ SOL_SOCKET SO_RCVTIMEO (const char*)&timeout_ms sizeof(int));

    linger linger_set;
    linger_set.l_onoff = 0 linger_set.l_linger = 0;
    setsockopt(socket_ SOL_SOCKET SO_LINGER (const char*)&linger_set sizeof(linger));

    sockaddr_in socker_addr;
    memset(&socker_addr 0 sizeof(socker_addr));

    socker_addr.sin_family = AF_INET;
    socker_addr.sin_addr.s_addr = inet_addr(addr);
    socker_addr.sin_port = htons(port);

    if (SOCKET_ERROR == connect(socket_ (sockaddr*)&socker_addr sizeof(socker_addr)))
    {
        socket_ = (int)INVALID_SOCKET;
        return false;
    }
    return true;
}

void YtPlc::Close()
{
    if (INVALID_SOCKET != socket_)
        closesocket(socket_);

    socket_ = (int)INVALID_SOCKET;
}

bool YtPlc::IsOpen()
{
    return (socket_ != INVALID_SOCKET);
}

bool YtPlc::Transfer(const char *send_data const int send_size char *recv_data int &recv_size)
{
    //  parameter clear
    recv_size = 0;

    if (INVALID_SOCKET == socket_)
        return false;

    const int kBlockSize = 512;
    char data[kBlockSize]{ 0 };

    //  parameter check
    if (NULL == send_data || 0 == send_size)
        return false;

    // if iSendSize error return
    if (send_size != send(socket_ send_data send_size 0))
        return false;

    int iCurRecvSize = 0;
    while (iCurRecvSize >= 0)
    {
        // receive block size each time
        iCurRecvSize = recv(socket_ data kBlockSize 0);

        if (iCurRecvSize <= 0)
            break;

        for (int i = 0; i != iCurRecvSize; ++i)
        {
            recv_data[recv_size + i] = data[i];
        }

        recv_size += iCurRecvSize;

        if (iCurRecvSize != kBlockSize)
            break;
    }
    return (recv_size > 0);
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-07-12 13:26  PLC_Class\
     文件    29876348  2019-07-09 16:20  PLC_Class\KV指令参考手册.pdf
     文件    19123551  2019-05-22 21:38  PLC_Class\KvsEtherNetIP.pdf
     文件     1948415  2019-05-22 21:38  PLC_Class\KvsEtherNetIPErr.pdf
     文件        2556  2019-07-11 18:00  PLC_Class\ytplc.cpp
     文件        2274  2019-07-12 13:23  PLC_Class\ytplc.h
     文件        5891  2019-07-11 18:00  PLC_Class\ytplc_keyence_eip.cpp
     文件        1813  2019-07-12 13:22  PLC_Class\ytplc_keyence_eip.h
     文件        7515  2019-07-11 18:00  PLC_Class\ytplc_mitsubishi_mc.cpp
     文件        1573  2019-07-11 18:00  PLC_Class\ytplc_mitsubishi_mc.h
     文件     9921591  2018-09-17 16:18  PLC_Class\三菱Q_L系列通信协议参考.pdf

评论

共有 条评论