3

Matlab から次の C ライブラリ関数を呼び出す必要があります。

bool PI_OAD (int ID, const int* channel, const double* pdValueArray, int iArraySize)

パラメータ iArraySize は、配列チャネルと pdValueArray のサイズである必要があります。

パラメータ channel と pdValueArray は次のように指定されます。

pChannel = uint8(channel);
pStep = uint16(step);

私のcalllibコマンドは次のとおりです。

calllib(Controller, 'PI_OAD', ID, pChannel, pStep, int32(24));

うまくいきません。

パラメータ チャネルのサイズを渡し、正しくステップする方法がわかりません。誰かがアイデアを持っていますか?? ありがとう!

編集:すべての回答に感謝します。次の火曜日に仕事に戻ったら、あなたの提案を試してみます。

いくつかの追加情報:

ハードウェア インターフェイスを介してピエゾ素子を操作するには、関数 PI_OAD が必要です。軸が 1 つしかないため、チャネルはほとんどの場合 1 です。ステップは、ピエゾ素子に設定する電圧です。

機能しないということは、インターフェイスからいくつかのエラーが発生することを意味します。私が覚えている限り、「コマンドが長すぎます」の後に「不明なコマンド」エラーが表示されます。

4

2 に答える 2

1

コードにいくつかのエラーがあります。

  • channelとして宣言されてint *いますが、の配列を渡しますuint8
  • pdValueArraydouble *あなたが通過している間、として宣言されていますuint16

したがって、サイズを渡すことは問題ではありません-他の変数を渡すことは問題です。

ここに私が書いた簡単なdllがあります:

int PI_OAD (int ID, const int* channel, const double* pdValueArray, int iArraySize){
  int i; 
  mexPrintf("ID %d, size %d\n", ID, iArraySize);
  for(i=0; i<iArraySize; i++)
    mexPrintf("%lf ", pdValueArray[i]);
}

MATLABから呼び出す方法は次のとおりです

lib = loadlibrary('libtestlib.so','testlib.h');

ID=int32(10);
pChannel = int32([1:10]);
pStep = double([1:10]);
calllib('libtestlib', 'PI_OAD', ID, pChannel, pStep, int32(numel(pChannel)));

unloadlibrary('libtestlib');

そして、ここに出力があります

ID 10, size 10
1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000 9.000000 10.000000 

すべて正常に動作します!

于 2012-11-22T14:33:17.097 に答える
0

MATLAB MEX-Wrapper を作成する必要があります。これは C 関数であり、MATLAB で定義された型 (通常は mxArray) を受け取り、それらを正しい型に変換します。

MEX 関数を書くのはそれほど難しくありません。

http://www.mathworks.com/help/matlab/creating-cc-and-fortran-programs-to-be-callable-from-matlab-mex-files.html;jsessionid=874554659556527535e9ea9a084c

と:

http://www.mathworks.com/help/matlab/apiref/mexfunction.html

MATLAB ドキュメンテーションには、従うことができる多くの例があります。それらの多くは、あなたが望むものに近いものです。

于 2012-11-22T14:11:21.697 に答える