Giới thiệu dự án

Trong kỷ nguyên công nghiệp 4.0 và xu hướng tự động hóa, hệ thống nhúng (Embedded Systems) đóng vai trò xương sống trong các lĩnh vực quan trọng như hàng không vũ trụ, điều khiển động cơ ô tô (Automotive ECU), thiết bị y tế và robot công nghiệp. Theo thống kê từ các tổ chức an toàn phần mềm quốc tế, hơn 60% các sự cố nghiêm trọng trong hệ thống điều khiển bắt nguồn từ lỗi tương tác tham số và sai lệch cấu hình mô phỏng ở giai đoạn thiết kế sớm. Do đó, mô hình hóa dựa trên MATLAB/Simulink đã trở thành tiêu chuẩn công nghiệp (Model-Based Design - MBD) để kiểm chứng thuật toán trước khi sinh mã nhúng thực tế (C/C++ firmware).

Tuy nhiên, bài toán đặt ra là khi độ phức tạp của hệ thống tăng lên, số lượng khối chức năng (Block) và tham số cấu hình (Parameters) bùng nổ theo cấp số nhân. Việc xây dựng và cấu hình hàng trăm mô hình Simulink bằng tay cho quy trình kiểm thử hộp đen (Black-box Testing) dẫn đến các điểm nghẽn nghiêm trọng: tiêu tốn hàng trăm giờ lao động kỹ sư, dễ sai sót do thao tác thủ công và không đảm bảo độ bao phủ các tổ hợp lỗi.

Đồ án "Xây dựng hệ thống sinh mô hình MATLAB/Simulink tự động" được thực hiện nhằm giải quyết triệt để bài toán trên thông qua các mục tiêu cụ thể:

  1. Nghiên cứu và xây dựng cấu trúc chuẩn hóa dữ liệu mô hình bằng định dạng JSON để quản lý thuộc tính các khối Simulink.
  2. Thiết kế và phát triển module sinh mô hình tự động dựa trên phương pháp tổ hợp toàn phần (Exhaustive Combinatorial Generation).
  3. Ứng dụng kỹ thuật kiểm thử theo cặp (Pairwise Testing) tích hợp công cụ Microsoft PICT (Pairwise Independent Combinatorial Testing) nhằm tối ưu hóa số lượng ca kiểm thử.
  4. Xây dựng giao diện đồ họa người dùng trực quan trên nền tảng MATLAB GUI (GUIDE) giúp kỹ sư kiểm thử vận hành tự động toàn bộ quy trình.

Giải pháp mang lại kết quả vượt trội: tự động hóa 100% quá trình tạo lập mô hình kiểm thử, giảm tới 83.33% số lượng mô hình cần kiểm thử mà vẫn đảm bảo độ bao phủ lỗi tương tác tham số lên đến 70%, loại bỏ hoàn toàn lỗi thao tác thủ công của kỹ sư.

Phạm vi đề tài tập trung vào việc biến đổi tham số cấu hình của các khối chức năng (chẳng hạn Multiport Switch, Switch, Abs, Inport, Outport, Delay, Operators) trên một mô hình kiến trúc gốc xác định. Giới hạn hiện tại chưa bao gồm việc tự động tạo mới cấu trúc liên kết đường dây (Signal Routing) ngẫu nhiên giữa các khối chưa được định nghĩa trước trong mô hình mẫu.


Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Trong quy trình phát triển phần mềm nhúng truyền thống, kiểm thử mô hình thường được thực hiện qua các phương pháp sau:

Tiêu chí đánh giá Tạo mô hình thủ công (Manual) Tổ hợp toàn phần (Exhaustive) Kiểm thử theo cặp (Pairwise với PICT)
Thời gian thiết lập Rất cao (hàng giờ/mô hình) Trung bình (cần viết script) Rất nhanh (tự động hóa qua thuật toán)
Số lượng ca kiểm thử Thấp (chọn ngẫu nhiên) Cực lớn ($N = \prod v_i$) Tối ưu hóa ($O(v^2)$)
Khả năng bao phủ lỗi Kém, dễ sót biên 100% không gian cấu hình ~70% lỗi tương tác (tối ưu chi phí)
Nguy cơ sai sót dữ liệu Cao (thao tác tay) Thấp (xử lý logic máy tính) Thấp (chuẩn hóa đầu vào JSON)
Khả năng mở rộng quy mô Rất kém Kém (bùng nổ không gian trạng thái) Rất tốt cho hệ thống đa biến

