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

📄 smain.cpp

📁 AB_5000_PLC以太网通讯动态连接库
💻 CPP
字号:
//==========================================================
// 模块名称			: GX_COM 通用PLC通讯动态连接库
// 作者				: Liuw@gaoxao.com
// 日期				: 2007-2-26
// 版本号			: 
// 模块说明			: 
// 输出				: 
// 参数             : 
// 参数             : 
// 参数             : 
// 引用关系         :
// 必要的算法说明   :
//==========================================================
#include "stdafx.h"
#include "DTL.H"
//#include "SMain.H"

#include "W95_s7.H"
#include "Komfort.h"

bool  m_InitOk;	    //保存与PLC通讯状态
int   m_PlcType;	//保存PLC类型
int   m_DrID;		//保存驱动号
CString  m_IP;		//保存下位机IP地址

//===============================>AB<==============================
DWORD dwDrivers;
DTLDRIVER DtlDrivers[DTL_MAX_DRIVERS];

long AB_gx_DB_WRITES(int dbID, int dbNum, int dbS , VARIANT *dbW, char dbType[1]);
long AB_gx_DB_WRITE( int dbID,  int dbNum, VARIANT *dbW , char dbType[1]);

long AB_gx_DB_READS(int dbID,  int dbNum, int dbS, VARIANT &dbR,  char dbType[1]); 
long AB_gx_DB_READ( int dbID,  int dbNum, VARIANT &dbR,  char dbType[1]);

long AB_INIT(int PlcType,char lDriName[],char IP[32]);
long AB_UNINIT();

//===============================>SIEMENS<================================
adr_table_type m_Adr;


long SIEMENS_INIT(char DriName[], char IP[32]);



// 初始化连接
long _stdcall gx_INIT(int PlcType,char DriName[],char IP[32]) 
{
	switch (PlcType)
	{
		case 1://AB
		{ 
			return AB_INIT(PlcType,DriName,IP);
		}
	/*	case 2://SIEMENS
		{
			return SIEMENS_INIT(DriName,IP);
		}
		case 3://
		{
			return SIEMENS_INIT(DriName,IP);
		}*/
		default:
		{
			return 1000;
		}
	}
}

// 释放系统资源
long _stdcall gx_UNINIT() 
{
	if(m_InitOk == true)
	{
		switch (m_PlcType)
		{
			case 1:
			{
				return AB_UNINIT();
			}
			default:
			{
				 return 1000;
			}
		}
	}	
	else
	{
		return 2;
	}
}

// 从PLC中读一个字的数据	 N100:	 0        返回的数据        数据类型        
long _stdcall gx_DB_READ(int dbID,  int dbNum, VARIANT &dbR,  char dbType[1]) 
{
	if (m_InitOk == true)
	{	
		switch (m_PlcType)
		{			
		case 1://AB
		{
			return AB_gx_DB_READ(dbID, dbNum,  dbR, dbType);	
		}
		default:
			{
				 return 1000;
			}
		}	
	}
}

// 从PLC中读多个字的数据
long _stdcall gx_DB_READS(int dbID,  int dbNum, int dbS,  VARIANT &dbR,  char dbType[1]) 
{
	if (m_InitOk == true)
	{
		switch (m_PlcType)
		{
			case 1://AB
				{
					return AB_gx_DB_READS(dbID, dbNum, dbS , dbR, dbType);
				}
			default:
			{
				 return 1000;
			}
		}
	}	
}

// 向PLC中写一个字的数据   	  N100:	     0     写入的数据       数据类型
long _stdcall gx_DB_WRITE( int dbID, int dbNum,  VARIANT *dbW , char dbType[1]) 
{
	if(m_InitOk == true)
	{
		switch (m_PlcType)
		{
			case 1://AB
			{
				 return AB_gx_DB_WRITE( dbID, dbNum, dbW , dbType);
			}
			default:
			{
				 return 1000;
			}
		}
	}	
}

// 向PLC中写多个字的数据
long _stdcall gx_DB_WRITES(int dbID, int dbNum, int dbS, VARIANT *dbW, char dbType[1])
{
	if (m_InitOk == true)
	{
		switch (m_PlcType)
		{
			case 1://AB
				{
					return AB_gx_DB_WRITES(dbID, dbNum, dbS , dbW, dbType);
				}
			default:
			{
				 return 1000;
			}
		}
	}	
}

