许多玩工控的朋友需要用到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
界面示意图: