GenICam GenTL 标准 ver1.5(2)第三章 模块枚举与实例化

本文档详细介绍了GenTL生产者接口的使用,包括系统模块的初始化与关闭、接口和设备的枚举、数据流与缓冲区的管理。GenTL消费者需调用特定函数来更新模块列表,确保线程安全并正确处理资源。在多进程环境中,GenTL生产者需要处理进程间通信和资源计数。同时,文档提供了实例代码展示如何访问和操作设备数据流。
  1. 模块枚举与实例化

下面描述的行为是从单个进程的角度来看的。一个GenTL生产者实现必须确保允许访问资源在硬件上有这个独立的视图,而不需要知道其他相关进程。有关C功能和数据类型的详细说明,请参阅第6章软件接口。有关如何配置特定模块或获得事件通知的信息,请参阅第4章配置和信号。

 1.1 设置

打开系统模块并在GenTL上执行任何操作之前,生产者驱动程序必须调用GCInitLib函数。此操作必须执行一次。关闭系统模块后(比如,GenTL消费者关闭)必须调用GCCloseLib函数才能正确释放所有资源。如果库在调用GCCloseLib后使用,必须再次调用GCInitLib。GCInitLib的单个进程中没有引用计数。因此,如果在单个进程空间内,GCInitLib被调用两次,但没有调用GCCloseLib,那么第二个调用将返回错误GC_ERR_RESOURCE_IN_USE。这个在该进程中首次调用GCCloseLib将释放所有资源。如果有多个对GCCloseLib的调用,而没有相应的对GCInitLib的调用,也会报错。

1.2 系统

系统模块始终是GenTL消费者调用进入GenTL生产者的入口点。使用系统模块提供的功能,所有可用的硬件接口都可以以接口模块的形式枚举出来。

通过调用TLOpen函数可以获取TL_HANDLE句柄,它用来处理系统模块的函数。从成功调用TLOpen函数获得来的TL_HANDLE句柄将用来对属于系统模块的其他功能进行所有后续调用。

在此之前,可能会调用GCGetInfo函数来检索关于GenTL 生产者实现的基本信息,而无需打开系统模块。

每个GenTL Producer驱动程序在进程空间中,仅公开操作系统中的单个系统实例。如果GenTL生产商允许从多个进程访问,则必须小心处理进程间通信,与实例化系统模块的记帐。如果不允许这种访问,则每当试图从另一个操作系统进程,创建第二个系统模块实例时,必须返回相应的错误代码。

系统模块在单个进程内不进行引用计数。因此,即使在单个进程空间内请求两次系统模块句柄,第二次调用将返回错误GC_ERR_RESOURCE_IN_USE。来自在此进程中的对close函数第一次调用,将释放所有资源,并关闭模块。

在枚举子接口之前,TLUpdateInterfaceList函数必须被调用。系统模块持有的接口列表不得更改其内容,除非再次调用此函数。对TLUpdateInterfaceList的任何调用都不会影响实例化的接口句柄。它只会更改通过访问的内部列表的顺序TLGetInterfaceID。可以使用已知id实例化以前没有枚举的子接口。建议调用TLUpdateInterfaceList重新配置系统模块后,以反映可能的变化。

GenTL消费者必须确保对TLUpdateInterfaceList的调用函数和访问列表的函数不会从多个线程并发,并且所有线程在执行时都知道更新操作。GenTL生产者必须确保以线程安全的方式进行任何列表的访问。

在内部生成可用接口列表后,TLGetNumInterfaces函数返回系统中已知的当前接口数量。此系统列表中不包含IF_HANDLEs句柄本身,而是包含它们各自的唯一ID接口。要检索这样的ID,必须调用TLGetInterfaceID函数。这间接级别允许枚举多个接口,而无需真正打开它们,这样可以节省资源和时间。

如果需要其他信息来决定要打开哪个接口,则可以调用TLGetInterfaceInfo函数。此功能启用GenTL消费者可以在单个界面上查询信息,而无需打开它。

要打开特定接口,将该接口的唯一ID传递给TLOpenInterface函数。如果在调用之前知道ID,则可以使用此ID直接打开接口,无需通过查询可用接口列表TLUpdateInterfaceList。这意味着两个ID在这两个会话当中,必须保持相同。仅仅在硬件没有任何变化的情况下,才能保证这一点。尽管如此,仍可以调用TLUpdateInterfaceList函数来创建系统内部可用接口列表。

GenTL生产者可能在需要的情况下,在模块实例化时调用TLUpdateInterfaceList。GenTL消费者必须在调用TLGetNumInterfaces或TLGetInterfaceID之前,先调用一下TLUpdateInterfaceList。模块实例化成功后GenTL使用者可以调用TLUpdateInterfaceList函数,以便了解此列表中的任何更改。

为方便起见,GenTL生产者不仅可以使用其唯一ID打开接口模块,还可以使用任何其他与ID对应的名称来打开接口模块。如果GenTL消费者请求模块ID,则GenTL生产者必须返回其唯一ID,而不是用于最初请求模块句柄的方便使用的名称。例如,这允许GenTL消费者使用网络的IP地址接口(如果是GigE Vision GenTL Producer驱动程序)来实例化模块使用唯一ID。

当不再需要GenTL 生产者驱动程序时,必须调用TLClose函数来关闭系统模块以及仍处于打开状态且与此相关的所有其他系统模块。

关闭系统模块后,可以再次打开该模块,处理模块方式可能与第一次实例化不同。

1.3 接口

接口模块表示特定的硬件接口,如网络接口卡或图像数据采集卡。接口含义的确切定义留给GenTL生产者实现。从系统模块中获取IF_HANDLE句柄后,就可以枚举所有连接到系统上的设备。

系统模块提供的接口列表的大小和顺序在仅在调用TLUpdateInterfaceList函数后更新。接口模块可能以随机顺序关闭,其顺序可能不同于实例化时的顺序。模块不进行引用计数。如果接口模块句柄在一个进程空间内请求第二次调用,那么第二次调用将返回错误GC_ ERR_RESOURCE_IN_USE。从该进程中调用IFClose函数将释放所有资源并在此进程中关闭模块。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值