Dependencies
modbus-moon/
├── modbus-moon.mbt # entry point / public API re-exports
├── modbus-moon_test.mbt # blackbox tests
├── modbus-moon_wbtest.mbt # whitebox tests
├── pkg.generated.mbti # generated root interface
├── moon.mod # module manifest
├── moon.pkg # root package manifest
├── README.md # this file (mooncakes.io)
├── LICENSE # Apache-2.0
├── AGENTS.md # coding conventions
└── src/
├── lib/ # core protocol modules
│ ├── adu.mbt # Application Data Unit (TCP / RTU)
│ ├── coil.mbt # coil / word bit-packing helpers
│ ├── constructors.mbt # cross-package Request/Response ctors
│ ├── crc.mbt # Modbus RTU CRC-16
│ ├── exception.mbt # ExceptionCode, ExceptionResponse
│ ├── exception_ctors.mbt # cross-package ExceptionCode ctors
│ ├── func_codes.mbt # FunctionCode enum + byte mapping
│ ├── function_code_ctors.mbt
│ ├── pdu.mbt # Protocol Data Unit (function code + data)
│ ├── request.mbt # Request enum + PDU codec
│ ├── response.mbt # Response enum + PDU codec
│ ├── slave.mbt # Slave / unit id + SlaveContext
│ └── types.mbt # ModbusError, ModbusResult
├── transport/ # TCP / RTU ADU codecs
│ ├── tcp.mbt # MBAP request/response (de)serialization
│ └── rtu.mbt # RTU request/response (de)serialization
├── client/ # Modbus client
│ ├── context.mbt # Context[R : Runtime], ClientResult
│ └── traits.mbt # Reader, Writer + Context impls
├── server/ # Modbus server
│ ├── service.mbt # Service, OptionalService traits
│ └── context.mbt # MemoryContext + Terminated
├── tests/ # integration tests
│ └── lib_test.mbt # codec + server integration tests
└── examples/ # runnable examples (codec / mock client / sim serial)
docs/ # 19-chapter Chinese tutorial// Encode a request into a PDU
let req = @lib.Request::read_holding_registers(0, 4)
let pdu = req.to_pdu() // [0x03, 0x00, 0x00, 0x00, 0x04]
// Decode a response
let resp = @lib.Response::read_holding_registers([0x1234, 0x5678])
let resp_pdu = resp.to_pdu()
let parsed = @lib.Response::from_pdu(resp_pdu)
// parsed is `Some(@lib.Response::ReadHoldingRegisters([0x1234, 0x5678]))`
// Encode a TCP request frame
let frame = @transport.encode_tcp_request(@lib.Slave::new(1), req)
// Encode an RTU request frame with CRC
let rtu = @transport.encode_rtu_request(@lib.Slave::new(1), req)| Component | Status |
|---|---|
| PDU/ADU codec | ✅ done |
| Function codes | ✅ done |
| Exception codes | ✅ done |
| CRC-16 | ✅ done |
| TCP transport codec | ✅ done |
| RTU transport codec | ✅ done |
| Client Context + traits | ✅ done |
| In-memory Service | ✅ done |
| Unit tests | ✅ 7 tests passing |
| MockRuntime (in-process) | ✅ done |
| TcpRuntime (async TCP) | ✅ done |
| SerialRuntime (RTU) | ✅ done (trait-based) |
| End-to-end examples | ✅ done (3 demos) |
| Chinese tutorial (docs/) | ✅ 19 chapters |
# typecheck the entire workspace
moon check
# run all tests (currently 7 in src/tests/lib_test.mbt)
moon test
# refresh generated interface files and re-format
moon info
moon fmt| tokio-modbus | modbus-moon |
|---|---|
| modbus-core (PDU/ADU/CRC/exceptions) | src/lib/ |
| modbus-frame (TCP/RTU codecs) | src/transport/ |
| Client trait + Context | Runtime trait + src/client/context.mbt |
| Reader/Writer traits | src/client/traits.mbt |
| Service trait + Service::call | src/server/service.mbt |
| Result<T> (two-layer) | ClientResult[T] |
| Request / Response enums | src/lib/request.mbt / response.mbt |
| Slave / SlaveId | src/lib/slave.mbt |
Install
Download zipDependencies