2台のPC間で信号を送受信したい
60 views (last 30 days)
Show older comments
2台のWindows10 PC(PC1、PC2とします)を使って、次のような処理をするための良い案があればご教示願います。
(MATLABのバージョンはR2020aです)
PC1から信号aを送信
PC2が信号aを受信すると、処理Aを開始
PC2は処理Aを終えると、信号a'を送信
PC1が信号a'を受信すると、信号bを送信
PC2が信号bを受信すると、処理Bを開始
PC2は処理Bを終えると、信号b'を送信
(上記を繰り返す)
PC1で常にPC2の状態を監視し、処理を始めるタイミングを制御することが目的です。
このような目的で一般的に利用されている方法や、何か参考になりそうな意見がございましたら、ご教示いただけますと幸いです。
以下、私が試してみた2つの方法について記載します。
------------
上記の目的を達成するために、まずは、2台のPCをLANケーブルで接続し、PC2上に共有フォルダを作成しました。
一方のPCから信号を送信する際、この共有フォルダ上に特定のファイル(例:signal_a.dat)を作成し、もう一方のPCでは、
while ~exist('signal_a.dat', 'file')
end
で signal_a.dat が生成されるのを待機して、while文を抜けたら処理Aを開始するようにしました。
とりあえずこれで期待通りの動作にはなりましたが、わざわざファイルを生成する(しかも信号の種類ごとに別名のファイル)のは冗長なので、もう少しスマートにできる方法はないかと模索しています。
そこで次に、
を参考にして、memmapfile関数を利用する方法を試しました。
上記URLのページに記載されているsend関数とanswer関数について、'tempdir'の部分を2台のPCの共有フォルダに変更しました。
この状態で、1台のPC上でMATLABインスタンスを2つ立ち上げ、一方でsend関数、もう一方でanswer関数を実行すると、期待通りに動作します。
しかし、PC1でsend関数、PC2でanswer関数を実行した場合、PC2がPC1からsendされた情報を受け取れないらしく、処理が進まなくなります。
もっと単純化した例を挙げると,PC1上で
m = memmapfile(filename, 'Writable', true, 'Format', 'uint8');
m.Data(1) = 1; % 元々は 0 で初期化してあるものを 1 に変更
とした後に、PC2上で、
disp(m.Data(1))
を実行すると「0」という値が返ってきてしまいます(本当は「1」になって欲しい)。
memmapfile関数では、LANケーブルで接続した他のPC上のメモリの変更をリアルタイムには読み取り&書き込みできないのでしょう。
詳しい仕組みは理解していませんが、、
0 Comments
Accepted Answer
Toshinobu Shintai
on 26 Aug 2021
TCP/IPで通信を行い、PC1で処理が終わったタイミングで送信、PC2はそのデータを受信するまで処理を待たせる、ということを行ってはどうでしょうか。以下にTCP/IPの紹介ページがあります。
UDP通信でも可能です。こちらはDSP System Toolboxが必要になります。
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!