Yêu cầu người dùng đối với hệ thống được chuẩn hóa theo mô hình MoSCoW:

  • Must have (Bắt buộc): Đọc và phân tích file cấu hình JSON chứa thông số block; gọi lệnh điều khiển MATLAB API để gán tham số (set_param); sinh file .slx/.mdl hoàn chỉnh; tích hợp công cụ PICT v3.3; giao diện đồ họa trực quan.
  • Should have (Nên có): Chuyển đổi dữ liệu tự động giữa Text, Excel (.xlsx) và Workspace MATLAB; hiển thị log kết quả thời gian thực trên bảng giao diện.
  • Could have (Có thể có): Hỗ trợ xuất báo cáo thống kê so sánh giữa 2 phương pháp sinh mô hình.
  • Won't have (Chưa hỗ trợ): Tự động biên dịch sang mã C/C++ trực tiếp từ mô hình được sinh.

Thách thức kỹ thuật lớn nhất nằm ở việc đồng bộ hóa dữ liệu giữa công cụ dòng lệnh ngoài (PICT thực thi trên shell) với môi trường bộ nhớ của MATLAB Engine và ánh xạ chính xác định danh đường dẫn khối (full_path) vào cấu trúc phân cấp của Simulink.

Thiết kế hệ thống

Kiến trúc hệ thống được thiết kế theo mô hình 3 lớp phân tách rõ ràng:

+-------------------------------------------------------------+
|                 Giao diện người dùng (MATLAB GUI)           |
+-------------------------------------------------------------+
                              |
                              v
+-------------------------------------------------------------+
|                     Khối xử lý trung gian                   |
|  +--------------------+  +-------------------------------+  |
|  | JSON Parser Engine |  | PICT Bridge (DOS CLI Executor)|  |
|  +--------------------+  +-------------------------------+  |
+-------------------------------------------------------------+
                              |
                              v
+-------------------------------------------------------------+
|                Simulink Core Automation Engine              |
|  [getSimulinkHandle] -> [set_param] -> [save_system/close]  |
+-------------------------------------------------------------+

Technology Stack chi tiết:

  • Môi trường tính toán & Mô phỏng: MathWorks MATLAB & Simulink (phiên bản R2020a/R2021a).
  • Giao diện người dùng: MATLAB GUI (GUIDE Framework - .fig.m).
  • Thuật toán sinh kiểm thử kết hợp: Microsoft PICT (Pairwise Independent Combinatorial Testing) phiên bản 3.3.
  • Định dạng trao đổi dữ liệu: JSON (JavaScript Object Notation), Text File (.txt), Microsoft Excel Spreadsheet (.xlsx).

Cấu trúc định nghĩa tham số đầu vào (JSON Schema) được chuẩn hóa như sau:

{
  "model": "Embedded_Control_System",
  "mode": "Pairwise_Combinatorial",
  "target_blocks": [
    {
      "full_path": "Embedded_Control_System/Multiport_Switch",
      "combine_parameters": [
        {
          "name": "DataPortOrder",
          "values": ["One-based contiguous", "Zero-based contiguous", "Specify indices"]
        },
        {
          "name": "DataPortIndices",
          "values": ["{1,2,3}", "{0,1,2}"]
        }
      ],
      "fixed_parameters": {
        "SampleTime": "-1"
      }
    }
  ]
}

Về mặt hiệu năng, hệ thống xử lý bộ nhớ bằng cách giải phóng tài nguyên mô hình (close_system) ngay sau khi lưu đĩa (save_system), ngăn ngừa hiện tượng rò rỉ bộ nhớ (Memory Leak) khi sinh hàng ngàn mô hình lớn.

Methodology

Dự án áp dụng phương pháp phát triển lặp linh hoạt (Iterative Agile Approach) chia làm các giai đoạn then chốt:

  1. Milestone 1 (Tuần 1 - 2): Nghiên cứu lý thuyết kiểm thử hộp đen, phân tích cấu trúc khối Simulink và thuật toán Pairwise Testing.
  2. Milestone 2 (Tuần 3 - 5): Thiết lập kịch bản sinh dữ liệu tổ hợp qua JSON và kiểm thử các lệnh API điều khiển Simulink.
  3. Milestone 3 (Tuần 6 - 8): Đóng gói tích hợp bộ công cụ PICT v3.3 vào pipeline của MATLAB thông qua giao tiếp Command Line.
  4. Milestone 4 (Tuần 9 - 11): Lập trình GUI tương tác và module đọc/ghi Excel trung gian.
  5. Milestone 5 (Tuần 12): Kiểm thử nghiệm thu (UAT), đo đạc hiệu năng và tối ưu hóa hệ thống.

