📄 abplc5.cpp
字号:
#define LIB_DLL
#include "abplc5.h"
sesDbg *g_pDbg;
ABPLC5::ABPLC5(int iPLCType,sesDbg *dbg,sesLogErr *eLog)
{
m_bConnected=FALSE;
m_iPLCType=iPLCType;
m_pDbg = dbg;
m_eLog = eLog;
g_pDbg=m_pDbg;
}
ABPLC5::~ABPLC5()
{
this->ToClose(TRUE);
}
//=========================================================
INT32 ABPLC5::ToConnection( CIP_CHAR* _HostName, INT32 _debug)
{
struct plc5stat status;
if(!m_bConnected)
{
comm=abplc5_attach(_HostName,_debug);
if (comm.error != 0)
{
if(m_eLog)
m_eLog->logError("Could not connect. Check your address and try again.\n","ToConnection");
else
printf("Could not connect. Check your address and try again.\n");
return -1;
}
status = getstatus (comm,_debug);
m_iPLCType = PLC5;
if (status.type == 0xde)
m_iPLCType = PLC5250;
if (status.type == 0xee)
m_iPLCType = SLC;
comm.tns = comm.tns + 4;
m_bConnected = TRUE;
}
return OK;
}
INT32 ABPLC5::ToClose( INT32 debug )
{
if(m_bConnected)
{
if((comm.handle!=-1) && (comm.handle!=0))
{
close(comm.handle);//关闭SOCKET指针
comm.handle=0;
}
}
m_bConnected = FALSE;
return OK;
}
//-------------------------------------------------------------------
INT32 ABPLC5::ToReadTagValue( TagData* pTagData, INT32 _debug )
{
char _sFunName[]="ToReadTagValue";
char _sTempStr[255];
char _TagName[TAG_MAX_LENGTH];
struct _data data;
debug = _debug;
if (pTagData == NULL)
{
if(m_eLog)
m_eLog->logError("You need to specify a pTagData",_sFunName);
return 1;
}
if(pTagData->tagData==NULL)
{
if(m_eLog)
m_eLog->logError("You need to specify data buffer",_sFunName);
return 1;
}
if(_debug>0 && m_pDbg)
{
sprintf(_sTempStr,"ToReadTagVale input param TagName=%s Type=%d rStart=%d row=%d cStart=%d,col=%d.\n",
pTagData->TagName,pTagData->type,pTagData->rowStart,pTagData->row,pTagData->colStart,pTagData->col);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
comm.tns = comm.tns + 4;
sprintf(_TagName,"%s:%d",pTagData->TagName,pTagData->rowStart);
data=protread3(comm,_TagName,pTagData->row,m_iPLCType,_debug);
if(_debug>0 && m_pDbg)
{
sprintf(_sTempStr,"len=%d \n ",data.len);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
if (data.len == -1)
{
if(_debug>0 && m_pDbg)
{
int sts = data.data[0];
int extsts = data.data[1];
sprintf(_sTempStr,"An error occured. The PLC STS byte is %d, the EXT STS byte is %d\n",sts,extsts);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
if (sts != 0xf0)
{
sprintf(_sTempStr,"Primary Error code is %s\n",errors[(sts/16)]);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
if (extsts != 0)
{
sprintf(_sTempStr,"Extended error code is %s\n",ext_errors[extsts]);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
}
return -1;
}
if(data.name.section==0)
{
if (data.name.floatdata == TRUE)
{
int _iIndex=0;
for (int x=0;x<data.len;x=x+2)
{
unsigned int temp1 = (data.data[x]);
unsigned int temp2 = (data.data[x+1]);
float _fTmpVal=itof(temp1,temp2);
memcpy(&(pTagData->tagData[_iIndex]),&_fTmpVal,sizeof(float));
_iIndex+=sizeof(float);
}
}
else
{
memcpy(pTagData->tagData,data.data,data.len*2);
}
}
else
{
memcpy(pTagData->tagData,data.data,data.len*2);
}
if(_debug>0 && m_pDbg)
{
switch( pTagData->type )
{
case dtLOGICAL:
{
for(int _iRow=0;_iRow<pTagData->row;_iRow++)
{
sprintf(_sTempStr ," %d:%u , ",_iRow+pTagData->rowStart, pTagData->tagData[_iRow]);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
break;
}
case dtUINT16:
{
dtUInt16*pABValue=(dtUInt16 *)(pTagData->tagData);
for(int _iRow=0;_iRow<pTagData->row;_iRow++)
{
sprintf(_sTempStr ," %d:%u , ",_iRow+pTagData->rowStart, pABValue[_iRow]);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
break;
}
case dtINT16:
{
dtInt16*pABValue=(dtInt16 *)(pTagData->tagData);
for(int _iRow=0;_iRow<pTagData->row;_iRow++)
{
sprintf(_sTempStr ," %d:%d , ",_iRow+pTagData->rowStart, pABValue[_iRow]);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
break;
}
case dtUINT32:
{
dtUInt32*pABValue=(dtUInt32 *)(pTagData->tagData);
for(int _iRow=0;_iRow<pTagData->row;_iRow++)
{
sprintf(_sTempStr ," %d:%u , ",_iRow+pTagData->rowStart, pABValue[_iRow]);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
break;
}
case dtINT32:
{
dtInt32*pABValue=(dtInt32 *)(pTagData->tagData);
for(int _iRow=0;_iRow<pTagData->row;_iRow++)
{
sprintf(_sTempStr ," %d:%d , ",_iRow+pTagData->rowStart, pABValue[_iRow]);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
break;
}
case dtFLOAT:
{
dtFloat*pABValue=(dtFloat *)(pTagData->tagData);
for(int _iRow=0;_iRow<pTagData->row;_iRow++)
{
sprintf(_sTempStr ," %d:%.3f, ",_iRow, pABValue[_iRow]);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
break;
}
case dtDOUBLE: //AB PLC只是4字节,所以强制转换为float
{
double*pABValue=(double *)(pTagData->tagData);
for(int _iRow=0;_iRow<pTagData->row;_iRow++)
{
sprintf(_sTempStr ," %d:%.3f, ",_iRow, pABValue[_iRow]);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
break;
}
default:
{
break;
}
}
}
return 0;
}
INT32 ABPLC5::ToWriteTagValue(TagData* pTagData, INT32 _debug )
{
char _sFunName[]="ToReadTagValue";
char _sTempStr[255];
char _TagName[TAG_MAX_LENGTH];
struct _data data,ret;
struct namedata name;
debug = _debug;
if (pTagData == NULL)
{
if(m_eLog)
m_eLog->logError("You need to specify a pTagData",_sFunName);
return -1;
}
if(_debug>0 && m_pDbg)
{
sprintf(_sTempStr,"ToWriteTagVale input param TagName=%s Type=%d rStart=%d row=%d cStart=%d,col=%d.\n",
pTagData->TagName,pTagData->type,pTagData->rowStart,pTagData->row,pTagData->colStart,pTagData->col);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
comm.tns = comm.tns + 4;
sprintf(_TagName,"%s:%d",pTagData->TagName,pTagData->rowStart);
memset(&data,0,sizeof(data));
name = nameconv5(_TagName,m_iPLCType,_debug);
//int _iCount=pTagData->row;
//if (name.floatdata == TRUE)
// _iCount=_iCount*2;
int _iCount=pTagData->row/name.typelen;
if (name.floatdata == TRUE) {
float *_fdata=(float *)pTagData->tagData;
int place=0;
for (int x=0;x<_iCount;x++)
{
struct floatstuff fdata;
fdata = ftoi (_fdata[x]);
data.data[place++] = fdata.data1; data.data[place++] = fdata.data2; } } else
{
memcpy(data.data,pTagData->tagData,pTagData->row*8);
}
ret = protwrite3 (comm, _TagName, _iCount, data, m_iPLCType, _debug);
if (ret.len == -1)
{
if(_debug>0 && m_pDbg)
{
int sts = ret.data[0];
int extsts = ret.data[1];
sprintf(_sTempStr,"An error occured. The PLC STS byte is %d, the EXT STS byte is %d\n",sts,extsts);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
if (sts != 0xf0)
{
sprintf(_sTempStr,"Primary Error code is %s\n",errors[(sts/16)]);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
if (extsts != 0)
{
sprintf(_sTempStr,"Extended error code is %s\n",ext_errors[extsts]);
m_pDbg->logDbg(_sFunName,_debug,_sTempStr);
}
}
return -1;
}
return 0;
}
float itof (unsigned int data1, unsigned int data2){ union cdata c;
c.idata[1] = data1;
c.idata[0] = data2;
return c.fdata;
}struct floatstuff ftoi (float data){ struct floatstuff outdata;
union cdata c;
c.fdata = data;
outdata.data1 = c.idata[1];
outdata.data2 = c.idata[0];
return outdata;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -