虚拟仪器系统I/O接口软件——VISA(3)

3.3.4 VISA仪器控制组织器资源
       VISA仪器控制组织器资源在资源模板的基础上,扩展了自己的属性、事件与操作,实现多仪器控制资源的管理机制,使多个仪器合理地分配通信通道,进行多对话通道操作。组织器所定义的资源即为VISA仪器控制组织器资源。
n   VISA仪器控制组织器资源(VI_RSRC_VISA_IC_ORG):
1.  资源概述:为多仪器的控制资源提供存取能力。
2.  资源属性表及属性描述:
属性名          描述
VI_ATTR_ACC_MODE    操作模式
VI_ATTR_RESOURCES   资源名列表
3.  VISA仪器控制组织器资源定义的事件如下所示:无
4.  VISA仪器控制组织器资源定义的操作如下:
viGetRsrcSession(sesn,refName,accessMode,vi
4.1.    viGetRsrcSession(sesn,refName,accessMode,vi
1) 目标:返回一特定VISA仪器控制组织器的资源对话通道
2) 参数表:
参数名  输入/输出方向   数据类型    描述
sesn    输入    ViSession   组织器对话通道标识符
refName 输入    ViRsrc  资源名
accessMode  输入    ViAccessMode    存取模式
vi  输出    ViSession   资源对话通道标识符
3) 返回状态值:
完成代码:
VI_SUCCESS  资源关联完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_ABORT  传送时用户退出
VI_ERROR_INV_REF_NAME   资源名不当
4) 描述:该操作用于VISA仪器控制组织器对话通道获取资源的存取能力。
5) 相关项:viAttachRsrc()、viDetachRsrc()。
6) 实现要求:viClose()将关闭所有由viGetRsrcSession()打开的资源通道。

3.3.5 VISA特定接口仪器控制资源
       在VISA资源模板的基础上,VISA特定接口仪器控制资源定义了仪器控制特有的属性、事件与操作。在仪器控制资源中定义的功能是特定的仪器功能,每个控制与操作功能都有明确的仪器对象。
VISA特定接口仪器控制资源中包括:
n   GPIB总线接口控制资源
n   VXI总线器件配置资源
n   VXI总线接口控制资源
n   VXI总线零槽资源
n   VXI总线系统中断资源
n   VXI总线信号处理器资源
n   VXI总线信号资源
n   VXI总线中断资源
n   VXI总线扩展接口资源
n   异步串行总线接口控制资源
下面分别对各个资源进行详尽描述。
n   GPIB总线接口控制资源(VI_RSRC_GPIB_INTF):
1.  资源概述:对GPIB总线进行存取,实现GPIB器件的状态并行轮询及远程/当地控制操作。
2.  资源属性表及属性描述:
属性名          描述
VI_ATTR_GPIB_ATN    ATN线当前状态
VI_ATTR_GPIB_BUS_TIMING 接口资源握手延时值
VI_ATTR_GPIB_DATA   GPIB数据线(D0~D7)状态
VI_ATTR_GPIB_DAV    DAV线当前状态
VI_ATTR_GPIB_EOI    EOI线当前状态
VI_ATTR_GPIB_GLOB_TLC_MODE  接口当前讲者/听者/控者模式
VI_ATTR_GPIB_HS488_CBL_LEN  HS488电缆长度
VI_ATTR_GPIB_IFC    IFC线当前状态
VI_ATTR_GPIB_LOCAL_PP   是否允许并行轮询
VI_ATTR_GPIB_NDAC   NDAC线当前状态
VI_ATTR_GPIB_NRFD   NRFD线当前状态
VI_ATTR_GPIB_REM    REM线当前状态
VI_ATTR_GPIB_SRQ    SRQ线当前状态
VI_ATTR_PHYS_ADDR   器件地址
VI_ATTR_SYS_CNTLR   是否置为系统控者
VI_ATTR_7_8_BIT_CMP 终止符有效位
VI_ATTR_SEND_END_ON 终止符是否插入EOI
_TERMCHAR_EN
VI_ATTR_GPIB_IST    是否允许并行轮询
VI_ATTR_GPIB_SES_ADDR   GPIB对话通道地址
VI_ATTR_GPIB_SES_STAT   32位状态变量
VI_ATTR_GPIB_TLC_MODE   对话通道当前讲者/听者/控制模式
VI_ATTR_PROTOCOL    协议
VI_ATTR_SEND_END    写操作最后一个字节是否插入EOI
VI_ATTR_TERMCHAR    终止符
VI_ATTR_TERMCHAR_EN 终止符是否有效
VI_ATTR_TMO_UNIT    超时值单位
VI_ATTR_TMO 超时值
VI_ATTR_TRANSPORT   传送机制
3.  GPIB总线接口控制资源定义的事件如下所示:
事件    说明
VI_EVENT_GPIB_REM   GPIB REM线有效引发事件
VI_EVENT_GPIB_ATN   GPIB ATN线有效引发事件
VI_EVENT_GPIB_TALK  对话通道置为讲者引发事件
VI_EVENT_GPIB_LISTEN    对话通道置为听者引发事件
VI_EVENT_GPIB_CIC   对话通道置为责任控者引发事件
VI_EVENT_GPIB_LOK   对话通道处于锁定状态
VI_EVENT_GPIB_END   对话通道接收到EOI
VI_EVENT_GPIB_CMPL  对话通道完成一个传送
VI_EVENT_GPIB_DCAS  对话通道处于器件清除激活状态(DCAS)
VI_EVENT_GPIB_DTAS  对话通道处于器件触发激活状态(DTAS)
VI_EVENT_GPIB_SPAS  对话通道处于串行轮询激活状态(SPAS)
4.  GPIB总线接口控制资源定义的操作如下:
viGPIBRead(vibufcountretCount
viGPIBReadAsync(vibufcount,jobId)
viGPIBReadStatus(vi,jobId,status)
viGPIBWrite(vibufcountretCount
viGPIBWriteAsync(vibufcount,jobId)
viGPIBWriteStatus(vi,jobId,status)
viGPIBCommand(vibufcountretCount
viGPIBCommandAsync(vibufcount,jobId)
viGPIGCommandStatus(vi,jobId,status)
viSendIFC(vi
viTakeControl(vi,sync)
viGoToStandby(vi,shake)
viListen(vi,address)
viLocal(vi
viRemoteEnable(vi,rem)
viPPollConfig(vi,address,ppc)
viPPoll(vi,result)
4.1.    viGPIBRead(vibufcountretCount
1) 目标:从GPIB总线读取数据
2) 参数表:与viRead()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS  数据读取完成
VI_SUCCESS_TERM_CHAR    特定终止符被读取
VI_SUCCESS_MAX_CNT  读取的字节数与count数相同
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_TMO    超时错误
VI_ERROR_ABORT  传送时用户退出
VI_ERROR_CLR_ABORT  传送时器件清除
VI_ERROR_NADDRESSED 接口没有置为听状态
4) 描述:该操作将从器件中读取的值放在buf
5) 相关项:参见viGPIBReadAsync()、viGPIBReadStatus()。
6) 实现要求:无。
4.2.    viGPIBReadAsync(vibufcount,jobId)
1) 目标:从GPIB总线异步读取数据
2) 参数表:与viReadAsync()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS  异步数据读取完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_QUEUE_ERROR    不能进行异步操作排队
4) 描述:该操作将从器件中读取的值放在buf
5) 相关项:参见viGPIBRead()、viGPIBReadStatus()。
6) 实现要求:无。
4.3.    viGPIBReadStatus(vi,jobId,jobStatus)
1) 目标:获取GPIB读操作状态
2) 参数表:与viReadStatus()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS  状态获取完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_INV_JOBID  作业标识符不当
4) 描述:当操作为同步时,标识符唯一确定,为VI_SYNC;当操作为异步时,标识符为操作的输出参数值。
5) 相关项:参见viGPIBReadAsync()、viGPIBRead()。
6) 实现要求:无。
4.4.    viGPIBWrite(vibufcountretCount
1) 目标:将数据同步写入到GPIB总线中
2) 参数表:与viWrite()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS  数据写入完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_TMO    超时错误
VI_ERROR_ABORT  传送时用户退出
VI_ERROR_CLR_ABORT  传达时器件清除
VI_ERROR_NADDRESSED 接口未置为听者状态
VI_ERROR_NLISTENERS 没有听者状态被检测到
4) 描述:该操作将位于buf中的数据写入到GPIB总线中去,任一写资源通道只能登录一个同步写操作。
5) 相关项:参见viGPIBWriteAsync()、viGPIBWriteStatus()。
6) 实现要求:无。
4.5.    viGPIBWriteAsync(vibufcount,jobId)
1) 目标:将数据异步写入到GPIB总线中
2) 参数表:与viWriteAsync()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS  异步写操作完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_QUEUE_ERROR    不能进行写操作排队
4) 描述:该操作将位于buf中的数据写入到GPIB总线中去,任一写资源通道可以登录多个异步写操作,进行排队处理。
5) 相关项:参见viGPIBWrite()、viGPIBWriteStatus()。
6) 实现要求:无。
4.6.    viGPIBWriteStatus(vi,jobId,jobStatus)
1) 目标:获取GPIB写操作状态
2) 参数表:与viWriteStatus()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS  状态获取完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_INV_JOBID  作业标识符不当
4) 描述:当操作为同步时,标识符唯一确定,为VI_SYNC;当操作为异步时,标识符为操作的输出参数值。
5) 相关项:参见viGPIBWrite()、viGPIBWriteAsync()。
6) 实现要求:无。
4.7.    viGPIBCommand(vibufcountretCount
1) 目标:将命令同步写入到GPIB总线中
2) 参数表:与viGPIBWrite()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS  发送命令完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_TMO    超时错误
VI_ERROR_ABORT  传送时用户退出
VI_ERROR_NCIC   vi未表示为当前责任控者
VI_ERROR_NLISTENERS 没有听者状态被检测到
4) 描述:该操作将位于buf中的命令写入到GPIB总线中去。
5) 相关项:参见viGPIBCommandAsync()、viGPIBCommandStatus()。
6) 实现要求:无。
4.8.    viGPIBCommandAsync(vibufcount,jobId)
1) 目标:将命令异步写入到GPIB总线中
2) 参数表:与viGPIBWriteAsync()一致。
3) 返回状态值:与viGPIBWriteAsync()一致。
4) 描述:该操作将位于buf中的命令异步写入到GPIB总线中去。
5) 相关项:参见viGPIBCommand()、viGPIBCommandStatus()。
6) 实现要求:无。
4.9.    viGPIBCommandStatus(vi,jobId,jobStatus)
1) 目标:获取GPIB命令操作状态
2) 参数表:与viGPIBWriteStatus()一致。
3) 返回状态值:与viGPIBWriteStatus()一致。
4) 描述:当操作为同步时,标识符唯一确定,为VI_SYNC;当操作为异步时,标识符为操作的输出参数值。
5) 相关项:参见viGPIBCommand()、viGPIBCommandAsync()。
6) 实现要求:无。
4.10.   viSendIFC(vi
1) 目标:置GPIB IFC线有效至少100微秒
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
3) 返回状态值:
完成代码:
VI_SUCCESS  置GPIB IFC线完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_NSYS_CNTLR vi不能置为系统控者
4) 描述:该操作只有在当前vi为系统控者时才有效。
5) 相关项:无。
6) 实现要求:无。
4.11.   viTakeControl(vi,sync)
1) 目标:取得GPIB总线控制同步操作
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
sync    输入    ViBoolean   同步操作还是异步操作
3) 返回状态值:
完成代码:
VI_SUCCESS  控制取得完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_NCIC   vi不能置为责任控者
4) 描述:该操作通过将ATN接口线置高以取得总线控制权,该操作是对于vi置为责任控者时才有效。
5) 相关项:无。
6) 实现要求:无。
4.12.   viGoToStandby(vi,shake)
1) 目标:使GPIB ATN接口线无效,接受者可以任意握手
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
shake   输入    ViBoolean   ATN线无效后是否接受者执行握手
3) 返回状态值:
完成代码:
VI_SUCCESS  总线旁路完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_NCIC   vi不能置为责任控者
VI_ERROR_BAD_ADDR_STATE ATN线已经置为无效
4) 描述:该操作是对于vi置为责任控者时才有效。
5) 相关项:无。
6) 实现要求:当接受者握手被执行,接口需要延时一段时间才会进行数据传送。

4.13.   viListen(vi,address)
1) 目标:检查GPIB总线上听者器件是否存在
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
address 输入    ViPhysAddr  GPIB器件地址
3) 返回状态值:
完成代码:
VI_SUCCESS  操作完成
VI_SUCCESS_DEV_NPRESENT 操作完成,但器件没有在特定地址上
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_NCIC   vi不能置为责任控者
VI_ERROR_INV_ADDR   地址表示不正确
4) 描述:该操作只有当vi置为责任控者且address表示的地址不代表vi时才有效。
5) 相关项:无。
6) 实现要求:无。
4.14.   viLocal(vi
1) 目标:置接口为当地模式
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
3) 返回状态值:
完成代码:
VI_SUCCESS  操作完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
4) 描述:当接口处于锁定状态时,该操作无效。
5) 相关项:无。
6) 实现要求:无。
4.15.   viRemoteEnable(vi,rem)
1) 目标:控制GPIB REM接口线状态
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
rem 输入    ViBoolean   REM接口线状态
3) 返回状态值:
完成代码:
VI_SUCCESS  操作完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_NSYS_CNTLR vi不能置为系统控者
4) 描述:该操作只有当vi置为系统控者时才有效。
5) 相关项:无。
6) 实现要求:无。
4.16.   viPPollConfig(vi,address,ppc)
1) 目标:设置GPIB器件为并行轮询
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
address 输入    ViPhysAddr  GPIB器件地址
ppc 输入    ViUInt8 必须包括PPE或PPD命令
3) 返回状态值:
完成代码:
VI_SUCCESS  操作完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_TMO    超时错误
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_NCIC   vi不能置为责任控者
VI_ERROR_INV_ADDR   地址表示不正确
VI_ERROR_LOCAL_CONFIG   在远程控制状态下进行当地配置
VI_ERROR_INV_PPC    ppc不能包括一个正确的并行轮询配置
4) 描述:该操作只有当vi置为责任控者时才有效。
5) 相关项:参见viPPoll()。
6) 实现要求:无。
4.17.   viPPoll(vi,,result)
1) 目标:并行轮询GPIB器件
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
result  输出    ViPUInt8    结果地址
3) 返回状态值:
完成代码:
VI_SUCCESS  并行轮询完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_TMO    超时错误
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_NCIC   vi不能置为责任控者
4) 描述:该操作只有当vi置为责任控者时才有效。
5) 相关项:参见viPPollConfig()。
6) 实现要求:无。
n   VXI总线器件配置资源(VI_RSRC_VXI_DEV_CONF):
1.  资源概述:可实现VXI总线器件的初始化操作。
2.  资源属性表及属性描述:
属性名          描述
VI_ATTR_ASYNC_MODE_CNTRL    异步模式控制命令响应
VI_ATTR_CMDR_LA VXI总线控制器地址
VI_ATTR_DEV_CLASS   VXI仪器类型
VI_ATTR_DEV_LA  器件地址
VI_ATTR_DEV_SUBCLASS    扩展型器件附加寄存器值
VI_ATTR_EXTDR_INFO  主机箱扩展器信息
VI_ATTR_MAINFRAME_LA    主机箱地址
VI_ATTR_MANF_ID VXI器件制造厂家标识符
VI_ATTR_MANF_NAME   VXI器件制造厂家名
VI_ATTR_MEM_ATTR_REG    属性寄存器
VI_ATTR_MEM_BASE    内存基地址
VI_ATTR_MEM_SIZE    内存大小
VI_ATTR_MEM_SPACE   内存空间类型
VI_ATTR_MODEL_CODE  器件标号
VI_ATTR_MODEL_NAME  器件名
VI_ATTR_PASS_STATUS 器件自检通过状态
VI_ATTR_PROT_REG    消息基器件协议寄存器
VI_ATTR_PROT_RESP   读协议响应值
VI_ATTR_RDY_STATUS  器件就绪状态
VI_ATTR_RESP_EN 从机响应
VI_ATTR_SERV_AREA   从机空间大小
VI_ATTR_SERV_LIST   从机列表
VI_ATTR_SLOT    器件槽位号
VI_ATTR_SLOT0_LA    零槽器件地址
VI_ATTR_VXI_INTERRUPTERS    器件中断矢量
VI_ATTR_VXI_INTR_HNDLRS 中断处理矢量
3.  VXI总线器件配置资源定义的事件如下所示:无
4.  VXI总线器件配置资源定义的操作如下:
viAssertSoftReset(vi
4.1.    viAssertSoftReset(vi
1) 目标:执行软件复位
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
3) 返回状态值:
完成代码:
VI_SUCCESS  软复位完成
VI_SUCCESS_DEV_FAILED   软复位完成,但器件无法通过自检
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_BERR   总线错误
4) 描述:该操作执行器件软件复位。
5) 相关项:无。
6) 实现要求:无。
n   VXI总线接口控制资源(VI_RSRC_VXI_INTF):
1.  资源概述:用于配置VXI总线属性。
2.  资源属性表及属性描述:
属性名          描述
VI_ATTR_FAIR_RQST_TMO   公平请求超时值
VI_ATTR_HW_SOFTRESET_EN 硬件是否允许软复位
VI_ATTR_PHYS_ADDR   器件地址
VI_ATTR_RELS_MECH   总线释放机制
VI_ATTR_DEV_SUBCLASS    扩展型器件附加寄存器值
VI_ATTR_RQST_LEVEL  请求优先级
VI_ATTR_SYSFAIL_TMO SYSFAIL超时值
VI_ATTR_VXIBUS_TMO  VXI总线超时值
VI_ATTR_VXI_INTR_STATUS 中断与信号位矢量
VI_ATTR_VXI_RETRY_EN    是否允许VXI总线背板重入
VI_ATTR_TRIG_STATUS 触发线位矢量
VI_ATTR_UTIL_BUS_STATUS 失败线位矢量
3.  VXI总线接口控制资源定义的事件如下所示:
事件    说明
VI_EVENT_SOFTRESET  软复位引发事件
4.  VXI总线接口控制资源定义的操作如下:无
n   VXI零槽资源(VI_RSRC_VXI_SLOT_0):
1.  资源概述:描述VXI总线系统零槽功能。
2.  资源属性表及属性描述:
属性名          描述
VI_ATTR_ARBITRATION 总线仲裁模式
VI_ATTR_CLK10_LOCATION  CLK10信号来源
VI_ATTR_CLK10_OPERATIONAL   CLK10是否被操作
VI_ATTR_MODID   VXI总线背板MODID线状态
VI_ATTR_PHSY_ADDR   器件地址
3.  VXI总线接口控制资源定义的事件如下所示:无
4.  VXI总线接口控制资源定义的操作如下:无
n   VXI总线系统中断资源(VI_RSRC_VXI_SYS_INTR):
1.  资源概述:处理系统中断(ACFAIL、SYSFAIL与SYSRESET)。
2.  资源属性表及属性描述:
属性名          描述
VI_ATTR_HW_ACFAIL_EN    是否可以感知ACFAIL中断
VI_ATTR_HW_SYSFAIL_EN   是否可以感知SYSFAIL中断
VI_ATTR_HW_SYSRESET_EN  是否可以感知SYSRESET中断
3.  VXI总线系统中断资源定义的事件如下所示:
事件    说明
VI_EVENT_ACFAIL ACFAIL系统中断事件
VI_EVENT_SYSFAIL    SYSFAIL系统中断事件
VI_EVENT_SYSRESET   SYSRESET系统中断事件
4.  VXI总线系统中断资源定义的操作如下:
viAssertUtilBusSignal(vi,interrupt,mode)
4.1.    viAssertUtilBusSignal(vi,interrupt,mode)
1) 目标:确认特定应用总线中断
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
interrupt   输入    ViUInt16    应用总线中断
mode    输入    ViUInt16    执行模式
3) 返回状态值:
完成代码:
VI_SUCCESS  应用总线中断确认完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_NSUP_OPER  硬件不支持操作
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_INV_MODE   模式参数不合法
4) 描述:该操作可以确认三种系统中断,即为VI_ACFAIL、VI_SYSFAIL与VI_SYSRESET,其中mode参数只在VI_SYSRESET状态下有效,可分为VI_KEEP_CONFIG(不改变原来配置)、VI_NO_LOCAL_RESET(复位VXI电路但不复位当地CPU)及VI_RESET_LOCAL_CPU(复位当地CPU)。
5) 相关项:无。
6) 实现要求:无。
n   VXI总线信号处理器资源(VI_RSRC_VXI_SIG_PROCESSOR):
1.  资源概述:提供器件之间中断及信号通讯接口。
2.  资源属性表及属性描述:
属性名          描述
VI_ATTR_ASYNC_MODE_CNTRL    异步模式控制命令响应
VI_ATTR_SIGP_MASK   信号处理器事件过滤器
VI_ATTR_SUGGESTED_INTR_ID   器件中断号
3.  VXI总线信号处理器资源定义的事件如下所示:
事件    说明
VI_EVENT_SIGNALP    VXI总线信号或中断引发事件
4.  VXI总线信号处理器资源定义的操作如下:
viSendVXISignal(vi,StatusID)
4.1.    viSendVXISignal(vi,StatusID)
1) 目标:确认中断或向信号寄存器的写操作
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
statusID    输入    ViUInt16    信号值
3) 返回状态值:
完成代码:
VI_SUCCESS  写操作完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_BERR   总线错误
4) 描述:该操作的写入模式为异步方式。
5) 相关项:无。
6) 实现要求:缺省状态为VXI总线信号。
n   VXI总线信号资源(VI_RSRC_VXI_SIG):
1.  资源概述:监视送入当地控制器的信号。
2.  资源属性表及属性描述:
属性名          描述
VI_ATTR_HW_SIG_SENSE_EN 状态属性
VI_ATTR_SIG_RETRY_EN    在总线错误时进行信号重入
VI_ATTR_VXI_SIG_MASK    信号过滤屏蔽
3.  VXI总线信号资源定义的事件如下所示:
事件    说明
VI_EVENT_SIGNAL 写入一当地信号寄存器引发事件
4.  VXI总线信号资源定义的操作如下:无。
n   VXI总线中断资源(VI_RSRC_VXI_INTR):
1.  资源概述:监视中断线状态。
2.  资源属性表及属性描述:
属性名          描述
VI_ATTR_HW_INTR_SENSE_EN    中断是否有效
VI_ATTR_INTR_ACK_MODE   中断响应模式
VI_ATTR_VXI_INTR_LINE   对应中断线
VI_ATTR_INTR_TYPE   中断类型
VI_ATTR_VXI_INTR_MASK   中断过滤屏蔽
3.  VXI总线中断资源定义的事件如下所示:
事件    说明
VI_EVENT_VXI_INTR   中断引发事件
4.  VXI总线中断资源定义的操作如下:
viAssertVXIInterrupt(vi,statusId)
viDeassertVXIInterrupt(vi
viAcknowledgeVXIInterrupt(vi,statusId)
4.1.    viAssertVXIInterrupt(vi,StatusID)
1) 目标:确认中断线有效
2) 参数表:


参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
statusID    输入    ViUInt32    状态值
3) 返回状态值:
完成代码:
VI_SUCCESS  中断确认完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_NSUP_OPER  没有对应的中断器支持
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_INTR_PENDING   VXI中断仍在登录
4) 描述:该操作确认VXI总线中断。
5) 相关项:无。
6) 实现要求:无。
4.2.    viDeassertVXIInterrupt(vi
1) 目标:取消中断线确认
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
3) 返回状态值:
完成代码:
VI_SUCCESS  中断确认取消完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_NSUP_OPER  没有对应的中断器支持
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
4) 描述:该操作只可用于调试目的。
5) 相关项:无。
6) 实现要求:无。
4.3.    viAcknowledgeVXIInterrupt(vi,StatusID)
1) 目标:手动响应中断线
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   对话通道标识符(句柄)
statusID    输出    ViPUInt32   状态值
3) 返回状态值:
完成代码:
VI_SUCCESS  中断线响应完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_NSUP_OPER  没有对应的中断器支持
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_BERR   总线错误
4) 描述:该操作只能用于调试目的。
5) 相关项:无
6) 实现要求:无。
n   VXI总线扩展接口资源(VI_RSRC_VXI_EXTDR):
1.  资源概述:实现VXI总线主机笨扩展信号的配置。
2.  资源属性表及属性描述:
属性名          描述
VI_ATTR_ECL_TRIG_P2 扩展器件P2 ECL触发器是否有效
VI_ATTR_ECL_TRIG_P3 扩展器件P3 ECL触发器是否有效
VI_ATTR_INTR_DIR    中断级方向
VI_ATTR_INTR_LEVELS_EN  中断级是否有效
VI_ATTR_TRIG_DIR    ECL/TTL触发线方向
VI_ATTR_TTL_TRIG_P2 扩展器件P2 TTL触发器是否有效
VI_ATTR_UTIL_BUS_DIR    应用总线方向
3.  VXI总线扩展接口资源定义的事件如下所示:无
4.  VXI总线扩展接口资源定义的操作如下:无
n   异步串行总线接口控制资源(VI_RSRC_ASRL_INTF):
1.  资源概述:进行异步串行接口存取操作。
2.  资源属性表及属性描述:
属性名          描述
VI_ATTR_ASRL_BAUD   波特率
VI_ATTR_ASRL_DATA_BITS  数据位
VI_ATTR_ASRL_PARITY 检验极性
VI_ATTR_ASRL_STOP_BITS  停止位
VI_ATTR_ASRL_FLOW_CNTRL 数据流控制
VI_ATTR_ASRL_FLOW_IN    数据输入流
VI_ATTR_ASRL_FLOW_OUT   数据输出流
VI_ATTR_ASRL_ON_LIMIT   数据输入流允许
VI_ATTR_ASRL_OFF_LIMIT  数据输入流不允许
VI_ATTR_ASRL_XON_CHAR   开启流控制
VI_ATTR_ASRL_XOFF_CHAR  关闭流控制
VI_ATTR_ASRL_IN_BUF_SIZE    接收缓冲区大小
VI_ATTR_ASRL_AVAIL_NUM  接收缓冲区字节个数
VI_ATTR_ASRL_LOCAL_ECHO 是否对每个字符都响应
VI_ATTR_ASRL_RTS_STATE  RTS信号状态
VI_ATTR_ASRL_CTS_STATE  CTS信号状态
VI_ATTR_ASRL_DTR_STATE  DTR信号状态
VI_ATTR_ASRL_DSR_STATE  DSR信号状态
VI_ATTR_ASRL_DCD_STATE  DCD信号状态
VI_ATTR_ASRL_RI_STATE   RI信号状态
VI_ATTR_ASRL_BUS_STATE  所有总线信号状态
VI_ATTR_ASRL_ON_PARITY  极性校验有效
VI_ATTR_ASRL_ON_FRAMING 帧校验有效
VI_ATTR_ASRL_REPLACE_CHAR   输入字符替代字符
VI_ATTR_ASRL_DISCARD_NULL   空字符是否需要丢弃
VI_ATTR_TMO_UNIT    超时值单位
VI_ATTR_TMO 超时值
VI_ATTR_ASRL_ABORT_DCD  当DCD无效时是否需要退出
VI_ATTR_ASRL_ABORT_PARITY   极性校验错误是否需要退出
VI_ATTR_ASRL_END_IN 读操作终止方式
VI_ATTR_ASRL_TERMCHAR   终止符
VI_ATTR_ASRL_END_OUT    写操作终止方式
VI_ATTR_ASRL_END_OUT_CHAR   写操作终止符
3.  异步串行总线接口控制资源定义的事件如下所示:
事件    说明
VI_EVENT_IO_COMPLETION  异步读写操作完成
VI_EVENT_ASRL_DATA_AVAIL    接收缓冲区已有N个字符
VI_EVENT_ASRL_STRING_ARRIVED    接收缓冲区接收到特定字符
VI_EVENT_ASRL_END_ARRIVED   接收缓冲区接收到END字符
VI_EVENT_ASRL_FLOWIN_CHANGED    输入流控制方式改变  
VI_EVENT_ASRL_FLOWOUT   输出流控制方式改变
_CHANGED        
VI_EVENT_ASRL_RTS_CHANGED   RTS状态改变
VI_EVENT_ASRL_CTS_CHANGED   CTS状态改变
VI_EVENT_ASRL_DSR_CHANGED   DSR状态改变
VI_EVENT_ASRL_DTR_CHANGED   DTR状态改变
VI_EVENT_ASRL_DCD_CHANGED   DCD状态改变
VI_EVENT_ASRL_RI_CHANGED    RI状态改变
VI_EVENT_ASRL_RING  RI输入信号沿被检测到
VI_EVENT_ASRL_PARITY_ERR    极性校验错误引发事件
VI_EVENT_ASRL_FRAMING_ERR   帧校验错误引发事件
VI_EVENT_ASRL_OVERRUN_ERR   超限错误
VI_EVENT_ASRL_OVERFLOW_ERR  溢出错误
4.  异步串行总线接口控制资源定义的操作如下:
viAsrlRead(vibufcountretCount
viAsrcReadAsync(vibufcount,jobId)
viAsrcReadStatus(vi,jobId,status)
viAsrcWrite(vibufcountretCount
viAsrcWriteAsync(vibufcount,jobId)
viAsrcWriteStatus(vi,jobId,status)
viAsrcSendBreak(vi,unit,length)
4.1.    viAsrlRead(vibufcountretCount
1) 目标:从异步串行总线同步读取数据
2) 参数表:与viRead()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS  传送完成
VI_SUCCESS_TERM_CHAR    特定终止符被读取
VI_SUCCESS_MAX_CNT  读取的字节数与count数相同
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_TMO    超时错误
VI_ERROR_ABORT  传送时用户退出
VI_ERROR_ASRL_NO_DCD    DCD无效
VI_ERROR_ASRL_PARITY    极性校验错误
VI_ERROR_ASRL_FRAMING   帧校验错误
VI_ERROR_ASRL_OVERRUN   超限错误
VI_ERROR_ASRL_OVERFLOW  溢出错误
4) 描述:该操作将从器件中读取的值放在buf
5) 相关项:参见viAsrlReadAsync()、viAsrlReadStatus()。
6) 实现要求:无
4.2.    viAsrlReadAsync(vibufcount,jobId)
1) 目标:从异步串行总线异步读取数据
2) 参数表:与viReadAsync()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS  传送完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_QUEUE_ERROR    不能进行异步操作排队
4) 描述:该操作将从器件中读取的值放在buf
5) 相关项:参见viAsrlRead()、viAsrlReadStatus()。
6) 实现要求:无
4.3.    viAsrlReadStatus(vi,jobId,jobStatus)
1) 目标:获取异步串行总线读操作状态
2) 参数表:与viReadStatus()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS  状态获取完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_INV_JOBID  作业标识符不当
4) 描述:当操作为同步时,标识符唯一确定,为VI_SYNC;当操作为异步时,标识符为操作的输出参数值。
5) 相关项:参见viAsrlReadAsync()、viAsrlRead()。
6) 实现要求:无。
4.4.    viAsrlWrite(vibufcountretCount
1) 目标:将数据同步写入到异步串行总线中
2) 参数表:与viWrite()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS  传送完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_TMO    超时错误
VI_ERROR_ABORT  传送时用户退出
VI_ERROR_ASRL_NO_DCD    DCD信号无效
4) 描述:该操作将位于buf中的数据写入到异步串行总线中去。
5) 相关项:参见viAsrlWriteAsync()、viAsrlWriteStatus()。
6) 实现要求:无。
4.5.    viAsrlWriteAsync(vibufcount,jobId)
1) 目标:将数据异步写入到异步串行总线中。
2) 参数表:与viWriteAsync()一致
3) 返回状态值:
完成代码:
VI_SUCCESS  异步写操作完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_QUEUE_ERROR    不能进行写操作排队
4) 描述:该操作将位于buf中的数据写入到异步串行总线中去。
5) 相关项:参见viAsrlWrite()、viAsrlWriteStatus()。
6) 实现要求:无。
4.6.    viAsrlWriteStatus(vi,jobId,jobStatus)
1) 目标:获取异步串行写操作状态
2) 参数表:与viWriteStatus()一致。
3) 返回状态值:
完成代码:
VI_SUCCESS  状态获取完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_INV_JOBID  作业标识符不当
4) 描述:当操作为同步时,标识符唯一确定,为VI_SYNC;当操作为异步时,标识符为操作的输出参数值。
5) 相关项:参见viAsrlWrite()、viAsrlWriteAsync()。
6) 实现要求:无。
4.7.    viAsrlSendBreak(vi,unit,length)
1) 目标:发送时间间隔
2) 参数表:
参数名  输入/输出方向   数据类型    描述
vi  输入    ViSession   资源对话通道标识符
unit    输入    ViUint16    间隔时间单位,可取:VI_PICO_SEC(皮秒)、VI_NANO_
SEC
(纳秒)、VI_MICRO_SEC(微秒)、VI_MILLI_SEC(毫秒)、VI_SEC(秒)、
VI_ASRL_FRAME_TIME
length  输入    ViUInt32    间隔时间长度
3) 返回状态值:
完成代码:
VI_SUCCESS  间隔发送完成
错误代码:
VI_ERROR_INV_SESSION    vi不能标识正当对话通道
VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作
VI_ERROR_ABORT  传送时用户退出
4) 描述:该操作向异步串行接口发送一个间隔,数据传送中保持的时间间隔可以为一帧或更长。
5) 相关项:无。
6) 实现要求:无。

3.4 VISA的软件实现
       在前一节中,详细给出了VISA资源定义规范,但事实上,前一节中描述的VISA资源所含的属性、事件与操作在目前还没有能够完全实现,它只为一个统一的、开放的I/O接口软件库定义了一个标准规范与目标。目前真正已经用软件实现了的只是VISA规范定义的一个子集,无论是资源属性、事件与操作均只包含规范定义的一部
分,并且软件实现的一部分函数定义与VISA规范定义也不完全相同。

       目前,世界上只有HP公司与NI公司推出了自己的VISA软件,下面介绍的是HP公司的VISA软件(当前版本为Version1.1)所包含的VISA资源属性、事件与操作,这是虚拟仪器设计人员进行虚拟仪器驱动程序开发的真正基础与参考文本。下面也分别按资源类给出相应的属性表、事件表与操作表。
属性表:
1、VISA资源模板:
VI_ATTR_MAX_QUEUE_LENGTH    任一时间特定对话通道最大事件排队长度
VI_ATTR_RM_SESSION  资源管理器对话通道
VI_ATTR_RSRC_IMPL_VERSION   资源版本
VI_ATTR_RSRC_LOCK_STATE 资源存取锁定模式(取值为表中所列三种)
VI_ATTR_RSRC_MANF_ID    生产厂家标号
VI_ATTR_RSRC_MANF_NAME  生产厂家名
VI_ATTR_RSRC_NAME   资源名
VI_ATTR_RSRC_SPEC_VERSION   VISA规范版本
VI_ATTR_USER_DATA   资源特定对话通道所用的私有数据
2、仪器控制资源:
通用仪器控制属性:
VI_ATTR_INTF_TYPE   对话通道接口类型
VI_ATTR_INTF_NUM    接口板号
VI_ATTR_IO_PROT I/O协议
VI_ATTR_RD_BUF_OPER_MODE    读缓冲区操作模式
VI_ATTR_SEND_END_EN 最后一个字节是否有END字符
VI_ATTR_SUPPRESS_END_EN 是否禁止END字符
VI_ATTR_TERMCHAR    终止符
VI_ATTR_TERMCHAR_EN 是否允许终止符
VI_ATTR_TMO_VALUE   超时值
VI_ATTR_TRIG_ID 当前触发机制
VI_ATTR_WR_BUF_OPER_MODE    写缓冲区操作模式
GPIB仪器控制属性:
VI_ATTR_GPIB_PRIMARY_ADDR   GPIB主地址
VI_ATTR_GPIB_SECONDARY       GPIB副地址
_ADDR
VI_ATTR_INTF_PAERNT_NUM GPIB板号
VXI仪器控制属性:
VI_ATTR_MAINFRAME_LA    主机箱地址
VI_ATTR_MANF_ID VXI器件制造厂家标识符
VI_ATTR_MEM_BASE    内存基地址
VI_ATTR_MEM_SIZE    内存大小
VI_ATTR_MEM_SPACE   内存空间类型
VI_ATTR_MODEL_CODE  器件标号
VI_ATTR_SLOT    VXI器件槽位
VI_ATTR_VXI_LA  VXI器件逻辑地址
VI_ATTR_CMDR_LA VXI总线控制器地址
VI_ATTR_IMMEDIATE_SERV  是否为立即从者
VI_ATTR_FDC_CHNL    FDC数据传送通道
VI_ATTR_FDC_GEN_SIGNAL_EN   是否允许通过FDC传送数据
VI_ATTR_FDC_MODE    FDC模式
VI_ATTR_FDC_USE_PAIR    一对或一个FDC有效
VI_ATTR_SRC_INCREMENT   源偏移量
VI_ATTR_DEST_INCREMENT  目标偏移量
VI_ATTR_WIN_ACCESS  当前窗存取模式
VI_ATTR_WIN_BASE_ADDR   总线基地址
VI_ATTR_WIN_SIZE    当前窗长度
异步串行仪器控制属性:
VI_ATTR_ASRL_AVAIL_NUM  接收缓冲区字节个数
VI_ATTR_ASRL_BAUD   波特率
VI_ATTR_ASRL_DATA_BITS  数据位
VI_ATTR_ASRL_END_IN 读操作终止方式
VI_ATTR_ASRL_END_OUT    写操作终止方式
VI_ATTR_ASRL_FLOW_CNTRL 数据流控制
VI_ATTR_ASRL_PARITY 检验极性
VI_ATTR_ASRL_STOP_BITS  停止位
VI_ATTR_DEST_INCREMENT  目标偏移量
VI_ATTR_FDC_CHNL    FDC数据传送通道
VI_ATTR_FDC_GEN_SIGNAL_EN   是否允许通过FDC传送数据
VI_ATTR_FDC_MODE    FDC模式
VI_ATTR_FDC_USE_PAIR    一对或一个FDC有效
      对于属性的操作,一般用viSetAttribute(ViSession/ViEvent/ViFindList vi, ViAttr attribute, ViAttrState attrState)及viGetAttribute(ViSession/ViEvent/ViFindList vi, ViAttr attribute, ViPAttrState attrState)来进行属性设置与获取,属性的主体可以是器件句柄类型、事件类型、资源对象类型等,应该分情况对待。如例3.6与例3.7的事件中断子程序中的属性主体即为事件类型。

事件表:
VI_EVENT_SERVICE_REQ    服务请求通知事件
VI_EVENT_VXI_SIGP   VXI总线信号或中断引发事件
VI_EVENT_TRIG   硬件触发产生
VI_EVENT_IO_COMPLETION  异步I/O操作已完成
事件处理方式分事件排队方式与事件回调方式,具体见例3.4~例3.7。

操作表:
1、VISA资源模板:
viClose(vi):关闭特定的对话通道。
viGetAttribute(vi,attribute,attrState):获取资源属性状态值。
viSetAttribute(vi,attribute,attrState):设置资源属性状态值。
viStatusDesc(vi,status,desc):获取返回状态描述字符串。
viTerminate(vi,degree,jobId):请求VISA资源终止一个或所有对话通道的正常运行。
viLock(vi,lockType,timeout,requestId,accessKey):设置资源存取模式。
viUnlock(vi):取消资源存取模式。
viEnableEvent(vi,eventType,mechanism,context):允许特定事件通知。
viDisableEvent(vi,eventType,mechanism):不允许特定事件通知。
viDiscardEvents(vi,eventType,mechanism):刷新一个对话通道上事件发生。
viWaitOnEvent(vi,ineventTypeList,timeout,outEventType,outContext):等待特定事件的发生。
viInstallHandler(vi,eventType,handler,userHandle):安装回调事件句柄。
viUnInstallHandler(vi,eventType,handler,userHandle):卸载回调事件句柄。
2、VISA资源管理器:
viOpenDefaultRM(sesn):打开缺省资源管理器资源对话通道。
viOpen(sesn,rsrcname,accessMode,timeout,vi):打开特定资源的对话通道。
viFindRsrc(sesn,expr,findList,retcnt,instrDesc):查询VISA系统进行资源定位。
viFindNext(findList,instrDesc):返回前一个查询操作查得的资源。
3、仪器控制管理:
viRead(vibufcountretCount):从器件同步读取数据。
viReadAsync(vibufcount,jobId):从器件异步读取数据。
viWritevibufcountretCount):将数据同步写入到器件中。
viWriteAsync(vibufcount,jobId):将数据异步写入到器件中。
viAssertTrigger(vi,protocol):用特定协议确认硬件或软件触发。
viReadSTB(vi,status):读取服务请求状态字节。
viClear(vi):清除器件。
viSetBuf(vi,mask,size):设置格式化I/O缓冲区大小。
viFlush(vi,mask):手动刷新格式化I/O缓冲区。
viPrintf(vi,writeFmt,arg1,arg2…):按设定格式将数据传送到器件中。
viVPrintf(vi,writeFmt,params):按设定格式将数据传送到器件中。
viScanf(vi,readFmt,arg1,arg2…):按设定格式从器件中读取数据。
viVScanf(vi,readFmt,params):按设定格式从器件中读取数据。
viQuery(vi,writeFmt,readFmt,arg1,arg2…):按设定格式对器件进行数据读写。
viVQuery(vi,writeFmt,readFmt,params):按设定格式对器件进行数据读写。
viIn8(vi,space,offset,value):从接口总线读取8位(字节)单位。
viIn16(vi,space,offset,value):从接口总线读取16位(字)单位数据。
viIn32(vi,space,offset,value):从接口总线读取32位(双字)单位数据。

viOut8(vi,space,offset,value):向接口总线写入8位(字节)单位数据。
viOut16(vi,space,offset,value):向接口总线写入16位(字)单位数据。
viOut32(vi,space,offset,value):向接口总线写入32位(双字)单位数据。


viMoveIn8(vi,space,offset,length,buf8):从器件存储器向当地存储器移动8位(字节)单位数据。
viMoveIn16(vi,space,offset,length,buf8):从器件存储器向当地存储器移动16位(字)单位数据。
viMoveIn32(vi,space,offset,length,buf8):从器件存储器向当地存储器移动32位(双字)单位数据。
viMoveOut8(vi,space,offset,length,buf8):从当地存储器向器件存储器移动8位(字节)单位数据。
viMoveOut16(vi,space,offset,length,buf8):从当地存储器向器件存储器移动16位(字)单位数据。
viMoveOut32(vi,space,offset,length,buf8):从当地存储器向器件存储器移动32位(双字)单位数据。
viMapAddress(vi,mapSpace,mapBase,mapSize,access,suggested,address):映射内存空间。
viUnMapAddress(vi):取消内存映射。
viPeek8(vi,addr,val8):从特定地址读8位数据。
viPeek16(vi,addr,val16):从特定地址读16位数据。
viPeek32(vi,addr,val32):从特定地址读32位数据。
viPoke8(vi,addr,val8):向特定地址写8位数据。
viPoke16(vi,addr,val16):向特定地址写16位数据。
viPoke32(vi,addr,val32):向特定地址写32位数据。
viMemAlloc(vi,size,offset):从器件存储器分配内存。
viMemFree(vi,offset):释放内存分配。
       在VISA1.1中定义的操作函数列,只是VISA规范的一小部分,但有一些操作函数并没有在VISA规范中定义过,属于软件本身补充定义的,如打开资源管理器函数viOpenDefaultRM()函数在仪器系统初始化时进行调用,建立仪器系统资源管理器与VISA软件的关联;viStatusDesc()函数在VISA函数调用返回后调用,并将前一个VISA函数调用返回值作为输入参数,获取字符串形式的状态描述;viFindNext()函数是viFindRsrc()函数的补充,用于查寻VISA系统资源;viMemAlloc()函数与viMemFree()函数用于器件存储器内存操作。而对于VISA规范中的VISA仪器控制组织器资源与VISA特定接口仪器控制资源定义的操作,VISA1.1中均没有定义,这也为VISA软件今后的发展提供了方向。可以看到,应用VISA1.1函数,可以实现仪器系统基本编程要求,但对于特定的操作,尚需要进一
步扩充,VISA软件本身是一个不断完善与发展的产物。如果要修改与开发VISA软件,必须遵循VISA规范,并基于VISA模型进行开发。

       目前世界上,生产VXI仪器模块、机箱及应用程序等的生产厂家与设计单位层出不穷,但是,将VISA正式作为产品推出的只有HP公司与NI公司,它们一直从VTL(VISA过渡库)到版本1.1,也均只实现了VISA规范定义中的一部分函数。从理论上说,VISA软件应该不能由生产厂家提供,而是应该作为标准库为所有仪器生产厂家与集成单位所共享,但事实上由于商业等因素,VISA软件也同样被作为一个独立的产品提供,并依靠它的基础性与统一性,各自为HP公司和NI公司占领自动测试领域市场,作为一个市场竞争强有力的装器。况且,这两家推出的VISA软件之间也不尽兼容,安装了HP公司的VISA软件,再去安装NI公司的相关软件,计算机系统往往会给出警告提示,严重时会导致整个系统的崩溃。可以这么说,VISA软件的开发与硬件零槽控制模块的开发技术作为商业秘密垄断在国外少家几家公司手中,会成为我国产业真正实现自主化的障碍,剖析VISA软件的实质并进行自主的开发,是今后的
研究重点。

        目前,我国有些研究单位与生产厂家也开始在探索零槽控制模块的研制开发工作,并形成了一些产品,但大部分还是采用了GPIB—VXI接口模式,市场性价比并不高,对于VISA软件的开发,由于是一种基础性的研究,资金、人员、精力投入量大,产出的效益并不直接,因此各单位也并没有轻易入手。在本书的讨论中,也并没有包括VISA软件的开发,而只作为知识的延伸进行讨论,希望今后可以在这方面得到进一步的条件进行开发研制工作。

        VISA软件的开发,应基于自底向上的模型结构展开,先定义一个资源模板的子集,
如资源开启、资源寻找、资源属性操作、资源关闭等函数,在这些函数设计中,重点是对于输入参数分析,并在程序中加以多情况散转处理。然后,在资源模板基础上,定义一个VISA资源管理器,包括资源管理器操作与特定资源的查询,这部分函数集主要完成对仪器系统控制器的交互操作。下一步,定义出仪器控制函数集,主要包括读能、写功能、格式化I/O功能、触发功能、状态/服务请求功能、器件存取功能等,这些操作属于器件基本共有性操作,在函数实现时也同时必须进行分情况散转处理。而其它一些属于特定仪器特有的操作,可以列出另外一个函数子集,进行特定器件的控制与操作。这几部分函数子集组合成一个完整的函数集,即VISA软件函数库。以上所述的仅是基本的设计思路,具体的开发工作应结合系统控制器的开发一起进行。

        符合VPP规范的虚拟仪器驱动程序的开发,一般要求底层I/O接口软件调用VISA函数,但有些应用程序的设计跳过虚拟仪器驱动程序的间接调用而直接调用VISA函数,同样也是可以的,只是程序模块化不够清晰。另外,虚拟仪器系统软件结构中的I/O接口软件并不一定只限于VISA软件,它只是一个最优选择而并非唯一,事实上Windows中的API也承担着计算机系统的I/O接口软件的作用,对于计算机资源的操作,也可以通过直接调用API函数实现,这种模式同样符合扩展了的虚拟仪器系统框架。从本质上说,虚拟仪器系统软件结构的实质是为了实现对最终用户的方便易用,而并不一定拘泥于具体形式。

附录3.1:visatype.h文件
/*----------------------------------------------*/
/* 由VXI即插即用系统联盟提供                  */ 
/*标题:VISATYPE.H                             */
/*目标:提供VISA基本数据类型及宏定义          */
/*---------------------------------------------*/

#ifndef __VISATYPE_HEADER__
#define __VISATYPE_HEADER__

#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || 
defined(__NT__)) && !defined(_NI_mswin16_)
#define _VI_FAR
#define _VI_FUNC            __stdcall
#define _VI_FUNCC           __cdecl
#define _VI_FUNCH           __stdcall
#define _VI_SIGNED          signed
#elif defined(_CVI_) && defined(_NI_i386_)
#define _VI_FAR
#define _VI_FUNC            _pascal
#define _VI_FUNCC
#define _VI_FUNCH           _pascal
#define _VI_SIGNED          signed
#elif (defined(_WINDOWS) || defined(_Windows)) && 
!defined(_NI_mswin16_)
#define _VI_FAR             _far
#define _VI_FUNC            _far _pascal _export
#define _VI_FUNCC           _far _cdecl  _export
#define _VI_FUNCH           _far _pascal
#define _VI_SIGNED          signed
#elif (defined(hpux) || defined(__hpux)) && (defined(__cplusplus) || 
defined(__cplusplus__))
#define _VI_FAR
#define _VI_FUNC
#define _VI_FUNCC
#define _VI_FUNCH
#define _VI_SIGNED
#else
#define _VI_FAR
#define _VI_FUNC
#define _VI_FUNCC
#define _VI_FUNCH
#define _VI_SIGNED          signed
#endif

#define _VI_ERROR           (-2147483647L-1)  /* 0x80000000 */
#define _VI_PTR             _VI_FAR *

/*- VISA数据类型 
--------------------------------------------------------------*/
typedef unsigned long       ViUInt32;
typedef ViUInt32    _VI_PTR ViPUInt32;
typedef ViUInt32    _VI_PTR ViAUInt32;

typedef _VI_SIGNED long     ViInt32;
typedef ViInt32     _VI_PTR ViPInt32;
typedef ViInt32     _VI_PTR ViAInt32;

typedef unsigned short      ViUInt16;

typedef ViUInt16    _VI_PTR ViPUInt16;
typedef ViUInt16    _VI_PTR ViAUInt16;

typedef _VI_SIGNED short    ViInt16;
typedef ViInt16     _VI_PTR ViPInt16;
typedef ViInt16     _VI_PTR ViAInt16;

typedef unsigned char       ViUInt8;
typedef ViUInt8     _VI_PTR ViPUInt8;
typedef ViUInt8     _VI_PTR ViAUInt8;

typedef _VI_SIGNED char     ViInt8;
typedef ViInt8      _VI_PTR ViPInt8;
typedef ViInt8      _VI_PTR ViAInt8;

