ID : 370
Comm.Open
機能
データ通信時に回線をオープンします。
解説
データ通信をする際に回線をオープンします。
関連項目
Comm.Close、 Comm.Output、 Comm.Input、 Comm.Clear、 Comm.Count、 Comm.State、 データ通信
注意事項
Comm.Openの排他処理
回線をオープンしたタスクが実行中の場合、そのタスクがComm.Closeを実行し回線をクローズするまで、他のタスクがその回線をオープンすることも、使用することもできません。
ただし、回線をオープンしたタスクが回線をクローズせずに停止状態になった場合は、他のタスクがその回線を再オープンして使用することが可能です。
タスクが回線を占有しているかどうかは、Comm.Stateコマンドを使用して確認することができます。
オープンしたタスクに回線を占有させたくない場合は、「プログラムパラメータ」の「34:複数タスクの同一回線使用許可」を「1:有効」にしてください。他のタスクからでも、オープンした回線が使用できるようになります。
設定方法については、ティーチングペンダント操作ガイドの「プログラムパラメータの表示・変更」を参照してください。
Comm.inputどうし、Comm.outputどうしがマルチタスクで実行された場合は、後から実行されたほうは、先に実行されたコマンドの完了を待ちます。
プログラム停止後のComm.Open
オープンの状態から、Comm.Closeせずにタスクが停止状態になった場合、タスクの排他処理は解除されますが、回線のオープン状態は保持しています。2回目以降のComm.OpenはCPU負荷がかかりません。
(1)回線番号1がオープンされた状態で、 Comm.Closeせずにプログラム終了、またはエラー等で停止 |
(2)次回同じプログラム、または別のプログラムで、 |
![]() |
![]() |
プログラムの停止毎にクローズしたい場合は、「プログラムパラメータ」の「32:タスク終了時の通信回線自動切断」を「1:有効」にしてください。
設定方法については、ティーチングペンダント操作ガイドの「プログラムパラメータの表示・変更」を参照してください。
ただし、「34:複数タスクの同一回線使用許可」が有効になっている場合は、この設定は無視されます。
タスク連動のオプションの設定値の挙動
設定値 | 0:無効 | 1:有効 |
---|---|---|
内容 | Comm.Openを実行したタスクが停止しても、回線はCloseせず、Openしたままとなる。 | Comm.Openを実行したタスクが停止した場合、自動的に回線の切断処理が行われる。 |
メリット | タスクを連続実行した場合、Open,Closeを繰り返さないため素早くComm.Output,Inputが実行できる。 | タスクエラーなど、タスク停止に対して自動切断がおこなわれるため、回線が使用中のままになることはない。 |
デメリット | タスクエラーで停止した場合、自動で回線切断が行われないため、明示的にComm.Closeを行う必要がある。 | タスクが動作中の場合のみ回線を使用するような実装を行う必要がある。 |
用例
'!TITLE "デンソーロボットプログラム"
Sub Sample_CommOpen
On Error GoTo Label1
Comm.Open 8
On Error GoTo 0
'処理を記述
Exit Sub
Label1: '回線番号8をOpenできなかったとき
Delay 100 'サーバ側の準備待ち。
Resume 'もう一度Openの行を実行する。
End Sub
EthernetによるClient/Server間の通信を行う例を以下に示します。
Server側のコード例(Serverの設定:テキストモード)
Server側はComm.Open実行後、Comm.StateでClientからの接続待ちをする必要があります。接続が確立していないタイミングでComm.OutputやComm.Inputを実行した場合はエラーが発生します。
Sub Main
Comm.Open 4
Comm.Clear 4 '受信バッファをクリア
Wait Comm.State(4) = 2 ' クライアントの接続待ち
I1 = 0
Do
S1 = Comm.Input(4)
PrintDbg S1
Comm.Output 4, "OK " & Timer
Delay 1
Loop Until I1<>0
Comm.Close 4
End Sub
Client側のコード例(Clientの設定:テキストモード)
Sub Main
Comm.Open 8
I1 = 0
Do
Comm.Output 8, "Do " & Timer
S1 = Comm.Input(8)
PrintDbg S1
Delay 1
Loop Until I1<>0
Comm.Close 8
End Sub
Server側で回線が切断された場合の自動復帰のコード例(Serverの設定:テキストモード)
Server側で回線の切断が生じた場合、再接続のための処理を明示的に記述する場合は、下記のようなコードにします。
Sub Main
Comm.Open 4
Comm.Clear 4
Wait Comm.State(4) = 2 ' クライアントの接続待ち
On Error Goto ErrHandler
I1 = 0
Do
S1 = Comm.Input(4)
PrintDbg S1
Comm.Output 4, "OK " & Now
Delay 1
Loop Until I1<>0
Comm.Close 4
Exit Sub
ErrHandler:
Comm.Close 4, -1 ' 強制切断
PrintDbg "Err = " & Hex(Err.OriginalNumber)
Comm.Open 4
Comm.Clear 4
Wait Comm.State(4) = 2 ' クライアントの接続待ち
Resume ' エラー状態を解除し、エラーが発生した行から再実行
End Sub
ID : 370