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

📄 ioapi.h

📁 组态软件中
💻 H
📖 第 1 页 / 共 2 页
字号:
// IOAPI.H
// IOAPI.DLL的接口文件
#if !defined(_IOAPI_H)
#define _IOAPI_H
//**********************************************************************
//  扫描函数OnCreateDeviceLink,OnCreatePacketLink
//	OnReadData,OnWriteData的返回值定义
//**********************************************************************
const SEND = 1 ;
const WAIT = 2 ;
const SKIP = 4 ;
const TIMEOUT = 8 ;

//包/点的读写属性
const ACCESS_READ = 1 ;
const ACCESS_WRITE = 2 ;

//通道函数SetTimeoutAction的参数使用的常数,不进行任何超时处理
const TIMEOUT_ACTION_IGNORE = 1 ;

//设备配置结构,所有内容可自由使用
typedef struct tagIODEVCFGSTRUCT
{
    long n[32];     //128字节空间
    char str[128];  //128字节空间
} IODEVCFGSTRUCT;    //总长度256字节

//连接项结构,所有内容可自由使用
struct IOITEMDEF
{
	TCHAR str[ 64 ] ;	//64字节空间
	LONG n[ 8 ] ;		//32字节空间
} ; 

//插入历史数据时使用的历史数据结构
struct HISINSDATSTRU
{ 
	time_t tTime ;	//时间
	SHORT nMilli ;	//毫秒
	FLOAT fDat ;		//浮点数数据
};

struct PRIVATEDATA16
{
	INT n[ 4 ] ;
} ;

struct PRIVATEDATA64
{
	INT n[ 16 ] ;
} ;

//点参数
typedef struct TagId
{
	SHORT	iAreaNo;	//所在区域号
	USHORT	iTagNo;		//点序号     
	SHORT	iParNo;		//参数号
	SHORT	iTypeNo;	//数据类型     
}TAGIDDEF;

struct SODHEAD 
{
	short iServerModuleIndex;//
	short iVSDIndex;//
	short iTaskIndex;//
	short iDirection;//方向,1为从IO到VSD,2为从VSD到IO,
	TAGIDDEF TagID;
	SODHEAD()
	{
		iServerModuleIndex = -1;
		iVSDIndex = -1;
		iTaskIndex = -1;
		iDirection = 0;
	}
};

class CManager ;
class CChannel ;
class CDevice ;
class CPacket ;
class CItem ;
class CManager : public CObject
{
public:
	//取得IOSCAN执行文件名称,
	virtual const CString& GetModuleName() = 0 ;						
	//取得当前工程应用的安装路径
	virtual const CString& GetAppPath() = 0 ;							
	//取得I/O驱动的安装路径
	virtual const CString& GetInstallPath() = 0 ;						
	//取得信道个数
	virtual INT GetChannelCount() = 0 ;							
	//按索引取得信道指针
	virtual CChannel* GetChannel( INT nIndex ) = 0 ;	
	//取得私有数据结构
	virtual PRIVATEDATA64& GetPrivateData() = 0 ;

	//设置IOSCAN程序标题
	virtual VOID SetTitle( const CString& csTitle ) = 0 ;		

	//读端口字节数据
	virtual BOOL ReadIOPort( WORD wPort, BYTE& byInData ) const = 0 ;
	//读端口字数据
	virtual BOOL ReadIOPort( WORD wPort, WORD& wInData ) const = 0 ;
	//读端口双字数据
	virtual BOOL ReadIOPort( WORD wPort, DWORD& dwInData ) const = 0 ;
	//写端口字节数据
	virtual BOOL WriteIOPort( WORD wPort, const BYTE byOutData ) = 0 ;
	//写端口字数据
	virtual BOOL WriteIOPort( WORD wPort, const WORD wOutData ) = 0 ;
	//写端口双字数据
	virtual BOOL WriteIOPort( WORD wPort, const DWORD dwOutData ) = 0 ;
	//设置是否动态分包,为FALSE禁止动态分包
	virtual VOID SetDynamicPacket( BOOL bDynamicPacket = FALSE ) = 0 ;
	//设置驱动程序为需要授权方式,dwLicenseId(0~255)为力控为驱动分配的授权ID号
	//dwDemoTime为未授权情况下的演示时间
	virtual VOID SetLicense( DWORD dwLicenseId, DWORD dwDemoTime = 7200 ) = 0 ;
	//取得IoScan窗口句柄
	virtual HWND GetHwnd() = 0 ;
	//设置本驱动模块身份标志
	virtual VOID SetIdentifier(const CString& csModuleName, long nData = 0) = 0 ;
};