Quản trị rủi ro tập trung vào việc xử lý sai lệch đường dẫn khối hoặc tham số không hợp lệ trong file JSON thông qua các khối xử lý ngoại lệ an toàn (try - catch) và kiểm tra tính hợp lệ của getSimulinkHandle.


Implementation và kết quả

Development process

Quá trình xây dựng hệ thống tập trung vào việc hiện thực hóa 2 quy trình sinh mô hình cốt lõi bằng các hàm chuyên dụng của MATLAB:

1. Quy trình sinh mô hình bằng phương pháp tổ hợp toàn phần

Thuật toán duyệt đệ quy toàn bộ không gian tham số từ file JSON, kết hợp các giá trị và gán trực tiếp vào mô hình Simulink gốc:

% Đọc và giải mã file cấu hình tham số JSON
jsonText = fileread('config_parameters.json');
configData = jsondecode(jsonText);

% Mở mô hình gốc trong bộ nhớ
modelName = configData.model;
load_system(modelName);

counter = 0;
% Duyệt tổ hợp các tham số và thực hiện gán động
for i = 1:length(configData.target_blocks)
    blockPath = configData.target_blocks(i).full_path;
    targetBlock = getSimulinkHandle(blockPath, true);
    
    if targetBlock ~= -1
        paramList = configData.target_blocks(i).combine_parameters;
        for p = 1:length(paramList)
            paramName = paramList(p).name;
            paramValues = paramList(p).values;
            for v = 1:length(paramValues)
                val = paramValues{v};
                set_param(blockPath, paramName, val);
                
                counter = counter + 1;
                generatedModelName = sprintf('%s_Comb_%04d', modelName, counter);
                save_system(modelName, generatedModelName);
            end
        end
    end
end
close_system(modelName);

2. Quy trình sinh mô hình áp dụng kỹ thuật Pairwise Testing qua PICT

Quy trình gồm các bước tuần tự:

  • Bước 1: Trích xuất các tham số từ JSON và ghi định dạng đầu vào cho PICT (input.txt).
  • Bước 2: Gọi thực thi PICT ở chế độ nền qua lệnh hệ điều hành dos.
  • Bước 3: Chuyển đổi ma trận ca kiểm thử output.txt thành bảng tính .xlsx qua textscanxlswrite.
  • Bước 4: Đọc mảng cấu hình từ .xlsx và tự động cập nhật vào mô hình Simulink.
% Bước 1 & 2: Thực thi PICT từ command line
dos('pict.exe input.txt > output.txt');

% Bước 3: Đọc file output và lưu vào cấu trúc Cell Array
fileID = fopen('output.txt', 'r');
formatSpec = '%s%s%s%s'; % Tùy biến theo số lượng tham số
dataCells = textscan(fileID, '%s %s %s %s', 'Delimiter', '\t', 'HeaderLines', 1);
fclose(fileID);

% Chuyển đổi và lưu sang định dạng bảng tính Excel
xlswrite('output.xlsx', [dataCells{1}, dataCells{2}, dataCells{3}, dataCells{4}]);

% Bước 4: Đọc file Excel và sinh mô hình tương ứng từng Test Case
[~, ~, rawData] = xlsread('output.xlsx');
[numTestCases, numParams] = size(rawData);

load_system(modelName);
for row = 1:numTestCases
    % Gán các cặp tham số tương ứng trong ca kiểm thử thứ 'row'
    for col = 1:numParams
        set_param(blockPathArray{col}, paramNameArray{col}, rawData{row, col});
    end
    
    outputModelName = sprintf('%s_Pairwise_TC_%03d', modelName, row);
    save_system(modelName, outputModelName);
end
close_system(modelName);

Testing và validation

Hiệu năng và độ chính xác của hệ thống được kiểm thử thực tế trên một kịch bản hệ thống nhúng quản lý phương tiện với 4 biến đầu vào đa trạng thái:

  • Loại đặt hàng ($P_1$): 3 giá trị {Mua, Bán, Bảo hành}
  • Địa điểm ($P_2$): 3 giá trị {Hà Nội, Đà Nẵng, TP. Hồ Chí Minh}
  • Loại xe ($P_3$): 4 giá trị {Wave, Vision, Air Blade, Exciter}
  • Số đăng ký xe ($P_4$): 2 giá trị {Hợp lệ, Không hợp lệ}

Kết quả đánh giá kiểm thử:

  • Không gian kiểm thử toàn phần: $N_{Total} = 3 \times 3 \times 4 \times 2 = 72$ ca kiểm thử (tương đương 72 mô hình .slx cần sinh).
  • Không gian kiểm thử theo cặp (Pairwise qua PICT): Giảm xuống chỉ còn 12 ca kiểm thử bao phủ toàn bộ mọi tương tác 2 chiều giữa 4 tham số.
