📄 ioapi0.h
字号:
// 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字节空间
char str[64];
long n[7];
short fmt;
short bit;
} ;
//插入历史数据时使用的历史数据结构
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 ) ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -