📄 ioapi.h
字号:
{
CPacket* pPacket = pDevice->GetPacket( k ) ;
//假设包需要分配空间
//TCHAR* pChar = new TCHAR[ 512 ] ;
//pPacket->GetPrivateData().n[ 2 ] = INT( pChar ) ;
INT nParType = pPacket->GetItem( 0 )->GetItemStru()->n[ 0 ] ;
switch ( nParType )
{
case 0:
{
//设置包为可读写的(缺省即是)
pPacket->SetAccessFlag( ACCESS_READ | ACCESS_WRITE ) ;
for ( INT l = 0; l < pPacket->GetItemCount(); l++ )
{
CItem * pItem = pPacket->GetItem( l ) ;
INT nParNo = pItem->GetItemStru()->n[ 1 ] ;
switch ( nParNo )
{
case 0:
{
pItem->SetAccessFlag( ACCESS_READ | ACCESS_WRITE ) ;
}
break ;
case 1:
{
pItem->SetAccessFlag( ACCESS_READ ) ;
}
break ;
case 2:
{
pItem->SetAccessFlag( ACCESS_WRITE ) ;
}
break ;
default:
{
ASSERT( FALSE ) ;
}
break ;
}
}
}
break ;
case 1:
{
//设置包为只读
pPacket->SetAccessFlag( ACCESS_READ ) ;
for ( INT l = 0; l < pPacket->GetItemCount(); l++ )
{
CItem * pItem = pPacket->GetItem( l ) ;
INT nParNo = pItem->GetItemStru()->n[ 1 ] ;
switch ( nParNo )
{
case 0:
{
pItem->SetAccessFlag( ACCESS_READ | ACCESS_WRITE ) ;
}
break ;
case 1:
{
pItem->SetAccessFlag( ACCESS_READ ) ;
}
break ;
case 2:
{
pItem->SetAccessFlag( ACCESS_WRITE ) ;
}
break ;
default:
{
ASSERT( FALSE ) ;
}
break ;
}
}
}
break ;
case 2:
{
//设置包为只写
pPacket->SetAccessFlag( ACCESS_WRITE ) ;
for ( INT l = 0; l < pPacket->GetItemCount(); l++ )
{
CItem * pItem = pPacket->GetItem( l ) ;
INT nParNo = pItem->GetItemStru()->n[ 1 ] ;
switch ( nParNo )
{
case 0:
{
pItem->SetAccessFlag( ACCESS_READ | ACCESS_WRITE ) ;
}
break ;
case 1:
{
pItem->SetAccessFlag( ACCESS_READ ) ;
}
break ;
case 2:
{
pItem->SetAccessFlag( ACCESS_WRITE ) ;
}
break ;
default:
{
ASSERT(FALSE ) ;
}
break ;
}
}
}
break ;
default:
{
//出错了
ASSERT( FALSE ) ;
}
break ;
}
}
}
}
}
//打包后每个设备调用一次(动态分包后不调用)
extern "C" AFX_EXT_API INT OnCreateDeviceLink(
CDevice* pDevice,
LPTSTR lpszSendString,
INT& nSendStringLen )
{
//异步
sprintf( lpszSendString, "RequestDeviceLink" ) ;
nSendStringLen = strlen( lpszSendString ) ;
return ( SEND|WAIT ) ;
//同步
//调用设备初始化函数
//return ( SKIP ) ;
}
//每个包调用一次(动态分包后调用)
extern "C" AFX_EXT_API INT OnCreatePacketLink(
CPacket* pPacket,
LPTSTR lpszSendString,
INT& nSendStringLen )
{
//异步
sprintf( lpszSendString, "RequestPacketLink" ) ;
nSendStringLen = strlen( lpszSendString ) ;
return ( SEND | WAIT ) ;
//同步
//调用包初始化函数
//return ( SKIP ) ;
}
//循环调度,形成数据请求命令串
extern "C" AFX_EXT_API INT OnReadData(
CPacket* pPacket,
LPTSTR lpszSendString,
INT& nSendStringLen )
{
//异步
pPacket->GetPrivateData().n[ 0 ] = STEP_READ ;
CDevice* pDevice = pPacket->GetDevice() ;
INT nAddr = atoi( LPCTSTR( pDevice->GetAddr() ) ) ;
INT nParType = pPacket->GetItem( 0 )->GetItemStru()->n[ 0 ] ;
switch ( nParType )
{
case 0:
{
sprintf( lpszSendString, "\x2""%02d""R""\x3", nAddr ) ;
nSendStringLen = strlen( lpszSendString ) ;
pDevice->GetChannel()->ClearAcceptBuffer() ;
return ( SEND | WAIT ) ;
}
break ;
default:
{
ASSERT( FALSE ) ;
return ( SKIP ) ;
}
}
//同步
// CDevice* pDevice = pPacket->GetDevice() ;
// INT nAddr = atoi( LPCTSTR( pDevice->GetAddr() ) ) ;
// INT nParType = pPacket->GetItem( 0 )->GetItemStru()->n[ 0 ] ;
// switch ( nParType )
// {
// case 0:
// {
// if ( TRUE ) //ReadPacket函数
// {
// pPacket->SetReady() ;
// for ( INT i = 0; i < pPacket->GetItemCount(); i++ )
// {
// CItem* pItem = pPacket->GetItem( i ) ;
// pItem->SetData( 2 ) ;
// }
// }
// return ( 0 ) ;
// }
// break ;
// default:
// {
// ASSERT( FALSE ) ;
// return ( SKIP ) ;
// }
// break ;
//
// }
}
//发生数据下送时调用,形成数据下置命令串
extern "C" AFX_EXT_API INT OnWriteData(
CItem* pItem,
LPCTSTR lpszWriteDataString,
LPTSTR lpszSendString,
INT& nSendStringLen )
{
CPacket* pPacket = pItem->GetPacket() ;
CDevice* pDevice = pPacket->GetDevice() ;
INT nAddr = atoi( LPCTSTR( pDevice->GetAddr() ) ) ;
INT nParNo = pItem->GetItemStru()->n[ 1 ] ;
if ( nParNo > 12 || nParNo < 0 )
{
pDevice->ShowEventMessage( "不支持的参数" ) ;
return ( SKIP ) ;
}
DOUBLE dblData = atof( lpszWriteDataString ) ;
INT nData ;
if ( dblData >= 0 )
{
nData = INT( dblData + 0.5 ) ;
}
else
{
nData = INT( dblData - 0.5 ) ;
}
//异步
pPacket->GetPrivateData().n[ 0 ] = STEP_WRITE ;
sprintf( lpszSendString, "\x2""%02d""W""%02d""%02d""\x3", nAddr, nParNo, nData ) ;
nSendStringLen = strlen( lpszSendString ) ;
pDevice->GetChannel()->ClearAcceptBuffer() ;
return ( SEND | WAIT ) ;
//同步
// if ( TRUE )//Write函数
// {
// pItem->SetWriteSuccess( TRUE ) ;
// return ( 0 ) ;
// }
// else
// {
// pItem->SetWriteSuccess( FALSE ) ;
// return ( 0 ) ;
// }
}
//异步方式下判断是否完成数据的接收
extern "C" AFX_EXT_API BOOL OnIsResponseComplete(
CDevice* pDevice,
CPacket* pPacket,
CItem* pItem,
LPCTSTR lpszResponseString,
INT nResponseStringLen,
INT& nDeleteLen )
{
for ( INT i = 0; i < nResponseStringLen; i++ )
{
if ( lpszResponseString[ i ] == 2 )//头
{
for ( INT j = i + 1 ; j < nResponseStringLen; j++ )
{
if ( lpszResponseString[ j ] == 3 )//尾
{
if ( pPacket->GetPrivateData().n[ 0 ] == STEP_WRITE )
{
if ( TRUE )//各种检查
{
pItem->SetWriteSuccess() ;
}
else
{
pItem->SetWriteSuccess( FALSE ) ;
}
}
else//读
{
if ( TRUE )//各种检查
{
pPacket->SetReady() ;
for ( INT k = 0; k < pPacket->GetItemCount(); k++ )
{
CItem* pI = pPacket->GetItem( k ) ;
pI->SetData( 2 ) ;
}
}
else
{
}
}
nDeleteLen = -1 ;
return ( TRUE ) ;
}
}
}
}
nDeleteLen = 0 ;
return ( FALSE ) ;
}
//发送数据后调用一次
extern "C" AFX_EXT_API VOID OnAfterSend(
CDevice* pDevice,
CPacket* pPacket,
LPCTSTR lpszLastSendString,
INT nLastSendStringLen )
{
DCB dcb;
pDevice->GetChannel()->GetDCB( dcb ) ;
dcb.Parity = MARKPARITY ;
pDevice->GetChannel()->SetDCB( dcb ) ;
}
//发生超时时调用
extern "C" AFX_EXT_API VOID OnTimeout(
CDevice* pDevice,
CPacket* pPacket,
CItem* pItem,
INT nContinueTimeoutTimes )
{
//超时三次置包中所有点为-9999
if (nContinueTimeoutTimes == 3)
{
for ( INT i = 0; i < pPacket->GetItemCount(); i++ )
{
pPacket->GetItem( i )->SetData( "?", TRUE ) ;
}
}
}
//包析构时调用
extern "C" AFX_EXT_API VOID OnUnloadPacket( CPacket* pPacket )
{
//假设在包中分配了空间,在这里释放它
TCHAR* pChar = (TCHAR*)pPacket->GetPrivateData().n[ 2 ] ;
delete pChar ;
}
//CManager析构时调用一次
extern "C" AFX_EXT_API VOID OnClose( CManager* pManager )
{
//释放各种资源
}
*********/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -