Files
histsdk/docs/reverse-engineering/tagquery-gettaginfo-response-latest.json
dohertj2 c95824a65d Initial commit: managed .NET 10 AVEVA Historian SDK + reverse-engineering toolkit
Full read-only SDK (src/AVEVA.Historian.Client) implementing the CLAUDE.md required
surface against AVEVA Historian's binary WCF protocol — no native AVEVA runtime
dependency. All operations live-verified against a local Historian:

- ProbeAsync, ReadRawAsync, ReadAggregateAsync, ReadAtTimeAsync, ReadEventsAsync
- BrowseTagNamesAsync, GetTagMetadataAsync (17 native data-type codes mapped)
- GetConnectionStatusAsync, GetStoreForwardStatusAsync, GetSystemParameterAsync
- 108/108 unit + integration tests pass

Includes the reverse-engineering toolkit (tools/AVEVA.Historian.ReverseEngineering)
used to decode the protocol: WCF probes, IL inspection via dnlib, and IL-rewrite
instrumentation (instrument-wcf-{write,read}message etc.) plus the .NET Framework
trace harness (tools/AVEVA.Historian.NativeTraceHarness) for parity testing.

Sanitized handoff evidence under docs/reverse-engineering/. Native AVEVA binaries
(current/, aveva-install-x64/, aveva-install-x86/) are gitignored — fetch separately
from the AVEVA installer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 06:31:48 -04:00

145 lines
3.9 KiB
JSON

{
"Scenario": "TagQuery.GetTagInfo",
"CapturedUtc": "2026-05-02T16:17:47Z",
"Server": "<redacted-local-dev-historian>",
"ClientDllSet": "current",
"TagFilter": "TagName eq 'OtOpcUaParityTest_001.Counter'",
"TagName": "OtOpcUaParityTest_001.Counter",
"Instrumentation": {
"Command": "instrument-tagquery-gettaginfo",
"ResponseMethod": "aahClientCommon.CClientCommon.GetTagInfos",
"ResponseMethodToken": "0x06002EC9",
"ResponseInsertedAfterOffset": "0x01B3",
"VectorMethod": "ArchestrA.TagQuery.GetTagInfo",
"VectorMethodToken": "0x06006310",
"VectorInsertedAfterOffset": "0x0068"
},
"NativeSummary": {
"TagCount": 1,
"TagKey": 238,
"TagDataType": 4,
"TagStorageType": 3,
"EngineeringUnit": "None"
},
"GetTagInfoResponseStream": {
"Length": 106,
"Sha256": "77b2bf720d8888f08a1499a8162e706c2cef567a1f6d74d7e92efe0cd3e3e34b",
"Hex": [
"01 00 00 00 03 C3 00 31 84 22 8C 40 58 E1 87 4A",
"98 4B 3D BE CB E0 AA 42 EE 00 00 00 09 1D 00 4F",
"74 4F 70 63 55 61 50 61 72 69 74 79 54 65 73 74",
"5F 30 30 31 2E 43 6F 75 6E 74 65 72 09 04 00 4D",
"44 41 53 02 03 01 02 00 00 00 D0 57 F4 94 65 D8",
"DC 01 0A 00 00 00 00 00 00 00 24 40 00 00 00 00",
"00 00 24 40 FE 00 00 00 00 00"
],
"ObservedFields": [
{
"Offset": "0x0000",
"Type": "uint32",
"Name": "TagCount",
"Value": 1
},
{
"Offset": "0x0004",
"Type": "bytes[4]",
"Name": "NativeDataTypeDescriptor",
"ValueHex": "03 C3 00 31",
"Notes": "Passed through CTagUtil.GetDataValueType; native wrapper exposes HistorianDataType 4 for this tag."
},
{
"Offset": "0x0008",
"Type": "GUID",
"Name": "TypeId",
"Value": "408c2284-e158-4a87-984b-3dbecbe0aa42"
},
{
"Offset": "0x0018",
"Type": "uint32",
"Name": "TagKey",
"Value": 238
},
{
"Offset": "0x001C",
"Type": "compact-ascii-string",
"Name": "TagName",
"Encoding": "marker 0x09, uint16 byte length, ASCII/UTF-8 bytes",
"Value": "OtOpcUaParityTest_001.Counter"
},
{
"Offset": "0x003C",
"Type": "compact-ascii-string",
"Name": "MetadataProvider",
"Encoding": "marker 0x09, uint16 byte length, ASCII/UTF-8 bytes",
"Value": "MDAS",
"Notes": "Observed in the stream but not exposed by HistorianTag summary for this scenario."
},
{
"Offset": "0x0043",
"Type": "uint8",
"Name": "NativeTagClass",
"Value": 2
},
{
"Offset": "0x0044",
"Type": "uint8",
"Name": "TagStorageType",
"Value": 3
},
{
"Offset": "0x0045",
"Type": "uint8",
"Name": "TagDeadbandType",
"Value": 1
},
{
"Offset": "0x0046",
"Type": "uint8",
"Name": "InterpolationType",
"Value": 2
}
]
},
"CTagMetadataVector": {
"ElementSize": 224,
"Count": 1,
"CapturedLength": 224,
"Sha256": "6df4a5a837d06df9332391eb7350af17804137b87541dad8556ca04d015e2995",
"ConfirmedOffsetsFromLoadFromTagMetadata": [
{
"Offset": "0x0030",
"Type": "uint32",
"Name": "TagKey",
"Value": 238
},
{
"Offset": "0x0038",
"Type": "std::wstring",
"Name": "TagName"
},
{
"Offset": "0x0058",
"Type": "std::wstring",
"Name": "Description"
},
{
"Offset": "0x00C1",
"Type": "uint8",
"Name": "TagStorageType",
"Value": 3
},
{
"Offset": "0x00C2",
"Type": "uint8",
"Name": "TagDeadbandType",
"Value": 1
},
{
"Offset": "0x00C5",
"Type": "uint8",
"Name": "ServerTimestampFlag"
}
]
}
}