typedef char                ViChar;
typedef ViChar      _VI_PTR ViPChar;
typedef ViChar      _VI_PTR ViAChar;

typedef unsigned char       ViByte;
typedef ViByte      _VI_PTR ViPByte;
typedef ViByte      _VI_PTR ViAByte;

typedef void        _VI_PTR ViAddr;
typedef ViAddr      _VI_PTR ViPAddr;
typedef ViAddr      _VI_PTR ViAAddr;

typedef float               ViReal32;
typedef ViReal32    _VI_PTR ViPReal32;
typedef ViReal32    _VI_PTR ViAReal32;

typedef double              ViReal64;
typedef ViReal64    _VI_PTR ViPReal64;
typedef ViReal64    _VI_PTR ViAReal64;

typedef ViPByte             ViBuf;
typedef ViPByte             ViPBuf;
typedef ViPByte     _VI_PTR ViABuf;

typedef ViPChar             ViString;
typedef ViPChar             ViPString;
typedef ViPChar     _VI_PTR ViAString;

typedef ViString            ViRsrc;
typedef ViString            ViPRsrc;
typedef ViString    _VI_PTR ViARsrc;

typedef ViUInt16            ViBoolean;
typedef ViBoolean   _VI_PTR ViPBoolean;
typedef ViBoolean   _VI_PTR ViABoolean;

typedef ViInt32             ViStatus;
typedef ViStatus    _VI_PTR ViPStatus;
typedef ViStatus    _VI_PTR ViAStatus;

typedef ViUInt32            ViVersion;
typedef ViVersion   _VI_PTR ViPVersion;
typedef ViVersion   _VI_PTR ViAVersion;

typedef ViUInt32            ViObject;
typedef ViObject    _VI_PTR ViPObject;
typedef ViObject    _VI_PTR ViAObject;

typedef ViObject            ViSession;
typedef ViSession   _VI_PTR ViPSession;
typedef ViSession   _VI_PTR ViASession;

/*- 完成代码 ----------------------------------------------*/
#define VI_SUCCESS          (0L)

/*- 其它VISA定义 ----------------------------------------------*/
#define VI_NULL             (0)
#define VI_TRUE             (1)
#define VI_FALSE            (0)

/*- 宏定义
-------------------------------------------------------------*/
#define VISAFN            _VI_FUNC
#define ViPtr               _VI_PTR
#endif

/*- 结束--------------------------------------------*/




附录3.2:visa.h文件
/*-----------------------------------------------*/
/* 由VXI即插即用系统联盟提供                    */ 
/*标题:VISA.H                                  */
/*目标:VISA数据类型、属性、事件及操作定义     */
/*----------------------------------------------*/

#ifndef __VISA_HEADER__
#define __VISA_HEADER__

#include <stdarg.h>
#include "visatype.h"

#define VI_SPEC_VERSION     (0x00100100L)

#if defined(__cplusplus) || defined(__cplusplus__)
extern "C" {
#endif

#if defined(_CVI_)
#pragma EnableLibraryRuntimeChecking
#endif

/*- VISA数据类型
-----------------------------------------------------------*/
typedef ViObject             ViEvent;
typedef ViEvent      _VI_PTR ViPEvent;
typedef ViObject             ViFindList;
typedef ViFindList   _VI_PTR ViPFindList;
typedef ViUInt32             ViEventType;
typedef ViEventType  _VI_PTR ViPEventType;
typedef ViUInt32             ViAttrState;
typedef void         _VI_PTR ViPAttrState;
typedef ViString             ViKeyId;
typedef ViPString            ViPKeyId;
typedef ViUInt32             ViJobId;
typedef ViJobId      _VI_PTR ViPJobId;
typedef ViUInt32             ViAccessMode;
typedef ViUInt32             ViBusAddress;
typedef ViBusAddress _VI_PTR ViPBusAddress;
typedef ViUInt32             ViBusSize;
typedef ViUInt32             ViAttr;
typedef ViUInt32             ViEventFilter;
typedef va_list              ViVAList;
typedef ViStatus (_VI_FUNCH _VI_PTR ViHndlr)
   (ViSession vi, ViEventType eventType, ViEvent event, ViAddr 
userHandle);

/*- 资源管理器功能-----------------------------------------*/
#if (defined(__MWERKS__) && defined(__MC68K__)) || (defined(__SC__) && 
defined(__CFM68K__))
#pragma lib_export on
#endif

ViStatus _VI_FUNC  viOpenDefaultRM (ViPSession vi);
#define viGetDefaultRM(vi) viOpenDefaultRM(vi)
ViStatus _VI_FUNC  viFindRsrc(ViSession sesn, ViString expr, ViPFindList
vi,
                             ViPUInt32 retCnt, ViChar _VI_FAR desc[]);
ViStatus _VI_FUNC  viFindNext(ViFindList vi, ViChar _VI_FAR desc[]);
ViStatus _VI_FUNC  viOpen(ViSession sesn, ViRsrc name, ViAccessMode 
mode,
                         ViUInt32 timeout, ViPSession vi);

/*- 资源模板功能----------------------------------------------------*/
ViStatus _VI_FUNC  viClose(ViObject vi);
ViStatus _VI_FUNC viSetAttribute (ViObject vi, ViAttr attrName, ViAttrState attrValue);
ViStatus _VI_FUNC viGetAttribute(ViObject vi, ViAttr attrName, void _VI_PTR attrValue);
ViStatus _VI_FUNC viStatusDesc (ViObject vi, ViStatus status, ViChar _VI_FAR desc[]);
ViStatus _VI_FUNC  viTerminate(ViObject vi, ViUInt16 degree, ViJobId jobId);
ViStatus _VI_FUNC  viLock (ViSession vi, ViAccessMode lockType, ViUInt32
timeout,                          ViKeyId requestedKey, ViChar 
_VI_FAR accessKey[]);
ViStatus _VI_FUNC  viUnlock(ViSession vi);
ViStatus _VI_FUNC viEnableEvent(ViSession vi, ViEventType eventType,

ViUInt16 mechanism, ViEventFilter context);
ViStatus _VI_FUNC  viDisableEvent(ViSession vi, ViEventType eventType, ViUInt16 mechanism);
ViStatus _VI_FUNC  viDiscardEvents (ViSession vi, ViEventType eventType,ViUInt16 mechanism);
ViStatus _VI_FUNC  viWaitOnEvent   (ViSession vi, ViEventType 
inEventType, ViUInt32 timeout, ViPEventType outEventType, ViPEvent 
outContext);
ViStatus _VI_FUNC  viInstallHandler(ViSession vi, ViEventType eventType,ViHndlr handler, ViAddr userHandle);
ViStatus _VI_FUNC  viUninstallHandler(ViSession vi, ViEventType eventType, ViHndlr handler, ViAddr userHandle);

/*- 基本I/O操作---------------------------------------------------*/
ViStatus _VI_FUNC viRead(ViSession vi, ViPBuf buf, ViUInt32 cnt, ViPUInt32 retCnt);
ViStatus _VI_FUNC viReadAsync(ViSession vi, ViPBuf buf, ViUInt32 cnt, ViPJobId  jobId);
ViStatus _VI_FUNC viWrite(ViSession vi, ViBuf  buf, ViUInt32 cnt, ViPUInt32 retCnt);
ViStatus _VI_FUNC viWriteAsync(ViSession vi, ViBuf  buf, ViUInt32 cnt, ViPJobId  jobId);
ViStatus _VI_FUNC  viAssertTrigger (ViSession vi, ViUInt16 protocol);
ViStatus _VI_FUNC  viReadSTB(ViSession vi, ViPUInt16 status);
ViStatus _VI_FUNC  viClear(ViSession vi);

/*- 格式化I/O操作-----------------------------------------------*/
ViStatus _VI_FUNC  viSetBuf (ViSession vi, ViUInt16 mask, ViUInt32 size);
ViStatus _VI_FUNC  viFlush (ViSession vi, ViUInt16 mask);
ViStatus _VI_FUNCC viPrintf (ViSession vi, ViString writeFmt, ...);
ViStatus _VI_FUNC  viVPrintf(ViSession vi, ViString writeFmt, ViVAList params);
ViStatus _VI_FUNCC viScanf (ViSession vi, ViString readFmt, ...);
ViStatus _VI_FUNC  viVScanf(ViSession vi, ViString readFmt, ViVAList params);
ViStatus _VI_FUNCC viQueryf(ViSession vi, ViString writeFmt, ViString readFmt, ...);
ViStatus _VI_FUNC  viVQueryf(ViSession vi, ViString writeFmt, ViString readFmt, ViVAList params);

