Async full per-tag browse()
The sync browse() returns the full per-tag symbol tree (name + access-sequence + datatype) by combining the EXPLORE type-info container with the DB list and walking the type tree (#4). The async client (S7CommPlusAsyncClient) still has only the experimental shallow browse() (gijzelaerr#687), which uses _parse_explore_fields (one EXPLORE per DB, name/type per field) — not the type-info tree builder.
Goal
await client.browse() returns the same flat variable list as the sync client — {name, access_sequence, data_type, db_number} — by reusing the transport-agnostic s7/typeinfo.py parser/tree-builder and porting the sync Phase A–E orchestration (_s7commplus_client.browse()) to async.
Notes
s7/typeinfo.py performs no I/O and is fully reusable as-is; only the orchestration needs an async twin (the per-DB LID = 1 → type-info RID reads, the EXPLORE(ObjectOMSTypeInfoContainer) call, and the recombination into the tree).
- This is a distinct concern from both the experimental shallow async browse and the async transport fix.
Depends on
Validation
Against a live S7-1500: await client.browse() yields the same variable count and the same spot-read results as the sync browse().
Async full per-tag
browse()The sync
browse()returns the full per-tag symbol tree (name + access-sequence + datatype) by combining the EXPLORE type-info container with the DB list and walking the type tree (#4). The async client (S7CommPlusAsyncClient) still has only the experimental shallowbrowse()(gijzelaerr#687), which uses_parse_explore_fields(one EXPLORE per DB, name/type per field) — not the type-info tree builder.Goal
await client.browse()returns the same flat variable list as the sync client —{name, access_sequence, data_type, db_number}— by reusing the transport-agnostics7/typeinfo.pyparser/tree-builder and porting the sync Phase A–E orchestration (_s7commplus_client.browse()) to async.Notes
s7/typeinfo.pyperforms no I/O and is fully reusable as-is; only the orchestration needs an async twin (the per-DBLID = 1→ type-info RID reads, theEXPLORE(ObjectOMSTypeInfoContainer)call, and the recombination into the tree).Depends on
browse()/typeinfotree builder (provides the parser + orchestration to mirror).integrity_tail+ fragment reassembly); without it the large, multi-fragmentEXPLORE(ObjectOMSTypeInfoContainer)response can't be received.Validation
Against a live S7-1500:
await client.browse()yields the same variable count and the same spot-read results as the syncbrowse().