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 |
There was a problem hiding this comment.
Pull request overview
Adds a new protocols/slmp protocol module to PLC4X, introducing an initial SLMP (MELSEC Communication 3E) binary-frame wire-layer specification plus basic module scaffolding so the mspec parses/validates and protocol vectors are available for driver-level execution later.
Changes:
- Introduces SLMP 3E binary frame mspec modeling request/response framing and read commands
0x0401,0x0403,0x0406(word units). - Registers the new protocol for code generation and adds a minimal validation test to ensure the mspec resolves cleanly.
- Adds ParserSerializer reference vectors and test logging configuration for the new module.
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| protocols/slmp/src/test/resources/protocols/slmp/ParserSerializerTestsuite.xml | Adds SLMP ParserSerializer reference vectors for request/response frames and supported read commands. |
| protocols/slmp/src/test/resources/logback-test.xml | Test logging configuration for the new protocol module. |
| protocols/slmp/src/test/java/org/apache/plc4x/protocol/slmp/SlmpProtocolTest.java | Validates that the SLMP mspec parses and has no unresolved type references. |
| protocols/slmp/src/main/resources/protocols/slmp/slmp.mspec | Defines SLMP 3E binary framing, device codes, and read-request payload layouts. |
| protocols/slmp/src/main/resources/META-INF/services/org.apache.plc4x.plugins.codegenerator.protocol.Protocol | Registers SlmpProtocol as a codegen protocol provider. |
| protocols/slmp/src/main/java/org/apache/plc4x/protocol/slmp/SlmpProtocol.java | Implements the protocol entrypoint to load/validate the mspec. |
| protocols/slmp/pom.xml | Adds Maven module definition and dependencies for plc4x-protocols-slmp. |
| protocols/pom.xml | Registers slmp as a submodule under protocols. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| [simple uint 16 monitoringTimer] // 0x0000 = wait infinitely | ||
| [simple uint 16 command] // 0x0401 = Batch Read | ||
| [simple uint 16 subCommand] // 0x0000 = word units | ||
| [simple SlmpRequestData('command') requestData] |
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.