Add SLMP (MELSEC Communication 3E) protocol module (read-only wire layer)#2597
Add SLMP (MELSEC Communication 3E) protocol module (read-only wire layer)#2597LivingLikeKrillin wants to merge 2 commits into
Conversation
…wire layer Adds the codegen-layer protocol module for SLMP / MELSEC Communication protocol (Mitsubishi PLCs), as proposed in the SLMP driver proposal issue: - slmp.mspec modelling the 3E binary frame (request/response), with Batch Read (0x0401), Random Read (0x0403) and Batch Read Multiple Blocks (0x0406) in word units, read-only - ParserSerializer test suite with vectors derived from the worked examples in the public Mitsubishi reference manual SH-080008 (sections 8.1/8.3/8.4) - Root type declares the new-SPI encoding defaults (little-endian) The driver module (plc4j/drivers/slmp) will follow on top of the new SPI as a separate step. Signed-off-by: Jooyoung Jung <livinglikekrillin@gmail.com>
|
I've checked out your PR and created a dummy slmp driver module where the code is generated from your mspec and added a ParserSerializerTest to use the generated code with your xml ... I had to set it to fix one general issue: in your initial XML you had "deviceCode" modelled as:
This was the only issue I found in getting the driver's types, parsers and serializers generated and the test-suite running. You want me to send you my changes or do you want to learn it yourself? |
deviceCode is a numeric enum (SlmpDeviceCode), but the ParserSerializer
test vectors used the shorthand <deviceCode>D</deviceCode> form. That
does not round-trip through the generated parser/serializer, which
expects the full enum element with its numeric value:
<deviceCode>
<SlmpDeviceCode dataType="uint" bitLength="8" stringRepresentation="D">168</SlmpDeviceCode>
</deviceCode>
Convert all deviceCode occurrences in ParserSerializerTestsuite.xml to
the canonical form so the vectors round-trip once the generated driver
types exercise them.
|
Thanks for taking the time to check it out and for wiring up the generated-driver test run — much appreciated. Good catch on the On the bigger picture: this PR is intentionally the protocol-only module (mspec + generated wire layer), which is why the test suite isn't exercised here yet. The Java driver that actually runs these vectors is the next, separate PR, stacked on top of this one — I'll open it once this merges so its diff stays clean. Happy to adjust if you'd prefer different sequencing. |
|
Ok ... well ... as the PR says: Protocol Module I think it's ok to merge ... could you however do me a favor and sign an ICLA with Apache? This is something all contributors with more than minor contributions have to sign ... especially if you want to become a long time contributor or even committer here. https://www.apache.org/licenses/icla.pdf Then we've got everything in the right form and I'm happy to merge this PR |
First increment of the SLMP driver proposed in #2585 — the codegen-layer protocol module only (
protocols/slmp), opened as a draft per the Slack suggestion so the work is visible early.What''s in it
0x0401), Random Read (0x0403), Batch Read Multiple Blocks (0x0406), word unitsValidation so far
mvn -pl protocols/slmp testgreen on current develop (post-SPI3 merge): the mspec parses and all type references resolve0x0401/0x0403cross-checked against pymcprotocol (independent MIT-licensed client): its request bytes are byte-identical to the vectors except the monitoring-timer field, and it decodes the responses to the manual''s exact values0x0406: pymcprotocol has no multi-block API, so the request vector rests on the manual''s worked example plus an independent re-encode check — flagging this honestlyNext (not in this PR)
plc4j/drivers/slmpon the new SPI (slmp-tcp; single in-flight request since the 3E frame has no serial number)Developed with AI assistance; every wire-layer byte was verified against SH-080008, with the batch and random reads additionally cross-checked against pymcprotocol as noted above.