hart手操器在进行DD解析时用到的数组
数组是hart手操器中进行dd解析时,用到的相同结构的DD项(如变量、集合或菜单)的列表模型。数组中的每个元素应具有相同的类型、尺寸和形状。在HART调制解调器中,通过DD描述技术,能够同时支持数值数组和引用数组。
- 数值数组管理相对较大的数据集。数值数组通常建模或组织数据。可以将数值数组视为在主机或现场设备中实际分配的物理内存。这些数据可以是捆扎表、自定义传递函数或响应曲线。
- 参考阵列允许通过阵列组织和访问同质集合。
引用数组不分配内存,而是组织对现有声明的访问。
通过数组标识符和元素从DD中的其他位置引用数组元素指数此引用使用方括号表示法。此引用的语法为:
array-name [ index ]
值数组
值数组是一个向量或值表。数组的长度由“NUMBER_OF_ELEMENTS”属性,值数组的每个元素都是“TYPE”明确规定。
ARRAY name {
LABELopt string;
HELPopt string;
VALIDITYopt boolean-specifier
TYPE type-reference;
NUMBER_OF_ELEMENTS integer;
}
每个值数组必须有一个类型和元素数。所有其他属性都是可选的。有关通用属性标签帮助和有效性的详细信息,请参见附录A。
元素个数
ELEMENTS属性将值数组的大小或长度指定为大于零的无符号整数。值数组中的元素数解析为整数常数
类型
TYPE属性是对DDL声明(例如变量、集合)的引用。此引用可以像变量一样简单(例如,数组是浮点数的向量)。如果类型为复杂(像一个集合),那么每个元素就像数据库表中的一行。在任何情况下引用中的属性应用于每个数组元素。
当使用变量引用时,值数组的类型是数组的每个元素由变量构造。如果数组有100个元素,且变量为浮点,则为个100浮点数(即,对于数组条目0-99),每个浮点数都具有被引用对象的相同属性创建变量。
如果集合引用指定了数组类型,则集合的成员定义数组分配的空间。例如,考虑以下因素:
VARIABLE xValue { TYPE FLOAT; }
VARIABLE yValue { TYPE FLOAT; }
VARIABLE quality {
TYPE enumerated { {0 , "Bad"}, {2 , "Poor"}, {3 , "Good"} }
}
COLLECTION point { MEMBERS { X, xValue; Y, yValue; QUALITY, quality; }
ARRAY dataSetArray { NUMBER_OF_ELEMENTS 100; TYPE point; }
}
这将创建100个包含3个变量的集合。换句话说,总共需要300个变量在数组中创建和存储。
在一种方法中:
dataSetArray [15] . X = 26.4 ;
将第16个数组元素的X的值设置为26.4。如果集合中的变量如果指定了DEFAULT_VALUES(默认值),那么数组中的每个元素也应该设置对应的默认值。
引用数组
引用数组是一组逻辑项(变量、命令等)。组中的每个项目都是分配了一个称为索引的数字。数组表示为:
ARRAY OF item-type name {
LABELopt string;
HELPopt string;
VALIDITYopt boolean-specifier
ELEMENTS {
index , item , descriptionopt , helpopt ;
index , item , descriptionopt , helpopt ;
}
}
数组的类型是DDL的任何基本类型,例如变量、菜单、编辑显示、数组等,每个数组必须有一个名称,并且可以在DD中的其他位置使用以引用大堆有四个数组属性:元素、有效性帮助和标签。每个数组必须具有元素。有效性、帮助和标签是可选的,有关它们的详细信息可在附录A中找到“项类型”指定数组中元素的类型;所有数组元素都必须是该类型。
数组的元素表示为:
ELEMENTS {
index , item , description , help ;
index , item , description , help ;
}
每个(索引、项、描述、帮助)四元组指定数组中的一个元素。索引指定可引用项目的编号。该描述提供了一个简短的示例项目的描述。帮助指定项目的帮助文本。每个数组元素必须有一个指数说明和帮助是可选的。考虑以下示例:
VARIABLE pressureValue { CLASS CORRECTION & DYNAMIC; TYPE FLOAT; }
VARIABLE pressureUnits { TYPE ENUMERATED (2) { ALL_UNITS } }
VARIABLE pressureLS { TYPE ENUMERATED { LIMIT_STATUS_CODES } }
VARIABLE pressureStatus { TYPE BIT_ENUMERATED { { 0x08, "0x08", MORE } } }
VARIABLE pressureUSL
VARIABLE pressureLSL { TYPE FLOAT; }
VARIABLE pressureMinimumSpan { TYPE FLOAT; }
VARIABLE pressureDampingValue { CONSTANT_UNIT [sec]; TYPE FLOAT; }
VARIABLE pressureClassificationCode {
TYPE ENUMERATED{{ 0, "Not Classified"},{65, [pressure_classification] }}
}
VARIABLE pressurePDQ {
TYPE ENUMERATED {
{0 , process_data_status(0)}, {1 , process_data_status(1)},
{2 , process_data_status(2)}, {3 , process_data_status(3)}
}
}
COLLECTION OF VARIABLE press {
MEMBERS { DIGITAL_VALUE, pressureValue;
DIGITAL_UNITS, pressureUnits;
DATA_QUALITY, pressurePDQ;
LIMIT_STATUS, pressureLS;
DEVICE_FAMILY_STATUS, pressureStatus;
CLASSIFICATION, pressureClassificationCode;
UPPER_SENSOR_LIMIT, pressureUSL;
LOWER_SENSOR_LIMIT pressureLSL;
MINIMUM_SPAN, pressureMinimumSpan;
DAMPING_VALUE, pressureDampingValue;
}
}
ARRAY OF COLLECTION deviceVariables {
ELEMENTS { 0, press; 1, temperature;
}
}
COLLECTION OF COLLECTION primary_variable {
MEMBERS {
DEVICE_VARIABLE, deviceVariables[0];
RANGING, scaling;
DAQ, analog_io;
}
}
ARRAY OF COLLECTION dynamic_variables {
ELEMENTS {
0, primary_variable; 1, secondary_variable;
2, tertiary_variable; 3, quaternary_variable;
}
}
此示例允许构造如下所示的抽象命令定义:
COMMAND read_dynamic_variables_and_pv_current {
REDEFINE TRANSACTION {
REQUEST { }
REPLY {
response_code, device_status,
dynamic_variables[0].DAQ.ANALOG_VALUE,
dynamic_variables[0].DEVICE_VARIABLE.DIGITAL_UNITS,
dynamic_variables[0].DEVICE_VARIABLE.DIGITAL_VALUE
}
}
}
在本例中,dynamic_variables[0].DEVICE_VARIABLE.DIGITAL_VALUE引用的就是pressureValue。