/*- 存储器 I/O操作 
---------------------------------------------------*/
ViStatus_VI_FUNC viIn8(ViSession vi, ViUInt16 space, ViBusAddress offset, ViPUInt8  val8);
ViStatus _VI_FUNC  viOut8(ViSession vi, ViUInt16 space,ViBusAddress offset, ViUInt8   val8);
ViStatus _VI_FUNC  viIn16(ViSession vi, ViUInt16 space,ViBusAddress offset, ViPUInt16 val16);
ViStatus _VI_FUNC  viOut16(ViSession vi, ViUInt16 space,ViBusAddress offset, ViUInt16  val16);
ViStatus _VI_FUNC  viIn32(ViSession vi, ViUInt16 space,ViBusAddress offset, ViPUInt32 val32);
ViStatus _VI_FUNC  viOut32(ViSession vi, ViUInt16 space,ViBusAddress offset, ViUInt32  val32);
ViStatus _VI_FUNC  viMoveIn8(ViSession vi, ViUInt16 space, ViBusAddress offset, ViBusSize length, ViAUInt8 buf8);
ViStatus _VI_FUNC  viMoveOut8 (ViSession vi, ViUInt16 space, ViBusAddress offset,ViBusSize length, ViAUInt8  buf8);
ViStatus _VI_FUNC  viMoveIn16(ViSession vi, ViUInt16 space, ViBusAddressoffset,ViBusSize length, ViAUInt16buf16);
ViStatus _VI_FUNC  viMoveOut16 (ViSession vi, ViUInt16 space, ViBusAddress offset, ViBusSize length, ViAUInt16 buf16);
ViStatus _VI_FUNC  viMoveIn32 (ViSession vi, ViUInt16 space, ViBusAddress offset,ViBusSize length, ViAUInt32 buf32);
ViStatus _VI_FUNC  viMoveOut32(ViSession vi, ViUInt16 space, ViBusAddress offset, ViBusSize length, ViAUInt32 buf32);
ViStatus _VI_FUNC  viMove(ViSession vi, ViUInt16 srcSpace, ViBusAddress srcOffset, ViUInt16 srcWidth, ViUInt16 destSpace, ViBusAddress destOffset, ViUInt16 destWidth, ViBusSize srcLength); 
ViStatus _VI_FUNC  viMoveAsync(ViSession vi, ViUInt16 srcSpace, ViBusAddress srcOffset, ViUInt16 srcWidth, ViUInt16 destSpace, ViBusAddress estOffset, ViUInt16 destWidth, ViBusSize srcLength, ViPJobId jobId);
ViStatus _VI_FUNC  viMapAddress(ViSession vi, ViUInt16 mapSpace, ViBusAddress mapOffset, ViBusSize mapSize, ViBoolean access,ViAddr suggested, ViPAddr address);
ViStatus _VI_FUNC  viUnmapAddress  (ViSession vi);
void     _VI_FUNC  viPeek8 (ViSession vi, ViAddr address, ViPUInt8  
val8);
void     _VI_FUNC  viPoke8 (ViSession vi, ViAddr address, ViUInt8   val8);
void     _VI_FUNC  viPeek16 (ViSession vi, ViAddr address, ViPUInt16 val16);
void     _VI_FUNC  viPoke16 (ViSession vi, ViAddr address, ViUInt16  val16);
void     _VI_FUNC  viPeek32 (ViSession vi, ViAddr address, ViPUInt32 val32);
void     _VI_FUNC  viPoke32 (ViSession vi, ViAddr address, ViUInt32  val32);

/*- 共享内存操作 ------------------------------------------------*/
ViStatus _VI_FUNC  viMemAlloc(ViSession vi, ViBusSize size, ViPBusAddress offset);
ViStatus _VI_FUNC  viMemFree (ViSession vi, ViBusAddress offset);

#if (defined(__MWERKS__) && defined(__MC68K__)) || (defined(__SC__) && 
defined(__CFM68K__))
#pragma lib_export off
#endif

/*- 属性
--------------------------------------------------------------*/
#define VI_ATTR_RSRC_NAME           (0xBFFF0002L)
#define VI_ATTR_RSRC_IMPL_VERSION   (0x3FFF0003L)
#define VI_ATTR_RSRC_LOCK_STATE     (0x3FFF0004L)
#define VI_ATTR_MAX_QUEUE_LENGTH    (0x3FFF0005L)
#define VI_ATTR_USER_DATA           (0x3FFF0007L)
#define VI_ATTR_FDC_CHNL            (0x3FFF000DL)
#define VI_ATTR_FDC_MODE            (0x3FFF000FL)
#define VI_ATTR_FDC_GEN_SIGNAL_EN   (0x3FFF0011L)
#define VI_ATTR_FDC_USE_PAIR        (0x3FFF0013L)
#define VI_ATTR_SEND_END_EN         (0x3FFF0016L)
#define VI_ATTR_TERMCHAR            (0x3FFF0018L)
#define VI_ATTR_TMO_VALUE           (0x3FFF001AL)
#define VI_ATTR_GPIB_READDR_EN      (0x3FFF001BL)
#define VI_ATTR_IO_PROT             (0x3FFF001CL)
#define VI_ATTR_ASRL_BAUD           (0x3FFF0021L)
#define VI_ATTR_ASRL_DATA_BITS      (0x3FFF0022L)
#define VI_ATTR_ASRL_PARITY         (0x3FFF0023L)
#define VI_ATTR_ASRL_STOP_BITS      (0x3FFF0024L)
#define VI_ATTR_ASRL_FLOW_CNTRL     (0x3FFF0025L)
#define VI_ATTR_RD_BUF_OPER_MODE    (0x3FFF002AL)
#define VI_ATTR_WR_BUF_OPER_MODE    (0x3FFF002DL)
#define VI_ATTR_SUPPRESS_END_EN     (0x3FFF0036L)
#define VI_ATTR_TERMCHAR_EN         (0x3FFF0038L)
#define VI_ATTR_DEST_ACCESS_PRIV    (0x3FFF0039L)
#define VI_ATTR_DEST_BYTE_ORDER     (0x3FFF003AL)
#define VI_ATTR_SRC_ACCESS_PRIV     (0x3FFF003CL)
#define VI_ATTR_SRC_BYTE_ORDER      (0x3FFF003DL)
#define VI_ATTR_SRC_INCREMENT       (0x3FFF0040L)
#define VI_ATTR_DEST_INCREMENT      (0x3FFF0041L)
#define VI_ATTR_WIN_ACCESS_PRIV     (0x3FFF0045L)
#define VI_ATTR_WIN_BYTE_ORDER      (0x3FFF0047L)
#define VI_ATTR_CMDR_LA             (0x3FFF006BL)
#define VI_ATTR_MAINFRAME_LA        (0x3FFF0070L)
#define VI_ATTR_WIN_BASE_ADDR       (0x3FFF0098L)
#define VI_ATTR_WIN_SIZE            (0x3FFF009AL)
#define VI_ATTR_ASRL_AVAIL_NUM      (0x3FFF00ACL)
#define VI_ATTR_MEM_BASE            (0x3FFF00ADL)
#define VI_ATTR_ASRL_CTS_STATE      (0x3FFF00AEL)
#define VI_ATTR_ASRL_DCD_STATE      (0x3FFF00AFL)
#define VI_ATTR_ASRL_DSR_STATE      (0x3FFF00B1L)
#define VI_ATTR_ASRL_DTR_STATE      (0x3FFF00B2L)
#define VI_ATTR_ASRL_END_IN         (0x3FFF00B3L)
#define VI_ATTR_ASRL_END_OUT        (0x3FFF00B4L)
#define VI_ATTR_ASRL_RI_STATE       (0x3FFF00BFL)
#define VI_ATTR_ASRL_RTS_STATE      (0x3FFF00C0L)
#define VI_ATTR_WIN_ACCESS          (0x3FFF00C3L)
#define VI_ATTR_RM_SESSION          (0x3FFF00C4L)
#define VI_ATTR_VXI_LA              (0x3FFF00D5L)
#define VI_ATTR_MANF_ID             (0x3FFF00D9L)
#define VI_ATTR_MEM_SIZE            (0x3FFF00DDL)
#define VI_ATTR_MEM_SPACE           (0x3FFF00DEL)
#define VI_ATTR_MODEL_CODE          (0x3FFF00DFL)
#define VI_ATTR_SLOT                (0x3FFF00E8L)
#define VI_ATTR_INTF_INST_NAME      (0xBFFF00E9L)
#define VI_ATTR_IMMEDIATE_SERV      (0x3FFF0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值