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>
62 lines
2.1 KiB
JSON
62 lines
2.1 KiB
JSON
{
|
|
"LatestRequest": {
|
|
"Phase": "StartTagQuery.Request",
|
|
"Length": 4,
|
|
"Sha256": "17956e4fbe53d5edc0f9170203b013432e4afcc0591c795a10522a98d9fce926",
|
|
"NativeTagFilter": "TagName eq 'OtOpcUaParityTest_001.Counter'",
|
|
"Fields": {
|
|
"Marker": 26449,
|
|
"Version": 1
|
|
},
|
|
"Hex": "51 67 01 00"
|
|
},
|
|
"EarlierCapturedRequestCandidate": {
|
|
"Phase": "StartTagQuery.Request",
|
|
"Length": 92,
|
|
"Sha256": "af1dbcdd3eb0ad91a18882c22252aa74aff82998e96a39b63415ab4792a962ac",
|
|
"NativeTagFilter": "TagName eq 'OtOpcUaParityTest_001.Counter'",
|
|
"Fields": {
|
|
"Marker": 26449,
|
|
"Version": 1,
|
|
"FilterLength": 42,
|
|
"FilterEncoding": "UTF-16LE without terminator",
|
|
"FilterOffset": "0x0008"
|
|
},
|
|
"Hex": "51 67 01 00 2A 00 00 00 54 00 61 00 67 00 4E 00 61 00 6D 00 65 00 20 00 65 00 71 00 20 00 27 00 4F 00 74 00 4F 00 70 00 63 00 55 00 61 00 50 00 61 00 72 00 69 00 74 00 79 00 54 00 65 00 73 00 74 00 5F 00 30 00 30 00 31 00 2E 00 43 00 6F 00 75 00 6E 00 74 00 65 00 72 00 27 00"
|
|
},
|
|
"Response": {
|
|
"Phase": "StartTagQuery.Response",
|
|
"Length": 8,
|
|
"Sha256": "3f36b44b323f7d4760626302368f492bced79999112a9b7f9dbd2544326b2c7e",
|
|
"Fields": {
|
|
"QueryHandle": 12,
|
|
"TagCount": 1
|
|
},
|
|
"Hex": "0C 00 00 00 01 00 00 00"
|
|
},
|
|
"NativeResult": {
|
|
"StartQuerySuccess": true,
|
|
"TagNames": [
|
|
"OtOpcUaParityTest_001.Counter"
|
|
],
|
|
"TagInfo": [
|
|
{
|
|
"TagName": "OtOpcUaParityTest_001.Counter",
|
|
"TagKey": 238,
|
|
"TagDataType": 4,
|
|
"TagStorageType": 3,
|
|
"EngineeringUnit": "None"
|
|
}
|
|
]
|
|
},
|
|
"ManagedReplayResult": {
|
|
"HeaderOnlyRequestWithOpen2DerivedHandles": "negative",
|
|
"FilterRequestWithOpen2DerivedHandles": "negative",
|
|
"ErrorCodes": [
|
|
51,
|
|
1
|
|
]
|
|
},
|
|
"Notes": "Raw instrumentation capture is retained only under ignored artifacts. The tag name is the deterministic local parity test tag. Latest combined instrumentation shows the successful WCF StartTagQuery request is header-only; the filter was already processed by an earlier native metadata layer before this WCF call."
|
|
}
|