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

📄 pm5400.cpp

📁 pm518采集卡驱动源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ------------------------------------------------- //
//                   PM5400  新驱动                  //
// ------------------------------------------------- //

//#include "stdafx.h"
#include <windows.h>
#include "..\pm5002k.h"
#include "pm5400.h"


//结构信息开始<5400>
#define PM5400_SPECIAL
struct PM5400_INFO //PM5400信息
{
//卡型号
	unsigned short CardManorVer;//5400
	unsigned char CardMinorVer; //' '
//用于参数检查的值
	unsigned char MaxJDQ_CH; //2(0--2)共3个继电器通道
	unsigned char Max_OCgate; //3(0--3)共4个OC门通道
	unsigned char MaxIOChannel;  //7(0--7)共8路,每组8个通道
	unsigned char MaxIOGroup;   //5(0--5)共6组

//其他寄存器
	unsigned char ROff_IOMode; //0xE
	unsigned char ROff_OCgate; //0xC
	unsigned char ROff_JDQ;    //0xC
//DI、DO相关信息,因为各卡的差异太大,无法设为结构数组
	unsigned char ROff_DIGroup[6];//0x6,0x6,0x8,0x8,0xA,0xA(读,读I/O 输入数据)
	unsigned char ROff_DOGroup[6];//0x0,0x0,0x2,0x2,0x4,0x4(写,写I/O 输出数据)

//////////////////////电子所的//////////////////////////////////
//卡型号
	unsigned short DZS_CardManorVer;
	unsigned char DZS_CardMinorVer; //' '
//用于参数检查的值
	unsigned char DZS_MaxIOChannel;  //7(0--7)共8路,每组8个通道
	unsigned char DSZ_MaxIOGroup;   //11(0--11)共12组
//其他寄存器
	unsigned char DZS_ROff_IOMode1; //13
	unsigned char DZS_ROff_IOMode2; //12
//DI、DO相关信息
	unsigned char DZS_ROff_DIOGroup[12];//0x0-0xb(读,读I/O 输入数据)
///////////////////////////////////////////////////////////////////

};
PM5400_INFO pm5400 = {5400,' ',2,3,7,5,\
0xE,0xC,0xC,\
0x6,0x6,0x8,0x8,0xA,0xA,\
0x0,0x0,0x2,0x2,0x4,0x4,\
5400,' ',7,11,\
13,12,\
0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,\
};
//结构信息结束</5400>


//函数开始<5400>
long _stdcall ZT5400SetIOMode(unsigned long nAddr,\
					 unsigned long nGroup,\
					 unsigned long nIOMode)
{
//函数功能:设置某一组开关量的输入输出模式
//入口参数:nAddr      板卡基地址
//          nGroup     组号(1-6)共6组
//          nIOMode    设置IO方式,0 = 输入方式,1 = 输出方式
//函数返回值:
//             0 表示成功
//            -1 表示调用出错,应该进一步调用GetDll_LastErrNO函数查找出错原因
	//检查参数
	nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
	nGroup = nGroup - m_nCountFrom;
	if( nGroup > pm5400.MaxIOGroup ) m_errorLevel = ERR_PARAMETER2;
	nIOMode = ( nIOMode != 0 ) ? 1 : 0;
	//若用户参数错,不继续执行
	if(m_errorLevel != ZT_SUCCESS) return -1;

	//读当前工作方式字
	unsigned short currIOMode;
	currIOMode = ReadW( nAddr, pm5400.ROff_IOMode );
	currIOMode = (unsigned short)SetULongXBit( currIOMode, nGroup, nIOMode );
	//写工作方式字
	WriteW( nAddr, pm5400.ROff_IOMode, currIOMode);
	return ZT_SUCCESS;
}
//函数结束</5400>


//函数开始<5400>
long _stdcall ZT5400SetOCgate(unsigned long nAddr,\
							  unsigned long nBit,\
							  unsigned long nState)
{
//函数功能:设置某个OC门的通断
//入口参数:nAddr      板卡基地址
//          nBit       OC门编号(1-4)共4个
//          nState     设置IO方式,0 = 使OC门断开,1 = 使OC门导通
//函数返回值:
//             0 表示成功
//            -1 表示调用出错,应该进一步调用GetDll_LastErrNO函数查找出错原因
	//检查参数
	nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
	nBit = nBit - m_nCountFrom;
	if( nBit > pm5400.Max_OCgate ) m_errorLevel = ERR_PARAMETER_CH;
	nState = ( nState != 0 ) ? 1 : 0;
	//若用户参数错,不继续执行
	if(m_errorLevel != ZT_SUCCESS) return -1;

	//读当前OC门状态
	unsigned short currOCstatus;
	currOCstatus = ReadW( nAddr, pm5400.ROff_OCgate );
	currOCstatus = (unsigned short)SetULongXBit( currOCstatus, nBit + 4, nState );
	//设置OC门状态
	WriteW( nAddr, pm5400.ROff_OCgate, currOCstatus);
	return ZT_SUCCESS;
}
//函数结束</5400>


//函数开始<5400>
long _stdcall ZT5400SetJDQ(unsigned long nAddr,\
						   unsigned long nBit,\
						   unsigned long nState)
{
//函数功能:设置某个继电器的状态
//入口参数:nAddr      板卡基地址
//          nBit       继电器编号(1-3)共3个
//          nState     设置继电器状态,0 = 使继电器常闭导通
//                                     1 = 使继电器常开导通
//函数返回值:
//             0 表示成功
//            -1 表示调用出错,应该进一步调用GetDll_LastErrNO函数查找出错原因
	//检查参数
	nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
	nBit = nBit - m_nCountFrom;
	if( nBit > pm5400.MaxJDQ_CH ) m_errorLevel = ERR_PARAMETER_CH;
	nState = ( nState != 0 ) ? 1 : 0;
	//若用户参数错,不继续执行
	if(m_errorLevel != ZT_SUCCESS) return -1;

	//读当前继电器状态
	unsigned short currJDQstatus;
	currJDQstatus = ReadW( nAddr, pm5400.ROff_JDQ );
	currJDQstatus = (unsigned short)SetULongXBit( currJDQstatus, nBit, nState );
	//设置继电器状态
	WriteW( nAddr, pm5400.ROff_JDQ, currJDQstatus);
	return ZT_SUCCESS;
}
//函数结束</5400>


//函数开始<5400>
long _stdcall ZT5400DIBit(unsigned long nAddr,\
				 unsigned long nGroup,\
				 unsigned long nBit,\
				 unsigned long IOModeCheck)
{
//函数功能:得到某组中某个通道的开关量输入状态,每8个通道为一组
//入口参数:nAddr      板卡基地址
//          nGroup     组号(1-6)每8个通道为一组,共6组
//          nBit       指定某组中的第几个通道(1-8),每组8个通道
//       IOModeCheck   设置是否检查IO工作方式与当前的操作相抵触
//                     0 = 不检查,1 = 检查
//函数返回值:
//             0 表示低电平
//             1 表示高电平
//            -1 表示调用出错,应该进一步调用GetDll_LastErrNO函数查找出错原因
	//检查参数
	nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
	nGroup = nGroup - m_nCountFrom;
	if( nGroup > pm5400.MaxIOGroup ) m_errorLevel = ERR_PARAMETER2;
	nBit = nBit - m_nCountFrom;
	if( nBit > pm5400.MaxIOChannel ) m_errorLevel = ERR_PARAMETER_CH;
	IOModeCheck = ( IOModeCheck != 0 ) ? 1 : 0;
	if( IOModeCheck != 0 )
	{
		//读当前工作方式字
		unsigned short currIOMode;
		currIOMode = ReadW( nAddr, pm5400.ROff_IOMode );
		//如果某组设为输出状态,但调用此函数(输入),说明执行了错误的操作
		if( GetULongXBit( currIOMode, nGroup ) != 0 )
			m_errorLevel = ERR_FUNC_OPERATE;
	}

	//若用户参数错,不继续执行
	if(m_errorLevel != ZT_SUCCESS) return -1;

	unsigned short getVal;
	getVal = ReadW( nAddr, pm5400.ROff_DIGroup[nGroup] );
	return GetULongXBit( getVal, (nGroup % 2) * 8 + nBit );
}
//函数结束</5400>


