📄 smain.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 + -