#include "ModBus.h"
CModBus::CModBus(void) : m_PacketID(1)
{
}
CModBus::~CModBus(void)
{
}
void CModBus::Delete(void)
{
CMySock::Delete();
}
bool CModBus::Create(SOCKCALLBACK pCall,void *pUsrData)
{
return CMySock::Create(MODBUSPORT,pCall,(DWORD)pUsrData);
}
bool CModBus::Create(CString IpStr,int Port)
{
return CMySock::Connect(IpStr.GetBuffer(0),Port,0,0);
}
CModbusPac CModBus::GetCoil(WORD Adress,WORD BitCnt)//read bits from startadress of blocktype (UNUSABLE)
{
CModbusPac Pack(m_PacketID++,0,6,0,MBFNCWAGO::GETIOWAGO);//WORD tid,WORD pid,WORD len,BYTE uid,BYTE fnc
Pack.m_data[0]=HIBYTE(Adress);//HiAdr
Pack.m_data[1]=LOBYTE(Adress);//LoAdr
Pack.m_data[2]=HIBYTE(BitCnt);//ReadSize
Pack.m_data[3]=LOBYTE(BitCnt);//ReadSize
if(!CMySock::Send((char *)&Pack,offsetof(CModbusPac,m_data[4])))
return Pack;
if(!CMySock::Receive((char *)&Pack, 8))
return Pack;
return Pack;
}
CModbusPac CModBus::SetCoil(BYTE Adress,BYTE *pMem,WORD BitCnt)//write bits from startadress of blocktype (UNUSABLE)
{
CModbusPac Pack(m_PacketID++,0,8,0,MBFNCWAGO::SETIOWAGO);//WORD tid,WORD pid,WORD len,BYTE uid,BYTE fnc
int Cnt((BitCnt>>3));
Pack.m_data[0]=HIBYTE(Adress);//HiAdr
Pack.m_data[1]=LOBYTE(Adress);//LoAdr
Pack.m_data[2]=HIBYTE(BitCnt);//ReadSize
Pack.m_data[3]=LOBYTE(BitCnt);//ReadSize
Pack.m_data[4]=Cnt;//Bytes
for (register int i(0); i < Cnt; i++)
Pack.m_data[5 + i] = *pMem++;
if(!CMySock::Send((char *)&Pack,offsetof(CModbusPac,m_data[5])+Cnt))
return Pack;
int headlen = offsetof(CModbusPac, m_uid);
if((Cnt=CMySock::Receive((char *)&Pack,headlen)) <= 0)
return Pack;
Pack.Rotate();
if((Cnt=CMySock::Receive((char *)&Pack+offsetof(CModbusPac,m_uid),Pack.m_len)) < Pack.m_len)
return Pack;
return Pack;
}
CModbusPac CModBus::GetType(WORD Adress)
{
CModbusPac Pack(m_PacketID++,0,6,0,MBFNCWAGO::GETTYPWAGO);//WORD tid,WORD pid,WORD len,BYTE uid,BYTE fnc
int Cnt(0);
Pack.m_data[0]=0; //PDU
Pack.m_data[1]=LOBYTE(Adress); //LoAdr
Pack.m_data[2]=HIBYTE(Adress); //HiAdr
Pack.m_data[3]=8;//ReadSize
if(!CMySock::Send((char *)&Pack,offsetof(CModbusPac,m_data[4])))
return Pack;
if((Cnt=CMySock::Receive((char *)&Pack,offsetof(CModbusPac,m_uid))) <= 0)
return Pack;
Pack.Rotate();
if((Cnt=CMySock::Receive((char *)&Pack+offsetof(CModbusPac,m_uid),Pack.m_len)) < Pack.m_len)
return Pack;
return Pack;
}
CModbusPac CModBus::GetRegisters(WORD Adress,WORD CntWords/*=1*/)
{
CModbusPac Pack(m_PacketID++,0,6,0,MBFNCWAGO::GETREGWAGO);//WORD tid,WORD pid,WORD len,BYTE uid,BYTE fnc
Pack.m_data[0]=HIBYTE(Adress); //HiAdr
Pack.m_data[1]=LOBYTE(Adress); //LoAdr
Pack.m_data[2]=HIBYTE(CntWords);//ReadSize
Pack.m_data[3]=LOBYTE(CntWords);//ReadSize
if(!CMySock::Send((char *)&Pack,offsetof(CModbusPac,m_data[4])))
return Pack;
int Cnt(0);
if((Cnt=CMySock::Receive((char *)&Pack,offsetof(CModbusPac,m_uid))) <= 0)
return Pack;
Pack.Rotate();
if((Cnt=CMySock::Receive((char *)&Pack+offsetof(CModbusPac,m_uid),Pack.m_len)) < Pack.m_len)
return Pack;
return Pack;
}
CModbusPac CModBus::SetRegisters(WORD adress,WORD CntWords ,WORD *pMem)
{
CModbusPac Pack(m_PacketID++,0,9,0,MBFNCWAGO::SETREGWAGO);//WORD tid,WORD pid,WORD len,BYTE uid,BYTE fnc
Pack.m_data[0]=HIBYTE(adress);//HiAdr
Pack.m_data[1]=LOBYTE(adress);//LoAdr
Pack.m_data[2]=HIBYTE(CntWords);//WordCount
Pack.m_data[3]=LOBYTE(CntWords);//WordCount
Pack.m_data[4]=CntWords<<1;//DataLenInBytes
for(register BYTE n(0); n<CntWords; n++)
{
Pack.m_data[n+5]=HIBYTE(*pMem);//HiData
Pack.m_data[n+6]=LOBYTE(*pMem);//LoData
pMem++;
}
if(!CMySock::Send((char *)&Pack,offsetof(CModbusPac,m_data[5])+(CntWords<<1)))
return Pack;
int Cnt(0);
if((Cnt=CMySock::Receive((char *)&Pack,offsetof(CModbusPac,m_uid))) <= 0)
return Pack;
Pack.Rotate();
if((Cnt=CMySock::Receive((char *)&Pack+offsetof(CModbusPac,m_uid),Pack.m_len)) < Pack.m_len)
return Pack;
return Pack;
}
CModbusPac CModBus::GetCounter(void)
{
CModbusPac Pack(0,0,2,0,MBFNCWAGO::GETCNTWAGO);//WORD tid,WORD pid,WORD len,BYTE uid,BYTE fnc
if(!CMySock::Send((char *)&Pack,offsetof(CModbusPac,m_data[0])))
return Pack;
int Cnt(0);
if((Cnt=CMySock::Receive((char *)&Pack,offsetof(CModbusPac,m_uid))) <= 0)
return Pack;
Pack.Rotate();
if((Cnt=CMySock::Receive((char *)&Pack+offsetof(CModbusPac,m_uid),Pack.m_len)) < Pack.m_len)
return Pack;
return Pack;
}
CModbusPac CModBus::GetExceptStat(void)
{
CModbusPac Pack(0,0,2,0,MBFNCWAGO::EXSTATWAGO);//WORD tid,WORD pid,WORD len,BYTE uid,BYTE fnc
if(!CMySock::Send((char *)&Pack,offsetof(CModbusPac,m_data[0])))
return Pack;
int Cnt(0);
if((Cnt=CMySock::Receive((char *)&Pack,offsetof(CModbusPac,m_uid))) <= 0)
return Pack;
Pack.Rotate();
if((Cnt=CMySock::Receive((char *)&Pack+offsetof(CModbusPac,m_uid),Pack.m_len)) < Pack.m_len)
return Pack;
return Pack;
}