Panggil perpustakaan bersama dari Similink

Hai, Habr!
Saya mempersembahkan kepada Anda terjemahan sebuah artikel oleh rekan saya Mikhail tentang metode untuk memohon perpustakaan bersama di Simulink. Mengapa itu diciptakan sama sekali? Faktanya adalah bahwa banyak perusahaan sudah memiliki banyak model warisan yang ingin kami gunakan kembali dan kami sering mengajukan pertanyaan: “Bagaimana saya bisa mengintegrasikan warisan ke dalam Simulink? Dan jika warisan saya dalam bentuk DLL? " Karena itu, artikel aslinya ditulis.
Di bawah kucing, beberapa cara untuk memanggil perpustakaan bersama di Simulink dibahas.

Semua perubahan pada kode dibuat dengan izin Mikhail dan dibuat agar tidak membebani artikel.


Artikel ini menunjukkan cara menggunakan fungsi dari pustaka bersama dalam model Simulink.
Katakanlah kita perlu menyematkan perpustakaan exlib di Simulink. Kodenya terkandung dalam sumber-sumber exlib.c dan exlib.h . Ini adalah pustaka yang sangat sederhana yang berisi tiga fungsi:
void exlib_init (void) - membuka file untuk ditulis.
membatalkan exlib_print (data float) - menulis data ke file.
void exlib_term (void) - menutup file.

Majelis perpustakaan


Pertama, kompilasi perpustakaan.
Langkah ini tidak diperlukan jika perpustakaan dikompilasi dan dikirim sebagai file biner. Dalam hal ini, Anda bisa langsung pergi ke langkah 3, tetapi ingat bahwa untuk bekerja dengan perpustakaan Anda perlu mendapatkan file .dll (atau .so untuk Linux) dan file header yang sesuai (.h) dari penyedia perpustakaan. Untuk Windows, Anda juga akan memerlukan file .lib, yang bukan perpustakaan statis, tetapi yang disebut perpustakaan impor. Pustaka impor ini diperlukan untuk menghubungkan secara implisit.
Pertama, kita akan menggunakan perintah MATLAB mex, yang memanggil kompilator host aktif saat ini untuk mengkompilasi perpustakaan bersama (exlib.dll pada Windows dan exlib.so di Linux). Penting untuk memastikan bahwa perintah telah dijalankan terlebih dahulu.
mex -setup


untuk memilih kompiler yang didukung .
Sekarang gunakan mex untuk mengkompilasi perpustakaan:

Kode untuk membangun perpustakaan
mingw = strfind(mex.getCompilerConfigurations('C','Selected').Name,'MinGW64 Compiler');
if isunix
    % GCC
    mex('LDEXT=.so','LINKEXPORT=','LINKEXPORTVER=','LINKLIBS=','exlib.c');
elseif mingw
    % MinGW builds static shared library, so dll and lib files are the same
    % loadlibrary uses the dll file, while legacy code tool looks for the lib file
    mex('LDEXT=.lib','LINKEXPORT=','LINKEXPORTVER=','LINKLIBS=','exlib.c');
    mex('LDEXT=.dll','LINKEXPORT=','LINKEXPORTVER=','LINKLIBS=','exlib.c');
else
    % Visual
    mex('LDEXT=.dll','LINKEXPORT=','LINKEXPORTVER=','CMDLINE300="del exlib.exp exlib.dll.manifest"','exlib.c');
end
Building with 'gcc'.
MEX completed successfully.



Memeriksa perpustakaan yang dikompilasi


Setelah kompilasi, Anda perlu memastikan bahwa pustaka yang dihasilkan dapat dimuat dan digunakan di MATLAB:

Kode untuk memeriksa perpustakaan
% Load the library
[~,~] = loadlibrary(['exlib',system_dependent('GetSharedLibExt')],'exlib.h');
% Display functions available in the library
libfunctionsview('exlib');
% Initialize
calllib('exlib','exlib_init');
% Step
for i = 1:10
    calllib('exlib','exlib_print',single(i));
end
% Terminate
calllib('exlib','exlib_term');
% Unload the library
unloadlibrary('exlib');
% Show contents of generated file
type('exlib.txt');
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
10.000000


Sekarang setelah kami memastikan semuanya bekerja, mari kita mulai dengan Simulink!

Meminta pustaka bersama menggunakan fungsi S


Fungsi S memungkinkan Anda menggunakan kode-C di Simulink. Pendekatan ini memungkinkan pengguna untuk mengembangkan kode C yang diperlukan untuk memuat perpustakaan dan memanggil fungsinya. Kemudian, kode ini dikompilasi menjadi file biner yang dikenali oleh Simulink dan ditautkan ke perpustakaan bersama. Biner ini disebut fungsi S. Simulink memiliki blok untuk memanggil fungsi S ini. Ada beberapa pendekatan untuk membuat fungsi-S di Simulink.

Menggunakan Alat Kode Lama


Pendekatan pertama adalah menggunakan Legacy Code Tool , alat yang membantu Anda secara otomatis membuat fungsi-S sesuai dengan spesifikasi yang dibuat menggunakan MATLAB. Dalam contoh ini, fungsi-S dihubungkan ke perpustakaan impor (pada Windows kita memerlukan file * .lib yang sesuai) dan fungsi-fungsi perpustakaan dipanggil. Pendekatan ini disebut tautan implisit.
Pertama, Anda perlu menginisialisasi struktur untuk Alat Kode Legacy
Kode untuk menginisialisasi struktur Alat Kode Lama
specs = legacy_code('initialize');
% Prototype for the initialization function
specs.StartFcnSpec = 'exlib_init()';
% Prototype for the step function
specs.OutputFcnSpec = 'exlib_print(single u1)';
% Prototype for the terminate function
specs.TerminateFcnSpec = 'exlib_term()';
% Shared library to link with (.so on Linux and .dll on Windows)
specs.HostLibFiles = {['exlib',strrep(system_dependent('GetSharedLibExt'),'.dll','.lib')]};
% We must supply header file when linking with shared library, otherwise
% compiler might make wrong assumptions about function's prototype.
specs.HeaderFiles = {'exlib.h'};
specs.SFunctionName = 'sfun_exlib';



Buat fungsi-S, kompilasi dan tautkan:
legacy_code('generate_for_sim',specs);
### Start Compiling sfun_exlib
    mex('sfun_exlib.c', '-I/tmp/simulink_shrlib_fex', '/tmp/simulink_shrlib_fex/exlib.so')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_exlib
### Exit


Terakhir, buat blok Simulink:
legacy_code('slblock_generate',specs);


Jalankan simulasi:
open_system('simlib_test');
snapnow;
sim('simlib_test');
% Observe the results:
type('exlib.txt');
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
10.000000


Fungsi Menulis S Secara Manual


Pendekatan kedua adalah menulis fungsi-S Anda sendiri untuk memuat pustaka bersama dan fungsi panggilan dari pustaka ini. Pendekatan ini akan menggunakan tautan eksplisit, juga disebut tautan runtime. Solusi termudah adalah dengan mengadaptasi fungsi-S yang secara otomatis dihasilkan sebelumnya oleh Legacy Code Tool. Dalam contoh ini, fungsi mdlStart , mdlOutputs, dan mdlTerminate dimodifikasi .
Begini cara fungsi-fungsi ini terlihat setelah modifikasi:
Lihat kode
void mdlStart(SimStruct *S)
{
  /*
   * Load the dynamic library
   */

  #if defined(__GNUC__) && !defined(__MINGW32__)
    void (*exlib_init_ptr)(void);
    dllHandle = dlopen("./exlib.so",RTLD_LAZY);
    exlib_init_ptr = dlsym(dllHandle, "exlib_init");
  #else
    exlib_init_type exlib_init_ptr = NULL;
    dllHandle = LoadLibrary("exlib.dll");
    exlib_init_ptr = (exlib_init_type)GetProcAddress(dllHandle,"exlib_init");
  #endif

  exlib_init_ptr();
}


void mdlOutputs(SimStruct *S, int_T tid)
{
  real32_T *u1 = 0;

  #if defined(__GNUC__) && !defined(__MINGW32__)
    void (*exlib_print_ptr)(float);
    exlib_print_ptr = dlsym(dllHandle,"exlib_print");
  #else
    exlib_print_type exlib_print_ptr = NULL;
    exlib_print_ptr = (exlib_print_type)GetProcAddress(dllHandle,"exlib_print");
  #endif

  /*
   * Get access to Parameter/Input/Output/DWork/size information
   */
  u1 = (real32_T *) ssGetInputPortSignal(S, 0);

  /*
   * Call the function from library
   */
  exlib_print_ptr( *u1);
}


