使用 QueryPropertyHistory 服务
QueryPropertyHistory 服务能够查询给定时间范围内给定源事物的每个属性 (必须是已记录的属性) 值的值流。该服务针对每个属性调用 ValueStream.queryValueStreamEntries,然后将这些值全部放入结果集中。
QueryPropertyHistory 通过以下方法返回创建的数据集:查询事物上每个已记录的属性,然后将各个数据集组合成一个大数据集。将为单个数据集中的每个时间戳创建“行”。如果存在具有该时间戳的已记录值,则会将其输入到数据集的行中。如果没有任何已记录值,则使用该属性最后一个已记录值。如果没有任何已记录属性,则该条目为空。该组合器处理将根据时间戳移除给定属性的重复项。
要获取给定属性的实际已记录值,必须使用 QueryPropertyHistory 服务 (例如,QueryIntegerPropertyHistory)。您可以确认数据实际上已随这些服务一起清除。要了解该服务的工作原理,请参阅以下几个示例情景。
示例情景
情景 1:我指定了 3 行,但 QueryPropertyHistory 返回了 9 行
值流用于记录三个属性。每个属性已经有三个单独的条目。因此,输入的数据点总数为 9。
如果将 maxItems 参数设置为 3 时针对此值流调用 QueryPropertyHistory,则会返回 9 行数据。QueryPropertyHistory 会对每个单独的属性执行三次查询,因为已将 maxItems 设置为 3。由于每个属性有 3 个数据条目,所以可能会返回最大数量 9 行。
情景 2:我知道此时间戳有数据,但是收到的信息表为空
如果您不想使用在将值输入到值流时 ThingWorx 所自动生成的数据,则可以从 Edge 设备上记录自己的自定义时间戳,但应考虑以下行为。
如果尝试查询此自定义时间戳列而不是使用 setPropertyVTQ,则可能会发生什么情况?
QueryPropertyHistory 服务将发送到事物正在使用的值流,并获取基于 startDate、endDate、oldestFirst 和 maxRows 参数的初始结果集。
如果将 startDate 和 endDate 留空,这意味着您不会查询自动生成的时间戳属性,查询将从值流中最近添加的属性值或最早的属性值中获取 maxRows (例如,500)。这是由 oldestFirst 布尔型参数决定的。如果将 oldestFirst 设置为 false,则返回的结果集将包含每个属性最近输入的 500 个属性值。所以,如果有三个属性,每个属性记录了超过 500 个值,则初始数据集将包含 1500 行。
后处理时会发生什么情况?
还剩下一个参数没有用到,那就是 query 参数。此参数将在后处理中使用。这意味着,在对值流的初始查询完成之后,返回的初始结果集将应用 query 参数进行筛选,并仅返回所需的数据。
问题?
如果您已确定要查询所创建的自定义时间戳属性,但是返回的第一个结果集不包含您在查询中查找的时间,则会找不到任何内容,且会返回空的信息表。
解决方法
为完全避免此问题,可使用 setPropertyVTQ 服务将您自己的时间戳值输入到值流。这将覆盖自动生成的时间戳值,其中这些值表示将值输入到值流的确切时间。然后可以使用 startDate 和 endDate 参数而不是 query 参数来查询日期,且不会发生针对时间戳查询而产生的数据丢失风险。