@mokouliszt/mel-device 0.3.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 +21 -0
- package/README.ja.md +216 -0
- package/README.md +216 -0
- package/dist/index.cjs +686 -0
- package/dist/index.d.ts +105 -0
- package/dist/index.js +14 -0
- package/docs/manual-evidence.md +136 -0
- package/package.json +57 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
export type MelSeries = "iQ-R" | "iQ-F" | "MX-R" | "MX-F" | "CR800" | "CR800-R" | "CR800-D" | "CR800-Q";
|
|
2
|
+
export type ValidationMode = "syntax" | "default" | "maximum" | "configured";
|
|
3
|
+
export type InputMode = "exact" | "friendly";
|
|
4
|
+
export type DeviceOperation = "read" | "write" | "either";
|
|
5
|
+
export type DeviceAccess = "read-write" | "read-only" | "configuration-dependent" | "not-evaluated";
|
|
6
|
+
|
|
7
|
+
export interface Cr800Features {
|
|
8
|
+
/** CR800-R/Q sequencer I/O unit direct control (parameter QXYREAD). */
|
|
9
|
+
qxyread?: boolean;
|
|
10
|
+
/** CPU/shared-memory extension (parameter IQMEM). */
|
|
11
|
+
iqmem?: boolean;
|
|
12
|
+
/** Sequencer device allocation (parameters DDEVVL1-DDEVVL32). */
|
|
13
|
+
ddevvl?: "disabled" | "program-external" | "status" | "mixed";
|
|
14
|
+
/** CR800-D parallel I/O unit is connected. */
|
|
15
|
+
parallelIoUnit?: boolean;
|
|
16
|
+
/** CR800-D parallel I/O interface is connected. */
|
|
17
|
+
parallelIoInterface?: boolean;
|
|
18
|
+
/** CR800-D GOT link is active. */
|
|
19
|
+
gotLink?: boolean;
|
|
20
|
+
/** CR800-D PROFIBUS option is connected. */
|
|
21
|
+
profibus?: boolean;
|
|
22
|
+
/** CR800-D CC-Link is active. */
|
|
23
|
+
ccLink?: boolean;
|
|
24
|
+
/** CR800-D CC-Link IE Field is active. */
|
|
25
|
+
ccLinkIef?: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface DeviceOptions {
|
|
29
|
+
series: MelSeries | string;
|
|
30
|
+
model?: string;
|
|
31
|
+
mode?: ValidationMode;
|
|
32
|
+
inputMode?: InputMode;
|
|
33
|
+
operation?: DeviceOperation;
|
|
34
|
+
configuredPoints?: Partial<Record<string, number>>;
|
|
35
|
+
/** Known CR800 feature states. Omitted properties are treated as unknown. */
|
|
36
|
+
cr800Features?: Cr800Features;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ParsedDevice {
|
|
40
|
+
kind: "direct" | "unit" | "cpu-buffer" | "link";
|
|
41
|
+
prefix: string;
|
|
42
|
+
notationPrefix?: string;
|
|
43
|
+
address: number;
|
|
44
|
+
addressText: string;
|
|
45
|
+
radix: 8 | 10 | 16;
|
|
46
|
+
input: string;
|
|
47
|
+
normalized: string;
|
|
48
|
+
local: boolean;
|
|
49
|
+
digit: number | null;
|
|
50
|
+
indirect: boolean;
|
|
51
|
+
bit: number | null;
|
|
52
|
+
index: { type: "Z" | "LZ"; number: number } | null;
|
|
53
|
+
indexOrder: "index-bit" | "bit-index" | "bit" | "index" | null;
|
|
54
|
+
timerPart?: "contact" | "coil" | "current";
|
|
55
|
+
unit?: number;
|
|
56
|
+
cpu?: number;
|
|
57
|
+
network?: number;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface DeviceAnalysis {
|
|
61
|
+
valid: boolean;
|
|
62
|
+
input: unknown;
|
|
63
|
+
normalized: string | null;
|
|
64
|
+
series: MelSeries | null;
|
|
65
|
+
model: string | null;
|
|
66
|
+
mode: ValidationMode | string;
|
|
67
|
+
code: string;
|
|
68
|
+
message: string;
|
|
69
|
+
configurationDependent: boolean;
|
|
70
|
+
operation?: DeviceOperation;
|
|
71
|
+
access?: DeviceAccess;
|
|
72
|
+
/** true/false when the requested read/write is known; null when not requested or configuration-dependent. */
|
|
73
|
+
operationAllowed?: boolean | null;
|
|
74
|
+
activeAllocations?: string[];
|
|
75
|
+
possibleAllocations?: string[];
|
|
76
|
+
warnings?: string[];
|
|
77
|
+
parsed?: ParsedDevice;
|
|
78
|
+
suggestedMode?: ValidationMode;
|
|
79
|
+
source: { manual: string; pages: number[] } | null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export class MelDeviceError extends Error {
|
|
83
|
+
code: string;
|
|
84
|
+
result: DeviceAnalysis;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function analyzeDevice(value: unknown, options: DeviceOptions): DeviceAnalysis;
|
|
88
|
+
export function isValidDevice(value: unknown, options: DeviceOptions): boolean;
|
|
89
|
+
export function assertValidDevice(value: unknown, options: DeviceOptions): DeviceAnalysis;
|
|
90
|
+
export function parseDevice(value: unknown, options: Pick<DeviceOptions, "series" | "inputMode">): ParsedDevice | null;
|
|
91
|
+
export function normalizeDevice(value: unknown): string | null;
|
|
92
|
+
export function normalizeModel(series: MelSeries | string, value?: unknown): string | null;
|
|
93
|
+
export function getSupportedModels(series: MelSeries | string): string[];
|
|
94
|
+
|
|
95
|
+
declare const api: {
|
|
96
|
+
MelDeviceError: typeof MelDeviceError;
|
|
97
|
+
analyzeDevice: typeof analyzeDevice;
|
|
98
|
+
assertValidDevice: typeof assertValidDevice;
|
|
99
|
+
getSupportedModels: typeof getSupportedModels;
|
|
100
|
+
isValidDevice: typeof isValidDevice;
|
|
101
|
+
normalizeDevice: typeof normalizeDevice;
|
|
102
|
+
normalizeModel: typeof normalizeModel;
|
|
103
|
+
parseDevice: typeof parseDevice;
|
|
104
|
+
};
|
|
105
|
+
export default api;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Manual evidence
|
|
2
|
+
|
|
3
|
+
このファイルは、実装時に使用したPDFと判定値の対応を示します。ページ番号はPDFビューアの通しページではなく、マニュアル本文の印刷ページです。
|
|
4
|
+
|
|
5
|
+
## 使用マニュアル
|
|
6
|
+
|
|
7
|
+
| シリーズ | マニュアル | 文書番号・版 | 主な参照ページ |
|
|
8
|
+
| --- | --- | --- | --- |
|
|
9
|
+
| iQ-R | MELSEC iQ-R シーケンサCPUユニットユーザーズマニュアル | SH-082487-J | 65(機種別デフォルト点数)、408(デバイス一覧)、409-410(点数設定・最大使用範囲)、435-436(インデックス修飾) |
|
|
10
|
+
| iQ-F | MELSEC iQ-F FX5ユーザーズマニュアル(応用編) | JY997D54301AF | 57(デバイス一覧)、69-70(インデックス)、76(割込みポインタ)、89(機種別使用範囲) |
|
|
11
|
+
| MX-R | MELSEC MXコントローラ MX-Rモデルユーザーズマニュアル | SH-082640-D | 350(デバイス一覧・デフォルト点数)、351-352(点数設定・最大使用範囲)、380-381(インデックス修飾) |
|
|
12
|
+
| MX-F | MELSEC MXコントローラ MX-Fモデルユーザーズマニュアル | SH-082633-E | 277(性能・デフォルト点数)、416(デバイス一覧)、417-418(点数設定・最大使用範囲) |
|
|
13
|
+
| CR800 | CR800シリーズコントローラ 機能と操作の詳細解説 | BFP-A3477-AB | 5-489~5-491(CPUバッファ対応)、6-618~6-619(シーケンサリンク)、6-654(対応デバイス一覧)、6-655~6-657(デバイス割付) |
|
|
14
|
+
|
|
15
|
+
## 基数
|
|
16
|
+
|
|
17
|
+
| シリーズ | 8進 | 16進 | 10進 |
|
|
18
|
+
| --- | --- | --- | --- |
|
|
19
|
+
| iQ-F | X, Y | B, SB, W, SW | その他の通常デバイス |
|
|
20
|
+
| iQ-R / MX-R / MX-F | - | X, Y, B, SB, W, SW, FX, FY | その他の通常デバイス |
|
|
21
|
+
|
|
22
|
+
この差により、iQ-Fの `X1777` は有効候補ですが `X1780` は構文エラーです。一方、iQ-R/MXのX/Yは16進です。
|
|
23
|
+
|
|
24
|
+
## iQ-F 機種別使用範囲
|
|
25
|
+
|
|
26
|
+
本文89ページの表をそのまま上限へ変換しています。
|
|
27
|
+
|
|
28
|
+
| 記号 | FX5S / FX5U / FX5UC | FX5UJ |
|
|
29
|
+
| --- | ---: | ---: |
|
|
30
|
+
| X, Y | 0-1777(8進) | 0-1777(8進) |
|
|
31
|
+
| M | 0-32767 | 0-7679 |
|
|
32
|
+
| B, SB | 0-7FFF(16進) | 0-7FF(16進) |
|
|
33
|
+
| F | 0-32767 | 0-127 |
|
|
34
|
+
| S | 0-4095 | 0-4095 |
|
|
35
|
+
| T | 0-1023 | 0-511 |
|
|
36
|
+
| ST | 0-1023 | 0-15 |
|
|
37
|
+
| C | 0-1023 | 0-255 |
|
|
38
|
+
| LC | 0-1023 | 0-63 |
|
|
39
|
+
| D | 0-7999 | 0-7999 |
|
|
40
|
+
| L | 0-32767 | 0-7679 |
|
|
41
|
+
| R / ER | 0-32767 | 0-32767 |
|
|
42
|
+
| W / SW | 0-7FFF(16進) | 0-3FF(16進) |
|
|
43
|
+
|
|
44
|
+
FX5Sは本文57ページの注記により `U\G` 非対応です。ERはSDメモリカード上のデバイスであり、FX5Sで使用する場合は本文の別記載どおりSDメモリカードユニットが必要なので、詳細判定は設定依存になります。
|
|
45
|
+
|
|
46
|
+
## iQ-R デフォルト差
|
|
47
|
+
|
|
48
|
+
本文65ページおよび408-409ページに基づき、R00/R01/R02とそれ以外を分離しています。
|
|
49
|
+
|
|
50
|
+
| 記号 | R00/R01/R02 | R04以上・ENCPU |
|
|
51
|
+
| --- | ---: | ---: |
|
|
52
|
+
| X, Y | 8K点 | 12K点 |
|
|
53
|
+
| M | 8K点 | 12K点 |
|
|
54
|
+
| T | 2K点 | 1K点 |
|
|
55
|
+
| LT | 0点 | 1K点 |
|
|
56
|
+
| C | 1K点 | 512点 |
|
|
57
|
+
| LC | 0点 | 512点 |
|
|
58
|
+
| D | 12K点 | 18K点 |
|
|
59
|
+
| BL | 128点 | 320点 |
|
|
60
|
+
|
|
61
|
+
B=8K、F=2K、SB=2K、V=2K、W=8K、SW=2K、L=8Kは共通です。S/ST/LST/R/ZR/TRのデフォルトは0点なので、`default` では無効、`maximum` または実際の `configuredPoints` を必要とします。
|
|
62
|
+
|
|
63
|
+
本文410ページの最大値は「R120CPU + 16MB拡張SRAMカセット」条件であり、ほかの型名にそのまま保証できません。そのため `maximum` の成功結果でも `configurationDependent: true` を返します。
|
|
64
|
+
|
|
65
|
+
## MX-R / MX-F
|
|
66
|
+
|
|
67
|
+
デフォルトの主な点数は両シリーズで M=64K、B=32K、F=2K、SB=2K、V=2K、T=1K、LT=4K、C/LC=512、D=64K、W=32K、SW=2K、L=8Kです。ST/LST/R/ZRはデフォルト0点です。MX-RのSM/SDは4496点、Iは1024点です。MX-FのSM/SDは10000点、Iは256点です。MX-RのPはMXR300がデフォルト8192点/最大16384点、MXR500がデフォルト16384点/最大32768点です。
|
|
68
|
+
|
|
69
|
+
最大使用範囲は次のとおりです。
|
|
70
|
+
|
|
71
|
+
| 記号 | MX-R | MX-F |
|
|
72
|
+
| --- | ---: | ---: |
|
|
73
|
+
| M | 0-167747583 | 0-67084287 |
|
|
74
|
+
| B / SB | 0-9FF9FFF(16進) | 0-3FF9FFF(16進) |
|
|
75
|
+
| T / ST / C | 0-9319295 | 0-3726879 |
|
|
76
|
+
| LT / LST | 0-2621055 | 0-1048191 |
|
|
77
|
+
| LC | 0-4933727 | 0-1973055 |
|
|
78
|
+
| D | 0-10484223 | 0-4192767 |
|
|
79
|
+
| W / SW | 0-9FF9FF(16進) | 0-3FF9FF(16進) |
|
|
80
|
+
|
|
81
|
+
両マニュアルとも、実際の最大値はグローバルラベル使用量で変化すると注記しています。
|
|
82
|
+
|
|
83
|
+
## 修飾表記
|
|
84
|
+
|
|
85
|
+
iQ-R本文436ページ、MX-R本文381ページ、MX-Fの同等節では、次の例が明示されています。
|
|
86
|
+
|
|
87
|
+
- `K4M100Z2`
|
|
88
|
+
- `D10Z2.0`
|
|
89
|
+
- `D10.8Z2`
|
|
90
|
+
- `@D10Z2`
|
|
91
|
+
- `@D10.8`
|
|
92
|
+
- `@D10Z2.8`
|
|
93
|
+
- `@D10.8Z2`
|
|
94
|
+
|
|
95
|
+
iQ-F本文69ページではZによる全デバイスのインデックス修飾、LZによる `U\G` の修飾が示されています。
|
|
96
|
+
|
|
97
|
+
## 意図的な保守性
|
|
98
|
+
|
|
99
|
+
- P/I/BL/TR等、マニュアルの一覧には存在しても通常の連続番号上限を十分に確定できない表記は、`syntax` では解析できますが、範囲モードでは根拠のない上限を推測しません。
|
|
100
|
+
- リンクダイレクトとユニットアクセスは、コントローラが扱える最大値だけでは装着ユニット/ネットワーク上の実在性を保証できないため、成功時も設定依存です。
|
|
101
|
+
- 特殊リレー・特殊レジスタは番号が範囲内でも、全番号に機能が割り当てられているとは限りません。本パッケージは「表記と領域の範囲」を判定し、個別のSM/SD用途までは判定しません。
|
|
102
|
+
- `maximum` は「その型名の無条件保証」ではなく、マニュアルに記載されたシリーズ側の変更可能上限です。厳密な実機判定には `configured` を使用してください。
|
|
103
|
+
|
|
104
|
+
## MELFA CR800-R/D/Q
|
|
105
|
+
|
|
106
|
+
取扱説明書の本文6.8.1には、GOTまたはSLMP対応機器からアクセスできるデバイス範囲は固定で、変更できないと明記されています。このためCR800では設定点数による拡張を認めません。
|
|
107
|
+
|
|
108
|
+
| モデル | X/Y(16進) | M(10進) | D(10進) | SM/SD(10進) | CPUメモリ(10進) |
|
|
109
|
+
| --- | --- | --- | --- | --- | --- |
|
|
110
|
+
| CR800-R | `0-FFF` | `0-18431` | `0-5119` | `0-4095` | `U3En\G0-524287`, `U3En\HG0-12287` |
|
|
111
|
+
| CR800-D | `0-1FFF` | 非対応 | `0-5119` | `0-4095` | `U3E0/U3E1\HG0-2047` |
|
|
112
|
+
| CR800-Q | `0-FFF` | `0-18431` | `0-5119` | `0-2047` | `U3En\G10000-24335` |
|
|
113
|
+
|
|
114
|
+
表6-11~6-13により、MはDタイプで指定不可、CPUバッファのHGはQタイプで指定不可です。5.2.1および6.2.2ではロボットCPU No.1~3を`U3E1`~`U3E3`としてアクセスする対応が明記されているため、R/Qタイプのnは0~3として扱います。Dタイプは表6-12にn=0,1と明記されています。
|
|
115
|
+
|
|
116
|
+
### デバイス割付とR/W属性
|
|
117
|
+
|
|
118
|
+
表6-14~6-16の注記に従い、機能が無効または未割付の範囲はR/W、機能が有効な範囲は表の属性で判定します。`cr800Features`が省略された機能は不明扱いです。
|
|
119
|
+
|
|
120
|
+
| モデル | 常時読出し専用 | 機能有効時に読出し専用 |
|
|
121
|
+
| --- | --- | --- |
|
|
122
|
+
| CR800-R | `X384-X38B`, `U3E1-U3E3\HG0-HG511` | QXYREAD: `X/Y0-FFF`; IQMEM: `U3E1-U3E3\HG512-HG1023`; DDEVVL状態変数: `D4096-D5119` |
|
|
123
|
+
| CR800-D | `X320-X327`, `X384-X38B`, `U3E1\HG0-HG511` | パラレルI/O/GOT/PROFIBUS/CC-Link系の表6-15記載範囲; IQMEM: `U3E1\HG512-HG1023`; DDEVVL状態変数: `D4096-D5119` |
|
|
124
|
+
| CR800-Q | `X384-X38B`, `U3E1-U3E3\G10000-G10511` | QXYREAD: `X/Y0-FFF`; DDEVVL状態変数: `D4096-D5119` |
|
|
125
|
+
|
|
126
|
+
`U3E0`側のシーケンサリンク/拡張領域はR/Wです。DDEVVLはプログラム外部変数ならR/W、状態変数ならRです。
|
|
127
|
+
|
|
128
|
+
### CR800-Q表6-16の不整合
|
|
129
|
+
|
|
130
|
+
表6-16の共有メモリ拡張機能には`U3En\G512-G1023 (n=1,2,3)`と印刷されています。しかし、次の記載と両立しません。
|
|
131
|
+
|
|
132
|
+
- 表6-13: CR800-Qの固定範囲は`U3En\G10000-G24335`
|
|
133
|
+
- 表5-3/5-4: CR800-QはRタイプのHGアドレスに10000を加えたGアドレスで対応
|
|
134
|
+
- 6.2.2/表6-4: `U3En\G10000-G10511`をロボットCPU No.nの領域として使用
|
|
135
|
+
|
|
136
|
+
このため`U3En\G512-G1023`は有効範囲へ追加しません。該当入力には`MANUAL_RANGE_CONFLICT`を返します。IQMEMの意図された読み出し側アドレスと考えられる`U3En\G10512-G11023`は固定範囲としては有効ですが、表記不整合が解消できないため、IQMEM有効時でもR属性を断定せず`configuration-dependent`とします。これはマニュアル間の矛盾を隠して推測値を確定しないための意図的な保守性です。
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mokouliszt/mel-device",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Model-aware Mitsubishi MELSEC and MELFA device notation validator.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "mokouliszt",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./dist/index.cjs",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"require": "./dist/index.cjs"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md",
|
|
21
|
+
"README.ja.md",
|
|
22
|
+
"LICENSE",
|
|
23
|
+
"docs/manual-evidence.md"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "node scripts/build.mjs",
|
|
27
|
+
"test": "npm run build && node --test",
|
|
28
|
+
"prepack": "npm test"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"mitsubishi",
|
|
32
|
+
"melsec",
|
|
33
|
+
"plc",
|
|
34
|
+
"device",
|
|
35
|
+
"iq-r",
|
|
36
|
+
"iq-f",
|
|
37
|
+
"mx-r",
|
|
38
|
+
"mx-f",
|
|
39
|
+
"cr800",
|
|
40
|
+
"melfa"
|
|
41
|
+
],
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=18"
|
|
44
|
+
},
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public"
|
|
47
|
+
},
|
|
48
|
+
"sideEffects": false,
|
|
49
|
+
"repository": {
|
|
50
|
+
"type": "git",
|
|
51
|
+
"url": "git+https://github.com/mokouliszt/mel-device.git"
|
|
52
|
+
},
|
|
53
|
+
"bugs": {
|
|
54
|
+
"url": "https://github.com/mokouliszt/mel-device/issues"
|
|
55
|
+
},
|
|
56
|
+
"homepage": "https://github.com/mokouliszt/mel-device#readme"
|
|
57
|
+
}
|