07-03-2020 06:21 AM
お世話になります。
2台のPCをGPIBで接続するため、スレーブ側のプログラムを作成しています。
ヘルプの「トーカ/リスナアプリケーション」とナレッジベースやフォーラムの書き込みを参考に、
ステイタス(ibwait(mask=0)の戻り値)の変化に応答するように、
例えば、
DCAS=L-->HのときDEVICECLEAR
ATN=0かつLACS!=0のとき受信
ATN=0かつTACS!=0のとき送信
のように作成しました。
ただ、フォーラムで質問されてた方々と同じく、
送受信についてはそれだけでは送信受信を繰り返してしまったので、
LACS、TACSがLになるまで再送受信できないようにしました。
でも、この方法では交互に送信>受信を繰り返す場合には対応できますが、
送信>送信や受信>受信、または通信エラーで再送するような場合に対応できません。
そこでわかる方がいらっしゃいましたら教えていただきたいのですが、
1.本来ならNRFD等の信号は送受信終了時にスレーブ側から制御するものですが、ni4882.dllにはその機能がないそうですが、本当にないのでしょうか?
2.また、そのために「NI Deviceというソフトが必要」と記事にはありましたが、この「NI Device」とは何でしょうか?
3.また、DEVICECLEAR後は必ず送受信エラーになってしまうので、何か手順が足りなそうなのですが、それが何かわかりましたら教えてください。
以下に補足説明用に、プログラムを簡略化したものを記載します。
よろしくお願いします。
--------------------------------------------
const string dllname = "ni4882.dll";
[DllImport(dllname, CharSet = CharSet.Unicode)] static extern uint ibfind(string udname);
:
static csibfind(string udname)
{
int ud;
ud = ibfind(udname);
return(ud);
}
:
static void Main(string[] args)
{
const int bitDCAS = 0x0001;
const int bitLACS = 0x0004;
const int bitTACS = 0x0008;
const int bitATN = 0x0010;
int ud;
uint status = 0;
uint laststatus = 0;
byte[] recvbuf = new byte[1000];
int recvbufsiz = 1000;
string sendbuf = "ABC\r\n";
int sendcnt = sendbuf.Length;
bool LACSlowed = false;
bool TACSlowed = false;
uint uiret;
ud = ibinfo("GPIB2"); // MAXで非CICに設定済み
ibconfig(ud, 26, 0);
while (true)
{
status = csibwait(ud, 0);
if ((laststatus & bitDCAS) == 0) && (status & bitDCAS) != 0)) // DCAS=L-->H
{
Console.WriteLine("<<DODEVCLEAR>>");
laststatus = status;
}
if ((status & bitLACS) == 0) // LCAS=L
{
LACSlowed = true;
}
if ((LACSlowed == true) && ((status & bitLACS) != 0) && ((status & bitATN) == 0)) // LACS=L-->H and ATN=L
{
LACSlowed = false;
Console.WriteLine("<<DOLISTEN>>");
uiret = csibrd(ud, out recvbuf, recvbufsiz);
Console.WriteLine(recvbuf);
laststatus = uiret;
status = uiret;
}
if ((status & bitTACS) == 0) // TACS=L
{
TACSlowed = true;
}
if ((TACSlowed == true) && ((status & bitTACS) != 0) && ((status & bitATN) == 0)) // TACS=L-->H and ATN=L
{
TACSlowed = false;
Console.WriteLine("<<DOTALK>>");
uiret = csibwrt(ud, sendbuf, sendbuf.Length);
Console.WriteLine(sendbuf);
laststatus = status;
status = uiret;
}
laststatus = status;
}
}
--------------------------------------------
フォーラムへのリンク
IEEE488.1準拠の計測器の初期化に用いる関数の意味などについて
https://forums.ni.com/t5/NI%E8%A3%BD%E5%93%81%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AB%E3%83%83%E3%82%B7%...
LabVIEW GP-IBスレーブプログラムにおける受信待ちについて
https://forums.ni.com/t5/LabVIEW/LabVIEW-GP-IB%E3%82%B9%E3%83%AC%E3%83%BC%E3%83%96%E3%83%97%E3%83%AD...
LabVIEW及びGPIBを使用した2台のコンピュータ間の通信
https://digital.ni.com/public.nsf/allkb/4A99D53B1990A39F862579C50038D50E
GPIBを介したコンピュータ同士の通信方法
https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z0000019LgoSAE&l=ja-JP
Creating a GPIB slave device with NI488.2
https://forums.ni.com/t5/Instrument-Control-GPIB-Serial/Creating-a-GPIB-slave-device-with-NI488-2/m-...
SLAVEのプログラミング
https://forums.ni.com/t5/NI%E8%A3%BD%E5%93%81%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AB%E3%83%83%E3%82%B7%...
07-05-2020 04:23 AM
全く知識がないので、投稿いただいたご質問についてはお答えすることができないのですが、
ご質問されている内容(LabVIEW以外の言語・・・ですよね)はこのフォーラムだとなかなか答えが得られにくいのかなと
思っています。
お節介は百も承知ですが、こちらに投稿すると同時に、日本以外のフォーラムに同じ内容を投稿されるともしかすると
外国のマニアの人が答えてくれるのかもしれないと感じました。英語で書く必要はありますけれどね。
もちろんこの日本向けのフォーラムでもどなたかが回答されるかもしれませんが、いろいろな投稿を見ていると、何となく
テキスト言語系の質問については返答が少ない印象でしたので。
07-06-2020 05:35 PM
marble_worker様、
アドバイスありがとうございます。
そうですね。英語のディスカッションフォーラムにも投稿してみます。