Lập Trình PLC Siemens S7-1500: Hướng Dẫn Thực Hành Cho Kỹ Sư Tự Động Hóa
Bạn đang triển khai dự án tự động hóa với S7-1500 nhưng chưa rõ quy trình lập trình SCL? Bài viết này hướng dẫn chi tiết từ đấu nối phần cứng đến viết code thực tế, giúp bạn tự tin triển khai hệ thống điều khiển công nghiệp.

Tại Sao Chọn S7-1500 và SCL?
SIMATIC S7-1500 là bộ điều khiển thế hệ mới với thời gian quét cực nhanh (từ 1ms), bộ nhớ lớn và khả năng chẩn đoán vượt trội. Ngôn ngữ SCL (tương tự Pascal) giúp bạn viết các thuật toán phức tạp ngắn gọn hơn LAD/FBD đến 70%, đặc biệt hiệu quả cho tính toán công thức toán học và xử lý dữ liệu.
Bước 1: Lắp Đặt Phần Cứng Đúng Kỹ Thuật
Danh sách thiết bị cần chuẩn bị
| Thiết bị | Vai trò | Mã tham khảo |
|---|---|---|
| CPU 1511-1 PN | Bộ xử lý điều khiển | 6ES7511-1AK02-0AB0 |
| PM 190W | Nguồn 24VDC cho I/O | 6EP1332-4BA00 |
| SIMATIC Memory Card 24MB | Lưu chương trình | 6ES7954-8LC03-0AA0 |
| DIN Rail 2m | Thanh gắn module | 6ES7590-1AB60-0AA0 |
| DI 16x24VDC | Module đầu vào số | 6ES7521-1BH50-0AA0 |
| DQ 16x24VDC/0.5A | Module đầu ra số | 6ES7522-1BH01-0AB0 |
| Front Connector | Đầu nối tín hiệu | 6ES7592-1AM00-0XB0 |
Quy trình lắp ráp chuẩn
Bước 1: Gắn DIN Rail vào tủ điện, đảm bảo phẳng và chắc chắn.
Bước 2: Lắp PM vào đầu thanh, sau đó lắp CPU sát bên phải PM. Nghe tiếng “click” khi module khớp vào bus phía sau.
Bước 3: Lắp các module I/O theo thứ tự từ trái sang phải. Module tự động nhận địa chỉ tuần tự.
Lưu ý quan trọng: Luôn lắp từ trái sang phải để TIA Portal tự động gán địa chỉ đúng thứ tự.
Bước 2: Đấu Nối Điện An Toàn
Đấu nguồn chính
Đấu nguồn AC (220V/380V) vào PM theo sơ đồ trên vỏ module. Siết chặt vít đầu nối với mô-men 0.5-0.6 Nm (dùng tuốc nơ vít có điều chỉnh mô-men).
Đấu nguồn DC cho hệ thống
Nối đầu ra 24VDC của PM đến:
-
Cực L+ và M của CPU
-
Cực nguồn của các module I/O (nếu cần cách ly)
Đấu tín hiệu I/O
Đầu vào số (DI):
-
Cảm biến PNP: Nối 24V→Cảm biến→DI, Common về 0V
-
Cảm biến NPN: Nối 0V→Cảm biến→DI, Common về 24V
Đầu ra số (DQ):
-
Contactor/Van: Nối DQ→Cuộn dây→0V
-
Công suất lớn: Sử dụng relay trung gian
Checklist an toàn trước cấp nguồn
-
✓ Kiểm tra cực tính nguồn DC (đo bằng đồng hồ vạn năng)
-
✓ Đảm bảo không có chập ngắn mạch giữa L+ và M
-
✓ Siết chặm tất cả đầu nối, không có dây hở
-
✓ Nối đất tủ điện đúng kỹ thuật
Bước 3: Cấu Hình Kết Nối Mạng
Thiết lập IP trên CPU
Sau khi cấp nguồn, CPU hiển thị màn hình khởi động. Thao tác trên màn hình cảm ứng:
-
Chọn Settings → Addresses
-
Chọn giao diện X1 P1 (cổng Ethernet)
-
Chọn Ethernet addresses
-
Nhập IP:
192.168.0.10(hoặc theo quy hoạch mạng nhà máy) -
Subnet mask:
255.255.255.0 -
Nhấn OK để lưu
Kết nối từ máy tính
Đặt IP máy tính cùng dải mạng (ví dụ: 192.168.0.100). Dùng cáp Ethernet kết nối trực tiếp hoặc qua switch.
Test kết nối: Mở Command Prompt, gõ ping 192.168.0.10. Nếu thấy “Reply from…” là kết nối thành công.
Bước 4: Tạo Dự Án Trong TIA Portal
Khởi tạo dự án mới
Mở TIA Portal V17 trở lên, chọn Create new project. Đặt tên theo quy ước (ví dụ: Project_Line01_Packaging_2025).
Thêm và cấu hình CPU
-
Chọn Add new device → PLC → SIMATIC S7-1500 → CPU 1511-1 PN
-
Chọn phiên bản firmware (khuyến nghị V2.9 trở lên để dùng VARIANT)
-
Trong Device configuration, kéo module PM và các module I/O từ Hardware catalog
-
Đặt địa chỉ IP trong TIA khớp với CPU: Chọn CPU → Properties → Ethernet addresses
Kích hoạt Optimized Block Access
Trong Properties của CPU, tích chọn:
-
Optimized block access (tăng tốc độ truy cập biến)
-
Symbolic programming only (bắt buộc dùng tên biến thay địa chỉ tuyệt đối)
Lợi ích: Code dễ đọc, dễ bảo trì và giảm lỗi khi thay đổi phần cứng.
Bước 5: Lập Trình SCL – Từ Cơ Bản Đến Ứng Dụng
Cấu trúc khối chương trình
Organization Block (OB):
-
OB1: Chạy chu kỳ liên tục (Main Program)
-
OB100: Chạy một lần khi khởi động
-
OB82: Xử lý lỗi chẩn đoán
Function (FC):
-
Không có bộ nhớ riêng
-
Dùng cho tính toán, chuyển đổi đơn giản
-
Trả về một giá trị duy nhất
Function Block (FB):
-
Có Instance DB (bộ nhớ riêng)
-
Dùng cho đối tượng cần lưu trạng thái (Motor, Valve, PID)
-
Có thể gọi lại nhiều lần với Instance khác nhau
Ví Dụ Thực Tế 1: Tính Thể Tích Bồn Chứa
Bài toán: Nhà máy có bồn trụ đứng đường kính 3.5m, cao 12m. Cần tính thể tích chất lỏng hiện tại dựa vào mức đo được từ cảm biến radar.
Phân tích:
-
Công thức: V=π×r2×hV = pi times r^2 times h (m³)
-
Đổi sang lít: Vlıˊt=Vm3×1000V_{lít} = V_{m³} times 1000
-
Cần kiểm tra dữ liệu đầu vào hợp lệ
Tạo Function “FC_TankVolume”:
FUNCTION “FC_TankVolume” : Void
VAR_INPUT
Diameter : Real; // Đường kính bồn (m)
Height : Real; // Chiều cao bồn (m)
Current_Level : Real; // Mức chất lỏng hiện tại (m)
END_VAR
VAR_OUTPUT
Volume_Liter : Real; // Thể tích (lít)
Error : Bool; // TRUE = dữ liệu không hợp lệ
END_VAR
VAR_TEMP
Radius : Real;
Base_Area : Real;
END_VAR
BEGIN
// Kiểm tra điều kiện hợp lệ
IF (Diameter <= 0.0) OR (Current_Level < 0.0) OR (Current_Level > Height) THEN
Error := TRUE;
Volume_Liter := 0.0;
RETURN; // Thoát hàm sớm
END_IF;
// Tính toán
Error := FALSE;
Radius := Diameter / 2.0;
Base_Area := 3.141593 * Radius * Radius;
Volume_Liter := Base_Area * Current_Level * 1000.0;
END_FUNCTION
Cách sử dụng trong OB1:
Tạo Global DB “Tank_Data” với các tag:
-
Tank_Diameter (Real) = 3.5
-
Tank_Height (Real) = 12.0
-
Sensor_Level (Real) – Đọc từ module AI
-
Calculated_Volume (Real)
-
Calc_Error (Bool)
Trong OB1, gọi hàm:
Diameter := “Tank_Data”.Tank_Diameter,
Height := “Tank_Data”.Tank_Height,
Current_Level := “Tank_Data”.Sensor_Level,
Volume_Liter => “Tank_Data”.Calculated_Volume,
Error => “Tank_Data”.Calc_Error
);
Ví Dụ Thực Tế 2: Chuyển Đổi Tín Hiệu Analog 4-20mA
Bài toán: Cảm biến áp suất 4-20mA (0-10 bar) kết nối vào module AI. Module trả về giá trị INT từ 0 đến 27648. Cần chuyển đổi sang áp suất thực (bar).
Phân tích:
-
4mA (0 bar) → Giá trị 0
-
20mA (10 bar) → Giá trị 27648
-
Công thức scale: P=Raw×(Pmax−Pmin)27648+PminP = frac{Raw times (P_{max} – P_{min})}{27648} + P_{min}
Tạo Function “FC_ScaleAnalog”:
FUNCTION “FC_ScaleAnalog” : Void
VAR_INPUT
Raw_Value : Int; // Giá trị thô từ AI (0-27648)
Min_EU : Real; // Giá trị min thang đo (0 bar)
Max_EU : Real; // Giá trị max thang đo (10 bar)
END_VAR
VAR_OUTPUT
Scaled_Value : Real; // Giá trị sau scale (bar)
Error : Bool; // TRUE = lỗi
END_VAR
VAR_CONSTANT
MAX_RAW : Int := 27648; // Giá trị thô lớn nhất
END_VAR
BEGIN
// Kiểm tra điều kiện
IF (Raw_Value < 0) OR (Raw_Value > MAX_RAW) OR (Max_EU <= Min_EU) THEN
Error := TRUE;
Scaled_Value := Min_EU;
RETURN;
END_IF;
// Công thức scale
Error := FALSE;
Scaled_Value := (INT_TO_REAL(Raw_Value) * (Max_EU – Min_EU) / INT_TO_REAL(MAX_RAW)) + Min_EU;
END_FUNCTION
Test case thực tế:
| Raw_Value | Min_EU | Max_EU | Kết quả mong đợi | Ý nghĩa |
|---|---|---|---|---|
| 0 | 0.0 | 10.0 | 0.0 bar | Cảm biến ở 4mA |
| 13824 | 0.0 | 10.0 | 5.0 bar | Cảm biến ở 12mA (giữa thang) |
| 27648 | 0.0 | 10.0 | 10.0 bar | Cảm biến ở 20mA |
| 5530 | 0.0 | 10.0 | 2.0 bar | Áp suất 2 bar |
Kỹ Thuật Nâng Cao: Sử Dụng VARIANT
VARIANT cho phép một hàm xử lý nhiều kiểu dữ liệu khác nhau, hữu ích khi viết hàm scale chung cho cả INT và DINT.
FUNCTION “FC_Scale_Universal” : Void
VAR_INPUT
Input_Value : Variant; // Có thể nhận INT hoặc DINT
Min_EU : Real;
Max_EU : Real;
END_VARVAR_OUTPUT
Scaled : Real;
Error : Bool;
END_VARVAR_TEMP
Raw_Int : Int;
Raw_DInt : DInt;
Max_Raw : DInt;
END_VARBEGIN
// Kiểm tra kiểu dữ liệu
IF TypeOf(Input_Value) = Int THEN
Raw_Int := VariantGet(Input_Value);
Raw_DInt := INT_TO_DINT(Raw_Int);
Max_Raw := 27648;
ELSIF TypeOf(Input_Value) = DInt THEN
Raw_DInt := VariantGet(Input_Value);
Max_Raw := 16#6C000000; // Max cho DINT analog
ELSE
Error := TRUE;
RETURN;
END_IF;// Scale
Scaled := (DINT_TO_REAL(Raw_DInt) * (Max_EU – Min_EU) / DINT_TO_REAL(Max_Raw)) + Min_EU;
Error := FALSE;END_FUNCTION
Bước 6: Biên Dịch và Xử Lý Lỗi
Quy trình biên dịch
-
Nhấn Ctrl + Shift + F11 hoặc chọn Compile → Software (only changes)
-
Kiểm tra cửa sổ Info ở góc dưới
-
Sửa các lỗi cú pháp (màu đỏ) và cảnh báo (màu vàng)
Các lỗi thường gặp
Lỗi: “Operand type mismatch”
-
Nguyên nhân: Gán kiểu dữ liệu không tương thích (ví dụ: Real → Int)
-
Giải pháp: Dùng hàm chuyển đổi
REAL_TO_INT(),INT_TO_REAL()
Lỗi: “Block already exists”
-
Nguyên nhân: Tên khối trùng
-
Giải pháp: Đổi tên khối hoặc xóa khối cũ
Lỗi: “Unknown tag”
-
Nguyên nhân: Biến chưa được khai báo
-
Giải pháp: Khai báo trong PLC tags hoặc phần VAR
Bước 7: Tải Chương Trình và Vận Hành
Tải xuống PLC
-
Nhấn Load into device (icon mũi tên xuống màu xanh)
-
Chọn PG/PC interface → PN/IE
-
Nhấn Start search → Chọn CPU có IP đúng
-
Nhấn Load → Chọn Stop all khi được hỏi
Chuyển sang chế độ RUN
Trong TIA Portal:
-
Chọn CPU → Online & diagnostics
-
Nhấn nút RUN màu xanh
-
Xác nhận Yes
CPU LED chuyển sang xanh nhấp nháy → Chương trình đang chạy.
Giám sát trực tuyến
Cách 1: Monitor trong Block
-
Mở OB1 hoặc FC → Nhấn icon kính lúp Monitor on/off
-
Quan sát giá trị biến thay đổi real-time
Cách 2: Watch Table
-
Tạo Watch table mới
-
Kéo thả các tag cần theo dõi vào bảng
-
Bật Monitor all
Cách 3: Force Table (Cẩn thận!)
-
Dùng để buộc giá trị đầu vào/ra khi test
-
Luôn tắt Force sau khi test xong
Kiểm Tra Hệ Thống Theo Checklist
Test hàm tính thể tích
| Test case | Diameter | Height | Level | Volume mong đợi | Error |
|---|---|---|---|---|---|
| Bình thường | 3.5 | 12.0 | 6.0 | ≈57,726 lít | FALSE |
| Đầy bồn | 3.5 | 12.0 | 12.0 | ≈115,453 lít | FALSE |
| Lỗi: Level > Height | 3.5 | 12.0 | 15.0 | 0.0 | TRUE |
| Lỗi: Diameter = 0 | 0.0 | 12.0 | 6.0 | 0.0 | TRUE |
Test hàm scale analog
| Raw_Value | Min_EU | Max_EU | Scaled mong đợi | Error |
|---|---|---|---|---|
| 0 | 0.0 | 10.0 | 0.0 | FALSE |
| 27648 | 0.0 | 10.0 | 10.0 | FALSE |
| 13824 | 0.0 | 10.0 | 5.0 | FALSE |
| -100 | 0.0 | 10.0 | 0.0 | TRUE |
| 30000 | 0.0 | 10.0 | 0.0 | TRUE |
Tối Ưu Hóa Hiệu Suất
Sử dụng kiểu dữ liệu phù hợp
-
Bool: Cho tín hiệu số (1 bit)
-
Int/DInt: Cho đếm, giá trị rời rạc
-
Real: Cho tính toán analog, công thức
-
String: Cho thông báo, tên thiết bị
Tổ chức khối hợp lý
-
FC: Tính toán đơn giản, chuyển đổi
-
FB: Motor, valve, PID controller
-
Global DB: Dữ liệu chia sẻ giữa các khối
-
UDT: Cấu trúc dữ liệu cho thiết bị (ví dụ: Motor gồm Start, Stop, Running, Error)
Tips viết code sạch
-
Đặt tên biến rõ ràng:
Tank01_Levelthay vìL1 -
Thêm comment cho logic phức tạp
-
Chia nhỏ chương trình thành các khối chức năng
-
Dùng hằng số (VAR_CONSTANT) cho giá trị cố định
Xử Lý Sự Cố Thường Gặp
CPU không kết nối được
Triệu chứng: TIA Portal không tìm thấy CPU
Giải pháp:
-
Kiểm tra cáp Ethernet đã cắm chặt
-
Ping IP của CPU từ Command Prompt
-
Tắt Firewall tạm thời
-
Đặt IP máy tính cùng dải mạng với CPU
Chương trình không chạy (CPU ở STOP)
Triệu chứng: LED CPU màu vàng, không chuyển RUN
Giải pháp:
-
Kiểm tra Diagnostics → Module states xem có module nào lỗi
-
Kiểm tra Error LED trên CPU
-
Xem Diagnostic buffer để biết lỗi chi tiết
-
Đảm bảo không có lỗi compile
Giá trị đầu ra không đúng
Triệu chứng: Output không khớp với logic
Giải pháp:
-
Dùng Watch table theo dõi từng bước tính toán
-
Kiểm tra kiểu dữ liệu có bị ép kiểu sai không
-
Kiểm tra thứ tự thực thi trong Network
-
Dùng breakpoint trong simulation mode (nếu có)
Lợi Ích Khi Thành Thạo S7-1500
Cho kỹ sư:
-
Tăng 40-60% hiệu quả lập trình so với S7-300/400
-
Dễ dàng triển khai các thuật toán phức tạp
-
Chẩn đoán lỗi nhanh hơn với Trace và Web Server tích hợp
Cho nhà máy:
-
Giảm thời gian dừng máy nhờ chẩn đoán mạnh
-
Dễ mở rộng hệ thống khi tăng công suất
-
Tích hợp liền mạch với HMI, SCADA, MES
Cho dự án:
-
Rút ngắn thời gian commissioning
-
Code dễ bảo trì, chuyển giao
-
Tương thích với Industry 4.0 (OPC UA, Profinet)
Liên hệ ngay với chúng tôi để được tư vấn giải pháp phù hợp và báo giá chi tiết cho dự án của bạn.