//********************************>内部函数区-AB<********************************
// AB-初始化
long AB_INIT(int PlcType,char DriName[], char IP[32])
{
	if (DTL_INIT(1) == 0)
	{
		if (DTL_DRIVER_LIST((PDTLDRIVER)DtlDrivers,&dwDrivers,500) ==0)
		{
			for (int i=0;i < DTL_MAX_DRIVERS;++i)
			{
				if (strstr(DtlDrivers[i/*nDriver*/].szDriverName,DriName) != NULL)
				{
					if (DTL_DRIVER_OPEN(0,DtlDrivers[i/*nDriver*/].szDriverName,500) == 0)
					{
						CString a,c;
						int i=0,b; 
						while(IP[i])
						{
							b = IP[i];
							a.Format("%d",b);
							c += a;
							c += ".";
							++i;
						}
						m_IP += c;
						m_IP += "0.1.0,PLC5,0";
						m_PlcType = PlcType;
						m_InitOk = true;
						m_DrID = i;
						return 0;
					}
					else
					{
						m_InitOk = false;
						return 1;
					}
				}
				else
				{
					m_InitOk = false;
					return 2;
				}
			} 
		}
		else
		{
			m_InitOk = false;
			return 3;
		}
	}
	else
	{
		m_InitOk = false;
		return 4;
	}
} 

// AB-释放系统资源
long AB_UNINIT()
{
	if (DTL_DRIVER_CLOSE(m_DrID,500) == 0) 
	{ 
		
		DTL_UNINIT(0);
		m_PlcType = 0;
		m_InitOk = false;
		m_DrID = 0;
		m_IP = "";
		return 0;
	}
	else
	{
		return 1;	
	}
}

// AB-向PLC中写多个字的数据
long  AB_gx_DB_WRITES(int dbID, int dbNum, int dbS , VARIANT *dbW, char dbType[1])
{
	if ((dbID >= 0) && (dbID <= 999))
	{	
		if ((dbNum >= 0) && (dbNum <= 10000))
		{			
			unsigned long handle,w;
			CString stemp,a;

			switch (*dbType)
			{
				case 'N':
				{
					stemp += "$N";
					a.Format("%d",dbID);
					stemp += a;
					stemp += ":";
					a.Format("%d",dbNum);
					stemp += a;
					stemp += ",";
					a.Format("%d",dbS);
					stemp += a;
					stemp += ",WORD,MODIFY,AB:CIP,16.14.";
					break;
				}
				case 'F':
				{
					stemp += "$F";
					a.Format("%d",dbID);
					stemp += a;
					stemp += ":";
					a.Format("%d",dbNum);
					stemp += a;
					stemp += ",";
					a.Format("%d",dbS);
					stemp += a;
					stemp += ",FLOAT,MODIFY,AB:CIP,16.14.";
					break;
				}
			}		
			stemp += m_IP;

			if (stemp != "")
			{
				if ( DTL_C_DEFINE(&handle,stemp) == 0)
				{
					if (DTL_WRITE_W(handle,(unsigned char*)dbW,&w,1000) == 0)
					{
						DTL_UNDEF(handle);
						return 0;	
					}
					else
					{
						return 1;
					}
				}
				else
				{
					return 2;		
				}
			}
			else
			{
				return 3;
			}
		}
		else
		{
			return 4;
		}
	}
	else
	{
		return 5;
	}
}

// AB-从PLC中读多个字的数据
long AB_gx_DB_READS(int dbID,  int dbNum, int dbS,VARIANT &dbR,  char dbType[1]) 
{
	if ((dbID >= 0) && (dbID <= 999))
	{	
		if ((dbNum >= 0) && (dbNum <= 10000))
		{			
			unsigned long handle,w;
			CString stemp,a;

			switch (*dbType)
			{
				case 'N':
				{
					stemp += "$N";
					a.Format("%d",dbID);
					stemp += a;
					stemp += ":";
					a.Format("%d",dbNum);
					stemp += a;
					stemp += ",";
					a.Format("%d",dbS);
					stemp += a;
					stemp += ",WORD,READ,AB:CIP,16.14.";
					dbR.vt = VT_I4;
					break;
				}
				case 'F':
				{
					stemp += "$F";
					a.Format("%d",dbID);
					stemp += a;
					stemp += ":";
					a.Format("%d",dbNum);
					stemp += a;
					stemp += ",";
					a.Format("%d",dbS);
					stemp += a;
					stemp += ",FLOAT,READ,AB:CIP,16.14.";
					dbR.vt = VT_R4;
					break;
				}
			}		
			stemp += m_IP; 

			if (stemp != "")
			{
				if ( DTL_C_DEFINE(&handle,stemp) == 0)
				{
					if (DTL_READ_W(handle,(unsigned char*)&dbR ,&w,1000) == 0)
					{
						DTL_UNDEF(handle);
						return 0;	
					}
					else
					{
						return 1;
					}
				}
				else
				{
					return 2;
				}
			}
			else
			{
				return 3;
			}
		}
		else
		{
			return 4;
		}
	}
	else
	{
		return 5;
	}
}