void mdlTerminate(SimStruct *S)
{
  /*
   * Unload the dynamic library
   */

  #if defined(__GNUC__) && !defined(__MINGW32__)
    void (*exlib_term_ptr)(void);
    exlib_term_ptr = dlsym(dllHandle,"exlib_term");
    exlib_term_ptr();
    dlclose(dllHandle);
  #else
    exlib_term_type exlib_term_ptr = NULL;
    exlib_term_ptr = (exlib_term_type)GetProcAddress(dllHandle,"exlib_term");
    exlib_term_ptr();
    FreeLibrary(dllHandle);
  #endif
}



Kompilasi S-function yang dihasilkan:
if isunix
    mex('sfun_exlib_dyn.c','-ldl');
else
    mex('sfun_exlib_dyn.c');
end
Building with 'gcc'.
MEX completed successfully.


Dan jalankan simulasi:
open_system('simlib_test_dyn');
sim('simlib_test_dyn');
% Observe the results:
type('exlib.txt');
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
10.000000


Menggunakan S-Function Builder


Pendekatan lain adalah dengan menggunakan blok S-Function Builder . Ini adalah unit khusus yang dapat dilihat sebagai persilangan antara Legacy Code Tool dan S-functions yang ditulis tangan dalam hal kompleksitas. S-Function Builder menyediakan antarmuka grafis yang menggambarkan karakteristik fungsi-S Anda, dan fungsi-S dibuat secara otomatis.
Ada beberapa batasan kinerja dan masalah dengan menggunakan S-Function Builder. Saat ini, ini dianggap sebagai pendekatan usang untuk membuat fungsi-S. Disarankan untuk menggunakan blok fungsi C, yang muncul dalam rilis R2020a dan dibahas nanti.

Meminta pustaka bersama menggunakan Fungsi MATLAB


Blok Fungsi MATLAB memungkinkan Anda untuk menggunakan bahasa MATLAB untuk mendeskripsikan algoritma khusus di Simulink.
Untuk memanggil pustaka bersama dari fungsi MATLAB, gunakan fungsi coder.ceval , yang hanya dapat digunakan di tubuh Fungsi MATLAB (dan bukan MATLAB). Coder.ceval tidak membutuhkan MATLAB Coder untuk berfungsi.
Kode untuk blok Fungsi MATLAB memanggil pustaka bersama:
Lihat kode
function fcn(u)
%#codegen

% Keep track of initialization and runtime count
persistent runTimeCnt

% Generate library path on the fly (current directory in this case)
coder.extrinsic('pwd','system_dependent');
libpath = coder.const(pwd);
% Shared library to link with
libname = coder.const(['exlib',strrep(system_dependent('GetSharedLibExt'),'.dll','.lib')]);
% Add the external library. Mark it as precompiled, so it won't appear as
% makefile target during code generation.
coder.updateBuildInfo('addLinkObjects',libname,libpath,1000,true,true);
coder.updateBuildInfo('addIncludePaths',libpath);
coder.cinclude('exlib.h');

if isempty(runTimeCnt)
    % Initialize
    coder.ceval('exlib_init');
    runTimeCnt = 0;
end
% Step
coder.ceval('exlib_print',single(u));
runTimeCnt = runTimeCnt+1;
% Terminate on the 10th step
if (runTimeCnt == 11)
    coder.ceval('exlib_term');
end



Pendekatan ini memiliki satu kelemahan - kurangnya cara yang baik untuk memanggil fungsi penyelesaian pada akhir simulasi (dibandingkan dengan blok Sistem MATLAB).
Anda dapat menentukan fungsi penyelesaian untuk model dengan mengatur exlib_term (); dalam pengaturan model dalam kategori Target Simulasi -> Kode Kustom -> Hentikan fungsi .

CATATAN . Jika parameter "Impor kode kustom" diatur dalam pengaturan model, maka Anda perlu menentukan semua dependensi kode di panel "Target Simulasi" (alih-alih menggunakan coder.cinclude dan coder.updateBuildInfo ). Jika parameter ini tidak disetel, maka Anda dapat menggabungkan pengaturan dari Simulasi Target, coder.cinclude dan coder.updateBuildInfo.


Cara lain adalah mempertahankan dependensi menggunakancoder.cinclude dan coder.updateBuildInfo , dan panggil exlib_term () dengan konvensi, seperti yang ditunjukkan pada contoh di atas.
Jalankan simulasi:
open_system('simlib_test_mlf');
sim('simlib_test_mlf');
% Observe the results:
type('exlib.txt');
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
10.000000


Meminta pustaka bersama dari Stateflow


Jika Anda ingin menggunakan fungsi pustaka bersama dalam diagram Stateflow , maka fungsi-fungsi ini harus dipanggil langsung dari Stateflow. Dokumentasi Stateflow memiliki contoh yang menunjukkan cara melakukan ini.
Memanggil fungsi eksternal dalam Stateflow sangat sederhana - Anda perlu menentukan nama fungsi dalam diagram Stateflow:


Selain itu, Anda perlu mengkonfigurasi parameter model sehingga Stateflow tahu ke mana harus mencari fungsi-fungsi eksternal ini. Dalam pengaturan Target Simulasi -> Kode Kustom -> Perpustakaan, Anda harus memasukkan exlib.lib (atau exlib.so di Linux) . Dalam Sasaran Simulasi -> Kode Kustom -> File Header, Anda harus memasukkan #include "exlib.h" . Penting juga untuk tidak lupa menentukan fungsi penyelesaian. DITarget Simulasi -> Kode Kustom -> Hentikan fungsi harus menentukan exlib_term (); .
Jalankan simulasi:
if isunix
    set_param('simlib_test_sf','SimUserLibraries','exlib.so');
end
sim('simlib_test_sf');
% Observe the results:
type('exlib.txt');
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
10.000000


Perhatikan bahwa informasi dalam bagian ini berlaku untuk Stateflow diagram yang menggunakan bahasa C tindakan . Jika diagram Stateflow menggunakan bahasa tindakan MATLAB , maka coder.ceval diperlukan , seperti halnya dengan Fungsi MATLAB.

Meminta pustaka bersama menggunakan blok Sistem MATLAB


Blok Sistem MATLAB memungkinkan Anda untuk menggunakan objek sistem di Simulink. Informasi lebih lanjut tentang blok ini dapat ditemukan dalam dokumentasi.
Dukungan untuk objek sistem muncul di Simulink dalam rilis R2013b. Banyak orang menggunakan objek sistem karena memudahkan mendefinisikan fungsi inisialisasi, simulasi, dan penyelesaian. Juga, objek sistem dapat menggunakan kode MATLAB tambahan untuk fungsi-fungsi ini - misalnya, untuk data pra-dan pasca-pemrosesan fungsi langkah - semua tanpa menulis kode C.
Inilah yang terlihat seperti objek sistem yang digunakan dalam blok Sistem MATLAB:
Kode Obyek Sistem
classdef exlib < matlab.System
    % Call exlib shared library
    %
    % This example shows how to call shared library from Simulink using
    % MATLAB System block.
    properties (Nontunable,Access=private)
        libName = exlib.getLibName;
        libPath = pwd;
        libHeader = 'exlib.h';
    end
    
    methods (Static)
        function libName = getLibName
            if isunix
                libName = 'exlib.so';
            else
                libName = 'exlib.lib';
            end
        end
    end
    
    methods (Access=protected)
        function setupImpl(obj, ~)
            % Initialize.
            coder.updateBuildInfo('addLinkObjects',obj.libName,obj.libPath,1000,true,true);
            coder.updateBuildInfo('addIncludePaths',obj.libPath);
            coder.cinclude(obj.libHeader);
            coder.ceval('exlib_init');
        end
        
        function stepImpl(~, u)
            % Step.
            coder.ceval('exlib_print',u);
        end
        
        function releaseImpl(~)
            % Terminate.
            coder.ceval('exlib_term');
        end
    end
end



Jalankan simulasi:
open_system('simlib_test_mls');
sim('simlib_test_mls');
% Observe the results:
type('exlib.txt');
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
10.000000


Panggil perpustakaan bersama menggunakan blok C Caller


Blok C Caller memungkinkan Anda untuk memanggil fungsi C langsung dari Simulink. Informasi lebih lanjut tentang blok ini dapat ditemukan dalam dokumentasi.
Ini adalah pendekatan yang relatif baru yang pertama kali muncul di MATLAB R2018b. Tujuan utamanya adalah membuat panggilan fungsi dan pustaka C di Simulink sangat sederhana. Tetapi memiliki keterbatasan, yang dapat Anda baca di dokumentasi untuk blok ini.
Setelah exlib.so/exlib.lib telah ditambahkan ke Simulasi Target -> Perpustakaan dan #include "exlib.h" di Simulasi Target -> Header dalam pengaturan model, cukup klik tombol "Refresh kode kustom" di blok C Caller, untuk melihat semua fungsi yang ada di perpustakaan.
Setelah memilih exlib_print fungsi , dialog spesifikasi port diisi secara otomatis:

Dan lagi, Anda perlu menambahkan exlib_init dan exlib_term fungsi panggilan untuk Target Simulasi. Anda juga dapat menambahkan beberapa blok Caller C lainnya untuk secara langsung memanggil fungsi inisialisasi dan terminasi. Blok-blok Penelepon C ini perlu ditempatkan dalam subsistem Fungsi Inisialisasi dan Fungsi Hentikan. Anda juga dapat mempertimbangkan contoh berikut dari Stateflow: Jadwalkan Subsistem untuk
Dijalankan pada Waktu Tertentu Jalankan simulasi:
open_system('simlib_test_ccaller');
if isunix
    set_param('simlib_test_ccaller','SimUserLibraries','exlib.so');
end
sim('simlib_test_ccaller');
% Observe the results:
type('exlib.txt');
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
10.000000


Meminta pustaka bersama menggunakan blok Fungsi C


Penambahan terbaru untuk mengintegrasikan kode eksternal ke Simulink adalah C Fungsi blok . Dia muncul di R2020a.
Ini menyerupai blok C Caller dalam hal kemudahan penggunaan, tetapi memungkinkan Anda untuk membuat pembungkus C di sekitar fungsi yang diimpor (dengan demikian, blok ini menyerupai S-Function Builder). Tetapi, kemungkinan besar, skenario utama untuk menggunakan blok Fungsi C bukan untuk memanggil fungsi C yang ada, tetapi untuk menulis potongan kecil kode C, jika kode tersebut diperlukan dalam aplikasi. Misalnya, Anda mungkin memerlukan akses ke register perangkat keras atau fungsi bawaan kompiler.
Jangan lupa untuk menambahkan exlib.so/exlib.lib ke pengaturan "Target Simulasi -> Perpustakaan" dan #sertakan "exlib.h"dalam pengaturan "Simulasi Target -> file Header" dalam pengaturan model.
Setelah itu, dalam pengaturan blok Fungsi C, Anda perlu menambahkan karakter untuk data input dengan tipe data tunggal dan tentukan output, mulai dan kode akhir:


open_system('simlib_test_cfunction');
if isunix
    set_param('simlib_test_cfunction','SimUserLibraries','exlib.so');
end
sim('simlib_test_cfunction');
% Observe the results:
type('exlib.txt');
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
10.000000


Meminta pustaka bersama yang dibuat menggunakan Embedded Coder


Salah satu skenario untuk menggunakan Embedded Coder adalah pembuatan kode-C otomatis dari model Simulink dan pengemasan kode ini di perpustakaan bersama. Dokumentasi ini juga memiliki contoh yang menunjukkan cara membuat pustaka bersama secara otomatis dan menyebutnya dari aplikasi eksternal yang ditulis dalam C.
Perhatikan bahwa jika Anda hanya perlu menjalankan algoritme atau bagian dari algoritma sebagai kode C dalam model Simulink yang sama, maka lebih baik menggunakan S-fungsi dari Simulink Coder atau simulasi software-in-the-loop. Namun, jika pustaka bersama yang dihasilkan oleh Embedded Coder digunakan untuk pemodelan semi-alami, Anda mungkin perlu mengintegrasikan pustaka yang sama ke dalam model yang lebih besar yang digunakan oleh pengembang lain dan dengan demikian melindungi kekayaan intelektual Anda.
Bekerja dengan pustaka bersama yang dihasilkan oleh Embedded Coder tidak berbeda dengan bekerja dengan pustaka bersama, yang digunakan dalam artikel. Pertimbangkan model sederhana yang memiliki dua input dan satu output:
open_system('simlib_test_ert');
snapnow;



