Modbus主站C++类的实现 点击:1429 | 回复:0



ytuan

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 1回
  • 年度积分:0
  • 历史总积分:27
  • 注册:2009年5月06日
发表于:2013-01-20 21:36:06
楼主

许多玩工控的朋友需要用到Modbus协议,因此这里提供一个Modbus主站的C++类,可以用来实现VC++中Modbus读写小工具。

CModbus::CModbus()
{

}

CModbus::~CModbus()
{

}

WORD CModbus::Check_CRC(LPBYTE pBuffer, int Length)
{
    WORD wCRC = 0xFFFF;
    for (int i = 0; i < Length; i++)
    {
        wCRC ^= pBuffer【i】;

        for (int j = 0; j < 8; j++)
            if (wCRC & 0×0001)
                wCRC = (wCRC >> 1) ^ 0xA001;
            else
                wCRC = wCRC >> 1;
    }
    return wCRC;
}

int CModbus::PackRead(LPBYTE pBuffer, int iAddress, int iBegin, int iCount)
{
    pBuffer【0】 = iAddress;
    pBuffer【1】 = 0×03;
    pBuffer【2】 = HIBYTE(iBegin);
    pBuffer【3】 = LOBYTE(iBegin);
    pBuffer【4】 = HIBYTE(iCount);
    pBuffer【5】 = LOBYTE(iCount);
    *(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);
    return 8;
}

int CModbus::PackWrite(LPBYTE pBuffer, int iAddress, int iBegin, int iCount, int *pValue)
{
    pBuffer【0】 = iAddress;
    pBuffer【1】 = 0×10;
    pBuffer【2】 = HIBYTE(iBegin);
    pBuffer【3】 = LOBYTE(iBegin);
    pBuffer【4】 = HIBYTE(iCount);
    pBuffer【5】 = LOBYTE(iCount);
    pBuffer【6】 = iCount * 2;
    for (int i = 0; i < iCount; i++)
    {
        pBuffer【7 + i * 2】 = HIBYTE(pValue【i】);
        pBuffer【8 + i * 2】 = LOBYTE(pValue【i】);
    }
    *(WORD*)(pBuffer + 7 + iCount * 2) = Check_CRC(pBuffer, 7 + iCount * 2);
    return (iCount * 2 + 9);
}

bool CModbus::UnpackRead(LPBYTE pBuffer, int *pValue)
{
    if (*(WORD*)(pBuffer + pBuffer【2】 + 3) != Check_CRC(pBuffer, pBuffer【2】 + 3))
        return false;
    for (int i = 0; i < pBuffer【2】 / 2; i++)
        pValue【i】 = MAKEWORD(pBuffer【4 + i * 2】, pBuffer【3 + i * 2】);
    return true;
}

bool CModbus::UnpackWrite(LPBYTE pBuffer)
{
    if (*(WORD *)(pBuffer + 6) != Check_CRC(pBuffer, 6))
        return false;
    return (pBuffer【1】 == 0×03);
}

int CModbus::PackWriteEx(LPBYTE pBuffer, int iAddress, int iBegin, int iCount, int *pValue)
{
    pBuffer【0】 = iAddress;
    pBuffer【1】 = 0×47;
    pBuffer【2】 = HIBYTE(iBegin);
    pBuffer【3】 = LOBYTE(iBegin);
    pBuffer【4】 = HIBYTE(iCount);
    pBuffer【5】 = LOBYTE(iCount);
    pBuffer【6】 = iCount * 2;
    for (int i = 0; i < iCount; i++)
    {
        pBuffer【7 + i * 2】 = HIBYTE(pValue【i】);
        pBuffer【8 + i * 2】 = LOBYTE(pValue【i】);
    }
    *(WORD*)(pBuffer + 7 + iCount * 2) = Check_CRC(pBuffer, 7 + iCount * 2);
    return (iCount * 2 + 9);
}

int CModbus::PackReadEx(LPBYTE pBuffer, int iAddress, int iBegin, int iCount)
{
    pBuffer【0】 = iAddress;
    pBuffer【1】 = 0×46;
    pBuffer【2】 = HIBYTE(iBegin);
    pBuffer【3】 = LOBYTE(iBegin);
    pBuffer【4】 = HIBYTE(iCount);
    pBuffer【5】 = LOBYTE(iCount);
    *(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);
    return 8;
}

int CModbus::PackWriteRelay(LPBYTE pBuffer, int iAddress,int iBegin, int value)
{
    pBuffer【0】 = iAddress;
    pBuffer【1】 = 0×05;
    pBuffer【2】 = HIBYTE(iBegin);
    pBuffer【3】 = LOBYTE(iBegin);
    pBuffer【4】 = HIBYTE(value);
    pBuffer【5】 = LOBYTE(value);

    *(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);
    return (8);

}

bool CModbus::UnpackWriteRelay(LPBYTE pBuffer)
{
    if (*(WORD *)(pBuffer + 6) != Check_CRC(pBuffer, 6))
        return false;
    return (pBuffer【1】 == 0×05);

}

