@fa_yoshinobu/node-red-contrib-plc-comm-slmp 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ ## 0.2.3 - 2026-04-13
6
+
7
+ - CI now checks out `plc-comm-slmp-cross-verify/specs/shared` before running the shared-vector tests, so the Node package validates against the canonical cross-library parity vectors.
8
+
9
+ ## 0.2.2 - 2026-04-01
10
+
11
+ - add an optional `npm run smoke:editor` script that installs the local package into an isolated userDir, starts a temporary Node-RED runtime, imports `slmp-basic-read-write.json`, and verifies the flow starts cleanly
12
+ - refresh README, user guide, and example-flow docs with the editor-smoke command and the current canonical-address helper exports
13
+
3
14
  ## 0.2.1 - 2026-03-28
4
15
 
5
16
  - move npm package publishing to the scoped name `@fa_yoshinobu/node-red-contrib-plc-comm-slmp`
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 yoshinobu
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 yoshinobu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,5 +1,3 @@
1
- # Node-RED SLMP Nodes for Mitsubishi PLCs
2
-
3
1
  [![CI](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/actions/workflows/ci.yml/badge.svg)](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/actions/workflows/ci.yml)
4
2
  [![npm version](https://img.shields.io/npm/v/%40fa_yoshinobu%2Fnode-red-contrib-plc-comm-slmp?logo=npm&color=CB3837)](https://www.npmjs.com/package/@fa_yoshinobu/node-red-contrib-plc-comm-slmp)
5
3
  [![npm downloads](https://img.shields.io/npm/dm/%40fa_yoshinobu%2Fnode-red-contrib-plc-comm-slmp?logo=npm&color=CB3837)](https://www.npmjs.com/package/@fa_yoshinobu/node-red-contrib-plc-comm-slmp)
@@ -9,6 +7,8 @@
9
7
  ![Transport](https://img.shields.io/badge/Transport-TCP%20%2F%20UDP-0A7D5C)
10
8
  ![License](https://img.shields.io/badge/License-MIT-1F6FEB)
11
9
 
10
+ # Node-RED SLMP Nodes for Mitsubishi PLCs
11
+
12
12
  ![Node-RED SLMP hero](https://raw.githubusercontent.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/main/docsrc/assets/node-red-slmp.png)
13
13
 
14
14
  Node-RED nodes for Mitsubishi PLC communication over SLMP binary 3E/4E frames.
@@ -26,7 +26,13 @@ This package uses the same named-device foundation as the SLMP libraries, extend
26
26
  - `D100:STR,10`
27
27
  - `DSTR100,10`
28
28
 
29
- ## Quick start
29
+ This package is documented for the high-level Node-RED workflow only:
30
+
31
+ - `slmp-connection`
32
+ - `slmp-read`
33
+ - `slmp-write`
34
+
35
+ ## Quick Start
30
36
 
31
37
  1. Install the package into your Node-RED user directory and restart Node-RED.
32
38
  2. Add one `slmp-connection` config node and set `host`, `port`, `transport`, `PLC series`, and `frame type`.
@@ -40,10 +46,12 @@ If you are working from this repository, import one of the ready-to-run flows un
40
46
  - [`slmp-device-matrix.json`](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/examples/flows/slmp-device-matrix.json) for one-by-one high-level coverage across the matrix catalog
41
47
  - [`slmp-udp-read-write.json`](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/examples/flows/slmp-udp-read-write.json) for UDP validation
42
48
 
43
- ## Release information
49
+ Start with `D` word devices for the first smoke test. Do not start with `slmp-device-matrix.json`.
50
+
51
+ ## Release Information
44
52
 
45
53
  - package name: `@fa_yoshinobu/node-red-contrib-plc-comm-slmp`
46
- - package version: `0.2.1`
54
+ - package version: `0.2.3`
47
55
  - npm package: <https://www.npmjs.com/package/@fa_yoshinobu/node-red-contrib-plc-comm-slmp>
48
56
  - Node-RED requirement: `>=3.0.0`
49
57
  - Node.js requirement: `>=18`
@@ -63,200 +71,71 @@ cd ~/.node-red
63
71
  npm install /path/to/node-red-contrib-plc-comm-slmp
64
72
  ```
65
73
 
74
+ Optional local editor smoke test from the repository root:
75
+
76
+ ```bash
77
+ npm run smoke:editor
78
+ ```
79
+
80
+ This command installs the local package into an isolated temporary userDir, starts a temporary Node-RED runtime, imports `slmp-basic-read-write.json`, verifies the flow starts, and then shuts the runtime down again.
81
+
66
82
  Legacy note:
67
83
 
68
84
  - the original unscoped `node-red-contrib-plc-comm-slmp@0.2.0` remains on npm, but new releases move to the scoped package name above
69
85
 
86
+ ## Supported PLC Registers
87
+
88
+ Start with these register/device families first:
89
+
90
+ - word devices: `D`, `SD`, `R`, `ZR`, `TN`, `CN`
91
+ - bit devices: `M`, `X`, `Y`, `SM`, `B`
92
+ - typed forms: `D200:F`, `D300:L`
93
+ - special Node-RED forms: `D100,10`, `M1000,8`, `D100:STR,10`, `DSTR100,10`
94
+ - bit-in-word form: `D50.3`
95
+
96
+ See the full public table in [Supported PLC Registers](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/docsrc/user/SUPPORTED_REGISTERS.md).
97
+
70
98
  ## Documentation
71
99
 
100
+ - [Getting Started](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/docsrc/user/GETTING_STARTED.md)
101
+ - [Supported PLC Registers](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/docsrc/user/SUPPORTED_REGISTERS.md)
102
+ - [Latest Communication Verification](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/docsrc/user/LATEST_COMMUNICATION_VERIFICATION.md)
72
103
  - [User Guide](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/docsrc/user/USER_GUIDE.md)
73
104
  - [Example Flows](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/examples/flows/README.md)
74
- - [Future Device Support](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/TODO.md)
75
- - [Maintainer Notes](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/docsrc/maintainer/ARCHITECTURE.md)
76
- - [Validation Reports Directory](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/tree/main/docsrc/validation/reports)
77
105
  - [Documentation Index](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/docsrc/index.md)
78
106
 
79
- ## Current scope
107
+ Maintainer-only notes and retained evidence live under `internal_docs/`.
108
+
109
+ ## What You Can Do
80
110
 
81
111
  - Binary 3E and 4E frames
82
112
  - TCP and UDP transport
83
- - Reusable `slmp-connection` config node
84
- - `slmp-read` node powered by `readNamed`
85
- - `slmp-write` node powered by `writeNamed`
113
+ - reusable `slmp-connection`
114
+ - high-level reads and writes through `slmp-read` and `slmp-write`
86
115
  - typed source selection for literal / `msg` / `flow` / `global` / `env`
87
116
  - per-request routing via `msg.target` or configured route sources
88
117
  - read output selection for object / array / single value
89
- - metadata emission selection for `msg.slmp`: `full` / `minimal` / `off`
118
+ - metadata emission selection for `msg.slmp`
90
119
  - configurable error handling with throw / `msg.error` / second output
91
120
  - connection control via `connect` / `disconnect` / `reinitialize` messages
92
- - editor-side validation for connection ranges, literal addresses, literal updates, and route JSON
93
- - importable example flow under `examples/flows/`
94
- - Local tests for codec and high-level helpers
95
121
 
96
122
  Set `frame type` and `PLC series` explicitly for each connection.
97
123
 
98
- Validated PLC models:
124
+ ## Current Public Register Scope
125
+
126
+ - bit devices: `SM`, `X`, `Y`, `M`, `L`, `F`, `V`, `B`, `TS`, `TC`, `STS`, `STC`, `CS`, `CC`, `SB`, `DX`, `DY`
127
+ - word devices: `SD`, `D`, `W`, `TN`, `LTN`, `STN`, `LSTN`, `CN`, `LCN`, `SW`, `Z`, `R`, `ZR`, `RD`
128
+ - typed views: `:S`, `:D`, `:L`, `:F`
129
+ - string/count views: `,count`, `:STR`, `DSTR`
130
+ - word-bit view: `.bit`
131
+
132
+ Validated public hardware summary:
99
133
 
100
134
  - `FX5UC-32MT/D`
101
135
  - `Q06UDVCPU`
102
136
  - `R08CPU`
103
137
 
104
- ## Supported devices
105
-
106
- Supported bit devices:
107
-
108
- - `SM`, `X`, `Y`, `M`, `L`, `F`, `V`, `B`
109
- - `TS`, `TC`, `STS`, `STC`
110
- - `CS`, `CC`
111
- - `SB`, `DX`, `DY`
112
-
113
- Supported word devices:
114
-
115
- - `SD`, `D`, `W`
116
- - `TN`, `LTN`, `STN`, `LSTN`
117
- - `CN`, `LCN`
118
- - `SW`
119
- - `Z`
120
- - `R`, `ZR`, `RD`
121
-
122
- Address notes:
123
-
124
- - `X`, `Y`, `B`, `W`, `SB`, `SW`, `DX`, and `DY` use hexadecimal device numbers
125
- - most other devices use decimal numbers
126
- - word devices support `.bit`, for example `D50.3`
127
- - count and string forms work on supported devices, for example `D300,10`, `M1000,8`, and `DSTR320,10`
128
- - `LTN`, `LSTN`, and `LCN` default to 32-bit current-value access in the high-level nodes
129
- - future device support candidates such as `LTS`, `LTC`, `LSTS`, `LSTC`, `LCS`, `LCC`, `LZ`, `G`, and `HG` are tracked in the [Future Device Support list](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/TODO.md)
130
-
131
- ## Nodes
132
-
133
- ### `slmp-connection`
134
-
135
- Holds the transport and SLMP profile settings:
136
-
137
- - host / port
138
- - transport: `tcp` or `udp`
139
- - timeout in milliseconds
140
- - PLC series: `ql` or `iqr`
141
- - frame type: `3e` or `4e`
142
- - target routing fields
143
-
144
- ### `slmp-read`
145
-
146
- Reads one or more addresses and writes the result to `msg.payload`.
147
-
148
- Configured addresses can be overridden by:
149
-
150
- - `msg.addresses` as an array or string
151
- - `msg.payload` as an array or string
152
-
153
- Configured source modes:
154
-
155
- - literal editor text
156
- - `msg`
157
- - `flow`
158
- - `global`
159
- - `env`
160
-
161
- Examples:
162
-
163
- ```text
164
- D100
165
- D100,10
166
- D200:F
167
- D200:F,4
168
- D50.3
169
- M1000
170
- M1000,8
171
- D100:STR,10
172
- DSTR100,10
173
- ```
174
-
175
- Notes:
176
-
177
- - `,count` returns an array for numeric and direct-bit reads
178
- - `:STR,<length>` reads or writes a UTF-8 byte string packed two bytes per word
179
- - `DSTR100,10` is accepted as a compatibility alias for `D100:STR,10`
180
- - `LTN`, `LSTN`, and `LCN` use high-level 32-bit current values by default
181
- - when you send multiple addresses as a string, newline-separated input is the clearest form
182
- - per-request routing can be supplied as `msg.target`, `msg.slmp.target`, or a configured route source
183
- - metadata mode can keep full `msg.slmp`, emit only `target` plus `itemCount`, or leave `msg.slmp` unchanged
184
- - read errors can throw, attach to `msg.error`, or go to a second output
185
- - output can be object, array, or single value when one address is requested
186
- - send `msg.connect`, `msg.disconnect`, or `msg.reinitialize` as `true`, or use `msg.topic`, to control the shared connection
187
-
188
- ### `slmp-write`
189
-
190
- Writes one or more addresses.
191
-
192
- Preferred dynamic input:
193
-
194
- ```json
195
- {
196
- "D100": 42,
197
- "D100,3": [10, 11, 12],
198
- "D200:F": 3.14,
199
- "D200:F,2": [1.25, -2.5],
200
- "D50.3": true,
201
- "D100:STR,10": "HELLO"
202
- }
203
- ```
204
-
205
- Accepted sources:
206
-
207
- - `msg.updates`
208
- - `msg.payload`
209
- - `msg.address` + optional `msg.dtype` + `msg.value`
210
- - static JSON or `address=value` lines in the editor
211
- - configured `msg` / `flow` / `global` / `env` sources
212
-
213
- Write errors can throw, attach to `msg.error`, or go to a second output.
214
- Send `msg.connect`, `msg.disconnect`, or `msg.reinitialize` to control the shared connection from the write node too.
215
- Route overrides use the same `target` object shape as reads.
216
- Metadata mode can keep full `msg.slmp`, emit only `target` plus `itemCount`, or leave `msg.slmp` unchanged.
217
-
218
- ## Route overrides
219
-
220
- Use a `target` object when one request needs a different route than the shared connection default:
221
-
222
- ```json
223
- {
224
- "addresses": ["D300,4", "DSTR320,10"],
225
- "target": {
226
- "network": 0,
227
- "station": 255,
228
- "moduleIO": "03FF",
229
- "multidrop": 0
230
- }
231
- }
232
- ```
233
-
234
- The editor validates connection ranges, literal address lists, literal update payloads, and literal route JSON before save.
235
-
236
- ## Example flows
237
-
238
- Read:
239
-
240
- ```json
241
- {
242
- "addresses": ["D100", "D100,3", "D200:F", "D200:F,2", "D50.3", "D100:STR,10"]
243
- }
244
- ```
245
-
246
- Write:
247
-
248
- ```json
249
- {
250
- "payload": {
251
- "D100": 42,
252
- "D100,3": [10, 11, 12],
253
- "D50.3": true,
254
- "D100:STR,10": "HELLO"
255
- }
256
- }
257
- ```
258
-
259
- Import one of the ready-to-run flows under [examples/flows](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/examples/flows/README.md):
138
+ ## Example Flows
260
139
 
261
140
  - [`slmp-demo.json`](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/examples/flows/slmp-demo.json): combined demo
262
141
  - [`slmp-basic-read-write.json`](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/examples/flows/slmp-basic-read-write.json): scalar, float, and bit read/write over TCP
@@ -266,19 +145,13 @@ Import one of the ready-to-run flows under [examples/flows](https://github.com/f
266
145
  - [`slmp-routing.json`](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/examples/flows/slmp-routing.json): per-request routing with `msg.target`
267
146
  - [`slmp-udp-read-write.json`](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/examples/flows/slmp-udp-read-write.json): basic UDP read/write
268
147
 
269
- Recommended first import:
270
-
271
- - start with [`slmp-basic-read-write.json`](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/examples/flows/slmp-basic-read-write.json) if you only need to confirm a single PLC over TCP
272
- - use [`slmp-array-string.json`](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/examples/flows/slmp-array-string.json) when you want to validate `,count` and string handling immediately
273
- - use [`slmp-device-matrix.json`](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/examples/flows/slmp-device-matrix.json) when you need to step through the matrix catalog one by one from the high-level nodes and keep a persistent verification log
274
- - use [`slmp-control-error.json`](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/examples/flows/slmp-control-error.json) when you need `msg`-driven addresses, control messages, or second-output error routing
275
-
276
- ## Known limitations
148
+ ## Known Limitations
277
149
 
278
- - Set `frame type` and `PLC series` explicitly for each connection
150
+ - set `frame type` and `PLC series` explicitly for each connection
279
151
  - `.bit,count` is not supported
280
- - A single client connection keeps requests serialized by default
281
- - Future high-level device support candidates are tracked in the [Future Device Support list](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/blob/main/TODO.md)
152
+ - a single client connection keeps requests serialized by default
153
+ - the read and write nodes keep the caller-visible logical request shape and do not silently retry with a different fallback split semantics
154
+ - `LTS`, `LTC`, `LSTS`, `LSTC`, `LCS`, `LCC`, `LZ`, `G`, and `HG` are not part of the current public high-level register table
282
155
 
283
156
  ## Development
284
157
 
@@ -291,5 +164,5 @@ cmd /c npm.cmd test
291
164
  ## Notes
292
165
 
293
166
  - `.bit` notation is only valid for word devices such as `D50.3`
294
- - Direct bit devices should be addressed directly as `M1000`, `X1F`, `Y20`
295
- - Random read batching follows the Python helper layer for batchable word devices
167
+ - direct bit devices should be addressed directly as `M1000`, `X1F`, `Y20`
168
+ - random read batching follows the Python helper layer for batchable word devices
package/docsrc/index.md CHANGED
@@ -4,8 +4,8 @@ Documentation landing page for `@fa_yoshinobu/node-red-contrib-plc-comm-slmp`.
4
4
 
5
5
  - [Project README](../README.md)
6
6
  - [Changelog](../CHANGELOG.md)
7
- - [Future Device Support](../TODO.md)
7
+ - [Getting Started](user/GETTING_STARTED.md)
8
+ - [Supported PLC Registers](user/SUPPORTED_REGISTERS.md)
9
+ - [Latest Communication Verification](user/LATEST_COMMUNICATION_VERIFICATION.md)
8
10
  - [User Guide](user/USER_GUIDE.md)
9
11
  - [Example Flows](../examples/flows/README.md)
10
- - [Maintainer Notes](maintainer/ARCHITECTURE.md)
11
- - [Validation Reports](validation/reports/README.md)
@@ -0,0 +1,87 @@
1
+ # Getting Started
2
+
3
+ ## Start Here
4
+
5
+ Use this package when you want the shortest Node-RED path to Mitsubishi SLMP communication through the public high-level nodes.
6
+
7
+ Recommended first path:
8
+
9
+ 1. Install the package into your Node-RED user directory.
10
+ 2. Restart Node-RED.
11
+ 3. Add one `slmp-connection` config node.
12
+ 4. Set `host`, `port`, `transport`, `PLC series`, and `frame type`.
13
+ 5. Import `examples/flows/slmp-basic-read-write.json`.
14
+ 6. Replace the host and safe test addresses.
15
+ 7. Deploy and confirm that one `D` read succeeds.
16
+
17
+ ## First PLC Registers To Try
18
+
19
+ Start with these first:
20
+
21
+ - `D100`
22
+ - `D100,4`
23
+ - `D200:F`
24
+ - `D300:L`
25
+ - `D50.3`
26
+ - `M1000`
27
+
28
+ These stay on the public high-level surface and avoid the more complex routing and validation cases.
29
+
30
+ Do not start with these:
31
+
32
+ - `slmp-device-matrix.json`
33
+ - routed or multi-station requests
34
+ - future-tracked families such as `G`, `HG`, `LTS`, `LTC`, `LSTS`, `LSTC`, `LCS`, `LCC`, `LZ`
35
+
36
+ ## First Connection Checklist
37
+
38
+ Set these fields explicitly on `slmp-connection`:
39
+
40
+ - `host`
41
+ - `port`
42
+ - `transport`
43
+ - `PLC series`
44
+ - `frame type`
45
+ - timeout
46
+
47
+ If you do not already know a safe writable area, start with reads only.
48
+
49
+ ## First Successful Run
50
+
51
+ The easiest sequence is:
52
+
53
+ 1. Import `slmp-basic-read-write.json`.
54
+ 2. Use a safe word address such as `D100`.
55
+ 3. Deploy.
56
+ 4. Confirm that `msg.payload` returns a scalar word value.
57
+ 5. Move to `slmp-array-string.json` only after the first read is stable.
58
+
59
+ Expected result:
60
+
61
+ - the flow deploys without editor validation errors
62
+ - the read node returns a value in `msg.payload`
63
+ - the connection node remains stable across repeated injects
64
+
65
+ ## What To Try Next
66
+
67
+ After the basic flow succeeds:
68
+
69
+ - import `slmp-array-string.json` for `,count` and string handling
70
+ - use `slmp-udp-read-write.json` when you want to confirm UDP
71
+ - use `slmp-device-matrix.json` only when you need one-by-one coverage across the public matrix
72
+
73
+ ## Common Beginner Checks
74
+
75
+ If the first read fails, check these in order:
76
+
77
+ - correct `PLC series`
78
+ - correct `frame type`
79
+ - correct `tcp` or `udp` selection
80
+ - a simple `D` address instead of a typed, count, or string form
81
+ - editor validation messages before deploy
82
+
83
+ ## Next Pages
84
+
85
+ - [Supported PLC Registers](./SUPPORTED_REGISTERS.md)
86
+ - [Latest Communication Verification](./LATEST_COMMUNICATION_VERIFICATION.md)
87
+ - [User Guide](./USER_GUIDE.md)
@@ -0,0 +1,28 @@
1
+ # Latest Communication Verification
2
+
3
+ This page keeps the current public summary only. Older detailed notes are not kept in the public documentation set.
4
+
5
+ ## Current Retained Summary
6
+
7
+ - verified PLC models: `FX5UC-32MT/D`, `Q06UDVCPU`, `R08CPU`
8
+ - verified transports: `TCP`, `UDP`
9
+ - verified public nodes: `slmp-connection`, `slmp-read`, `slmp-write`
10
+ - retained first-run smoke path: `slmp-basic-read-write.json`
11
+
12
+ ## Confirmed Public Register Scope
13
+
14
+ - bit devices: `SM`, `X`, `Y`, `M`, `L`, `F`, `V`, `B`, `TS`, `TC`, `STS`, `STC`, `CS`, `CC`, `SB`, `DX`, `DY`
15
+ - word devices: `SD`, `D`, `W`, `TN`, `LTN`, `STN`, `LSTN`, `CN`, `LCN`, `SW`, `Z`, `R`, `ZR`, `RD`
16
+ - typed forms: `:S`, `:D`, `:L`, `:F`
17
+ - high-level special forms: `.bit`, `,count`, `:STR`, `DSTR`
18
+
19
+ ## Practical Cautions
20
+
21
+ - set `PLC series` and `frame type` explicitly for every connection
22
+ - start with `D` reads before using typed, counted, or string forms
23
+ - keep `slmp-device-matrix.json` for later verification, not for the first smoke test
24
+ - `.bit,count` is not part of the current public high-level surface
25
+
26
+ ## Where Older Evidence Went
27
+
28
+ Public historical report clutter was removed. Maintainer-only retained evidence now belongs under `internal_docs/`.
@@ -0,0 +1,81 @@
1
+ # Supported PLC Registers
2
+
3
+ This page is the canonical public register/device table for the Node-RED high-level nodes.
4
+
5
+ ## Supported Bit Devices
6
+
7
+ | Family | Kind | Example | Numbering |
8
+ | --- | --- | --- | --- |
9
+ | `SM` | bit | `SM400` | decimal |
10
+ | `X` | bit | `X20` | hexadecimal |
11
+ | `Y` | bit | `Y20` | hexadecimal |
12
+ | `M` | bit | `M1000` | decimal |
13
+ | `L` | bit | `L100` | decimal |
14
+ | `F` | bit | `F10` | decimal |
15
+ | `V` | bit | `V10` | decimal |
16
+ | `B` | bit | `B20` | hexadecimal |
17
+ | `TS` | bit | `TS10` | decimal |
18
+ | `TC` | bit | `TC10` | decimal |
19
+ | `STS` | bit | `STS10` | decimal |
20
+ | `STC` | bit | `STC10` | decimal |
21
+ | `CS` | bit | `CS10` | decimal |
22
+ | `CC` | bit | `CC10` | decimal |
23
+ | `SB` | bit | `SB20` | hexadecimal |
24
+ | `DX` | bit | `DX20` | hexadecimal |
25
+ | `DY` | bit | `DY20` | hexadecimal |
26
+
27
+ ## Supported Word Devices
28
+
29
+ | Family | Kind | Example | Numbering |
30
+ | --- | --- | --- | --- |
31
+ | `SD` | word | `SD100` | decimal |
32
+ | `D` | word | `D100` | decimal |
33
+ | `W` | word | `W20` | hexadecimal |
34
+ | `TN` | word | `TN10` | decimal |
35
+ | `LTN` | word | `LTN10` | decimal |
36
+ | `STN` | word | `STN10` | decimal |
37
+ | `LSTN` | word | `LSTN10` | decimal |
38
+ | `CN` | word | `CN10` | decimal |
39
+ | `LCN` | word | `LCN10` | decimal |
40
+ | `SW` | word | `SW20` | hexadecimal |
41
+ | `Z` | word | `Z10` | decimal |
42
+ | `R` | word | `R100` | decimal |
43
+ | `ZR` | word | `ZR100` | decimal |
44
+ | `RD` | word | `RD100` | decimal |
45
+
46
+ ## High-Level Address Forms
47
+
48
+ | Form | Example | Meaning |
49
+ | --- | --- | --- |
50
+ | plain word | `D100` | unsigned 16-bit word |
51
+ | signed view | `D100:S` | signed 16-bit value |
52
+ | dword view | `D200:D` | unsigned 32-bit value |
53
+ | long view | `D300:L` | signed 32-bit value |
54
+ | float view | `D200:F` | float32 value |
55
+ | bit in word | `D50.3` | one bit inside a word |
56
+ | counted word read | `D100,10` | 10 consecutive values |
57
+ | counted bit read | `M1000,8` | 8 consecutive bits |
58
+ | string view | `D100:STR,10` | UTF-8 string packed into words |
59
+ | compatibility alias | `DSTR100,10` | alias for `D100:STR,10` |
60
+
61
+ ## Addressing Notes
62
+
63
+ - Start with `D` for the first smoke test.
64
+ - `X`, `Y`, `B`, `W`, `SB`, `SW`, `DX`, and `DY` use hexadecimal device numbers.
65
+ - Most other families use decimal numbers.
66
+ - `.bit` is valid only on word devices such as `D50.3`.
67
+ - `LTN`, `LSTN`, and `LCN` default to 32-bit current-value access in the public high-level nodes.
68
+
69
+ ## Not Currently in the Public Surface
70
+
71
+ - `LTS`
72
+ - `LTC`
73
+ - `LSTS`
74
+ - `LSTC`
75
+ - `LCS`
76
+ - `LCC`
77
+ - `LZ`
78
+ - `G`
79
+ - `HG`
80
+
81
+ If a family is not listed above, do not treat it as publicly supported by the current Node-RED package.
@@ -31,6 +31,14 @@ If you are starting from the example flows in this repository, import these in t
31
31
  - [`slmp-control-error.json`](../../examples/flows/slmp-control-error.json)
32
32
  - [`slmp-udp-read-write.json`](../../examples/flows/slmp-udp-read-write.json)
33
33
 
34
+ Optional local runtime smoke test from the repository root:
35
+
36
+ ```bash
37
+ npm run smoke:editor
38
+ ```
39
+
40
+ The smoke script installs the local package into an isolated temporary userDir, starts a temporary Node-RED runtime, imports `slmp-basic-read-write.json`, checks that the flow starts, and then shuts the runtime down again.
41
+
34
42
  ## Available nodes
35
43
 
36
44
  - `slmp-connection`
@@ -113,6 +121,7 @@ Rules:
113
121
  - `DSTR100,10` is accepted as a compatibility alias for `D100:STR,10`
114
122
  - `.bit` stays scalar-only, so `.bit,count` is not supported
115
123
  - `LTN`, `LSTN`, and `LCN` use high-level 32-bit current values by default
124
+ - helper exports also include `normalizeAddress()`, `formatParsedAddress()`, and `normalizeAddressList()` for canonical address handling outside the editor UI
116
125
 
117
126
  ## Dynamic inputs
118
127
 
@@ -234,5 +243,6 @@ Recommended first import:
234
243
  - `.bit,count` is not supported
235
244
  - direct bit devices should be addressed directly as `M1000`, `X1F`, or `Y20`
236
245
  - a single client connection keeps requests serialized by default
246
+ - the read and write nodes keep the caller-visible logical request shape and do not silently switch to a different fallback split behavior
237
247
  - read/write errors can throw, attach to `msg.error`, or go to a second output
238
248
  - the editor validates connection ranges, literal address lists, literal update payloads, and literal route JSON before save
@@ -1,2 +1,8 @@
1
- - name: User Guide
2
- href: USER_GUIDE.md
1
+ - name: Getting Started
2
+ href: GETTING_STARTED.md
3
+ - name: Supported PLC Registers
4
+ href: SUPPORTED_REGISTERS.md
5
+ - name: Latest Communication Verification
6
+ href: LATEST_COMMUNICATION_VERIFICATION.md
7
+ - name: User Guide
8
+ href: USER_GUIDE.md
@@ -15,6 +15,16 @@ Start here:
15
15
  - [`slmp-device-matrix.json`](slmp-device-matrix.json) when you want one-by-one high-level coverage across the matrix catalog with persistent JSONL logging, pending tracking, and timeout detection
16
16
  - [`slmp-udp-read-write.json`](slmp-udp-read-write.json) when you need UDP first
17
17
 
18
+ Optional local runtime smoke test from the repository root:
19
+
20
+ ```bash
21
+ npm run smoke:editor
22
+ ```
23
+
24
+ This imports `slmp-basic-read-write.json` into an isolated temporary userDir and verifies that the temporary Node-RED runtime reaches `Started flows`.
25
+
26
+ Available flows:
27
+
18
28
  - [`slmp-demo.json`](slmp-demo.json): combined demo with control messages, array read, string read, and error second output
19
29
  - [`slmp-basic-read-write.json`](slmp-basic-read-write.json): basic TCP read and write with scalar, float, and word-bit examples
20
30
  - [`slmp-array-string.json`](slmp-array-string.json): TCP array and string read/write examples using `,count` and `DSTR`
@@ -22,3 +32,7 @@ Start here:
22
32
  - [`slmp-device-matrix.json`](slmp-device-matrix.json): one-by-one high-level read, write, and readback across the matrix catalog with completed-result history, run summary, and `logs/slmp-device-matrix-<session>.jsonl`
23
33
  - [`slmp-routing.json`](slmp-routing.json): per-request routing using `msg.lookup` and `msg.target`
24
34
  - [`slmp-udp-read-write.json`](slmp-udp-read-write.json): basic UDP read and write example
35
+
36
+ Notes:
37
+
38
+ - The flow nodes keep the caller-visible logical request shape and do not silently switch to a different fallback split behavior.