// AB-从PLC中读一个字的数据	N100:	 0     返回的数据        数据类型
long AB_gx_DB_READ(int dbID,  int dbNum, VARIANT &dbR,  char dbType[1]) 
{
	if ((dbID >= 0) && (dbID <= 999))
	{	
		if ((dbNum >= 0) && (dbNum <= 10000))
		{			
			unsigned long handle,w;
			CString stemp,a;

			switch (*dbType)
			{
				case 'N':
				{
					stemp += "$N";

					a.Format("%d",dbID);
					stemp += a;
					stemp += ":";
					a.Format("%d",dbNum);
					stemp += a;
					stemp += ",1,WORD,READ,AB:CIP,16.14.";
				//	*dbR.vt = VT_I4;
					break;
				}
				case 'F':
				{
					stemp += "$F";

					a.Format("%d",dbID);
					stemp += a;
					stemp += ":";
					a.Format("%d",dbNum);
					stemp += a;
					stemp += ",1,FLOAT,READ,AB:CIP,16.14.";
				//	dbR.vt = VT_R4;
					break;
				}
			}		
			stemp += m_IP;
			
			if (stemp != "")
			{
				if ( DTL_C_DEFINE(&handle,stemp) == 0)
				{
					if (DTL_READ_W(handle,(unsigned char*)&dbR ,&w,1000) == 0)
					{
						DTL_UNDEF(handle);
						return 0;	
					}
					else
					{
						return 1;
					}
				}
				else
				{
					return 2;
				}
			}
			else
			{
				return 3;
			}
		}
		else
		{
			return 4;
		}
	}
	else
	{
		return 5;
	}
}

// AB-向PLC中写一个字的数据 N100:   0     写入的数据       数据类型 
long AB_gx_DB_WRITE( int dbID, int dbNum,  VARIANT *dbW , char dbType[1])
{
	if ((dbID >= 0) && (dbID <= 999))
	{	
		if ((dbNum >= 0) && (dbNum <= 10000))
		{			
			unsigned long handle,w;
			CString stemp,a;

			switch (*dbType)
			{
				case 'N':
				{
					stemp += "$N";
					a.Format("%d",dbID);
					stemp += a;
					stemp += ":";
					a.Format("%d",dbNum);
					stemp += a;
					stemp += ",1,WORD,MODIFY,AB:CIP,16.14.";
					break;
				}
				case 'F':
				{
					stemp += "$F";
					a.Format("%d",dbID);
					stemp += a;
					stemp += ":";
					a.Format("%d",dbNum);
					stemp += a;
					stemp += ",1,FLOAT,MODIFY,AB:CIP,16.14.";
					break;
				}
			}		
			stemp += m_IP;
			if (stemp != "")
			{
				if ( DTL_C_DEFINE(&handle,stemp) == 0)
				{
					if (DTL_WRITE_W(handle,(unsigned char*)dbW,&w,1000) == 0)
					{
						DTL_UNDEF(handle);
						return 0;	
					}
					else
					{
						return 1;
					}
				}
				else
				{
						return 2;
				}
			}
			else
			{
				return 3;
			}
		}
		else
		{
			return 4;
		}
	}
	else
	{
		return 5;
	}
} 


//********************************>内部函数区-SIEMENS<********************************
// SIEMENS-初始化
long SIEMENS_INIT(char DriName[], char IP[32])
{
	m_Adr.adr = IP[0];
	m_Adr.rackno = IP[2];
	m_Adr.segmentid = IP[4];
	m_Adr.slotno = IP[6];

	return load_tool(1,DriName,&m_Adr);
}
//********************************>非代码区<********************************
//CString asd;
//asd.Format(_T("%s"),DriName);
//asd.Format(_T("%s"),strcpy(DriName,DtlDrivers[i/*nDriver*/].szDriverName));
//::AfxMessageBox(asd);
//itoa(m_DriID, 变量,10)

//aa.Format(_T("%s"),DriName);
//::AfxMessageBox(aa);

//isdigit()判断字符是否位数字
					
//aa.Format("%f",dbR.fltVal);
//::AfxMessageBox(aa);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -