GenICam标准(五)

在这里插入图片描述

系列文章目录


GenICam标准(一)
GenICam标准(二)
GenICam标准(三)
GenICam标准(四)
GenICam标准(五)
GenICam标准(六)


文章目录

  • 系列文章目录
  • 8.10.Enumeration, EnumEntry
  • 8.11.StringReg
  • 8.12.SwissKnife, IntSwissKnife, Converter, and IntConverter
  • 8.13.ConfRom, TextDesc, and IntKey
  • 8.14.DcamLock and SmartFeature
  • 8.15.Port
  • 8.16.Group element
  • 参考


8.10.Enumeration, EnumEntry

    Enumeration 节点把一个名称(name)映射到一个索引值(index value),并实现 Ienumeration 接口。Enumeration 节点拥有一系列 EnumEntries ,每一个都表现为可能的 {name, index} 对。Enumeration 节点从 Node 节点继承元素和属性。另外,它要么有一个表现当前索引值的 ,要么有一个连接到 IInteger 节点的 <pValue> 元素。

    下面的例子是用 Enumeration 来描述相机的 ColorCode 。如果 ColorCodeReg 被设定为 1 ,则相机就是 Mono16 。

<Enumeration Name="ColorCode">
	<EnumEntry Name="Mono8">
		<Value>0</Value>
	</EnumEntry>
	<EnumEntry Name="Mono16">
		<Value>1</Value>
	</EnumEntry>
	<EnumEntry Name="YUV422">
		<Value>3</Value>
	</EnumEntry>
		<pValue>ColorCodeReg</pValue>
</Enumeration>

<IntReg Name="ColorCodeReg">
	<Address>0x1234</Address>
	<Length>1</Length>
	<AccessMode>RW</AccessMode>
	<pPort>Device</pPort>
	<Sign>Unsigned</Sign>
	<Endianess>BigEndian</Endianess>
</IntReg>

    经常发生的情况是,枚举值列表中的某些值暂时不可用,因而不应该显示给用户。为用 GenICam 来描述这种情况,你可以用 EnumEntry 子节点中的 <pIsImplemented><pIsAvailable> 元素,就像你可以用其它任何节点一样。

    通常,实现程序会预处理相机描述文件,并会为每个 EnumEntry 创建一个独立的节点,节点的 Name 是 “EnumerationName_EnumEntryName” 。在 Enumeration 节点中放入一个 <pEnumEntry> 元素以代替 EnumEntry 本身。在新创建的 EnumEntry 节点内,原来的 EnumEntry 名称被复制到 <Symbolic> 元素。枚举入口点所代表的索引值被复制到 EnumEntry 的 <Value> 元素。

    Enumeration 节点也可以有一个 <pSelected> 元素。参见 8.4。

8.11.StringReg

    字符串是一个(可能是以 NULL 结尾的)ASCII 字符串,存放在相机地址空间的某处,字符串通过一个 IString 接口来操作。下面的例子显示了用一个 StringReg 节点来取得相机型号名的方法。我们假定 ModelName 最多可以有 128个 字节,包括结尾的空字符。

<StringReg Name="ModelName">
	<Address>0x1234</Address>
	<Length>128</Length>
	<AccessMode>RO</AccessMode>
	<pPort>Device</pPort>
</StringReg>

    你可以通过 IString 来取得并设置一个字符串。

8.12.SwissKnife, IntSwissKnife, Converter, and IntConverter

    为在 GenICam 中进行数学运算,我们引入了两个节点,SwissKnife(瑞士军刀) 节点用来处理浮点数,IntSwissKnife 节点用来处理整数。两个节点有相同的语法。

    下面的例子显示了得到两个数字计算结果的方法。XTimesY 节点引出一个 IInteger 接口,通过这个接口可以读出 504 (=12*42):

<IntSwissKnife Name="XTimesY">
	<pVariable Name="X">XValue</pVariable>
	<pVariable Name="Y">YValue</pVariable>
	<Formula>X*Y</Formula>
</IntSwissKnife>

<Integer Name="XValue">
	<Value>42</Value>
</Integer>

<Integer Name="YValue">
	<Value>12</Value>
</Integer>

    <Formula> 元素包含一个数学公式,公式指向由 <pVariable> 元素定义的变量,<pVariable> 元素指向一个 IInteger 节点,并拥有一个定义了公式中变量名的 Name 属性。变量名必须是大写的。

    参考实现中使用的瑞士军刀功能相当强大。不过,为简化那些想自己写实现的人的工作,标准仅允许有限的一组数学操作。标准支持下面的操作:

符号名称
( )括号
+ - * /加减乘除
%取模
**乘方
& | ^ ~按位与 / 或 / 异或 / 非
<> = > < <= >=逻辑关系 不等于 / 等于 / 大于 / 小于 / 小于等于 / 大于等于
&& ||逻辑与 / 或
<< >>按位左移,按位右移

条件表达式:

<条件> ? <真操作.> : <假操作>
<condition> ? <true expr.> : <false expr.>


函数:

SGN, NEG,

仅对 SwissKnife 提供的函数,不对 IntSwissKnife 提供:

ATAN, COS, SIN, TAN, ABS, EXP, LN, LG, SQRT,
TRUNC, FLOOR, CEIL, ROUND( x, precision ),
ASIN, ACOS, SGN, NEG, E, PI

    当把公式嵌入 XML 文件的时候,又引发了新的问题:不能直接使用 <,> 和 & 字符,因为它们是 XML 语法的一部分。关于这个问题有两个可能的解决方案。

  • 第一,你可以像下面这样替换这些字符:

在这里插入图片描述

结果,公式 (x>0) && (x<10) 变成

<formula>(x &gt; 0) &amp;&amp; (x &lt; 10)</formula>
  • 第二,你可以把整个公式声明成非 XML 文本,方法是把它们用 <![CDATA[ ]]> 括起来。这样的话公式就变成了:
<formula><![CDATA[ (x>0) && (x<10) ]]>/formula>

    与只读的 SwissKnife 不同,Converter 可以双向工作。它实现一个 Ifloat 接口,这一点有点像 SwissKnife ,不过它还另有一个 <pValue> 元素,这个元素可以指向一个 IInteger 或 Ifloat 接口。它有两个公式:<FormulaFrom> 描述从 int 生成 float 的方法; <FormulaTo> 描述从 float 生成 int 的方法。<Slope> 入口表示这个公式是否是单调 Increasing(增加的) 或 Decreasing(减少) ,或者是 Varying(变化的)(这种情况下,使用整个数字范围),或者 slope 是 Automatic 方式决定的。

    下面的例子显示了一个 Converter 计算绝对快门值(一个浮点数)的方法,做法是把一个原始快门值(一个整数)和一个时间基数(另一个整数)相乘。

<Converter Name="ShutterAbs">
	<pVariable Name="TIMEBASE">TimeBase</pVariable>
	<FormulaTo> FROM / TIMEBASE </FormulaTo>
	<FormulaFrom> TO * TIMEBASE </FormulaFrom>
	<pValue>ShutterRaw</pValue>
	<Slope>Increasing</Slope>
</Converter>

<Integer Name="ShutterRaw">
	<Value>2</Value>
</Integer>

<Integer Name="TimeBase">
	<Value>10</Value>
</Integer>

    IntConverter 很像 Converter,只不过它实现一个 IInteger 接口。

8.13.ConfRom, TextDesc, and IntKey

    1394 相机用的 DCAM 标准实现一个树形数据结构的配置 ROM ,它由 IEEE 1212 标准定义。它在相机上下文中的主要作用是,提供型号名称,制造商名称,所支持的标准版本接口,以及 DCAM 标准寄存器的基地址。由于 IEEE 1212 兼容配置 ROM 的特殊排列,引入了一个特殊的 ConfROM 节点,以提供对所有这些信息的访问。

    在下面的例子中,我们通过单元 ID 查找一个描述 DCAM 兼容相机的单元目录,单元 ID 由 <Unit> 元素给出。在这个单元中,加入了三个入口,作为子节点。<IntKey> CommandRegBase 元素会转换成一个带 IInteger 接口的节点,用于读 DCAM 寄存器的基地址。<TextDesc> VendorName 和 ModelName 元素转换成带 IString 接口的节点,用于读相机的制造商和型号名称(脚注:注意,不要求配置 ROM 中的字符串是以 NULL 结尾的,参见 IEEE 1212 ),元素中的 16 进制数值是各自的 key 值,和入口一起储存在单元目录中。

<Category Name="Root">
	<pFeature>CommandRegBase</pFeature>
	<pFeature>VendorName</pFeature>
	<pFeature>ModelName</pFeature>
</Category>

