GenICam GenTL 标准 ver1.5(4)第五章 采集引擎

本文深入探讨GenTL标准中的数据流机制,特别是采集引擎的工作原理、缓冲池管理、数据采集流程及不同数据处理模式,包括多分区缓冲处理等内容。

5.1 概览

    采集引擎是GenTL数据流的核心。它的任务是运输本身,主要由缓冲区管理组成。如前所述,采集引擎的目标是抽象底层数据传输使其能够被使用的机制,即使不是全部,也应当适用于市场上的大多数技术。这个目标是将来自输入流的数据获取到GenTL消费者提供的存储缓冲区或者GenTL消费者可以访问到。内部设计可以单独实现,但它必须遵循一些指令。GenTL采集引擎作为一个重要的管理元素,拥有许多内部逻辑缓冲池。

5.1.1 声明缓冲池

        此处引用了所有声明的缓冲区,因此采集引擎知道这些缓冲区。一个缓冲区从声明处开始,直到它被撤销(从采集引擎移除)。如果一个缓冲区在采集过程中声明的(见5.2.2),那么就依赖于GenTL生产者。缓冲区即使在被引用时也将保留在此池中,直至撤销。这些引用可能来自其他队列/池,如输入缓冲池(见5.1.2)或输出缓冲队列(见5.1.3)或交付给GenTL消费者。

缓冲池中缓冲区的顺序未定义。缓冲区的最大可能数量仅受限于系统资源,缓冲池中缓冲区的最小数目是一个或多个,具体取决于允许的流式处理的实现或技术。

5.1.2 输入缓冲池

        当采集引擎从设备接收到数据时,它将填充输入缓冲池中的一个缓冲区。填充缓冲区后,如果成功填充,会将其从池中移除,然后将其放入输出缓冲区队列。如果传输未成功或用指定的ACQ_STOP_FLAGS_KILL指令,停止采集后,默认情况下将缓冲区放入输出缓冲区队列。由实现者提供额外的缓冲区处理模式将以不同的方式处理部分填充的缓冲区。

缓冲池中缓冲区的顺序未定义。仅存在声明缓冲池的缓冲区可以在输入缓冲池中。此池中缓冲区的最大数目是声明的缓冲区的数目。

5.1.3 输出缓冲队列

        输入缓冲池中的一个缓冲区在成功填充后,会被放入此输出缓冲队列中。只要输出缓冲区队列中至少有一个缓冲区,以前注册的事件对象会收到信号,这样GenTL消费者可以获取事件数据,从而可以识别已填充的缓冲区。

事件数据被取走后,将从输出缓冲区中删除关联的缓冲区。这也意味着数据和缓冲区只能获取一次。当缓冲区从输出缓冲区队列中移除(已交付)后,采集引擎不得再将数据写入其中。因此,这是一种有效的缓冲锁定机制。

为了重用此缓冲区,GenTL消费者必须将缓冲区放回输入中缓冲池(重新排队)。

缓冲区的顺序由缓冲区处理模式定义。缓冲区由新缓冲区事件,以逻辑上先进先出的方式(队列)创建。如果采集引擎没有删除或重新排序输出缓冲区队列中的缓冲区,它始终把输出缓冲队列中最老的缓冲区返回给GenTL消费者。仅出现在声明缓冲池中且已经填充过的缓冲区可以在输出缓冲队列中。

5.2 数据采集系列步骤

以下描述从GenTL消费者的视角(默认缓冲区处理模式)显示了采集图像的步骤。图像或数据采集,在具有使用DS_HANDLE的函数的数据流模块上执行的。因此在采集之前必须对数据流模块进行枚举(参见第章3模块枚举)。有关C函数和数据的详细说明类型见第6章软件接口。

在执行以下步骤之前,远程设备,如有必要(使用采集卡的情况下),以及GenTL设备模块应配置为生成所需的图像格式。可以从GenTL设备模块的DevGetPort函数获取远程设备的PORT_HANDLE句柄。

缓冲区使用视角下的采集步骤如下图所示,

5.2.1 分配内存

        首先,必须获得单个缓冲区的大小。为了获得该信息,GenTL消费者必须查询GenTL数据流模块(重要提示:不是远程设备)。检查有效负载大小信息是否提供,由GenTL生产者提供使用命令参数STREAM_INF_DEFINES_PAYLOADSIZE,调用DSGetInfo函数。如果返回的信息为真,消费者必须使用STREAM_INFO_PAYLOAD_SIZE参数调用DSGetInfo来检索当前有效负载大小。此外,GenTL生产者可在数据流模块的节点映射图中提供“PayloadSize”功能,反映GenTL生产者的有效负载大小。通过该功能报告的值必须与通过DSGetInfo提供的值相同。如果DSGetInfo返回的信息STREAM_INFO_DEFINES_PAYLOADSIZE为false,消费者 需要查询通过远程设备的节点映射获得PayloadSize。远程设备端口可以通过DevGetPort函数从相应的设备模块中检索。GenTL消费者必须在远程设备中选择流媒体通道并读取“PayloadSize”标准功能。

        无论如何,GenTL生产者和基础技术必须提供一种检索有效负载大小的方法。当设备不提供PayloadSize功能时(比如,GenTL生产者在接口标准的实现中,未将PayloadSize指定为强制功能),GenTL生产者必须使用流信息命令STREAM_INFO_DEFINES_PAYLOADSIZE和STREAM_INFO_PAYLOADSIZE,自行报告所需的有效负载大小。如果无法查询所需的有效负载大小,GenTL消费者通常不允许正确设置采集。它可能会根据设备配置尝试计算有效负载大小,但这样的计算永远不会可靠。

        如果STREAM_INFO_DEFINES_PAYLOADSIZE返回true,则数据流模块必须提供描述参数的缓冲区。这允许GenTL生产者修改用于预处理图像的缓冲区参数。如果GenTL生产者正在这样做,它必须实现所有缓冲区描述参数。有关详细说明,请参阅第5.5章节。

     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值