MATLAB Answers

2台のPC間で信号を送受信したい

10 views (last 30 days)
Ray
Ray on 26 Aug 2021
Commented: Ray on 29 Aug 2021
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上のメモリの変更をリアルタイムには読み取り&書き込みできないのでしょう。
詳しい仕組みは理解していませんが、、

Accepted Answer

Toshinobu Shintai
Toshinobu Shintai on 26 Aug 2021
TCP/IPで通信を行い、PC1で処理が終わったタイミングで送信、PC2はそのデータを受信するまで処理を待たせる、ということを行ってはどうでしょうか。以下にTCP/IPの紹介ページがあります。
UDP通信でも可能です。こちらはDSP System Toolboxが必要になります。
  2 Comments
Ray
Ray on 29 Aug 2021
目的を達成することができました。
助言をいただきありがとうございました。
TCP/IPでの通信について調べてみたところ、
によると、tcpclient関数ではPC間の通信はできないとあり、実際に私が即席で書いたコードではPC間の通信を実現できませんでした。
Instrument Control Toolboxに含まれるtcpip関数であればそれが可能になるらしいですが、このToolboxは購入していないため使用できません。
そこで次に、下記URLで配布されているjtcp関数を参考にしました。
こちらで利用されているjavaの関数によってTCP/IPでの通信を可能にし、目的を満たすことができました。

Sign in to comment.

More Answers (0)

Tags

Products


Release

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!