<ConfRom Name="ConfRom">
	<Unit>0x00A02D</Unit>
	<Address>0x400</Address>
	<pAddress>InitialNodeSpace</pAddress>
	<Length>0x400</Length>
	<pPort>Device</pPort>
	<IntKey Name="CommandRegBase">0x40</IntKey> 
	<TextDesc Name="VendorName">0x81</TextDesc>
	<TextDesc Name="ModelName">0x82</TextDesc>
</ConfRom>

<Integer Name="InitialNodeSpace">
	<Value>0xFFFFF0000000</Value>
</Integer>

    注意,ConfROM 节点有 <Address>,<pAddress>,<IntSwissKnife>,<Length> 和 <pPort> 元素,它们的含义和别的 Registers 一样(参见 2.8.3)。

    典型的实现会为 <IntKey> 和 <TextDesc> 元素各自创建节点,区分的方法是通过各自入口的 Name 属性,一个指向 ConfROM 节点的 <p1212Parser> 元素,以及一个带有相应 key 值的 <Key> 元素。

8.14.DcamLock and SmartFeature

    目前,大多数标准寄存器的构造是固定的,需要提供机制和方法来访问那些没有在标准中定义的自定义属性。GenICam 目前支持两种机制。

    DcamLock 节点可以得到根据 DCAM 高级属性机制提供的智能属性的地址,它从 Register 节点继承元素和属性。在下面的例子中,我们对一个高级 DCAM 属性解锁,属性的 <FeatureID> 元素是 0x0030533B73C3 ,其中 0x003053 是制造商的 ID,0x3B73C3 是这个制造商所定义的属性 ID 。<Timeout> 元素的值是 0,意味着这个属性不会自动解锁。

<AdvFeatureLock Name="BaslerAdvFeatureLock">
	<FeatureID>0x0030533B73C3</FeatureID>
	<Timeout>0</Timeout>
	<Address>0xfffff2f00000</Address>
	<Length>8</Length>
	<AccessMode>RW</AccessMode>
	<pPort>Device</pPort>
</AdvFeatureLock>

    如果一个智能属性在 <FeatureID> 元素中给定了一个 GUID,则 SmartFeature 节点可以得到这个属性的地址。它也从 Register 节点继承元素和属性。下面的例子中,我们取得一个智能属性的地址,属性的 GUID 是 {5590D58E-1B84-11D8-8447-00105A5BAE55} :

<SmartFeature Name="TimeStampAdr">
	<FeatureID>5590D58E-1B84-11D8-8447-00105A5BAE55</FeatureID>
	<Address>0xfffff2f00010</Address>
	<pPort>Device</pPort>
</SmartFeature>

8.15.Port

    Port 对象仅仅是个代理,它把读写请求转送给传输层。不过要注意,这个代理有 Node 的所有特征,例如,它可以是 “未实现” ,这样就把传输层驱动暂时没有打开的信息告诉了所有从属节点,结果所有的从属属性也自动变成了 “未实现” 。另一个例子是用户设定加载器的实现。如果把一个用户设定从闪存加载到相机,则节点图内所有的属性都要无效。简单地令 Port 节点无效就可以实现这一点,用一个连接到 ReadUserSet 属性节点的 <pInvalidator> 就可以自动实现 Port 节点的无效。

    如果传输层有最大数据长度的限制,或者需要特别的对齐方式,例如按 quadlet 对齐,传输层的实现必须模拟 Iport 接口,把超出最大长度的请求分成多条请求,给不符合对齐要求的请求补上附加数据。为支持某些处理 quadlet 的接口,引入了 <SwapEndianess> 元素:如果它是 true,那么在通过 Iport 接口向 GenICam 提供数据之前,每个 quadlet 的字节序都要转换。

    Port 从 Node 节点继承元素和属性。另外,它有一个用来标识缓冲区内大块数据的元素。这个大块数据可能被映射到一个虚拟端口,这个虚拟端口不提供对真实设备的访问,但是提供对内存中大块数据的访问。

<Port Name="Device" NameSpace="Standard">
	<ChunkID>4711</ChunkID>
</Port>

8.16.Group element

    元素可以让一个大的相机描述文件更具可读性。如下所示,这个元素可以把节点封装成很多块:

<Category Name="Root">
	<pFeature>Analog</pFeature>
	<pFeature>Trigger</pFeature>
</Category>

<Group Comment="Analog section">
	<Category Name="Analog">
		<pFeature>Shutter</pFeature>
		<pFeature>Gain</pFeature>
		<pFeature>Offset</pFeature>
	</Category>
	
	<IntReg Name="Shutter">
		<!-- more elements -->
	</IntReg>
	<IntReg Name="Gain">
		<!-- more elements -->
	</IntReg>
	<IntReg Name="Offset">
		<!-- more elements -->
	</IntReg>
</Group>

<Group Comment="Trigger section">
	<!-- more elements -->
</Group>

    XML 编辑器应该可以隐藏一个组的内容,像下面的截屏图一样:

在这里插入图片描述

    <Group> 节点有一个 Comment 属性,当组被折叠的时候,编辑器会显示这个属性。组可以在任何深度展开。组对相机的功能没有任何影响,当解析相机描述文件的时候,会忽略它们。

参考

GenIcam标准(一)
GenIcam标准(二)
GenIcam标准(三)
GenIcam标准(四)
GenIcam标准(五)
GenIcam标准(六)

GenIcam标准介绍


GenIcam标准(一)
GenIcam标准(二)
GenIcam标准(三)
GenIcam标准(四)
GenIcam标准(五)
GenIcam标准(六)

   
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/712661.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jupyter notebook中使用不同的anaconda环境及常用conda命令

conda命令 在jupyter notebook中使用不同的anaconda环境其他常用conda命令 在jupyter notebook中使用不同的anaconda环境 创建环境 myenvname 需替换为自己的环境名称 conda create --name myenvname python3.7激活环境 conda activate myenvname 在该环境中安装Jupyter N…

什么是专业的CRM客户管理系统,介绍crm客户管理系统的功能作用

CRM&#xff08;Customer Relationship Management&#xff09;客户管理系统&#xff0c;是现代企业不可或缺的一款管理工具。它集客户信息管理、销售自动化、客户服务与支持、数据分析与决策支持等多项功能于一身&#xff0c;帮助企业实现客户关系的全方位管理&#xff0c;从而…

【AI学习】Together AI的新研究:Together MoA(Mixture of Agents)

第一次听说Mixture of Agents&#xff0c;原来Agent也能混合&#xff0c;有意思&#xff01; 介绍 Together AI的最新研究“Together MoA”&#xff08;Mixture of Agents&#xff0c;代理混合&#xff09;是一种创新的方法&#xff0c;旨在通过结合多个开源大型语言模型&…

proDAD V4最新版软件安装包下载+详细安装步骤

简介&#xff1a; proDAD Adorage 是一款一体化的效果库&#xff0c;完美拥有所有的效果&#xff0c;集所有Adorage卷于一体&#xff0c;该系列包含13种可用套装中的17,000多种效果。 对于每种情况都能获得完美的效果&#xff0c;支持Adobe、avid、Corel、Cyberlink、MAGIX等多…

Setapp:只需一次订阅,即可获得 240 款+ Mac 软件

为一项任务寻找合适的应用程序是一项相当艰巨的任务。过去&#xff0c;最好的办法要么是花费宝贵的时间搜索可靠的评论&#xff0c;要么就是相信无论安装什么软件都能完成任务。 如果你是 Mac 用户&#xff0c;那么 Setapp 将让这一问题成为过去。无需在需要时下载单个程序&am…

special characters are not allowed

处理域名连接nacos读取配置异常 1 项目启动报错2 问题处理3 刷新依赖重启问题解决 1 项目启动报错 使用ip可以正在启动&#xff0c;但是使用域名报下面的错误 2024-06-15 17:37:22.981 ERROR 29268 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : parse …

1)Java项目笔记搭建系统梳理相关知识

目录 前言项目结构Java部分Spring整合部分SpringBoot整合部分 模块说明规划 小结javarabbitmqmybatisspring最后推荐几本工具书 前言 工作有年头了&#xff0c;学到了很多技术&#xff0c;收获了很多。但是对与工作相关的专业技能知识的掌握杂而乱&#xff0c;不够全面系统。因…

面试题 17.06. 2出现的次数

题解&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;. - 力扣&#xff08;LeetCode&#xff09; 数位 DP 通用模板_哔哩哔哩_bilibili class Solution { public:int numberOf2sInRange(int n) {std::string str to_string(n);int len str.size();std::vector<std:…

嵌入式软件工程师入何突破瓶颈?

各位关注嵌入式软件工程师发展的朋友们&#xff0c;下面来探讨一下嵌入式软件工程师该如何突破瓶颈。首先要强调的是&#xff0c;不要仅仅将自己局限在嵌入式软件工程师这一角色定位上。 事实上&#xff0c;嵌入式软件工程师已经掌握了诸多业务层面的内容&#xff0c;完全有能力…

