Lập trình Macro trên HMI Weintek: Hướng dẫn nâng cao cho kỹ sư đã biết cơ bản
SCADA và điều khiển công nghiệp25 tháng 7, 2026· 11 phút đọc · 70 lượt xem

Lập trình Macro trên HMI Weintek: Hướng dẫn nâng cao cho kỹ sư đã biết cơ bản

Giới thiệu ngôn ngữ Macro trên HMI Weintek — cú pháp, các nhóm hàm chính, cách đọc/ghi dữ liệu PLC qua GetData/SetData, và những lỗi thường gặp khi lập trình macro nâng cao trên EasyBuilder Pro

Sau khi đã nắm được các bước lập trình HMI cơ bản (kéo thả nút nhấn, đèn báo, cấu hình kết nối PLC), nhiều kỹ sư sẽ cần đến một công cụ mạnh hơn khi dự án đòi hỏi xử lý logic phức tạp ngay trên HMI — đó là Macro. Đây là ngôn ngữ kịch bản riêng của Weintek (và các nền tảng dùng chung nền tảng như Maple Systems, Watlow, Nematron), cho phép xử lý logic nâng cao mà các đối tượng đồ họa thông thường không đáp ứng được.

1. Macro trên HMI Weintek là gì?

Macro là ngôn ngữ kịch bản độc quyền của Weintek, kết hợp cú pháp gần giống BASIC, C và Visual Basic, được bổ sung thêm các hàm chuyên dụng để giao tiếp với PLC. Macro chạy trực tiếp trên firmware của HMI, hoạt động như một lớp xử lý logic bổ sung bên cạnh vai trò hiển thị giao diện thông thường.

Thông số kỹ thuật cơ bản

Thông số

Đặc tả

Kiểu biến hỗ trợ

BOOL, SHORT, INT, DINT, FLOAT, STRING

Mảng dữ liệu

Hỗ trợ mảng một chiều và nhiều chiều

Điều kiện kích hoạt

Theo chu kỳ (1ms–10s), khi bit bật/tắt, khi mở/đóng màn hình, khi nhấn nút

Cách địa chỉ hóa bộ nhớ

Địa chỉ hóa trực tiếp PLC theo cú pháp riêng từng giao thức

Thư viện hàm

Hơn 300 hàm dựng sẵn phục vụ giao tiếp HMI/PLC

Hỗ trợ Recipe

Có sẵn nhóm hàm thao tác với cơ sở dữ liệu công thức (recipe)

2. Nguyên lý hoạt động

Macro thực thi trong môi trường runtime của HMI và giao tiếp với PLC đã kết nối thông qua các giao thức đã thiết lập sẵn. Nói cách khác, HMI lúc này đóng vai trò kép: vừa là bộ điều khiển giao diện, vừa là bộ xử lý logic bổ trợ.

Cú pháp địa chỉ hóa cơ bản

Hai hàm nền tảng nhất trong lập trình Macro Weintek là GetData() (đọc dữ liệu từ thiết bị) và SetData() (ghi dữ liệu xuống thiết bị). Cú pháp tổng quát có dạng: khai báo biến nhận/gửi dữ liệu, tên giao thức thiết bị, vùng địa chỉ, số địa chỉ bắt đầu và số lượng phần tử cần đọc/ghi. Ví dụ minh họa (không phải trích dẫn nguyên văn, chỉ mang tính tham khảo cú pháp):

' Đọc thanh ghi giữ (holding register) từ thiết bị Modbus RTU
GetData(bienNhan, "MODBUS RTU", 4x, diaChi, soLuong)

' Ghi giá trị xuống thiết bị Allen-Bradley qua giao thức DF1
SetData(bienGui, "Allen-Bradley DF1", diaChiThanhGhi, soLuong)

Các giao thức được hỗ trợ phổ biến

  • MODBUS RTU/ASCII/TCP

  • Allen-Bradley DF1, DH+, EtherNet/IP

  • Siemens MPI, PPI, PROFIBUS, S7 Ethernet

  • Mitsubishi FX, dòng Q Series

  • Omron Host Link, FINS

