@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 +11 -0
- package/LICENSE +21 -21
- package/README.md +59 -186
- package/docsrc/index.md +3 -3
- package/docsrc/user/GETTING_STARTED.md +87 -0
- package/docsrc/user/LATEST_COMMUNICATION_VERIFICATION.md +28 -0
- package/docsrc/user/SUPPORTED_REGISTERS.md +81 -0
- package/docsrc/user/USER_GUIDE.md +10 -0
- package/docsrc/user/toc.yml +8 -2
- package/examples/flows/README.md +14 -0
- package/examples/flows/slmp-array-string.json +194 -184
- package/examples/flows/slmp-basic-read-write.json +194 -184
- package/examples/flows/slmp-control-error.json +216 -210
- package/examples/flows/slmp-demo.json +269 -259
- package/examples/flows/slmp-device-matrix.json +514 -514
- package/examples/flows/slmp-routing.json +123 -117
- package/examples/flows/slmp-udp-read-write.json +194 -184
- package/lib/slmp/client.js +227 -3
- package/lib/slmp/constants.js +4 -1
- package/lib/slmp/high-level.js +72 -10
- package/nodes/slmp-read.html +1 -0
- package/nodes/slmp-write.html +1 -0
- package/package.json +3 -2
- package/docsrc/maintainer/ARCHITECTURE.md +0 -36
- package/docsrc/validation/reports/README.md +0 -15
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
|
[](https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp/actions/workflows/ci.yml)
|
|
4
2
|
[](https://www.npmjs.com/package/@fa_yoshinobu/node-red-contrib-plc-comm-slmp)
|
|
5
3
|
[](https://www.npmjs.com/package/@fa_yoshinobu/node-red-contrib-plc-comm-slmp)
|
|
@@ -9,6 +7,8 @@
|
|
|
9
7
|

|
|
10
8
|

|
|
11
9
|
|
|
10
|
+
# Node-RED SLMP Nodes for Mitsubishi PLCs
|
|
11
|
+
|
|
12
12
|

|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
-
|
|
84
|
-
- `slmp-read`
|
|
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
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
-
|
|
150
|
+
- set `frame type` and `PLC series` explicitly for each connection
|
|
279
151
|
- `.bit,count` is not supported
|
|
280
|
-
-
|
|
281
|
-
-
|
|
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
|
-
-
|
|
295
|
-
-
|
|
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
|
-
- [
|
|
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
|
package/docsrc/user/toc.yml
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
- name:
|
|
2
|
-
|
|
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
|
package/examples/flows/README.md
CHANGED
|
@@ -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.
|