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

📄 ioapi.h

📁 组态软件中
💻 H
📖 第 1 页 / 共 2 页
字号:
			{
				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 + -