tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB RS232C通信(MSComm使用)
記事No11249
投稿日: 2014/04/14(Mon) 17:26
投稿者MON
初めまして,教えていただけないでしょうか。
流れは
・PLC ⇒ OK+CRLF ⇒ PC(Port2受信)
PC(Port1送信) ⇒ E[]+CRLF ⇒ レーザ印字開始

・レーザ印字完了 ⇒ END+CRLF ⇒ PC(Port1受信)
PC(Port2送信) ⇒ E[]+CRLF ⇒ PLC次工程開始

各指令(OK,E[],END)を取りこぼすことなくバッファに取り込みたいです。
下記プログラムでよろしいでしょうか?

Private Sub Form_load() 'イニシャル
MSComm1.CommPort = 1 'レーザー ⇔ PC
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.InBufferCount = 0
MSComm1.InputLen = 0

MSComm2.CommPort = 3 'PLC ⇔ PC
MSComm2.Settings = "9600,N,8,1"
MSComm2.PortOpen = True
MSComm2.RThreshold = 1
MSComm2.SThreshold = 1
MSComm2.InBufferCount = 0
MSComm2.InputLen = 0
End Sub

'********** PLC -> PC -> レーザ刻印指令 ***************
Private Sub MSComm2_OnComm()
Dim Buffer10 As String ' 文字列型
Dim Buffer11 As String ' 文字列型
Dim Buffer12 As String ' 文字列型

Buffer10 = "" 'バッファ内クリアー

Do 'OK受信するまで待機
DoEvents()
Buffer10 = Buffer10 & MSComm2.Input
Loop Until InStr(Buffer10, vbCrLf)

Select Case MSComm2.CommEvent
Case ComEvReceive
Buffer11 = MSComm2.Input '受信バッファに転送
Text5.Text = Buffer11 '受信データ表示

If Buffer11 = "OK" Then
Buffer12 = "E[]"
MSComm1.Output = Buffer12 + vbCrLf 'レーザへ開始指令
End If

以下省略
End Select
End Sub

'********** レーザ刻印完了 -> PC -> PLC次工程開始指令 ****
Private Sub MSComm1_OnComm()

Dim Buffer00 As String ' 文字列型
Dim Buffer01 As String ' 文字列型
Dim Buffer02 As String ' 文字列型

Buffer00 = "" 'Bufferクリア

Do 'END受信するまで待機
DoEvents()
Buffer00 = Buffer00 & MSComm2.Input
Loop Until InStr(Buffer00, vbCrLf)

Select Case MSComm2.CommEvent
Case ComEvReceive
Buffer01 = MSComm1.Input '受信バッファに転送
Text3.Text = Buffer01 '受信データ表示

If Buffer01 = "END" Then 'PLCへ刻印完了指令
Buffer02 = "E[]"
MSComm2.Output = Buffer02 + vbCrLf
End if

以下省略
End Select
End Sub

[ツリー表示へ]
タイトルRe: VB RS232C通信(MSComm使用)
記事No11250
投稿日: 2014/04/14(Mon) 18:27
投稿者オショウ
> 初めまして,教えていただけないでしょうか。
>
> 各指令(OK,E[],END)を取りこぼすことなくバッファに取り込みたいです。
> 下記プログラムでよろしいでしょうか?

> MSComm1.RThreshold = 1
> MSComm1.SThreshold = 1
>
> MSComm2.RThreshold = 1
> MSComm2.SThreshold = 1

  悪かった場合、コード書いたらそのままプログラム完成してしまうので・・・

  上記のThreshold を設定しているのに、同期式の送受信では意味が無い。
  非同期で行いたいのか同期で行いたいのかどっち?

  私は、何でも応用できるように非同期式の方法を推奨しますが、取りこぼしが
  発生するのは、PCの性能が悪いかシリアル通信デバイスが悪い場合くらい。
  ちゃんと書けば、早々、取りこぼしは起きない。

  因みに、そのコードで動作させた場合、どうだったの?

以上。

[ツリー表示へ]
タイトルRe^2: VB RS232C通信(MSComm使用)
記事No11251
投稿日: 2014/04/14(Mon) 20:07
投稿者MON
>   上記のThreshold を設定しているのに、同期式の送受信では意味が無い。
>   非同期で行いたいのか同期で行いたいのかどっち?
>
>   私は、何でも応用できるように非同期式の方法を推奨しますが、取りこぼしが
>   発生するのは、PCの性能が悪いかシリアル通信デバイスが悪い場合くらい。
>   ちゃんと書けば、早々、取りこぼしは起きない。

オショウ様
ありがとうございます。
理解できていませんでした。

MSComm2の時に
Port2(受信)⇒Port1(送信)

MSComm1の時に
Port1(受信)⇒Port2(送信)
なので、非同期式にするには下記のように
変更すればよろしいでしょうか。

MSComm1.RThreshold = 1
MSComm1.SThreshold = 0

MSComm2.RThreshold = 1
MSComm2.SThreshold = 0

[ツリー表示へ]
タイトルRe^3: VB RS232C通信(MSComm使用)
記事No11254
投稿日: 2014/04/15(Tue) 20:58
投稿者オショウ
> なので、非同期式にするには下記のように
> 変更すればよろしいでしょうか。
>
> MSComm1.RThreshold = 1
> MSComm1.SThreshold = 0
>  
> MSComm2.RThreshold = 1
> MSComm2.SThreshold = 0

  そういう意味では無く・・・

> Do 'OK受信するまで待機
> DoEvents()
> Buffer10 = Buffer10 & MSComm2.Input
> Loop Until InStr(Buffer10, vbCrLf)
>
> Select Case MSComm2.CommEvent
> Case ComEvReceive
> Buffer11 = MSComm2.Input '受信バッファに転送
> Text5.Text = Buffer11 '受信データ表示

  こういう書き方自体が、おかしい。
  ちゃんと、OnCommイベント処理ルーチンを書きましょう!

  ここのApp2とか・・・
  http://support.microsoft.com/kb/194922/ja

  http://homepage1.nifty.com/MADIA/vb/vb_bbs/200403/200403_04030077.html
  http://www.picfun.com/serial07.html

以上。参考まで

[ツリー表示へ]
タイトルRe: VB RS232C通信(MSComm使用)
記事No11255
投稿日: 2014/04/16(Wed) 08:56
投稿者オショウ
今更だったんですけど、VB6使用?VB.NET使用?
こちらの掲示板は、.NET用なので、.NETでMSCommを使うくらいなら
SerialPortクラスを使う方が安全・・・

あしからず。

[ツリー表示へ]
タイトルRe^2: VB RS232C通信(MSComm使用)
記事No11258
投稿日: 2014/04/18(Fri) 00:09
投稿者MON
> 今更だったんですけど、VB6使用?VB.NET使用?
> こちらの掲示板は、.NET用なので、.NETでMSCommを使うくらいなら
> SerialPortクラスを使う方が安全・・・
>
> あしからず。

返事が遅くなりすみません。
.NET用の掲示板でしたか、、、すみません。
会社に古いVB6しかないため、MSCommでしか動作出来ないようです。
的違いな書き込みをしてすみませんでした。

[ツリー表示へ]