node-red-tienho-mcprotocol 2.0.0
Node-RED nodes to read from & write to MITSUBISHI MELSEC PLCs over Ethernet using MC Protocol (1E/3E/4E, TCP/UDP)
node-red-tienho-mcprotocol
Node-RED nodes để đọc/ghi trực tiếp PLC MITSUBISHI MELSEC qua Ethernet bằng MC Protocol.
Node-RED nodes to read from and write to MITSUBISHI MELSEC PLCs over Ethernet using MC Protocol. Supports frames 1E/3E/4E, TCP and UDP, A/QnA/Q/L/R series. Bản 2.0 chạy được trên Node.js 20/22/24 và đã sửa các lỗi làm dừng cả Node-RED.
Mục lục
- Tính năng
- Yêu cầu
- Cài đặt
- Nâng cấp từ bản cũ
- Bắt đầu nhanh
- Node: Ind MC Protocol Connection
- Node: Ind MC Read
- Node: Ind MC Write
- Cú pháp địa chỉ
- Điều khiển kết nối bằng msg
- Xử lý lỗi
- Cấu hình phía PLC
- Khắc phục sự cố
- Ghi chú về độ ổn định
- Bản quyền
Tính năng
- Kết nối TCP và UDP
- Frame 1E, 3E, 4E
- Dòng PLC: A (chỉ 1E), QnA, Q, L, R
- Chế độ BINARY và ASCII (ASCII chỉ dùng được với frame 1E)
- Đọc/ghi bit, word, dword, float, string, mảng
- Số hiệu thiết bị theo đúng hệ mà GX Works hiển thị (X/Y/B/W hệ 16, D/M/R hệ 10)
- Một kết nối dùng chung cho nhiều node đọc/ghi (đếm tham chiếu)
- Tự kết nối lại với backoff luỹ tiến khi mất kết nối
Khuyến nghị: nếu PLC hỗ trợ UDP + 4E, đây là tổ hợp ổn định nhất.
Yêu cầu
| Thành phần | Phiên bản |
|---|---|
| Node.js | >= 14 (đã kiểm thử tới v24) |
| Node-RED | >= 2.0 |
Không có dependency ngoài — thư viện mcprotocol được kèm sẵn trong package.
Cài đặt
Cách 1 — qua Node-RED (khuyến nghị)
Menu → Manage palette → Install → tìm node-red-tienho-mcprotocol → Install.
Cách 2 — qua npm
cd ~/.node-red && npm install node-red-tienho-mcprotocol
Trên Windows:
cd %USERPROFILE%\.node-red && npm install node-red-tienho-mcprotocol
Khởi động lại Node-RED sau khi cài. Các node xuất hiện trong palette ở nhóm MITSUBISHI.
Nâng cấp từ bản cũ
Nếu đang dùng node-red-contrib-mcprotocol hoặc node-red-contrib-mcprotocol-ind,
gỡ bản cũ trước để tránh trùng tên node trong palette:
cd ~/.node-red && npm uninstall node-red-contrib-mcprotocol-ind && npm install node-red-tienho-mcprotocol
Tên node giữ nguyên (Ind MC Read, Ind MC Write, Ind MC Protocol Connection)
nên flow hiện có chạy lại được ngay, không cần sửa gì.
Xem CHANGELOG.md để biết chi tiết những gì đã sửa ở 2.0.
Bắt đầu nhanh
- Kéo node Ind MC Read vào flow.
- Mở node, bấm biểu tượng bút chì cạnh Connection để tạo cấu hình kết nối mới.
- Điền Host (IP của PLC), Port, chọn Protocol, Frame, PLC type đúng như cài đặt trong GX Works.
- Ở ô Address điền ví dụ
D100,10(đọc 10 word từ D100). - Nối một node inject vào đầu vào và một node debug vào đầu ra, rồi Deploy.
- Mỗi lần inject là một lần đọc PLC.
Trong Node-RED có flow mẫu sẵn: menu → Import → Examples → node-red-tienho-mcprotocol.
Node: Ind MC Protocol Connection
Node cấu hình, mô tả một kết nối tới PLC. Nhiều node Read/Write trỏ vào cùng một cấu hình sẽ dùng chung một socket.
| Thuộc tính | Mặc định | Mô tả |
|---|---|---|
| Host | — | IP hoặc hostname của PLC |
| Port | — | Cổng đã mở trên module Ethernet của PLC |
| Protocol | TCP | TCP hoặc UDP |
| Frame | 3E | 1E, 3E, 4E |
| PLC type | Q | A, QnA, Q, L, R |
| ASCII | false | Bật nếu PLC cấu hình ở chế độ ASCII (chỉ frame 1E) |
| Timeout | 1000 | Thời gian chờ phản hồi (ms) — cũng là timeout của node Read/Write |
| PLC station | 0 | Số station của PLC đích |
| PC station | 255 (0xFF) | Số station của phía PC |
| PLC module No | 1023 (0x3FF) | Số I/O module đích |
| Network | 0 | Số network |
| Octal input/output | false | Hiện không có tác dụng — bộ phân giải địa chỉ trong bản này luôn dùng hệ số của từng thiết bị (xem Cú pháp địa chỉ). Giữ nguyên mặc định |
Node: Ind MC Read
Mỗi msg vào là một lần đọc. Node bỏ qua msg mới nếu lần đọc trước chưa xong (không xếp hàng chờ).
Cấu hình
| Thuộc tính | Mô tả |
|---|---|
| Address | Địa chỉ cần đọc. Nhận giá trị tĩnh (str) hoặc lấy động từ msg/flow/global/env |
| Output format | JSON Object (khoá là địa chỉ) hoặc Array (chỉ mảng giá trị) |
| Errors | Cách báo lỗi — xem Xử lý lỗi |
Đầu ra
msg.payload— giá trị đọc được, hoặcnullnếu lỗimsg.mcReadDetails— chi tiết:request,response,timeout,error
Ví dụ với Address = D100,5, Output format = JSON Object:
{
"D100": 1000, "D101": 1001, "D102": 1002, "D103": 1003, "D104": 1004
}
Cùng địa chỉ đó với Output format = Array:
[1000, 1001, 1002, 1003, 1004]
Node: Ind MC Write
Cấu hình
| Thuộc tính | Mô tả |
|---|---|
| Address | Địa chỉ cần ghi (tĩnh hoặc động như node Read) |
| Data | Giá trị cần ghi. num, str, csv, hoặc lấy từ msg/flow/global |
| Errors | Cách báo lỗi |
Đầu ra
msg.payload—truenếu ghi thành công,falsenếu chất lượng dữ liệu xấumsg.mcWriteDetails— chi tiết kết quả ghi
Ví dụ
| Address | Data | Kết quả |
|---|---|---|
D100 |
1234 |
Ghi 1234 vào D100 |
D100,3 |
[1,2,3] |
Ghi 3 word từ D100 |
M0,8 |
[true,false,true,true,false,false,true,false] |
Ghi 8 bit từ M0 |
DSTR100,10 |
"HELLO" |
Ghi chuỗi (tối đa 10 ký tự) từ D100 |
DFLOAT200 |
3.14 |
Ghi float vào D200–D201 |
Cú pháp địa chỉ
[DS] DEV [DT] DN [.BIT] [,CNT] [:OPTS]
| Phần | Bắt buộc | Ý nghĩa |
|---|---|---|
DS |
không | Digit specifier, ví dụ K4 |
DEV |
có | Thiết bị: D W R M B X Y L F S TS TN CS CN … |
DT |
không | Kiểu dữ liệu: INT UINT WORD DINT DWORD REAL FLOAT STR. Mặc định là INT |
DN |
có | Số hiệu thiết bị. Hệ số phụ thuộc thiết bị: X Y B W SB SW DX DY dùng hệ 16 (YA, X1E, B3D, WBA4); D M R L F S T* C* ZR dùng hệ 10 — giống cách GX Works hiển thị |
.BIT |
không | Số bit trong word |
,CNT |
không | Số lượng phần tử (mặc định 1) |
:OPTS |
không | JSON định tuyến, ví dụ {N:2,S:3} → network 2, station 3 |
Không dùng DS và DT cùng lúc.
Ví dụ thường dùng
| Địa chỉ | Ý nghĩa |
|---|---|
D100 |
1 word tại D100 |
D2000,5 |
5 word từ D2000 |
D1000.2 |
Bit 2 của word D1000 |
D1000.2,5 |
5 bit liên tiếp từ D1000.2 |
M100,20 |
20 bit từ M100 đến M119 |
X0,8 |
8 input đầu tiên (X0–X7) |
Y10 |
Output Y10 — số hiệu hệ 16, tức output thứ 17 |
K4Y0 |
16 bit Y0–YF gộp thành int (−32.768…32.767) |
DUINT0,10 |
Mảng 10 word không dấu từ D0 (0…65535) |
DDINT80 |
D80+D81 thành DINT (chú ý: DINT80 là D + INT + 80, tức D80 kiểu INT) |
RDINT80 |
R80+R81 thành DINT |
DFLOAT1000 |
Float tại D1000–D1001 |
DSTR0,10 |
Chuỗi 10 ký tự (5 word) từ D0 |
RFLOAT20,5 |
5 float từ R20 đến R29 |
TS190 |
Trạng thái timer 190 (bit) |
TN190 |
Giá trị đếm của timer 190 (số) |
CN220 |
Giá trị counter 220 |
Điều khiển kết nối bằng msg
Gửi vào node Read hoặc Write:
| msg | Tác dụng |
|---|---|
msg.connect = true hoặc msg.topic = "connect" |
Mở kết nối |
msg.disconnect = true hoặc msg.topic = "disconnect" |
Đóng kết nối |
msg.reinitialize = true hoặc msg.topic = "reinitialize" |
Tạo lại kết nối từ đầu (dùng khi PLC bị rút cáp/khởi động lại) |
Các msg này chỉ điều khiển kết nối, không sinh ra lần đọc/ghi nào.
Xử lý lỗi
Cả hai node đều có mục Errors với 3 lựa chọn:
| Lựa chọn | Hành vi |
|---|---|
| Throw (mặc định) | Gọi node.error() — lỗi hiện ở tab Debug và có thể bắt bằng node catch |
| Output to msg.error | Gán lỗi vào msg.error rồi gửi ra cổng ra bình thường |
| Send to separate output | Node có 2 cổng ra; lỗi đi ra cổng thứ hai |
Nếu lỗi timeout, node vẫn có thể phát msg với payload = null; chi tiết nằm trong
msg.mcReadDetails / msg.mcWriteDetails.
Trạng thái hiển thị dưới node:
| Trạng thái | Ý nghĩa |
|---|---|
initialising |
Đang khởi tạo |
ready |
Node sẵn sàng nhận msg |
connected |
Đã kết nối tới PLC |
not connected |
Mất kết nối, đang thử lại |
read / write |
Đang chờ phản hồi từ PLC |
Good |
Giao dịch thành công |
Quality Issue |
PLC trả về nhưng chất lượng dữ liệu xấu (thường do địa chỉ sai) |
timeout |
Không có phản hồi trong thời gian Timeout |
error |
Lỗi kết nối hoặc lỗi cấu hình |
Cấu hình phía PLC
Trong GX Works, phần Ethernet Port / Module Parameter → Open Setting, cần khai báo một kết nối với:
- Protocol: TCP hoặc UDP — khớp với node Connection
- Open system: MC Protocol (Unpassive/Fullpassive tuỳ nhu cầu)
- Host station port No.: cổng bạn nhập vào node Connection
- Bật Enable online change nếu cần ghi khi PLC đang RUN
Lưu ý: mỗi module Ethernet chỉ hỗ trợ số kết nối đồng thời giới hạn (thường 8–16). Vì các node dùng chung socket theo cấu hình, hãy dùng một node Connection cho mỗi PLC thay vì tạo nhiều cấu hình trùng IP.
Khắc phục sự cố
util.log is not a function
Lỗi của bản 1.x trên Node.js 22/24 — util.log() đã bị xoá khỏi Node.js. Bản 2.0
đã sửa. Hãy cài [email protected] trở lên.
Node-RED chiếm 100% CPU hoặc treo khi PLC mất kết nối
Lỗi nhân bản timer của bản 1.x: mỗi lần thử kết nối lại sinh thêm một vòng lặp timer mới. Đã sửa ở 2.0.
Node-RED ngày càng chậm sau nhiều lần Deploy
Bản 1.x không dừng kết nối cũ khi deploy, nên các socket và timer cũ tích tụ lại. Đã sửa ở 2.0.
Trạng thái luôn là timeout
- Kiểm tra
pingtới IP của PLC - Kiểm tra số Port khớp với Open Setting trong GX Works
- Thử đổi Frame (3E ↔ 4E) và Protocol (TCP ↔ UDP)
- Tăng Timeout nếu mạng chậm hoặc PLC tải cao
Trạng thái Quality Issue hoặc đọc ra giá trị lạ
- Sai PLC type: dòng R và dòng Q có bảng mã thiết bị khác nhau
- Địa chỉ vượt phạm vi khai báo trong PLC
- Nhớ rằng
XYBWđánh số hệ 16:Y10là output thứ 17, không phải thứ 11
Muốn xem log chi tiết
Node lấy mức log theo cấu hình logging.console.level trong settings.js. Đặt
level: "debug" hoặc "trace" để thấy chi tiết gói tin MC Protocol.
Ghi chú về độ ổn định
Bản 2.0 tập trung vào việc một lỗi ở tầng PLC không được phép làm dừng Node-RED:
- Mọi callback do node cung cấp đều được bọc try/catch. Trước đây một lỗi trong callback lan từ socket handler ra ngoài và trở thành uncaught exception giết cả process.
- Event
errorcủa kết nối luôn có listener, nên không bao giờ khiến EventEmitter quăng lỗi. - Reconnect có backoff 1s → 30s và tối đa một lần thử đang chờ.
- Khi node bị xoá hoặc deploy lại, kết nối được dừng hẳn: huỷ reconnect, dừng timer, đóng socket (kể cả socket đang treo ở SYN_SENT), tháo listener.
- Kết nối dùng chung được đếm tham chiếu: đóng một node không ngắt kết nối của các node khác.
Bản quyền
MIT — xem LICENSE.
Ghi công
- plcpeople/mcprotocol — thư viện MC Protocol gốc
- Steve-Mcl/node-red-contrib-mcprotocol — bộ node Node-RED gốc
ejz— bảnnode-red-contrib-mcprotocol-ind