nadesiko3-slmp 0.1.0
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/LICENSE +22 -0
- package/README.ja.md +164 -0
- package/README.md +164 -0
- package/examples/monitor.nako3 +15 -0
- package/examples/read.nako3 +19 -0
- package/examples/write.nako3 +18 -0
- package/nadesiko3-slmp.mjs +336 -0
- package/package.json +72 -0
- package/src/client.d.mts +164 -0
- package/src/client.mjs +265 -0
- package/src/constants.mjs +184 -0
- package/src/core.d.mts +257 -0
- package/src/core.mjs +622 -0
- package/src/errors.d.mts +53 -0
- package/src/errors.mjs +62 -0
- package/src/transport.mjs +177 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 mokouliszt (nadesiko3 port)
|
|
4
|
+
Copyright (c) 2026 fa-yoshinobu (original Python implementation: plc-comm-slmp-python)
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
package/README.ja.md
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# nadesiko3-slmp
|
|
2
|
+
|
|
3
|
+
[English](README.md) | **日本語**
|
|
4
|
+
|
|
5
|
+
日本語プログラミング言語[なでしこ3](https://nadesi.com/)から、三菱電機製シーケンサ(MELSEC)とSLMPバイナリ3E/4Eフレームで通信するプラグインです。なでしこのコードから直接PLCのデバイスを読み書きできます。
|
|
6
|
+
|
|
7
|
+
fa-yoshinobu氏の[plc-comm-slmp-python](https://github.com/fa-yoshinobu/plc-comm-slmp-python)(MIT)からの移植です。
|
|
8
|
+
|
|
9
|
+
```nako3
|
|
10
|
+
!「nadesiko3-slmp」を取り込む。
|
|
11
|
+
設定は{"ホスト":"192.168.3.39","ポート":5007,"機種":"melsec:iq-r"}
|
|
12
|
+
接続は、設定でSLMP接続。
|
|
13
|
+
値は、接続から「D100」を10だけSLMPワード読。
|
|
14
|
+
値を表示。
|
|
15
|
+
接続で[100,200,300]を「D100」にSLMPワード書。
|
|
16
|
+
接続をSLMP切断。
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 特徴
|
|
20
|
+
|
|
21
|
+
- **SLMPバイナリ3E/4Eフレーム**をTCP/UDPで送受信。フレーム種別は機種プロファイルから自動決定し、TCPストリームは応答データ長に従ってフレーム単位に再構成します
|
|
22
|
+
- **機種プロファイル14種**(iQ-R、iQ-F、iQ-L、MX-R/F、Q、L、QnU、QnUDV、および各Ethernetユニット構成)。機種を選ぶだけでフレーム種別・サブコマンド系列・デバイス番号の基数・1要求あたりの点数上限が決まります
|
|
23
|
+
- **デバイスコード41種**を基数込みで処理。`D`/`M`は10進、`X`/`Y`/`W`/`B`は16進、iQ-Fの`X`/`Y`は8進。機種が対応しないデバイスは送信前に弾きます
|
|
24
|
+
- **型付きアクセス**: 16ビットワード、ビット、符号なし/符号付き32ビット、IEEE 754単精度実数
|
|
25
|
+
- **CPU操作**: 形名読出、リモートRUN/STOP/PAUSE/RESET、エラークリア、自己診断(ループバック)
|
|
26
|
+
- **1接続あたりの要求は直列化**されるため、同じ接続に対する同時呼び出しでフレームが交錯しません
|
|
27
|
+
- ネイティブ依存なし。Node.js標準ライブラリのみで動作します
|
|
28
|
+
|
|
29
|
+
## 動作要件
|
|
30
|
+
|
|
31
|
+
- Node.js 18以降
|
|
32
|
+
- なでしこ3 3.6.0以降(`cnako3`で実行)
|
|
33
|
+
|
|
34
|
+
生のTCP/UDPソケットを使うため、**cnako(Node.js)専用**です。ブラウザ版(wnako)では動作しません。
|
|
35
|
+
|
|
36
|
+
## インストール
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm install nadesiko3-slmp
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
パッケージ名で取り込みます。
|
|
43
|
+
|
|
44
|
+
```nako3
|
|
45
|
+
!「nadesiko3-slmp」を取り込む。
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## TypeScript/Node.jsから直接使う
|
|
49
|
+
|
|
50
|
+
なでしこの命令は、プレーンな非同期クライアントの薄いラッパーです。型定義付きで別エントリポイントとして公開しています。
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { SlmpClient } from 'nadesiko3-slmp/client'
|
|
54
|
+
|
|
55
|
+
const client = new SlmpClient({ host: '192.168.3.39', port: 5007, plcProfile: 'melsec:iq-r' })
|
|
56
|
+
await client.connect()
|
|
57
|
+
const values = await client.readWords('D100', 10)
|
|
58
|
+
await client.writeWords('D100', [100, 200, 300])
|
|
59
|
+
await client.close()
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
まだクライアントで包んでいない要求を自分で組み立てるための低レベルなフレーム/デバイス関数は`nadesiko3-slmp/core`に、`instanceof`で判定するためのエラークラス(`SlmpTimeoutError`、`SlmpTransportError`、`SlmpNotConnectedError`、`SlmpUnsupportedDeviceError`など)は`nadesiko3-slmp/errors`にあります。3つのサブパスはいずれも`.d.mts`型定義を同梱しているため`@types`パッケージは不要ですが、`tsconfig.json`の`moduleResolution`は`bundler`・`node16`・`nodenext`のいずれかにしてください(従来の`node`解決はサブパスの`exports`より前の方式で、これらを見つけられません)。ルートのインポート(サブパスなしの`nadesiko3-slmp`)はなでしこ用プラグインオブジェクトそのもので、意図的に型を付けていません。`!「nadesiko3-slmp」を取り込む。`用の辞書ベースAPIであり、TypeScriptから`import`する対象ではないためです。
|
|
63
|
+
|
|
64
|
+
## 接続設定
|
|
65
|
+
|
|
66
|
+
`SLMP接続`には辞書を渡します。日本語キー・英語キーのどちらも使えます。
|
|
67
|
+
|
|
68
|
+
| キー | 別名 | 既定値 | 意味 |
|
|
69
|
+
| --- | --- | --- | --- |
|
|
70
|
+
| `ホスト` | `host` | (必須) | シーケンサのIPアドレスまたはホスト名 |
|
|
71
|
+
| `ポート` | `port` | (必須) | SLMPポート。通常5007 |
|
|
72
|
+
| `機種` | `plcProfile` | (必須) | 機種プロファイル。例: `melsec:iq-r` |
|
|
73
|
+
| `通信` | `transport` | `tcp` | `tcp` または `udp` |
|
|
74
|
+
| `タイムアウト` | `timeoutMs` | `3000` | 応答待ちのミリ秒 |
|
|
75
|
+
| `監視タイマ` | `monitoringTimer` | `4` | SLMPの監視タイマ(250ms単位) |
|
|
76
|
+
| `ネットワーク番号` | `network` | `0x00` | 要求先ネットワーク番号 |
|
|
77
|
+
| `局番` | `station` | `0xFF` | 要求先局番 |
|
|
78
|
+
| `ユニット番号` | `moduleIo` | `0x03FF` | 要求先ユニットI/O番号 |
|
|
79
|
+
| `マルチドロップ` | `multidrop` | `0x00` | マルチドロップ局番 |
|
|
80
|
+
|
|
81
|
+
指定できる機種は定数`SLMP機種一覧`で取得できます。
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
melsec:iq-f, melsec:iq-r, melsec:iq-r:rj71en71, melsec:iq-l,
|
|
85
|
+
melsec:mx-f, melsec:mx-r, melsec:mx-r:rj71en71,
|
|
86
|
+
melsec:qcpu:qj71e71-100, melsec:lcpu, melsec:lcpu:lj71e71-100,
|
|
87
|
+
melsec:qnu, melsec:qnu:qj71e71-100, melsec:qnudv, melsec:qnudv:qj71e71-100
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## 命令一覧
|
|
91
|
+
|
|
92
|
+
読み出しは接続を`から`、デバイスを`を`、点数を`だけ`で受けます。書き込みは接続を`で`、値を`を`、書き込み先デバイスを`に`で受けます。
|
|
93
|
+
|
|
94
|
+
### 接続
|
|
95
|
+
|
|
96
|
+
| 命令 | 例 |
|
|
97
|
+
| --- | --- |
|
|
98
|
+
| `SLMP接続` | `接続は、設定でSLMP接続` |
|
|
99
|
+
| `SLMP切断` | `接続をSLMP切断` |
|
|
100
|
+
| `SLMP接続中` | `もし、接続がSLMP接続中ならば` |
|
|
101
|
+
|
|
102
|
+
### 読み出し
|
|
103
|
+
|
|
104
|
+
| 命令 | 戻り値 | 例 |
|
|
105
|
+
| --- | --- | --- |
|
|
106
|
+
| `SLMPワード読` | 16ビット値の配列 | `接続から「D100」を10だけSLMPワード読` |
|
|
107
|
+
| `SLMPビット読` | オン/オフの配列 | `接続から「M0」を8だけSLMPビット読` |
|
|
108
|
+
| `SLMPダブルワード読` | 符号なし32ビットの配列 | `接続から「D300」を2だけSLMPダブルワード読` |
|
|
109
|
+
| `SLMP実数読` | 実数の配列 | `接続から「D400」を1だけSLMP実数読` |
|
|
110
|
+
| `SLMP整数読` | 符号付き16ビット値1点 | `接続から「D500」をSLMP整数読` |
|
|
111
|
+
| `SLMP倍長整数読` | 符号付き32ビット値1点 | `接続から「D502」をSLMP倍長整数読` |
|
|
112
|
+
|
|
113
|
+
### 書き込み
|
|
114
|
+
|
|
115
|
+
| 命令 | 例 |
|
|
116
|
+
| --- | --- |
|
|
117
|
+
| `SLMPワード書` | `接続で[100,200]を「D100」にSLMPワード書` |
|
|
118
|
+
| `SLMPビット書` | `接続で[オン,オフ]を「M0」にSLMPビット書` |
|
|
119
|
+
| `SLMPダブルワード書` | `接続で[123456]を「D300」にSLMPダブルワード書` |
|
|
120
|
+
| `SLMP実数書` | `接続で[36.5]を「D400」にSLMP実数書` |
|
|
121
|
+
|
|
122
|
+
### CPU操作・補助
|
|
123
|
+
|
|
124
|
+
| 命令 | 説明 |
|
|
125
|
+
| --- | --- |
|
|
126
|
+
| `SLMP形名取得` | CPU形名と形名コードを読み出す |
|
|
127
|
+
| `SLMPリモートRUN` / `SLMPリモートSTOP` / `SLMPリモートPAUSE` | リモート運転操作 |
|
|
128
|
+
| `SLMPリモートRESET` | リモートリセット(CPU側が切断するため再接続が必要) |
|
|
129
|
+
| `SLMPエラークリア` | CPUのエラーをクリアする |
|
|
130
|
+
| `SLMP自己診断` | ループバック試験。データはASCIIの`0-9`/`A-F`のみ |
|
|
131
|
+
| `SLMPデバイス確認` | 通信せずにデバイス表記を検査する |
|
|
132
|
+
| `SLMP機種情報取得` | 機種のフレーム種別と系列を返す |
|
|
133
|
+
| `SLMP統計取得` | 累計要求数と送受信バイト数 |
|
|
134
|
+
|
|
135
|
+
## 実機なしでの動作確認
|
|
136
|
+
|
|
137
|
+
[VirtualMelsecR](https://github.com/mokouliszt/VirtualMelsecR)はローカルでSLMP 3E/4Eを話す仮想MELSEC iQ-Rです。本リポジトリの例はすべてVirtualMelsecR相手に動作確認しています。
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
python -m virtualmelsecr --host 127.0.0.1 --port 5007
|
|
141
|
+
cnako3 examples/read.nako3
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
VirtualMelsecRが実装しているのは一括読み書き・ランダムアクセス・リモートRUN・形名読出です。未実装のコマンド(自己診断など)は終了コード`C059`が返り、本プラグインはそのコードを保持したエラーとして通知します。
|
|
145
|
+
|
|
146
|
+
単体テストはPLCを一切必要としません(モックサーバー同梱)。
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
npm test
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## 実装範囲
|
|
153
|
+
|
|
154
|
+
実装済み: デバイス一括読出(0x0401)、一括書込(0x1401)、形名読出(0x0101)、リモート操作(0x1001〜0x1006)、エラークリア(0x1617)、自己診断(0x0619)。
|
|
155
|
+
|
|
156
|
+
未実装: ランダムアクセス(0x0403 / 0x1402)、ブロックアクセス(0x0406 / 0x1406)、モニタ登録(0x0801 / 0x0802)、ラベルアクセス、拡張デバイス指定。コマンド表・サブコマンド表は実装済みのため、追加は差分のみで行えます。
|
|
157
|
+
|
|
158
|
+
## ライセンス
|
|
159
|
+
|
|
160
|
+
MIT。[LICENSE](LICENSE)を参照してください。
|
|
161
|
+
|
|
162
|
+
本プロジェクトは[plc-comm-slmp-python](https://github.com/fa-yoshinobu/plc-comm-slmp-python)(MIT, Copyright (c) 2026 fa-yoshinobu)の移植であり、原著作権表示を`LICENSE`に保持しています。
|
|
163
|
+
|
|
164
|
+
MELSECおよびSLMPは三菱電機株式会社の商標です。本プロジェクトは三菱電機とは無関係であり、同社による承認を受けたものではありません。
|
package/README.md
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# nadesiko3-slmp
|
|
2
|
+
|
|
3
|
+
**English** | [日本語](README.ja.md)
|
|
4
|
+
|
|
5
|
+
An SLMP plugin for [nadesiko3](https://nadesi.com/), the Japanese-language programming language. It talks to MITSUBISHI ELECTRIC MELSEC programmable controllers over SLMP binary 3E/4E frames, so a PLC can be read and written directly from nadesiko code.
|
|
6
|
+
|
|
7
|
+
Ported from [plc-comm-slmp-python](https://github.com/fa-yoshinobu/plc-comm-slmp-python) by fa-yoshinobu (MIT).
|
|
8
|
+
|
|
9
|
+
```nako3
|
|
10
|
+
!「nadesiko3-slmp」を取り込む。
|
|
11
|
+
設定は{"ホスト":"192.168.3.39","ポート":5007,"機種":"melsec:iq-r"}
|
|
12
|
+
接続は、設定でSLMP接続。
|
|
13
|
+
値は、接続から「D100」を10だけSLMPワード読。
|
|
14
|
+
値を表示。
|
|
15
|
+
接続で[100,200,300]を「D100」にSLMPワード書。
|
|
16
|
+
接続をSLMP切断。
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Features
|
|
20
|
+
|
|
21
|
+
- **SLMP binary 3E and 4E frames** over TCP or UDP. The frame type is chosen from the PLC profile, and TCP streams are reassembled by the declared response length
|
|
22
|
+
- **14 PLC profiles** (iQ-R, iQ-F, iQ-L, MX-R/F, Q, L, QnU, QnUDV, and Ethernet module variants). Selecting a profile sets the frame type, the subcommand series, the device number radix, and the per-request point limits
|
|
23
|
+
- **41 device codes** with correct radix handling — `D`/`M` decimal, `X`/`Y`/`W`/`B` hexadecimal, and `X`/`Y` octal on iQ-F. Devices a profile does not support are rejected before a frame is sent
|
|
24
|
+
- **Typed access**: 16-bit words, bits, unsigned/signed 32-bit values, and IEEE 754 single-precision floats
|
|
25
|
+
- **CPU operations**: read type name, remote RUN / STOP / PAUSE / RESET, clear error, and the loopback self test
|
|
26
|
+
- **Requests are serialized per connection**, so concurrent nadesiko calls on one handle cannot interleave frames
|
|
27
|
+
- No native dependencies. Node.js standard library only
|
|
28
|
+
|
|
29
|
+
## Requirements
|
|
30
|
+
|
|
31
|
+
- Node.js 18 or later
|
|
32
|
+
- nadesiko3 3.6.0 or later, run through `cnako3`
|
|
33
|
+
|
|
34
|
+
The plugin needs raw TCP/UDP sockets, so it runs on **cnako (Node.js) only**. It cannot run in a browser (wnako).
|
|
35
|
+
|
|
36
|
+
## Install
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm install nadesiko3-slmp
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Then import it by package name:
|
|
43
|
+
|
|
44
|
+
```nako3
|
|
45
|
+
!「nadesiko3-slmp」を取り込む。
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Using it from TypeScript / Node.js directly
|
|
49
|
+
|
|
50
|
+
The nadesiko commands are a thin wrapper over a plain async client, exported separately with full type declarations:
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { SlmpClient } from 'nadesiko3-slmp/client'
|
|
54
|
+
|
|
55
|
+
const client = new SlmpClient({ host: '192.168.3.39', port: 5007, plcProfile: 'melsec:iq-r' })
|
|
56
|
+
await client.connect()
|
|
57
|
+
const values = await client.readWords('D100', 10)
|
|
58
|
+
await client.writeWords('D100', [100, 200, 300])
|
|
59
|
+
await client.close()
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Low-level frame/device builders (for requests the client doesn't wrap yet) are at `nadesiko3-slmp/core`, and the error classes for `instanceof` checks (`SlmpTimeoutError`, `SlmpTransportError`, `SlmpNotConnectedError`, `SlmpUnsupportedDeviceError`, ...) are at `nadesiko3-slmp/errors`. All three subpaths ship `.d.mts` declarations, so no `@types` package is needed — only `"moduleResolution": "bundler"`, `"node16"`, or `"nodenext"` in your `tsconfig.json` (the classic `"node"` resolution predates package subpath `exports` and won't see them). The root import (`nadesiko3-slmp`, no subpath) is the nadesiko plugin object and is intentionally untyped — it's a dictionary-driven API meant for `!「nadesiko3-slmp」を取り込む。`, not for `import` from TypeScript.
|
|
63
|
+
|
|
64
|
+
## Connection settings
|
|
65
|
+
|
|
66
|
+
`SLMP接続` takes a dictionary. Japanese and English keys are both accepted.
|
|
67
|
+
|
|
68
|
+
| Key | Alias | Default | Meaning |
|
|
69
|
+
| --- | --- | --- | --- |
|
|
70
|
+
| `ホスト` | `host` | (required) | PLC IP address or host name |
|
|
71
|
+
| `ポート` | `port` | (required) | SLMP port, commonly 5007 |
|
|
72
|
+
| `機種` | `plcProfile` | (required) | PLC profile, e.g. `melsec:iq-r` |
|
|
73
|
+
| `通信` | `transport` | `tcp` | `tcp` or `udp` |
|
|
74
|
+
| `タイムアウト` | `timeoutMs` | `3000` | Response timeout in milliseconds |
|
|
75
|
+
| `監視タイマ` | `monitoringTimer` | `4` | SLMP monitoring timer, in 250 ms units |
|
|
76
|
+
| `ネットワーク番号` | `network` | `0x00` | Request destination network number |
|
|
77
|
+
| `局番` | `station` | `0xFF` | Request destination station number |
|
|
78
|
+
| `ユニット番号` | `moduleIo` | `0x03FF` | Request destination module I/O number |
|
|
79
|
+
| `マルチドロップ` | `multidrop` | `0x00` | Multidrop station number |
|
|
80
|
+
|
|
81
|
+
Available profiles are listed in the constant `SLMP機種一覧`:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
melsec:iq-f, melsec:iq-r, melsec:iq-r:rj71en71, melsec:iq-l,
|
|
85
|
+
melsec:mx-f, melsec:mx-r, melsec:mx-r:rj71en71,
|
|
86
|
+
melsec:qcpu:qj71e71-100, melsec:lcpu, melsec:lcpu:lj71e71-100,
|
|
87
|
+
melsec:qnu, melsec:qnu:qj71e71-100, melsec:qnudv, melsec:qnudv:qj71e71-100
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Commands
|
|
91
|
+
|
|
92
|
+
Reads take the connection with `から`, the device with `を`, and the point count with `だけ`. Writes take the connection with `で`, the values with `を`, and the destination device with `に`.
|
|
93
|
+
|
|
94
|
+
### Connection
|
|
95
|
+
|
|
96
|
+
| Command | Example |
|
|
97
|
+
| --- | --- |
|
|
98
|
+
| `SLMP接続` | `接続は、設定でSLMP接続` |
|
|
99
|
+
| `SLMP切断` | `接続をSLMP切断` |
|
|
100
|
+
| `SLMP接続中` | `もし、接続がSLMP接続中ならば` |
|
|
101
|
+
|
|
102
|
+
### Reading
|
|
103
|
+
|
|
104
|
+
| Command | Returns | Example |
|
|
105
|
+
| --- | --- | --- |
|
|
106
|
+
| `SLMPワード読` | array of 16-bit values | `接続から「D100」を10だけSLMPワード読` |
|
|
107
|
+
| `SLMPビット読` | array of on/off | `接続から「M0」を8だけSLMPビット読` |
|
|
108
|
+
| `SLMPダブルワード読` | array of unsigned 32-bit | `接続から「D300」を2だけSLMPダブルワード読` |
|
|
109
|
+
| `SLMP実数読` | array of floats | `接続から「D400」を1だけSLMP実数読` |
|
|
110
|
+
| `SLMP整数読` | one signed 16-bit value | `接続から「D500」をSLMP整数読` |
|
|
111
|
+
| `SLMP倍長整数読` | one signed 32-bit value | `接続から「D502」をSLMP倍長整数読` |
|
|
112
|
+
|
|
113
|
+
### Writing
|
|
114
|
+
|
|
115
|
+
| Command | Example |
|
|
116
|
+
| --- | --- |
|
|
117
|
+
| `SLMPワード書` | `接続で[100,200]を「D100」にSLMPワード書` |
|
|
118
|
+
| `SLMPビット書` | `接続で[オン,オフ]を「M0」にSLMPビット書` |
|
|
119
|
+
| `SLMPダブルワード書` | `接続で[123456]を「D300」にSLMPダブルワード書` |
|
|
120
|
+
| `SLMP実数書` | `接続で[36.5]を「D400」にSLMP実数書` |
|
|
121
|
+
|
|
122
|
+
### CPU operations and helpers
|
|
123
|
+
|
|
124
|
+
| Command | Description |
|
|
125
|
+
| --- | --- |
|
|
126
|
+
| `SLMP形名取得` | Reads the CPU model name and model code |
|
|
127
|
+
| `SLMPリモートRUN` / `SLMPリモートSTOP` / `SLMPリモートPAUSE` | Remote control |
|
|
128
|
+
| `SLMPリモートRESET` | Remote reset (the CPU drops the connection, so reconnect afterwards) |
|
|
129
|
+
| `SLMPエラークリア` | Clears the CPU error |
|
|
130
|
+
| `SLMP自己診断` | Loopback test; the payload must be ASCII `0-9` / `A-F` |
|
|
131
|
+
| `SLMPデバイス確認` | Validates a device string without communicating |
|
|
132
|
+
| `SLMP機種情報取得` | Returns the frame type and series of a profile |
|
|
133
|
+
| `SLMP統計取得` | Lifetime request count and byte counters |
|
|
134
|
+
|
|
135
|
+
## Testing without hardware
|
|
136
|
+
|
|
137
|
+
[VirtualMelsecR](https://github.com/mokouliszt/VirtualMelsecR) is a virtual MELSEC iQ-R that speaks SLMP 3E/4E on localhost. Every example in this repository was verified against it.
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
python -m virtualmelsecr --host 127.0.0.1 --port 5007
|
|
141
|
+
cnako3 examples/read.nako3
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
VirtualMelsecR implements batch read/write, random access, remote RUN and read type name. Commands it does not implement — the self test, for instance — come back as end code `C059`, which the plugin surfaces as an error carrying that code.
|
|
145
|
+
|
|
146
|
+
The unit tests need no PLC at all — an in-process mock server is included.
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
npm test
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Scope
|
|
153
|
+
|
|
154
|
+
Implemented: Device Read (0x0401), Device Write (0x1401), Read Type Name (0x0101), remote control (0x1001-0x1006), Clear Error (0x1617), and Self Test (0x0619).
|
|
155
|
+
|
|
156
|
+
Not implemented yet: random access (0x0403 / 0x1402), block access (0x0406 / 0x1406), monitor registration (0x0801 / 0x0802), label access, and extended device specification. The underlying command and subcommand tables are already in place, so these are additive.
|
|
157
|
+
|
|
158
|
+
## License
|
|
159
|
+
|
|
160
|
+
MIT. See [LICENSE](LICENSE).
|
|
161
|
+
|
|
162
|
+
This project is a port of [plc-comm-slmp-python](https://github.com/fa-yoshinobu/plc-comm-slmp-python) (MIT, Copyright (c) 2026 fa-yoshinobu). The original copyright notice is retained in `LICENSE`.
|
|
163
|
+
|
|
164
|
+
MELSEC and SLMP are trademarks of Mitsubishi Electric Corporation. This project is not affiliated with or endorsed by Mitsubishi Electric.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# 1秒周期でデバイスを監視する例
|
|
2
|
+
!「nadesiko3-slmp」を取り込む。
|
|
3
|
+
|
|
4
|
+
設定は{"ホスト":"192.168.3.39","ポート":5007,"機種":"melsec:iq-r","タイムアウト":2000}
|
|
5
|
+
接続は、設定でSLMP接続。
|
|
6
|
+
|
|
7
|
+
10回
|
|
8
|
+
値は、接続から「D100」を4だけSLMPワード読。
|
|
9
|
+
「{今時刻} D100〜D103 = {値}」と表示。
|
|
10
|
+
1秒待つ。
|
|
11
|
+
ここまで。
|
|
12
|
+
|
|
13
|
+
統計は、接続のSLMP統計取得。
|
|
14
|
+
「要求数={統計@"要求数"} 送信={統計@"送信バイト数"}B 受信={統計@"受信バイト数"}B」と表示。
|
|
15
|
+
接続をSLMP切断。
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# デバイスの読み出し例
|
|
2
|
+
!「nadesiko3-slmp」を取り込む。
|
|
3
|
+
|
|
4
|
+
設定は{"ホスト":"192.168.3.39","ポート":5007,"機種":"melsec:iq-r"}
|
|
5
|
+
接続は、設定でSLMP接続。
|
|
6
|
+
|
|
7
|
+
値は、接続から「D100」を10だけSLMPワード読。
|
|
8
|
+
「D100〜D109 = {値}」と表示。
|
|
9
|
+
|
|
10
|
+
状態は、接続から「M0」を8だけSLMPビット読。
|
|
11
|
+
「M0〜M7 = {状態}」と表示。
|
|
12
|
+
|
|
13
|
+
温度は、接続から「D200」を1だけSLMP実数読。
|
|
14
|
+
「D200(実数) = {温度[0]}」と表示。
|
|
15
|
+
|
|
16
|
+
情報は、接続のSLMP形名取得。
|
|
17
|
+
「CPU形名 = {情報@"形名"}」と表示。
|
|
18
|
+
|
|
19
|
+
接続をSLMP切断。
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# デバイスの書き込み例
|
|
2
|
+
!「nadesiko3-slmp」を取り込む。
|
|
3
|
+
|
|
4
|
+
設定は{"ホスト":"192.168.3.39","ポート":5007,"機種":"melsec:iq-r"}
|
|
5
|
+
接続は、設定でSLMP接続。
|
|
6
|
+
|
|
7
|
+
# ワード書き込み
|
|
8
|
+
接続で[100,200,300]を「D100」にSLMPワード書。
|
|
9
|
+
|
|
10
|
+
# ビット書き込み
|
|
11
|
+
接続で[オン,オフ,オン]を「M0」にSLMPビット書。
|
|
12
|
+
|
|
13
|
+
# 32ビット値・実数
|
|
14
|
+
接続で[123456]を「D300」にSLMPダブルワード書。
|
|
15
|
+
接続で[36.5]を「D400」にSLMP実数書。
|
|
16
|
+
|
|
17
|
+
「書き込み完了」と表示。
|
|
18
|
+
接続をSLMP切断。
|