2810Enumeration, EnumEntry

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

2811StringReg

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

<StringReg Name="ModelName">

<Address>0x1234</Address>

<Length>128</Length>

<AccessMode>RO</AccessMode>

<pPort>Device</pPort>

</StringReg>

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

2812SwissKnife, 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属性。变量名必须是大写的。

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

( )                  括号

+ - * /            加减乘除

%                  取模

**                  乘方

& | ^ ~         按位与 / 或 / 异或 / 非

<> = > < <= >=     逻辑关系 不等于 / 等于 / 大于 / 小于 / 小于等于 / 大于等于

&& ||           逻辑与 / 或

<< >>            按位左移,按位右移

条件表达式:

<条件> ? <真操作.> : <假操作>

函数:

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语法的一部分。关于这个问题有两个可能的解决方案。

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

<     变成       &lt; (lt = less than)

>     变成       gt;   (gt = greater than)

&    变成       &amp;   (amp = ampersand)

结果,公式 (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接口。

2813ConfRom, 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>元素。

2814DcamLock 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>

2815Port

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

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

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

<Port Name="Device" NameSpace="Standard">

<ChunkID>4711</ChunkID>

</Port>

2816Group element

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

<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标准(五)的更多相关文章

  1. GenIcam标准(四)

    2.8.可用的节点类型 本章对每个可用的节点类型提供一个概要的描述,包括其功能.用途以及最关心的参数.另外,对于每个节点在GenICam标准的XML格式文件中的layout,会有一个正式的说明.这个格 ...

  2. GenIcam标准(二)

    2     GenApi模块 – 配置相机 2.1. 简介 GenApi模块解决如何去配置相机的问题.主要的思路是,让相机生产厂商为他们的相机提供机器可以识别的产品说明.这些相机描述文件(camera ...

  3. GenIcam标准(一)

    1.概述 如今的数码摄相机包含了很多的功能,而不仅仅是采集图像.对于机器视觉相机来说,处理图像并把结果附加到图像数据流上,控制附加的硬件,代替应用程序作实时的处理等都是很平常的事情.这也导致了相机的编 ...

  4. GenIcam标准(三)

    2.6. 缓存 如果某个实现对每个写操作支持范围.实现和可用状态的检查,通常会触发一系列对相机的读操作.大多数用于有效性检查的数值很少或不会发生变化,所以可以放入缓存.相机描述文件包含所有必需的定义以 ...

  5. GenIcam标准介绍

    GenICam TM的目标是为各种相机和设备提供通用编程接口.无论他们使用什么接口技术(GigE Vision,USB3 Vision,CoaXPress,Camera Link HS,Camera ...

  6. GenIcam标准(六)

    2.9.可用的接口 本章用伪代码列出在2.3章介绍过的最重要的接口.对每个接口,实际的实现可以提供更多的方法,例如,除了SetValue(value)方法,还可以用直接映射到SetValue()的方式 ...

  7. GenIcam标准关键词整理

    1.<?xml> 版本信息和编码方式 IntSwissKnife 需计算和判断的节点 MaskedIntReg 需查询的节点 2.<RegisterDescription> 寄 ...

  8. go五笔——基于Google在线五笔制作

    go五笔 v0.0.2 加入新世纪版 86版收录几个不常用汉字,其它无更新 下载 86版64位密码: qe7k 86版32位密码: y25a 06版64位密码: d2ug 06版32位密码: bxxz ...

  9. 机器视觉必知-GenICam相机通用接口标准

    机器视觉必知-GenICam相机通用接口标准 GenICam(相机通用接口): 一种通用软件接口 通用相机接口标准 目前机器视觉行业所使用的相机几乎均以相同方式来进行配置,即:---通过在注册表中的读 ...

随机推荐

  1. POJ 3273 Monthly Expense 【二分答案】

    题意:给出n天的花费,需要将这n天的花费分成m组,使得每份的和尽量小,求出这个最小的和 看题目看了好久不懂题意,最后还是看了题解 二分答案,上界为这n天花费的总和,下界为这n天里面花费最多的那一天 如 ...

  2. iOS系统的特点-iOS为什么运行更流畅

    1.进程管理机制-不允许后台进程: 2.用户事件响应优先级: 3.GPU加速: 4.系统内存管理机制: 5.运行机制-机器码直接运行-非虚拟机.

  3. 关于VS2013 Browser Link 新功能

    今天小明在编写MVC项目,设计前端项目的时候,突然遇到一个问题,就是无论什么页面,当每次执行调试的时候,页面中都会自动的加上这样一行代码: <!-- Visual Studio Browser ...

  4. BZOJ 1050 [HAOI2006]旅行comf(最小生成树)

    题意 第一行包含两个正整数,N和M.下来的M行每行包含三个正整数:x,y和v.表示景点x到景点y之间有一条双向公路 ,车辆必须以速度v在该公路上行驶.最后一行包含两个正整数s,t,表示想知道从景点s到 ...

  5. jquery复制到剪贴板

    <!DOCTYPE html> <html> <head> <title>ZeroClipboard Test</title> <me ...

  6. k8s日志收集配置

    容器日志样例 172.101.32.1 - - [03/Jun/2019:17:14:10 +0800] "POST /ajaxVideoQueues!queryAllUser.action ...

  7. 浅谈python 中正则的一些函数

         主要的函数有  : match() search() findall() group() groups() split()  match (): 含义  开头匹配,匹配成功返回一个对象失败则 ...

  8. GET和POST请求的核心区别

    GET请求具有幂等性,而POST请求没有.

  9. "pom.xml" could not be activated because it does not exist.

    "pom.xml" could not be activated because it does not exist. 在sts中使用maven build,输入package然后 ...

  10. Struts2学习(三)上传下载

    今天记录一下利用struts2实现上传下载,借此案例说明一下struts2的开发流程. 须要注意的是struts2版本号不同非常多地方的写法是不同的.本例使用struts2.3.15 .有差别的地方文 ...