class CChannel : public CObject  
{
public:
	//取得设备类型(如:串口类、网络类等)
	virtual INT GetType() = 0 ;
	//取得IP地址或主机名称
	virtual const CString& GetNetAddr() = 0 ;
	//取得串口设备端口号或网络设备端口
	virtual INT GetPort() = 0 ;
	//取得DCB参数
	virtual VOID GetDCB( DCB& dcb) = 0 ;	
	//取得设备个数
	virtual INT GetDeviceCount() = 0 ;							
	//按索引取得设备指针
	virtual CDevice* GetDevice( INT nIndex ) = 0 ;	
	//取得私有数据结构
	virtual PRIVATEDATA64& GetPrivateData() = 0 ;
	//得到管理器指针。
	virtual CManager* GetManager() = 0 ; 


	//设置通信空闲时间常数(毫秒),用于决定是否按字节发送和每个字节之间的延时
	virtual VOID SetIdleTime( INT nTimE ) = 0 ;
	//设置DCB参数
	virtual BOOL SetDCB( DCB dcb) =0 ;	
	//设置接收缓冲区大小(字节)
	virtual INT  SetAcceptBufferLength( INT nNewAcceptBufferLength = 1024 ) = 0 ; 
	//设置发送缓冲区大小(字节)
	virtual INT  SetSendBufferLength( INT nNewSendBufferLength = 1024 ) = 0 ; 
	//设置一次从串口读取的字符串块大小(字节)
	virtual INT  SetReadDataBufferLength( INT nNewReadDataBufferLength = 128 ) = 0 ; 
	//读取信道数据前等待设定的时间
	virtual VOID  SleepBeforeRead( INT nSleepBeforeRead ) = 0 ;

	//清空接收缓冲区
	virtual VOID  ClearAcceptBuffer() = 0 ;
	//向信道写入数据
	virtual BOOL Send( LPTSTR lpszSendString, INT nszSendStringLen ) = 0 ;
	//设置超时后的处理方法
	virtual VOID SetTimeoutAction( INT nAction = 0 ) = 0 ;
	//得到串口或Modem的句柄
	virtual HANDLE GetHandle() = 0 ;
	//得到通道在管理器类中的索引
	virtual INT	GetIndex() = 0 ;

	virtual BOOL SetCommBreak() = 0;

	virtual BOOL ClearCommBreak() = 0;
};

class CDevice : public CObject
{
public:
	//取得设备名称
	virtual const CString& GetName() = 0 ;		
	//取得设备型号
	virtual INT GetModel() = 0 ;			
	//取得设备地址
	virtual const CString& GetAddr() = 0 ;		
	//取得电话号码
	virtual const CString& GetPhoneNumber() = 0 ;	
	//取得私有数据结构
	virtual PRIVATEDATA64& GetPrivateData() = 0 ;
	//取得设备包含的数据包个数
	virtual INT GetPacketCount() = 0 ; 
	//按索引取得数据包指针
	virtual CPacket* GetPacket( INT nIndex ) = 0 ; 
	//取得数据连接项个数
	virtual INT GetItemCount() = 0 ; 
	//按索引取得数据连接项指针
	virtual CItem* GetItem( INT nIndex ) = 0 ; 
	//取得信道指针
	virtual CChannel* GetChannel() = 0 ; 
	//设置协议为未公开的
	virtual VOID SetUnPublicized( BOOL bUnPublicized = TRUE ) = 0 ;
	//重复扫描当前设备
	virtual VOID RepeatScan() = 0 ;
	//按LPCSTR格式显示过程信息
	virtual VOID ShowProcessMessage( LPCTSTR lpszProcessMessage ) = 0 ;
	//按LPCSTR格式显示事件信息,bNotifyDB 决定是否提交给DB
	virtual VOID ShowEventMessage( LPCTSTR lpszEventMessage, BOOL bNotifyDB = FALSE ) = 0 ;
	//得到设备在通道类中的索引
	virtual INT	GetIndex() = 0 ;
	//得到SODLogger个数
	virtual INT GetSODLoggerCount() = 0;
	//获得第nIndex个SODLogger的属性
	virtual IOITEMDEF* GetSODLoggerProperty(INT nSODLoggerIndex) = 0;
	//IO驱动动态链接库向IOScan发送SOD数据
	virtual void SetDataSOD(INT nSODLoggerIndex, SODHEAD* pSODHead, 
										LPTSTR lpszReqString, INT nReqStringLen) = 0;
	//取得设备配置结构指针
	virtual IODEVCFGSTRUCT* GetCfgStru() = 0 ;
};