【AI+编程】工作日常场景随时可以AI编程,记一个问答SQL快速导出数据日常示例

今天有个场景&#xff0c;我们有个老项目&#xff0c;由于历史原因差不多1年多没使用了&#xff0c;恰巧客户紧急情况要使用。因为当时没有需求&#xff0c;所以V1.0上线后 就没做更新。 需求很简单&#xff1a;我们假定 项目问题表、客户表、问题答案表&#xff0c; 实时查询…

Linux文件与内容查阅、归档压缩

#Linux系统基础 文件与内容查找、归档压缩 find命令搜索文件 grep对文件的内容进行搜索 tar命令进行文件的压缩与解压缩 一、文件的查找 格式实例&#xff1a;find . -name "123.txt"说明find起始目录查找类型查找条件./ 或 .-name“123.txt”在当前目录中查找…

联想正式发布全栈算力基础设施新品,加速筑基AI 2.0时代

6月14日&#xff0c;以“异构智算 稳定高效”为主题的联想算力基础设施新品发布会在北京成功举办。 据「TMT星球」了解&#xff0c;在与会嘉宾和合作伙伴的见证下&#xff0c;联想正式发布率先搭载英特尔至强 6能效核处理器的联想问天WR5220 G5、联想ThinkSystem SR630 V4、联…

STM32学习笔记(一)--时钟树详解

&#xff08;1&#xff09;时钟概述&#xff1b;时钟是具有周期性的脉冲信号&#xff0c;最常用的是占空比50%的方波。&#xff08;时钟相当于单片机的脉搏&#xff1b;STM32本身非常复杂&#xff0c;外设非常的多&#xff0c;为了保持低功耗工作&#xff0c;STM32 的主控默认不…

ChatTTS-WebUI测试页面项目

概述 分享可以一个专门为对话场景设计的文本转语音模型ChatTTS&#xff0c;例如LLM助手对话任务。它支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练。在HuggingFace中开源的版本为4万小时训练且未SFT的版本. 该模型能够预测和控制细粒度的韵律特…

idea的java代码引用proto文件报错

尝试了四种办法&#xff0c;感觉第一个和第二个比较有效。 前提是要先安装了 proto 的idea插件。 1.修改idea配置文件编译大文件的限制 proto生成的源文件有数万行&#xff0c;源文件过大导致 idea 拒绝编译过大的源文件。 解决方案&#xff1a; 如果 protoc 生成的 class 文…

智能合约之路:Web3时代的商业革新之道

随着区块链技术的日益成熟和普及&#xff0c;智能合约作为其重要应用之一&#xff0c;正逐渐引领着我们进入一个全新的商业时代&#xff0c;即Web3时代。在这个时代&#xff0c;智能合约不仅改变着商业交易的方式&#xff0c;更为商业模式带来了颠覆性的革新。本文将深入探讨智…

二分【3】 旋转数组

目录 旋转数组 旋转数组找最小值 旋转数组找指定值 严格递增序列 递增序列 旋转序列找中位数&#xff1a; 旋转数组 旋转数组找最小值 思路 #include <iostream> #include <vector> #include <cmath> #include <string> #include <cstrin…

MyBatis的逆向工程详细步骤操作

1. MyBatis的逆向工程详细步骤操作 文章目录 1. MyBatis的逆向工程详细步骤操作2. 逆向工程配置与生成2.1 MyBatis3Simple&#xff1a;基础版&#xff0c;只有基本的增删改查2.1.1 第一步&#xff1a;在pom.xml 中添加逆向工程插件2.1.2 第二步&#xff1a;配置 generatorConfi…

(虚拟机)VMware软件的安装及Ubuntu系统安装

一、VMware软件的安装 软件下载&#xff0c;可以自己找或者百度网盘下载&#xff1a; 通过百度网盘分享的文件&#xff1a;ubuntu16…等2个文件 链接:https://pan.baidu.com/s/1VEnZKY9DJ1T1vC3ae20gKQ 提取码:11b6 复制这段内容打开「百度网盘APP 即可获取」 1、解压VMwar…

探索大数据在信用评估中的独特价值

随着我国的信用体系越来越完善&#xff0c;信用将影响越来越多的人。现在新兴的大数据信用和传统信用&#xff0c;形成了互补的优势&#xff0c;大数据信用变得越来越重要&#xff0c;那大数据信用风险检测的重要性主要体现在什么地方呢?本文将详细为大家介绍一下&#xff0c;…