Với đa số dự án tại Việt Nam dùng PLC Mitsubishi, Siemens hoặc Delta, việc macro hỗ trợ sẵn hầu hết các giao thức phổ biến giúp kỹ sư không cần viết driver giao tiếp riêng.

3. Cấu trúc trình soạn thảo Macro

Trình soạn thảo Macro trong EasyBuilder Pro tổ chức các hàm theo từng nhóm chức năng để dễ tra cứu: Communication (giao tiếp), Arithmetic (tính toán), String (xử lý chuỗi), Time (thời gian), Recipe (công thức) và System (hệ thống), kèm theo tô màu cú pháp (syntax highlighting) và trợ giúp tích hợp.

Ví dụ cấu trúc chương trình minh họa

Một đoạn macro điển hình thường gồm: khai báo biến, đọc dữ liệu từ PLC, xử lý điều kiện logic, và ghi kết quả trở lại. Ví dụ minh họa mang tính tham khảo cấu trúc (đã viết lại, không sao chép nguyên văn từ tài liệu gốc):

' Khai báo biến
short dem
float nhietDo
bool trangThaiCanhBao

' Đọc giá trị nhiệt độ từ PLC qua Modbus TCP
GetData(nhietDo, "MODBUS TCP", 4x, 40001, 1)

' Kiểm tra điều kiện và đặt cờ cảnh báo
if nhietDo > 100.0 then
    trangThaiCanhBao = 1
    SetData(trangThaiCanhBao, "MODBUS TCP", 0x, 1, 1)
endif

' Vòng lặp ghi dữ liệu vào dải thanh ghi
for dem = 1 to 10
    SetData(dem * 2, "MODBUS TCP", 4x, 41000 + dem, 1)
next

Các nhóm hàm quan trọng cần nắm

Nhóm hàm

Hàm tiêu biểu

Chức năng

Giao tiếp

GetData(), SetData(), GetDevice()

Trao đổi dữ liệu với PLC

Recipe

RecipeLoad(), RecipeSave(), RecipeEdit()

Thao tác cơ sở dữ liệu công thức

Chuỗi

strcat(), strlen(), strmid()

Xử lý văn bản

Thời gian

GetTime(), SetTime(), Delay()

Các thao tác liên quan thời gian

Hệ thống

ScreenChange(), Beep(), Print()

Điều khiển HMI (chuyển màn hình, còi báo, in ấn)

4. Một số đặc điểm kỹ thuật cần lưu ý

  • Macro chạy trên một luồng thực thi riêng trong firmware HMI, với chu kỳ ưu tiên có thể cấu hình từ 1ms đến 10 giây.

  • Bộ nhớ được quản lý tự động, có cơ chế thu gom rác (garbage collection) cho biến kiểu chuỗi.

  • Biến có thể khai báo ở phạm vi toàn cục (global) hoặc cục bộ (local); biến toàn cục vẫn giữ giá trị khi chuyển qua lại giữa các màn hình.

  • Thời gian thực thi macro sẽ cộng dồn vào chu kỳ quét (scan cycle) của HMI — vòng lặp phức tạp có thể ảnh hưởng đến tốc độ làm mới màn hình.

  • Các hàm giao tiếp có thời gian chờ (timeout) phụ thuộc giao thức, thường mặc định trong khoảng 3–5 giây.

  • Thao tác với Recipe liên quan đến việc ghi vào bộ nhớ flash, cần lưu ý về cơ chế cân bằng hao mòn (wear-leveling) của bộ nhớ.