class CPacket : public CObject
{
public:
	//取得包中数据连接项个数
	virtual INT GetItemCount() = 0 ; 
	//按索引取得数据连接项指针
	virtual CItem* GetItem( INT nIndex ) = 0 ; 
	//取得本数据包所归属的设备指针
	virtual CDevice* GetDevice() = 0 ;
	//取得私有数据结构
	virtual PRIVATEDATA64& GetPrivateData() = 0 ;
	//得到包的是否可读写属性,(nAccessFlag&1) == 1 可读;(nAccessFlag&2) == 2 可写;
	virtual INT GetAccessFlag() = 0 ; 

	//设置包的是否可读写属性,(nAccessFlag&1) == 1 可读;(nAccessFlag&2) == 2 可写;
	virtual VOID SetAccessFlag( INT nAccessFlag = ACCESS_READ|ACCESS_WRITE ) = 0 ; 
	//设置包准备好标志,所有设备的所有包准备好时DB才不会询问是否等待
	virtual VOID SetReady( BOOL bReady = TRUE ) = 0;

	//按先后顺序加入数据连接项
	virtual INT AddItem( CItem* pItem ) = 0 ; 
	//重复扫描当前数据包
	virtual VOID RepeatScan() = 0 ;
	//得到包在设备类中的索引
	virtual INT	GetIndex() = 0 ;
	//设置重复调用当前包时可以被写操作打断
	virtual VOID MayBrokenWhenRepeatScan( BOOL bMayBrokenWhenRepeatScan = TRUE ) = 0 ;
};

class CItem : public CObject
{
public:
	//取得点名
	virtual const CString& GetName() = 0 ;
	//取得私有数据结构
	virtual PRIVATEDATA16& GetPrivateData() = 0 ;
	//取得数据连接项结构指针
	virtual IOITEMDEF* GetItemStru() = 0 ;
	//取得本连接项类所归属的数据包指针
	virtual CPacket* GetPacket() = 0 ;
	//取得本连接项所归属的设备指针
	virtual CDevice* GetDevice() = 0 ;
	//得到连接项的是否可读写属性,(返回值&1) == 1 可读;(返回值&2) == 2 可写;
	virtual INT GetAccessFlag() = 0 ; 
	
	//设置连接项的是否可读写属性,(nAccessFlag&1) == 1 可读;(nAccessFlag&2) == 2 可写;
	virtual VOID SetAccessFlag( INT nAccessFlag = ACCESS_READ|ACCESS_WRITE ) = 0 ; 
	//按长整型格式设置采集数据
	virtual VOID SetData( INT nData, BOOL bUpdateAtOnce = FALSE ) = 0 ; 
	//按浮点型格式设置采集数据
	virtual VOID SetData( DOUBLE dblData, BOOL bUpdateAtOnce = FALSE ) = 0 ;
	//按字符串格式设置采集数据
	virtual VOID SetData( LPCTSTR lpszData, BOOL bUpdateAtOnce = FALSE ) = 0 ;
	//按浮点型格式设置历史数据
	virtual VOID SetHisData( HISINSDATSTRU* pHisInsDatStru, INT nCount ) = 0 ; 
	//设置点的数据下置是否成功
	virtual VOID SetWriteSuccess( BOOL bSuccess = TRUE ) = 0 ;
	//取DB参数值( Double形)
	virtual BOOL GetData( DOUBLE& dblData) = 0 ;
	//取DB参数值(字符串形)
	virtual BOOL GetData( CString& csData) = 0 ;		
	//按字符串首地址和长度设置采集数据
	virtual VOID SetDataByLength( LPCTSTR lpszData, INT nLength, BOOL bUpdateAtOnce = FALSE ) = 0 ;
	//得到点在包类中的索引
	virtual INT	GetIndexInPacket() = 0 ;
	//得到点在设备类中的索引
	virtual INT	GetIndexInDevice() = 0 ;
	//得到点在数据库中的索引
	virtual TAGIDDEF* GetTagId() = 0;
};