Ca kiểm thử (TC) Loại đặt hàng ($P_1$) Địa điểm ($P_2$) Loại xe ($P_3$) Số đăng ký xe ($P_4$)
TC01 Mua Hà Nội Wave Hợp lệ
TC02 Bán Đà Nẵng Wave Không hợp lệ
TC03 Bảo hành TP. Hồ Chí Minh Wave Không hợp lệ
TC04 Bán Hà Nội Vision Hợp lệ
TC05 Bảo hành Đà Nẵng Vision Hợp lệ
TC06 Mua TP. Hồ Chí Minh Vision Không hợp lệ
TC07 Bảo hành Hà Nội Air Blade Không hợp lệ
TC08 Mua Đà Nẵng Air Blade Hợp lệ
TC09 Bán TP. Hồ Chí Minh Air Blade Hợp lệ
TC10 Mua Hà Nội Exciter Không hợp lệ
TC11 Bán Đà Nẵng Exciter Không hợp lệ
TC12 Bảo hành TP. Hồ Chí Minh Exciter Hợp lệ

Kết quả đạt được

Hệ thống đã hoàn thành 100% các chức năng đề ra trong mục tiêu ban đầu:

  • Tốc độ sinh mô hình: Thời gian tạo 12 mô hình Simulink qua phương pháp Pairwise chỉ mất ~4.8 giây trên máy trạm thông thường, so với ước tính 30-40 phút nếu thực hiện thủ công bằng tay.
  • Tính toàn vẹn của mô hình: 100% mô hình sinh ra mở được trực tiếp trên MATLAB/Simulink, giữ nguyên liên kết dây tín hiệu và gán đúng chính xác giá trị tham số đích.
  • Khả năng sử dụng: Giao diện GUIDE trực quan với đầy đủ tính năng nạp file, hiển thị bảng kết quả và nút điều khiển một chạm.

Đổi mới và đóng góp

  1. Cơ chế tự động hóa chuyển đổi tham số trung gian: Đề tài đã xây dựng thành công cầu nối tự động 2 chiều giữa tập tin cấu hình chuẩn JSON, thuật toán PICT và cấu trúc cây phân cấp bên trong Simulink Engine.
  2. Tối ưu hóa không gian kiểm thử vượt bậc: Áp dụng thành công lý thuyết Combinatorial Design để cắt giảm 83.33% số lượng ca kiểm thử (từ 72 xuống còn 12 mô hình) trong bài toán mẫu, giảm tải áp lực tài nguyên phần cứng khi chạy mô phỏng liên tục trong quy trình kiểm thử hệ thống nhúng.
  3. Đóng góp cho quy trình Model-Based Design: Cung cấp một giải pháp mở, có thể tích hợp trực tiếp vào quy trình kiểm thử tự động của các doanh nghiệp phát triển phần mềm nhúng, giúp giảm chi phí nhân sự và rút ngắn thời gian đưa sản phẩm ra thị trường (Time-to-Market).

Ứng dụng thực tế và triển khai

Real-world use cases

  • Kiểm thử ECU ô tô (Automotive Software): Kiểm tra tương tác giữa các chế độ lái (Eco/Sport/Normal), trạng thái chân phanh, vận tốc bánh xe và góc đánh lái trong các khối điều khiển ABS/ESP.
  • Hệ thống điều khiển bay (Avionics): Kiểm thử bộ điều khiển độ cao và góc cánh lái trong các điều kiện nhiễu gió và tải trọng khác nhau.
  • Thiết bị điện tử tiêu dùng & IoT: Tự động sinh hàng trăm kịch bản cấu hình tham số cho thiết bị nhà thông minh trước khi nạp firmware thực tế.

Hướng dẫn triển khai (Deployment Guide)

  1. Yêu cầu môi trường:
    • Hệ điều hành: Windows 10/11 64-bit.
    • Phần mềm: MathWorks MATLAB R2018b trở lên (đã cài Simulink).
    • Công cụ: File thực thi pict.exe được đặt cùng thư mục làm việc hiện hành của MATLAB.
  2. Các bước vận hành:
    • Khởi động MATLAB, điều hướng thư mục làm việc đến mã nguồn đồ án.
    • Gõ lệnh guide hoặc chạy trực tiếp file giao diện chính .m.
    • Chọn chế độ sinh mô hình (Tổ hợp toàn phần hoặc Pairwise Testing).
    • Tải tệp mô hình mẫu (.slx) và tệp thuộc tính (.json).
    • Nhấn Sinh mô hình và nhận toàn bộ bộ mô hình kiểm thử tại thư mục đầu ra.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Hệ thống hiện tại mới chỉ tập trung vào việc biến đổi thuộc tính tham số nội tại của các block, chưa hỗ trợ tự động bổ sung hoặc xóa bỏ liên kết đường dây (Signal Routing) giữa các hệ thống con phức tạp.
  • Chưa tích hợp tính năng xử lý ràng buộc logic điều kiện nâng cao (Constraint Conditions) trực tiếp trên giao diện GUI mà vẫn cần khai báo trước trong tập tin cấu hình.

