💻 Code SCL cho Hàm Nội suy Tuyến tính (Curve Lin)
Tự viết được hàm nội suy tuyến tính
Có, bạn hoàn toàn có thể viết code SCL có chức năng tương đương (hoặc thậm chí giống hệt) với hàm Curve Lin (Nội suy Tuyến tính) bằng cách sử dụng các câu lệnh IF và công thức nội suy cơ bản.
Vì SCL là ngôn ngữ lập trình cấp cao (Procedure Language), nó cho phép bạn triển khai các thuật toán phức tạp như nội suy.
Dưới đây là một ví dụ về cách triển khai chức năng Curve Lin bằng SCL, giả định bạn có một bảng 4 điểm (đủ để minh họa nguyên tắc):
💻 Code SCL cho Hàm Nội suy Tuyến tính (Curve Lin)
Code này được viết dưới dạng một Function Block (FB) để dễ dàng tái sử dụng.
1. Khai báo Bảng Dữ liệu (Điểm Mốc)
Trước hết, bạn cần định nghĩa bảng các cặp tọa độ (X, Y).
DATA_BLOCK "Curve_Data_DB"
STRUCT
// Bảng Tọa độ X (Điểm vào)
X_Points : ARRAY[0..3] OF REAL := 10.0, 30.0, 70.0, 90.0;
// Bảng Tọa độ Y (Điểm ra)
Y_Points : ARRAY[0..3] OF REAL := 0.0, 45.0, 80.0, 100.0;
// Số lượng điểm trong bảng (N-1 đoạn)
Num_Points : INT := 4;
END_STRUCT
END_DATA_BLOCK
2. Khối Hàm Nội suy SCL
FUNCTION "FC_Linear_Interpolation" : REAL
TITLE = 'Linear Interpolation Function'
VERSION : 1.0
VAR_INPUT
X_In : REAL; // Giá trị đầu vào cần nội suy (Ví dụ: 25.0)
END_VAR
VAR_OUTPUT
Y_Out : REAL; // Giá trị đầu ra sau khi nội suy
Error : BOOL; // Cờ lỗi (Ví dụ: lỗi bảng rỗng)
END_VAR
VAR_IN_OUT
Curve_DB : "Curve_Data_DB"; // Tham chiếu đến khối dữ liệu bảng
END_VAR
VAR_TEMP
i : INT;
X0, Y0, X1, Y1 : REAL; // Các điểm của đoạn thẳng hiện tại
Slope : REAL; // Độ dốc
X_Diff : REAL; // Hiệu số X
END_VAR
BEGIN
#Error := FALSE;
#Y_Out := 0.0;
// Kiểm tra tính hợp lệ cơ bản của bảng
IF #Curve_DB.Num_Points < 2 THEN
#Error := TRUE;
RETURN 0.0;
END_IF;
// --- 1. Xử lý Ngoại suy (Extrapolation Limiting) ---
// Nếu X nhỏ hơn điểm đầu tiên
IF #X_In <= #Curve_DB.X_Points[0] THEN
#Y_Out := #Curve_DB.Y_Points[0];
RETURN #Y_Out;
// Nếu X lớn hơn điểm cuối cùng
ELSIF #X_In >= #Curve_DB.X_Points[#Curve_DB.Num_Points - 1] THEN
#Y_Out := #Curve_DB.Y_Points[#Curve_DB.Num_Points - 1];
RETURN #Y_Out;
END_IF;
// --- 2. Tìm đoạn chứa X và Nội suy ---
// Vòng lặp tìm đoạn [X_i, X_i+1] chứa X_In
FOR #i := 0 TO #Curve_DB.Num_Points - 2 DO
// Gán các điểm giới hạn của đoạn hiện tại
#X0 := #Curve_DB.X_Points[#i];
#Y0 := #Curve_DB.Y_Points[#i];
#X1 := #Curve_DB.X_Points[#i + 1];
#Y1 := #Curve_DB.Y_Points[#i + 1];
// Kiểm tra xem X_In có nằm trong đoạn này không
IF #X_In < #X1 THEN // Nếu X_In nằm giữa X0 và X1 (do đã loại trừ X < X0 ở trên)
#X_Diff := #X1 - #X0;
// Xử lý tránh chia cho 0 nếu X0 = X1 (lỗi cấu hình bảng)
IF #X_Diff = 0.0 THEN
#Y_Out := #Y0;
#Error := TRUE;
EXIT; // Thoát vòng lặp
END_IF;
// Công thức Nội suy Tuyến tính:
// Y = Y0 + (Y1 - Y0) * ((X_In - X0) / (X1 - X0))
#Y_Out := #Y0 + (#Y1 - #Y0) * ((#X_In - #X0) / #X_Diff);
EXIT; // Thoát vòng lặp sau khi tìm và tính toán xong
END_IF;
END_FOR;
RETURN #Y_Out;
END_FUNCTION
💡 Giải thích Logic
Xử lý Ngoại suy: Code đầu tiên kiểm tra xem giá trị đầu vào X_In có nằm ngoài phạm vi của bảng X hay không. Nếu có, đầu ra Y_Out được giới hạn bằng giá trị Y tại điểm cuối tương ứng. Điều này mô phỏng chính xác chức năng giới hạn của Curve Lin.
Vòng lặp Tra cứu: Vòng lặp FOR chạy qua từng đoạn của bảng.
Tìm Đoạn: Câu lệnh IF #X_In < #X1 THEN được sử dụng để xác định đoạn (
iđếni+1) nào chứa giá trịX_In.Công thức Nội suy: Sau khi tìm thấy đoạn, công thức tính toán tỷ lệ vị trí của X_In trong đoạn X và áp dụng tỷ lệ đó vào khoảng cách Y:
$$\text{Y}_{\text{Out}} = \text{Y}_{0} + (\text{Y}_{1} - \text{Y}_{0}) \times \frac{\text{X}_{\text{In}} - \text{X}_{0}}{\text{X}_{1} - \text{X}_{0}}$$EXIT: LệnhEXITđảm bảo rằng ngay sau khi tìm thấy đoạn và tính toán xong, vòng lặp sẽ dừng lại, tối ưu hóa thời gian chu kỳ.
Với việc sử dụng Function Block và bảng dữ liệu, khối SCL này thực hiện chức năng giống hệt và hoàn toàn có thể thay thế cho hàm Curve Lin có sẵn trong PLC.

