
PCとPLCでシリアル通信を行っています。PLCからPCへステータス受信要求し、PCから正常アンサーがあればPLCからPCへ処理開始指令コマンドが出力されるというプロトコルです。実際には、PC側ステータス正常の場合、PLCへの正常アンサーを出力するところまでは行くのですが、その直後にPLCから送信されているはずの処理開始指令コマンドを受信することができません。一連のコマンド送信・受信の間隔が狭すぎるのかと思い、PLC側で処理開始指令コマンド送信前に10msecのウェイトを設けるとPC側で受信することができました。(PLC側の送信が悪いのか、PC側の受信に問題があるのか不明ですが、、、)
シリアル通信では、上記のような問題が発生しないように送受信の間隔等なんらかの規約が定められているのでしょうか??ウェイトを設けることなく通信を行いたいのですが、考えられる対処法を教えていただけませんでしょうか。よろしくお願い致します。
なお、通信機器の仕様は以下の通りです。
PLC:三菱シリアルコミニケーションユニット QJ71C24N-R2
PC:WinXpSP2、COMポート、VisualBASIC6.0のCommイベントによりデータ受信(10msecウェイトなしでは、処理開始指令コマンド送信時にCommイベントが発生しませんでした。)
※アスキー文字、PLC・PCともに送信終了コード(CR+LF)でバッファデータ読込み
No.1ベストアンサー
- 回答日時:
>シリアル通信では、上記のような問題が発生しないように・・・
そんなことはありません。
まあ、ウエイトもプロトコルと言えばプロトコルでしょうが、
そういう問題ではないと思います。
COMポートのオープン処理はこんな感じ
strBps = "9600,N,8,1" '9600bps、パリティなし、8ビット、ストップ1
MSComm1.CommPort = p_PortNo 'ポート番号の指定
MSComm1.Settings = strBps 'オープンパラメータ
MSComm1.InputLen = 0 'バッファ全体を読み取るようにする
MSComm1.InputMode = comInputModeBinary
MSComm1.PortOpen = True 'ポートをオープン
MSComm1.NullDiscard = False
MSComm1.Handshaking = comNone
MSComm1.RTSEnable = True
MSComm1.RThreshold = 1
COMの割り込みイベントはこんな感じ
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
varDatas = MSComm1.Input
End Select
End Sub
ご回答ありがとうございます。
申し遅れましたが、当方では下記の通り記述しています。示していただいたサンプルよりも
設定項目は少ないですが、ボーレートやパリティ以外は基本的に同じだと思います。いかが
でしょうか?
また、MSCommイベント自体発生していないので、Private Sub MSComm1_OnComm()以下の
記述が違っていることは関係ないと思います。再度ご返信・アドバイスいただければ幸いです。
Private Sub Form_Load()
’COMオープン
' 入力文字列用バッファ。
Dim Instring As String
' COM1 を使用します。
MSComm1.CommPort = 1
' 19200bps、偶数パリティ、データ長 8 ビット、およびストップ ビット長 1。
MSComm1.Settings = "19200,E,8,1"
' Input プロパティ使用時に、バッファ全体を読み取るように設定します。
MSComm1.InputLen = 0
' ポートを開きます。
MSComm1.PortOpen = True
MSComm1.RThreshold = 1
End Sub
Private Sub MSComm1_OnComm()
Dim RS_Buff As String
RS_Buff = MSComm1.Input
End Sub
No.2
- 回答日時:
僕とあなたのコードの違いは
RTSを出しているか否かですから、
ハードウエアハンドシェークを使っていなければ
動作に違いはありません。(試しました)
解析は通信モニターなどで行いますが
PCでも、見ることが出来るので
他のPCを接続してモニターしてみたら
いかがでしょうか?
プログラムはどこかから探してもいいし、
ほとんど先のコードでいいと思います。
PLCの代わりにPCを繋いで見るのも
いいかもしれません。
ありがとうございます。度々すみません。
>動作に違いはありません。(試しました)
ウェイトなしで動作しましたでしょうか?
>一度PCを繋いで見るのもいいかもしれません。
PCもしくは232Cラインモニタで確認してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
シリアル通信エラー
-
ソケット通信内 read関数について
-
winsock windowprocでFD_WRITE...
-
popen実行時にバッファが空の場合
-
ReadFile(GPSとの通信)Win7で...
-
Linuxでのシリアル通信について...
-
SerialPortのDataReceivedイベ...
-
シリアルポート通信
-
再現性の無いバグ
-
「スイッチングハブのバッファ...
-
TCP/IP通信プログラミングにお...
-
socket: recvはいつ,どれだけ...
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
TCP/IP通信時のサーバーからの受信
-
Windows上で、シグナル(SIGTERM...
-
プロセスIDの取得方法について
-
Excel(VBA)でSetTimer関数を使...
-
win10で、正確な待ち時間の作り方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
winsockでソケット通信の開発を...
-
socket: recvはいつ,どれだけ...
-
「スイッチングハブのバッファ...
-
VB2005でWin32APIを用いてRS-23...
-
シリアル通信エラー
-
シリアル通信の出力バッファと...
-
バイナリデータ受信時のデータ順
-
WinsockAPIのrecvfromの受信デ...
-
SerialPortのDataReceivedイベ...
-
再現性の無いバグ
-
rs232cでの受信データ(mscomm)...
-
C#で通信処理。応答がない場合...
-
Linuxでのシリアル通信について...
-
WriteFile()でのデータ送信がで...
-
【CAsyncSocket::OnReceive()呼...
-
UDP処理のエラーについて
-
recv関数の受信結果について
-
ReadFile(GPSとの通信)Win7で...
-
VC++ HttpOpenRequest() 正し...
おすすめ情報