c2c3c52274
The AbCip controller browse could never be verified end to end: libplctag's ab_server answers CIP service 0x55 (Get Instance Attribute List) on the Symbol Object class with "unsupported", so the `@tags` walk had no backend. #468's own definition of done offered a sim that serves `@tags` as an alternative to real hardware; this is that. The fixture now applies a vendored patch teaching ab_server to serve the Symbol Object listing, with partial-transfer paging. Correctness is checked against libplctag's own `list_tags_logix` rather than against our decoder — our decoder is the thing under test, so its agreement would prove nothing. The clone is also pinned to a concrete tag: the Dockerfile called `--branch release` "pinned" while tracking a branch that moves. That immediately exposed a real defect. CipSymbolObjectDecoder advanced to an even byte boundary after each symbol name, but entries are packed with no padding — libplctag walks them by sizeof(entry) + string_len, and a captured reply confirms it. Any odd-length name therefore desynchronised every entry behind it, and odd-length names are ordinary. In the live browse below, `Motor_Run` is 9 bytes and first on the wire, so the old decoder would have shown that one tag and silently dropped the other eight. Every existing multi-entry test passed throughout, because the test builder padded exactly as the decoder did: the two agreed with each other and neither agreed with a controller. The builder no longer pads, and the layout is pinned by a captured reply (CipSymbolObjectWireCaptureTests) instead of by a second statement of the assumption. Restoring the alignment step reddens exactly the three new tests and none of the 29 others. Live gate on docker-dev, all three of #468's criteria: - populated tree — all nine seeded tags render as leaves, in wire order - refresh re-captures - leaf commit — Pump_1_Speed + TestDINT saved with their CIP tag paths The gate also surfaced two things it was not asked about: browse-commit drops the discovered data type, so a browsed REAL commits as a DINT and the driver decodes it as one (filed as #536), and Test Connect fails against this fixture regardless of the device because it probes `@raw_cpu_type` (documented). TwinCAT and FOCAS still have no browsable backend; #468's AbCip half is closed, theirs is not. Claude-Session: https://claude.ai/code/session_015p7wGqy3YpZNCpDzTpGMKo
54 lines
2.3 KiB
Docker
54 lines
2.3 KiB
Docker
# ab_server container for the AB CIP integration suite.
|
|
#
|
|
# ab_server is a C program in libplctag/libplctag under src/tools/ab_server.
|
|
# We clone at a pinned commit, build just the ab_server target via CMake,
|
|
# and copy the resulting binary into a slim runtime stage so the published
|
|
# image stays small (~60MB vs ~350MB for the build stage).
|
|
|
|
# -------- stage 1: build ab_server from source --------
|
|
FROM debian:bookworm-slim AS build
|
|
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
git \
|
|
build-essential \
|
|
cmake \
|
|
ca-certificates \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# A concrete tag, not a branch. This said "pinned" while cloning `release`,
|
|
# which moves — so two builds of the same Dockerfile could produce different
|
|
# servers, and the patch below could not be relied on to apply. Bump
|
|
# deliberately alongside a driver-side change that needs something newer, and
|
|
# re-check the patch against the new tag.
|
|
ARG LIBPLCTAG_TAG=v2.7.0
|
|
RUN git clone --depth 1 --branch "${LIBPLCTAG_TAG}" https://github.com/libplctag/libplctag.git /src
|
|
|
|
# Upstream ab_server answers CIP service 0x55 (Get Instance Attribute List) with
|
|
# "unsupported", so a controller-tag browse against it returns nothing. The
|
|
# patch implements the Symbol Object listing that a real Logix controller
|
|
# serves, which is what the AbCip driver's `@tags` walk reads. Verified against
|
|
# libplctag's own `list_tags_logix` client — see README.md.
|
|
COPY patches/ /patches/
|
|
WORKDIR /src
|
|
RUN git apply --verbose /patches/*.patch
|
|
|
|
RUN cmake -S . -B build -DCMAKE_BUILD_TYPE=Release \
|
|
&& cmake --build build --target ab_server --parallel
|
|
|
|
# -------- stage 2: runtime --------
|
|
FROM debian:bookworm-slim
|
|
|
|
LABEL org.opencontainers.image.source="https://github.com/dohertj2/lmxopcua" \
|
|
org.opencontainers.image.description="libplctag ab_server for OtOpcUa AB CIP driver integration tests"
|
|
|
|
# libplctag's ab_server is statically linked against libc / libstdc++ on
|
|
# Debian bookworm; no runtime dependencies beyond what the slim image
|
|
# already has.
|
|
COPY --from=build /src/build/bin_dist/ab_server /usr/local/bin/ab_server
|
|
|
|
EXPOSE 44818
|
|
|
|
# docker-compose.yml overrides the command with per-family flags.
|
|
CMD ["ab_server", "--plc=ControlLogix", "--path=1,0", "--port=44818", \
|
|
"--tag=TestDINT:DINT[1]", "--tag=TestREAL:REAL[1]", "--tag=TestBOOL:BOOL[1]"]
|