5. Những lỗi thường gặp khi lập trình Macro nâng cao

  1. Lỗi địa chỉ hóa: định dạng địa chỉ khác nhau theo từng giao thức phải khớp chính xác với cấu hình PLC.

    • Với Modbus: 4x là thanh ghi giữ (holding register), 0x là coil, 1x là input, 3x là input register.

    • Với Allen-Bradley: N7:0 là kiểu số nguyên, F8:0 là kiểu số thực, B3:0/0 là kiểu bit.

  2. Sai lệch kiểu dữ liệu: chuyển đổi ngầm định giữa các kiểu có thể làm mất dữ liệu — ví dụ chuyển từ FLOAT sang INT sẽ làm mất phần thập phân; độ dài chuỗi (STRING) bị giới hạn theo kích thước thanh ghi đích.

  3. Vấn đề thứ tự thực thi: khi có nhiều macro chạy song song, cần đồng bộ hóa bằng cách dùng các bit hệ thống để giao tiếp giữa các macro, hoặc thiết lập cờ bắt tay (handshaking flag) cho các chuỗi thao tác quan trọng.

6. Khuyến nghị khi lập trình Macro

  • Luôn khởi tạo giá trị ban đầu cho biến trước khi sử dụng, tránh giá trị ngẫu nhiên gây lỗi logic.

  • Kiểm tra lỗi bằng cách đọc trạng thái trả về từ hàm GetDevice() sau mỗi lần gọi hàm giao tiếp.

  • Thiết lập logic timeout cho các thao tác quan trọng, tránh macro bị "treo" chờ vô thời hạn.

  • Ghi chú rõ mục đích của macro và ý nghĩa các thanh ghi sử dụng ngay trong code, thuận tiện cho người bảo trì sau này.

  • Kiểm thử macro với dữ liệu giả lập trước khi tích hợp với PLC thật.

  • Cân nhắc ảnh hưởng đến chu kỳ quét khi dùng vòng lặp dày đặc hoặc gọi hàm giao tiếp liên tục.

7. Khi nào nên dùng Macro thay vì đối tượng đồ họa thông thường?

Không phải dự án nào cũng cần đến Macro — với các ứng dụng đơn giản (hiển thị giá trị, bật/tắt thiết bị), các đối tượng kéo-thả tiêu chuẩn trong EasyBuilder Pro đã đủ dùng. Nên cân nhắc dùng Macro khi:

  • Cần xử lý logic tính toán phức tạp ngay trên HMI (ví dụ chuyển đổi đơn vị, tính toán trung bình trượt) mà không muốn tốn thêm tài nguyên PLC.

  • Cần thao tác hàng loạt với dữ liệu dạng mảng hoặc bảng ghi công thức (recipe) sản xuất.

  • Cần tích hợp logic tùy biến mà các đối tượng đồ họa dựng sẵn không đáp ứng được, ví dụ xử lý chuỗi ký tự phức tạp, gửi email/báo cáo tự động.

Lưu ý quan trọng: dù Macro rất mạnh, không nên đặt logic điều khiển an toàn (safety interlock) trong Macro — nguyên tắc này áp dụng chung cho mọi loại script chạy trên HMI/SCADA, không riêng gì Weintek. Toàn bộ logic an toàn vẫn phải nằm trong PLC.

Kết luận

Macro là công cụ mạnh giúp mở rộng khả năng của HMI Weintek vượt ra ngoài giới hạn của các đối tượng đồ họa tiêu chuẩn, đặc biệt hữu ích khi cần xử lý dữ liệu phức tạp hoặc tự động hóa các tác vụ lặp lại. Tuy nhiên, đi kèm với sức mạnh đó là yêu cầu hiểu rõ về địa chỉ hóa, kiểu dữ liệu và giới hạn thời gian thực thi để tránh những lỗi khó chẩn đoán khi hệ thống đã đưa vào vận hành thực tế.

⚡
Chưa biết chọn UPS công suất bao nhiêu?
Nhập danh sách thiết bị, công cụ sẽ tính tự động và gợi ý model phù hợp.
Tính công suất miễn phí

Cần tư vấn giải pháp UPS?

UPSsmart hỗ trợ tư vấn miễn phí, không ràng buộc.