Setelah merakit model, kami mendapatkan file .dll (.so di Linux), file .lib (impor library untuk .dll), dan file .exp (file ekspor untuk berkomunikasi dengan .dll).
if isunix
    set_param('simlib_test_ert','CustomHeaderCode','#include <stddef.h>');
end
rtwbuild('simlib_test_ert');
### Starting build procedure for: simlib_test_ert
### Successful completion of build procedure for: simlib_test_ert


Pustaka bersama yang dihasilkan mengekspor karakter berikut:
ex_init
double ex_step(double, double)
simlib_test_ert_terminate


Secara default, input dan output diekspor sebagai karakter global, dan fungsi inisialisasi, langkah, dan penyelesaian mengikuti konvensi penamaan model. Jika perlu, Anda dapat mengonfigurasi prototipe fungsi, nama simbol, dan lainnya (diskusi tentang pengaturan ini berada di luar cakupan artikel ini). Dalam model ini, prototipe fungsi langkah dari model didefinisikan sebagai Out1 = ex_step (In1, In2) .
Untuk memanggil fungsi-fungsi ini, Anda perlu menggunakan salah satu metode yang tercantum di atas. Misalnya, Anda dapat menggunakan Fungsi MATLAB (untuk kesederhanaan, kami hanya memanggil fungsi langkah):
Lihat kode
function y = fcn(u1, u2)
%#codegen

% Generate library path on the fly
coder.extrinsic('RTW.getBuildDir','fullfile');
buildDir = coder.const(RTW.getBuildDir('simlib_test_ert'));
libpath = coder.const(buildDir.CodeGenFolder);
incpath = coder.const(fullfile(buildDir.BuildDirectory,'simlib_test_ert.h'));
% Shared library to link with
if isunix
    ext = '.so';
    libname = ['simlib_test_ert',ext];
else
    ext = '.lib';
    libname = ['simlib_test_ert_',computer('arch'),ext];
end
% Add the external library. Mark it as precompiled, so it won't appear as
% makefile target during code generation.
coder.updateBuildInfo('addLinkObjects',libname,libpath,1000,true,true);
coder.updateBuildInfo('addIncludePaths',libpath);
coder.cinclude(incpath);

% Initialize output
y = 0;
% Step
y = coder.ceval('ex_step',u1,u2);



Jalankan simulasi dan lihat hasilnya:
open_system('simlib_test_callert');
sim('simlib_test_callert');
snapnow;



temuan


Artikel ini menjelaskan berbagai pendekatan untuk memohon pustaka bersama dari model Simulink. Baik tautan implisit maupun eksplisit dipertimbangkan. Semua metode memiliki pro dan kontra, dan kesesuaiannya tergantung pada alur kerja, persyaratan, dan tujuan tertentu.
Pendekatan Legacy Code Tool berfungsi paling baik ketika menerapkan tautan implisit dengan pustaka bersama, karena dalam hal ini kita bisa memanggil fungsi langsung dari pustaka, dan penghubung akan mengurus sisanya.
Blok Sistem MATLAB adalah pendekatan lain yang memberikan manfaat berikut:
  • Kepatuhan luar biasa terhadap paradigma fungsi inisialisasi, langkah dan penyelesaian, memungkinkan Anda untuk mempertahankan semua fungsi ini di dalam blok itu sendiri, dan bukan pada skala model

  • MATLAB MATLAB
  • MATLAB System (, S-)

Kerugian menggunakan blok Fungsi MATLAB adalah penggunaannya dapat menyebabkan overhead tambahan selama pembuatan kode. Dengan demikian, Legacy Code Tool dan fungsi S masih lebih disukai untuk menghasilkan kode produksi.
Fungsi S yang ditulis tangan paling cocok untuk menerapkan tautan eksplisit ke pustaka bersama. Dalam hal ini, Anda harus menggunakan fungsi seperti LoadLibrary / dlopen , GetProcAddress / dlsym , FreeLibrary / dlclose agar dapat memanggil fungsi.
Blok C Caller yang diperkenalkan di R2018b sejauh ini merupakan cara termudah untuk memanggil fungsi C, tetapi memiliki keterbatasan. Hal yang sama dapat dikatakan untuk blok Fungsi C.yang merupakan tambahan terbaru untuk R2020a.

Unduh sumber dan model di sini

All Articles