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)

npm install node-red-tienho-mcprotocol

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.

npm license


Mục lục


Tính năng

  • Kết nối TCPUDP
  • Frame 1E, 3E, 4E
  • Dòng PLC: A (chỉ 1E), QnA, Q, L, R
  • Chế độ BINARYASCII (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 paletteInstall → tìm node-red-tienho-mcprotocolInstall.

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

  1. Kéo node Ind MC Read vào flow.
  2. 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.
  3. Điền Host (IP của PLC), Port, chọn Protocol, Frame, PLC type đúng như cài đặt trong GX Works.
  4. Ở ô Address điền ví dụ D100,10 (đọc 10 word từ D100).
  5. Nối một node inject vào đầu vào và một node debug vào đầu ra, rồi Deploy.
  6. Mỗi lần inject là một lần đọc PLC.

Trong Node-RED có flow mẫu sẵn: menu → ImportExamplesnode-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ặc null nếu lỗi
  • msg.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.payloadtrue nếu ghi thành công, false nếu chất lượng dữ liệu xấu
  • msg.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 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 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 DSDT 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ú ý: DINT80D + 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 ping tớ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 X Y B W đánh số hệ 16: Y10 là 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 error củ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

Node Info

Version: 2.0.0
Updated 1 day ago
License: MIT
Rating: not yet rated

Categories

Actions

Rate:

Downloads

0 in the last week

Nodes

  • Ind MC Read
  • Ind MC Write
  • Ind MC Protocol Connection

Keywords

  • node-red
  • mitsubishi
  • mcprotocol
  • mc-protocol
  • melsec
  • plc
  • iiot
  • scada
  • slmp

Maintainers

Contributors

  • Steve-Mcl
  • plcpeople
  • ejz