⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abplc5.cpp

📁 在LINUX环境下
💻 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 + -