许多玩工控的朋友需要用到Modbus协议,因此这里提供一个Modbus主站的C++类,可以用来实现VC++中Modbus读写小工具。

CModbus::CModbus()
{

}

CModbus::~CModbus()
{

}

WORD CModbus::Check_CRC(LPBYTE pBuffer, int Length)
{
    WORD wCRC = 0xFFFF;
    for (int i = 0; i < Length; i++)
    {
        wCRC ^= pBuffer【i】;

        for (int j = 0; j < 8; j++)
            if (wCRC & 0×0001)
                wCRC = (wCRC >> 1) ^ 0xA001;
            else
                wCRC = wCRC >> 1;
    }
    return wCRC;
}

int CModbus::PackRead(LPBYTE pBuffer, int iAddress, int iBegin, int iCount)
{
    pBuffer【0】 = iAddress;
    pBuffer【1】 = 0×03;
    pBuffer【2】 = HIBYTE(iBegin);
    pBuffer【3】 = LOBYTE(iBegin);
    pBuffer【4】 = HIBYTE(iCount);
    pBuffer【5】 = LOBYTE(iCount);
    *(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);
    return 8;
}

int CModbus::PackWrite(LPBYTE pBuffer, int iAddress, int iBegin, int iCount, int *pValue)
{
    pBuffer【0】 = iAddress;
    pBuffer【1】 = 0×10;
    pBuffer【2】 = HIBYTE(iBegin);
    pBuffer【3】 = LOBYTE(iBegin);
    pBuffer【4】 = HIBYTE(iCount);
    pBuffer【5】 = LOBYTE(iCount);
    pBuffer【6】 = iCount * 2;
    for (int i = 0; i < iCount; i++)
    {
        pBuffer【7 + i * 2】 = HIBYTE(pValue【i】);
        pBuffer【8 + i * 2】 = LOBYTE(pValue【i】);
    }
    *(WORD*)(pBuffer + 7 + iCount * 2) = Check_CRC(pBuffer, 7 + iCount * 2);
    return (iCount * 2 + 9);
}

bool CModbus::UnpackRead(LPBYTE pBuffer, int *pValue)
{
    if (*(WORD*)(pBuffer + pBuffer【2】 + 3) != Check_CRC(pBuffer, pBuffer【2】 + 3))
        return false;
    for (int i = 0; i < pBuffer【2】 / 2; i++)
        pValue【i】 = MAKEWORD(pBuffer【4 + i * 2】, pBuffer【3 + i * 2】);
    return true;
}

bool CModbus::UnpackWrite(LPBYTE pBuffer)
{
    if (*(WORD *)(pBuffer + 6) != Check_CRC(pBuffer, 6))
        return false;
    return (pBuffer【1】 == 0×03);
}

int CModbus::PackWriteEx(LPBYTE pBuffer, int iAddress, int iBegin, int iCount, int *pValue)
{
    pBuffer【0】 = iAddress;
    pBuffer【1】 = 0×47;
    pBuffer【2】 = HIBYTE(iBegin);
    pBuffer【3】 = LOBYTE(iBegin);
    pBuffer【4】 = HIBYTE(iCount);
    pBuffer【5】 = LOBYTE(iCount);
    pBuffer【6】 = iCount * 2;
    for (int i = 0; i < iCount; i++)
    {
        pBuffer【7 + i * 2】 = HIBYTE(pValue【i】);
        pBuffer【8 + i * 2】 = LOBYTE(pValue【i】);
    }
    *(WORD*)(pBuffer + 7 + iCount * 2) = Check_CRC(pBuffer, 7 + iCount * 2);
    return (iCount * 2 + 9);
}

int CModbus::PackReadEx(LPBYTE pBuffer, int iAddress, int iBegin, int iCount)
{
    pBuffer【0】 = iAddress;
    pBuffer【1】 = 0×46;
    pBuffer【2】 = HIBYTE(iBegin);
    pBuffer【3】 = LOBYTE(iBegin);
    pBuffer【4】 = HIBYTE(iCount);
    pBuffer【5】 = LOBYTE(iCount);
    *(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);
    return 8;
}

int CModbus::PackWriteRelay(LPBYTE pBuffer, int iAddress,int iBegin, int value)
{
    pBuffer【0】 = iAddress;
    pBuffer【1】 = 0×05;
    pBuffer【2】 = HIBYTE(iBegin);
    pBuffer【3】 = LOBYTE(iBegin);
    pBuffer【4】 = HIBYTE(value);
    pBuffer【5】 = LOBYTE(value);

    *(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);
    return (8);

}

bool CModbus::UnpackWriteRelay(LPBYTE pBuffer)
{
    if (*(WORD *)(pBuffer + 6) != Check_CRC(pBuffer, 6))
        return false;
    return (pBuffer【1】 == 0×05);

}

基于这个类实现的Modbus小工具请在这里下载:

http://www.b-tech.com.cn/?p=230

界面示意图:

Modbus读写工具



热门招聘
相关主题

官方公众号

智造工程师