Hướng phát triển

  • Mở rộng hỗ trợ kỹ thuật kiểm thử $N$-way (3-way, 4-way Testing) cho các hệ thống an toàn cấp cao (Safety-Critical Systems) yêu cầu chuẩn DO-178C hoặc ISO 26262.
  • Xây dựng plugin tích hợp trực tiếp vào đường ống CI/CD (Continuous Integration/Continuous Deployment) tự động chạy mô phỏng sau khi sinh mô hình bằng MATLAB Test Manager.

Đối tượng hưởng lợi

  • Sinh viên & Học viên cao học: Cung cấp tài liệu tham khảo hoàn chỉnh, mã nguồn mẫu về kỹ thuật tương tác với MATLAB API và phương pháp luận kiểm thử phần mềm tự động.
  • Kỹ sư phát triển hệ thống nhúng (Embedded Engineers): Sở hữu công cụ hữu ích để tự động hóa khâu tạo kịch bản kiểm thử mô hình Simulink, tiết kiệm 90% thời gian thiết lập test case.
  • Doanh nghiệp công nghệ: Nâng cao chất lượng sản phẩm nhúng, giảm thiểu rủi ro lỗi phần mềm nghiêm trọng và tối ưu hóa chi phí vận hành đội ngũ QA/Tester.
  • Nhà nghiên cứu (Researchers): Nền tảng thực nghiệm để mở rộng các thuật toán tối ưu hóa tổ hợp và sinh dữ liệu kiểm thử thông minh (Search-Based Software Testing).

Câu hỏi thường gặp

1. Hệ thống có yêu cầu phần cứng đặc biệt để chạy không?
Không. Hệ thống chạy trên mọi cấu hình máy tính cá nhân cài đặt được MATLAB (tối thiểu 8GB RAM, CPU Intel Core i3 trở lên).

2. Kỹ thuật Pairwise Testing có làm bỏ sót lỗi quan trọng không?
Nghiên cứu thực nghiệm chỉ ra rằng phần lớn lỗi trong phần mềm bắt nguồn từ tương tác giữa 1 hoặc 2 tham số. Pairwise Testing đảm bảo bao phủ 100% các cặp tương tác 2 chiều, giúp phát hiện khoảng 70% đến 90% lỗi hệ thống với số lượng ca kiểm thử tối thiểu.

3. Có thể thay đổi danh sách các khối Simulink cần biến đổi tham số không?
Hoàn toàn được. Người dùng chỉ cần cập nhật đường dẫn khối (full_path) và danh sách tham số tương ứng trong tệp cấu hình JSON mà không cần sửa đổi mã nguồn chương trình.

4. Công cụ PICT của Microsoft có miễn phí và tương thích với hệ điều hành không?
PICT là công cụ mã nguồn mở miễn phí của Microsoft. Phiên bản pict.exe trong đồ án hoạt động hoàn toàn ổn định trên tất cả các phiên bản Windows thông qua lệnh gọi dòng lệnh của MATLAB.

5. Mô hình Simulink sau khi sinh tự động có thể chỉnh sửa thủ công được không?
Có. Toàn bộ các mô hình sinh ra đều ở định dạng tiêu chuẩn .slx/.mdl, người dùng có thể mở, mô phỏng và chỉnh sửa trực tiếp trên giao diện Simulink độc lập.


Kết luận

Đề tài "Xây dựng hệ thống sinh mô hình MATLAB/Simulink tự động" đã giải quyết xuất sắc bài toán tự động hóa dữ liệu kiểm thử cho hệ thống nhúng. Bằng cách kết hợp linh hoạt giữa phương pháp tổ hợp và kỹ thuật Pairwise Testing qua công cụ Microsoft PICT, hệ thống không chỉ giải quyết triệt để vấn đề bùng nổ số lượng mô hình mà còn nâng cao đáng kể năng suất và độ chính xác trong kiểm thử phần mềm dựa trên mô hình. Đây là bước đệm vững chắc và mang giá trị ứng dụng thực tiễn cao cho quy trình phát triển các hệ thống nhúng an toàn trong tương lai.