extern "C" AFX_EXT_API VOID	OnCreate(CManager* pManager);
extern "C" AFX_EXT_API VOID OnSortItem(CDevice* pDevice, INT& nFirstSortKeyword, INT& nSecondSortKeyword);
extern "C" AFX_EXT_API VOID OnItemToPacket(CPacket* pPacket, CItem* pItem);
extern "C" AFX_EXT_API VOID OnBeforeScan(CManager* pManager);
extern "C" AFX_EXT_API INT	OnCreateDeviceLink(CDevice* pDevice, LPTSTR lpszSendString, INT& nSendStringLen);
extern "C" AFX_EXT_API INT	OnCreatePacketLink(CPacket* pPacket, LPTSTR lpszSendString, INT& nSendStringLen);
extern "C" AFX_EXT_API INT	OnReadData(CPacket* pPacket, LPTSTR lpszSendString, INT& nSendStringLen);
extern "C" AFX_EXT_API INT	OnWriteData(CItem* pItem, LPCTSTR lpszWriteDataString, LPTSTR lpszSendString, INT& nSendStringLen);
extern "C" AFX_EXT_API BOOL OnIsResponseComplete(CDevice* pDevice, CPacket* pPacket, CItem* pItem, LPCTSTR lpszResponseString, INT nResponseStringLen, INT& nDeleteLen);
extern "C" AFX_EXT_API VOID OnAfterSend(CDevice* pDevice, CPacket* pPacket, LPCTSTR lpszLastSendString, INT nLastSendStringLen);
extern "C" AFX_EXT_API VOID OnTimeout(CDevice* pDevice, CPacket* pPacket, CItem* pItem,INT nContinueTimeoutTimes);
extern "C" AFX_EXT_API VOID OnUnloadPacket(CPacket* pPacket);
extern "C" AFX_EXT_API VOID OnClose(CManager* pManager);
extern "C" AFX_EXT_API INT	OnRequestSOD(CDevice* pDevice, INT nSODLoggerIndex, SODHEAD* pSODHead, LPTSTR lpszReqString, INT nSODLength);

/*** 导出函数说明及示例 ***/
/*
	在IOAPI.DLL的程序中,需要暴露下面的部分函数的声明,
以便导出这些函数到DLL外部,使调度程序可以引用这些函数,
就象C++虚回调函数一样。
	下面是这些函数的模板,可以简化IOAPI.DLL的编程工作,使用
时拷贝相应的函数到IOAPI.CPP文件中(或其它类似实现上面定义的导出
函数的文件),稍加修改即可。

#pragma warning ( Disable : 4100)
const INT STEP_READ	= 1;//当前正在读,在DLL中使用的常数
const INT STEP_WRITE = 2;//当前正在写,在DLL中使用的常数

//载入IOAPI.DLL后立即调用,这时信道,设备,包,点都不存在.
extern "C" AFX_EXT_API VOID OnCreate( CManager* pManager )
{
	//设置标题
	pManager->SetTitle( ">>>>驱动程序" ) ;
	//禁止动态分包
	//pManager->SetDynamicPacket( FALSE ) ;
	//驱动程序需要授权,ID=0, 演示时间=7200秒.
	//pManager->SetLicense( 0, 7200 ) ;
}

//所有点Load完毕后调用(动态分包后也调用)
extern "C" AFX_EXT_API VOID OnSortItem(
	CDevice* pDevice, 
	INT& nFirstSortKeyword, 
	INT& nSecondSortKeyword )
{
	//以IO连接项结构的n[8]数组中的
	//n[0](第一关键字)和n[1](第二关键字)排序CItem* 数组
	nFirstSortKeyword = 0 ;
	nSecondSortKeyword = 1 ;
}

//循环多次添加所有的点到各个包中(动态分包后也调用)
extern "C" AFX_EXT_API VOID OnItemToPacket(
	CPacket* pPacket, 
	CItem* pItem )
{
	if ( pPacket->GetItemCount() == 0 )
	{
		pPacket->AddItem( pItem ) ;
	}
	else
	{
		if ( pPacket->GetItem( 0 )->GetItemStru()->n[ 0 ]
			== pItem->GetItemStru()->n[ 0 ] )
		{
			pPacket->AddItem( pItem ) ;
		}
	}
}

//打包完成,正式调度之前调用一次,遍历管理器,信道,设备,包,点(动态分包后也调用)
extern "C" AFX_EXT_API VOID OnBeforeScan( CManager* pManager )
{
	for ( INT i = 0; i < pManager->GetChannelCount(); i++ )
	{
		CChannel* pChannel = pManager->GetChannel( i ) ;
		//设置通讯空闲时间5毫秒
		//pChannel->SetIdleTime( 5 ) ;
		//设置接收缓冲区大小512字节
		//pChannel->SetAcceptBufferLength( 512 ) ;	
		//设置发送缓冲区大小512字节
		//pChannel->SetSendBufferLength( 512 ) ;	
		//读取信道数据前等待50毫秒(等待数据全部到达)

		for ( INT j = 0; j < pChannel->GetDeviceCount(); j++ )
		{
			CDevice* pDevice = pChannel->GetDevice( j ) ;
			//通讯过程信息将不显示,用于保密协议
			//pDevice->SetUnPublicized( TRUE ) ;

			for ( INT k = 0; k < pDevice->GetPacketCount(); k++ )

⌨️ 快捷键说明

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