{"_id":"@ap-atiruj/node-red-contrib-mc-protocol","name":"@ap-atiruj/node-red-contrib-mc-protocol","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@ap-atiruj/node-red-contrib-mc-protocol","version":"1.0.0","description":"Node-RED nodes for Mitsubishi MC Protocol (MELSEC) — FX3, FX5, iQ-R, Q series — by AP Atiruj","keywords":["node-red","mitsubishi","mc-protocol","melsec","plc","fx5","iq-r","iiot"],"author":{"name":"AP Atiruj"},"license":"MIT","main":"dist/index.js","types":"dist/index.d.ts","node-red":{"version":">=3.0.0","nodes":{"mc-connection":"dist/nodes/mc-connection/mc-connection.js","mc-read":"dist/nodes/mc-read/mc-read.js","mc-write":"dist/nodes/mc-write/mc-write.js","mc-monitor":"dist/nodes/mc-monitor/mc-monitor.js"}},"scripts":{"build":"tsc -p tsconfig.build.json && npm run copy-html","copy-html":"copyfiles -u 1 \"src/nodes/**/*.html\" dist","build:watch":"tsc -p tsconfig.build.json --watch","clean":"rimraf dist","prebuild":"npm run clean","lint":"eslint \"src/**/*.ts\" \"test/**/*.ts\" --fix","lint:check":"eslint \"src/**/*.ts\" \"test/**/*.ts\"","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","test:unit":"jest --testPathPattern=test/unit","test:integration":"jest --testPathPattern=test/integration","type-check":"tsc --noEmit","prepare":"npm run build","prepublishOnly":"npm run build"},"devDependencies":{"@types/jest":"^29.5.12","@types/node":"^20.14.0","@typescript-eslint/eslint-plugin":"^7.13.0","@typescript-eslint/parser":"^7.13.0","copyfiles":"^2.4.1","eslint":"^8.57.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","jest":"^29.7.0","node-red":"^3.1.0","prettier":"^3.3.2","rimraf":"^5.0.7","ts-jest":"^29.1.5","typescript":"^5.4.5"},"peerDependencies":{"node-red":">=3.0.0"},"engines":{"node":">=18.0.0"},"repository":{"type":"git","url":"git+https://github.com/your-org/node-red-contrib-mc-protocol.git"},"publishConfig":{"access":"public"},"_id":"@ap-atiruj/node-red-contrib-mc-protocol@1.0.0","gitHead":"c976e4a16c312a15ba5f90303cae89d5ef8b18e8","bugs":{"url":"https://github.com/your-org/node-red-contrib-mc-protocol/issues"},"homepage":"https://github.com/your-org/node-red-contrib-mc-protocol#readme","_nodeVersion":"24.14.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-Cm9gidWAhpN32wicyK8ft8WqG/V/RUgRXrFfHzLDsrQKuRnvz1PuOJ0gl5wtYmVoBhN+JoFra6QMYiJo+e0iKQ==","shasum":"0af2b9afcd4917606834c35c57bf5ed7095834fe","tarball":"https://registry.npmjs.org/@ap-atiruj/node-red-contrib-mc-protocol/-/node-red-contrib-mc-protocol-1.0.0.tgz","fileCount":63,"unpackedSize":194346,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEzdhlwOG7x7eecaUW7SCKMisb/tha/Alwjj+4dpJVCMAiEAkw7wi+wJu/OgY3YWzA6sWAfKJ5slDXn1PUllBYSzruw="}]},"_npmUser":{"name":"ap-atiruj","email":"atiruj2911@gmail.com"},"directories":{},"maintainers":[{"name":"ap-atiruj","email":"atiruj2911@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/node-red-contrib-mc-protocol_1.0.0_1784739642777_0.6296629628247947"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-22T17:00:42.644Z","1.0.0":"2026-07-22T17:00:42.928Z","modified":"2026-07-22T17:00:43.134Z"},"maintainers":[{"name":"ap-atiruj","email":"atiruj2911@gmail.com"}],"description":"Node-RED nodes for Mitsubishi MC Protocol (MELSEC) — FX3, FX5, iQ-R, Q series — by AP Atiruj","homepage":"https://github.com/your-org/node-red-contrib-mc-protocol#readme","keywords":["node-red","mitsubishi","mc-protocol","melsec","plc","fx5","iq-r","iiot"],"repository":{"type":"git","url":"git+https://github.com/your-org/node-red-contrib-mc-protocol.git"},"author":{"name":"AP Atiruj"},"bugs":{"url":"https://github.com/your-org/node-red-contrib-mc-protocol/issues"},"license":"MIT","readme":"# node-red-contrib-mc-protocol\r\n\r\n[![CI](https://github.com/your-org/node-red-contrib-mc-protocol/actions/workflows/ci.yml/badge.svg)](https://github.com/your-org/node-red-contrib-mc-protocol/actions/workflows/ci.yml)\r\n[![npm version](https://badge.fury.io/js/node-red-contrib-mc-protocol.svg)](https://www.npmjs.com/package/node-red-contrib-mc-protocol)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\r\n\r\nProduction-grade Node-RED nodes for **Mitsubishi MC Protocol** (MELSEC Communication Protocol) over TCP/UDP.\r\n\r\nSupports **3E / 4E binary and ASCII** frame formats for direct device-level read/write access to MELSEC PLCs — no middleware required.\r\n\r\n---\r\n\r\n## Supported PLC Series\r\n\r\n| Series | Connection |\r\n|---|---|\r\n| MELSEC iQ-R | 3E / 4E Binary + ASCII |\r\n| MELSEC iQ-F (FX5) | 3E Binary + ASCII |\r\n| MELSEC Q series | 3E / 4E Binary + ASCII |\r\n| MELSEC L series | 3E Binary + ASCII |\r\n\r\n---\r\n\r\n## Nodes\r\n\r\n| Node | Description |\r\n|---|---|\r\n| `mc-connection` | Shared config node – manages TCP/UDP socket, auto-reconnect, keep-alive |\r\n| `mc-read` | Read consecutive device values (word / bit / dword) |\r\n| `mc-write` | Write consecutive device values |\r\n| `mc-batch-read` | Read multiple non-contiguous ranges in one operation |\r\n| `mc-batch-write` | Write multiple non-contiguous ranges in one operation |\r\n| `mc-monitor` | Poll devices at a configured interval; emit on change |\r\n\r\n---\r\n\r\n## Installation\r\n\r\n```bash\r\ncd ~/.node-red\r\nnpm install node-red-contrib-mc-protocol\r\n```\r\n\r\nRestart Node-RED after installation.\r\n\r\n> **Requirements:** Node.js ≥ 18, Node-RED ≥ 3.0\r\n\r\n---\r\n\r\n## Quick Start\r\n\r\n### 1. Configure the PLC connection\r\n\r\nAdd any MC Protocol node to the canvas → click the pencil icon beside **Connection** → fill in your PLC's IP, port, and frame type.\r\n\r\n### 2. Read D0–D9\r\n\r\n```\r\n[Inject] ──► [mc-read  D0 × 10 WORD] ──► [Debug]\r\n```\r\n\r\nThe debug node will receive:\r\n```json\r\n{ \"payload\": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], \"topic\": \"D0\" }\r\n```\r\n\r\n### 3. Write D100 = 42\r\n\r\n```\r\n[Inject 42] ──► [mc-write  D100 WORD] ──► [Debug]\r\n```\r\n\r\n### 4. Monitor M0–M15 every 500 ms\r\n\r\n```\r\n[mc-monitor  M0 × 16 BIT 500 ms] ──► [Debug]\r\n```\r\n\r\n---\r\n\r\n## Supported Devices\r\n\r\n| Symbol | Type | Access | Description |\r\n|---|---|---|---|\r\n| X | Input relay | Bit | Physical inputs |\r\n| Y | Output relay | Bit | Physical outputs |\r\n| M | Internal relay | Bit | General-purpose coils |\r\n| B | Link relay | Bit | MELSECNET link relay |\r\n| D | Data register | Word | General-purpose registers |\r\n| W | Link register | Word | MELSECNET link register |\r\n| R | File register | Word | Extended file register |\r\n| TN | Timer current | Word | Timer current value |\r\n| CN | Counter current | Word | Counter current value |\r\n| SM | Special relay | Bit | System status bits |\r\n| SD | Special register | Word | System status words |\r\n\r\n---\r\n\r\n## Connection Configuration\r\n\r\n| Property | Default | Description |\r\n|---|---|---|\r\n| Host | — | PLC IP address |\r\n| Port | 5007 | TCP/UDP port (5006 for ASCII) |\r\n| Transport | TCP | TCP or UDP |\r\n| Frame Type | 3E Binary | 3E_BINARY / 3E_ASCII / 4E_BINARY / 4E_ASCII |\r\n| Connect Timeout | 5000 ms | TCP connect timeout |\r\n| Request Timeout | 3000 ms | Per-request response timeout |\r\n| Auto Reconnect | true | Reconnect on disconnect |\r\n| Reconnect Interval | 5000 ms | Delay between reconnects |\r\n| Max Reconnect Attempts | 0 (∞) | 0 = unlimited |\r\n| Keep-Alive Interval | 0 (off) | Heartbeat ping interval |\r\n\r\n---\r\n\r\n## Dynamic Message Overrides\r\n\r\nDevice address, count, and values can be set dynamically via `msg`:\r\n\r\n```javascript\r\n// mc-read: override address at runtime\r\nmsg.payload = { device: 'D', address: 500, count: 10 };\r\n\r\n// mc-write: override address via topic\r\nmsg.topic = 'D200';\r\nmsg.payload = [1, 2, 3];\r\n```\r\n\r\n---\r\n\r\n## Development\r\n\r\n### Setup\r\n\r\n```bash\r\ngit clone https://github.com/your-org/node-red-contrib-mc-protocol.git\r\ncd node-red-contrib-mc-protocol\r\nnpm install\r\n```\r\n\r\n### Build\r\n\r\n```bash\r\nnpm run build          # compile TypeScript → dist/\r\nnpm run build:watch    # watch mode\r\n```\r\n\r\n### Test\r\n\r\n```bash\r\nnpm test               # all unit tests\r\nnpm run test:coverage  # with coverage report\r\nnpm run test:unit      # unit tests only\r\nnpm run test:integration  # requires MC_TEST_HOST env var\r\n```\r\n\r\n### Lint & Format\r\n\r\n```bash\r\nnpm run lint           # eslint + fix\r\nnpm run format         # prettier + fix\r\nnpm run type-check     # tsc --noEmit\r\n```\r\n\r\n### Integration Test Against a Live PLC\r\n\r\n```bash\r\nMC_TEST_HOST=192.168.1.1 MC_TEST_PORT=5007 npm run test:integration\r\n```\r\n\r\n---\r\n\r\n## Project Structure\r\n\r\n```\r\nnode-red-contrib-mc-protocol/\r\n├── src/\r\n│   ├── nodes/                    # Node-RED node implementations\r\n│   │   ├── mc-connection/        # Config node (TCP/UDP manager)\r\n│   │   ├── mc-read/              # Read node\r\n│   │   ├── mc-write/             # Write node\r\n│   │   ├── mc-batch-read/        # Batch read node\r\n│   │   ├── mc-batch-write/       # Batch write node\r\n│   │   └── mc-monitor/           # Polling monitor node\r\n│   ├── protocol/                 # Core protocol layer\r\n│   │   ├── types.ts              # All TypeScript types and enums\r\n│   │   ├── constants.ts          # Frame magic bytes, device codes, defaults\r\n│   │   ├── frame-builder.ts      # Request frame serialisation\r\n│   │   ├── frame-parser.ts       # Response frame deserialisation\r\n│   │   ├── connection-manager.ts # TCP/UDP socket + reconnect logic\r\n│   │   └── mc-protocol.ts        # High-level client API\r\n│   └── utils/\r\n│       ├── logger.ts             # Structured logger\r\n│       ├── retry.ts              # Exponential back-off retry\r\n│       └── validators.ts         # Input validation\r\n├── test/\r\n│   ├── unit/                     # Unit tests (no PLC required)\r\n│   ├── integration/              # Integration tests (live PLC)\r\n│   └── fixtures/                 # Pre-built frame buffers\r\n├── docs/\r\n│   ├── protocol/                 # MC Protocol reference\r\n│   ├── guides/                   # Getting started, configuration, nodes\r\n│   └── api/                      # Generated TypeDoc output\r\n├── examples/                     # Import-ready Node-RED flow JSON files\r\n└── .github/workflows/            # CI, publish, CodeQL\r\n```\r\n\r\n---\r\n\r\n## Contributing\r\n\r\n1. Fork and clone the repository.\r\n2. Create a feature branch from `develop`.\r\n3. Write code + tests (coverage ≥ 80%).\r\n4. Run `npm run lint && npm test && npm run build`.\r\n5. Open a Pull Request using the provided template.\r\n\r\nSee [CONTRIBUTING](docs/guides/contributing.md) for detailed guidelines.\r\n\r\n---\r\n\r\n## References\r\n\r\n- [MELSEC Communication Protocol Reference Manual (SH-080008)](https://www.mitsubishielectric.com)\r\n- [iQ-R MELSEC Communication Protocol Reference Manual (SH-081263ENG)](https://www.mitsubishielectric.com)\r\n- [FX5 MELSEC Communication Protocol Reference Manual (JY997D53401)](https://www.mitsubishielectric.com)\r\n\r\n---\r\n\r\n## License\r\n\r\n[MIT](LICENSE) © 2026 AP\r\n","readmeFilename":"README.md","_rev":"1-742208960f8af5001a071b724605b02e"}