c95824a65d
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>
145 lines
3.9 KiB
JSON
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"
|
|
}
|
|
]
|
|
}
|
|
}
|