//函数开始<5400>
long _stdcall ZT5400DIAll(unsigned long nAddr,\
				 unsigned long nGroup,\
				 unsigned long IOModeCheck)
{
//函数功能:得到某组中所有通道的开关量输入状态,注意每8个通道为一组
//入口参数:nAddr      板卡基地址
//          nGroup     组号(1-6)每8个通道为一组,共6组
//       IOModeCheck   设置是否检查IO工作方式与当前的操作相抵触
//                     0 = 不检查,1 = 检查
//函数返回值:
//                0 表示这组的8个通道输入全为低电平
//             0xFF 表示这组的8个通道输入全为高电平
//            -1 表示调用出错,应该进一步调用GetDll_LastErrNO函数查找出错原因
	//检查参数
	nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
	nGroup = nGroup - m_nCountFrom;
	if( nGroup > pm5400.MaxIOGroup ) m_errorLevel = ERR_PARAMETER2;
	IOModeCheck = ( IOModeCheck != 0 ) ? 1 : 0;
	if( IOModeCheck != 0 )
	{
		//读当前工作方式字
		unsigned short currIOMode;
		currIOMode = ReadW( nAddr, pm5400.ROff_IOMode );
		//如果某组设为输出状态,但调用此函数(输入),说明执行了错误的操作
		if( GetULongXBit( currIOMode, nGroup ) != 0 )
			m_errorLevel = ERR_FUNC_OPERATE;
	}

	//若用户参数错,不继续执行
	if(m_errorLevel != ZT_SUCCESS) return -1;

	unsigned short getVal;
	getVal = ReadW( nAddr, pm5400.ROff_DIGroup[nGroup] );
	return ( getVal >> ((nGroup % 2) * 8) ) & 0xFF;
}
//函数结束</5400>


//函数开始<5400>
long _stdcall ZT5400DOBit(unsigned long nAddr,\
				 unsigned long nGroup,\
				 unsigned long nBit,\
				 unsigned long nState,\
				 unsigned long IOModeCheck)
{
//函数功能:设定某组中某个通道的开关量输出状态,每8个通道为一组
//入口参数:nAddr      板卡基地址
//          nGroup     组号(1-6)每8个通道为一组,共6组
//          nBit       指定某组中的第几个通道(1-8),每组8个通道
//          nState     指定通道的开关量输出状态
//                     0 = 低电平,1 = 高电平
//       IOModeCheck   设置是否检查IO工作方式与当前的操作相抵触
//                     0 = 不检查,1 = 检查
//函数返回值:
//             0 表成功
//            -1 表示调用出错,应该进一步调用GetDll_LastErrNO函数查找出错原因
	//检查参数
	nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
	nGroup = nGroup - m_nCountFrom;
	if( nGroup > pm5400.MaxIOGroup ) m_errorLevel = ERR_PARAMETER2;
	nBit = nBit - m_nCountFrom;
	if( nBit > pm5400.MaxIOChannel ) m_errorLevel = ERR_PARAMETER_CH;
	nState = ( nState != 0 ) ? 1 : 0;
	IOModeCheck = ( IOModeCheck != 0 ) ? 1 : 0;
	if( IOModeCheck != 0 )
	{
		//读当前工作方式字
		unsigned short currIOMode;
		currIOMode = ReadW( nAddr, pm5400.ROff_IOMode );
		//如果某组设为输入状态,但调用此函数(输出),说明执行了错误的操作
		if( GetULongXBit( currIOMode, nGroup ) == 0 )
			m_errorLevel = ERR_FUNC_OPERATE;
	}

	//若用户参数错,不继续执行
	if(m_errorLevel != ZT_SUCCESS) return -1;

	//读出当前开关量输出状态
	unsigned short getVal;
	getVal = ReadW( nAddr, pm5400.ROff_DOGroup[nGroup] );
	getVal = (unsigned short)SetULongXBit( getVal, (nGroup % 2) * 8 + nBit, nState );
	//设置开关量输出状态
	WriteW( nAddr, pm5400.ROff_DOGroup[nGroup], getVal);
	return ZT_SUCCESS;
}
//函数结束</5400>


//函数开始<5400>
long _stdcall ZT5400DOAll(unsigned long nAddr,\
				 unsigned long nGroup,\
				 unsigned long nStateAll,\
				 unsigned long IOModeCheck)
{
//函数功能:设定某组的所有通道的开关量输出状态,每8个通道为一组
//入口参数:nAddr      板卡基地址
//          nGroup     组号(1-6)每8个通道为一组,共6组
//        nStateAll    指定某组中的所有通道的开关量输出状态
//                     例如:0 = 所有8个通道输出低电平,
//                        0xFF = 所有8个通道输出高电平
//       IOModeCheck   设置是否检查IO工作方式与当前的操作相抵触
//                     0 = 不检查,1 = 检查

⌨️ 快捷键说明

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