BASICで書かれたプログラムをVB6で書き換えてくれませんか?お願いします。


VB初心者  2005-09-21 14:58:22  No: 125570  IP: [192.*.*.*]

BASICで書かれたプログラムをVB6で書き換えてくれませんか?お願いします。

取扱説明書に書かれているプログラムです。(NEC製PC9801用)
110 CLOSE
120 OPEN “COM:N81NN” AS #1 
130 PRINT #1 , CHR$(5)+”01”+CHR$(2)+”RPV01:01”+CHR$(3)+”7F”
140 LINE INPUT #1 , A$
150 PRINT A$
160 CLOSE #1
170 END

Run
01APV01:01=日時  データー  F1
Ok

*CHR$(5):ENQ(問い合わせ)、”01”:機器番号、CHR$(2):STX(テキス  ト開始)、”RPV01:01”:データー要求命令、CHR$(3):ETX(テキスト終  結)、”7F”:?

編集 削除
・・・  2005-09-21 15:19:34  No: 125571  IP: [192.*.*.*]

ここは、VisualBasicに関する質問をする場所で、
仕事を依頼する掲示板ではありません。

編集 削除
Geo=TK3  2005-09-21 15:22:33  No: 125572  IP: [192.*.*.*]

無理っす。
シリアルポート操作してるわ、コンソールへの表示部分があるわで
とてもこのままでは VB6.0 へのリプレースはできません。

Visual Basic は名前こそ Basic ですが、PC9801 用の N88-Basic とは
完全に別物ですので、簡単に書換が出来るとは考えない方がよいかと。

編集 削除
我龍院忠太  2005-09-21 16:32:53  No: 125573  IP: [192.*.*.*]

MSDNのサンプル殆どそのままコピペ。(^^;
動作は保証外。   
   Dim buffer As String
   MSComm1.CommPort = 1
   MSComm1.Settings = "9600,N,8,1"
   MSComm1.InputLen = 0
   MSComm1.PortOpen = True
   MSComm1.Output = Chr$(5) + "01" + Chr$(2) + "RPV01:01" + Chr$(3) + "7F"
   Do
      DoEvents
      buffer = buffer & MSComm1.Input
   Loop Until InStr(buffer, Chr$(3) & "7F")
   Text1.Text = buffer
   MSComm1.PortOpen = False
後は自分で調べる。

編集 削除
VB初心者  2005-09-21 16:49:00  No: 125574  IP: [192.*.*.*]

ご意見ありがとうございます。
少しずつ解決していきたいのですが、まず
110 CLOSE
120 OPEN “COM:N81NN” AS #1
というのは、シリアルポートを開くということですとね?
ということは次のようにVBで書くことは間違っているのでしょうか?
Private Sub Command1_Click()
  If MSComm1.PortOpen = False Then
     MSComm1.PortOpen = True
  End If

編集 削除
VB初心者  2005-09-21 16:55:02  No: 125575  IP: [192.*.*.*]

>>我龍院忠太さん
ありがとうございます。今から試してみます。

編集 削除
我龍院忠太  2005-09-21 17:08:14  No: 125576  IP: [192.*.*.*]

>If MSComm1.PortOpen = False Then
  >   MSComm1.PortOpen = True
  >End If
こっちの方が良いかも。
  If MSComm1.PortOpen = False Then
        MSComm1.CommPort = 1
        MSComm1.Settings = "9600,N,8,1"
        MSComm1.InputLen = 0
        MSComm1.PortOpen = True
   End If

編集 削除
VB初心者  2005-09-21 18:21:56  No: 125577  IP: [192.*.*.*]

>>我龍院忠太さん
ありがとうございます。
130 PRINT #1 , CHR$(5)+”01”+CHR$(2)+”RPV01:01”+CHR$(3)+”7F”
というのは、
MSComm1.Output = Chr$(5) + "01" + Chr$(2) + "RPV01:01" + Chr$(3) + "7F"
のことだと思うのですが。Textにコマンドとして、Chr$(5) + "01" + Chr$(2) + "RPV01:01" + Chr$(3) + "7F"を入力するんですよね?
例えば
MSComm1.Output = Text1.Textのようにする必要はないんですか?

編集 削除
我龍院忠太  2005-09-21 18:34:40  No: 125578  IP: [192.*.*.*]

>MSComm1.Output = Chr$(5) + "01" + Chr$(2) + "RPV01:01" + Chr$(3) + "7F"
文字列をセリアルポートから出力します。
>MSComm1.Output = Text1.Textのようにする必要はないんですか?
取りあえず無い。
何のコマンドを送ったかどうか判り易くするために、テキストボックスに入れてもいい。

編集 削除
VB初心者  2005-09-22 10:10:57  No: 125579  IP: [192.*.*.*]

>>我龍院忠太さん

返信遅れてすみません。
140 LINE INPUT #1 , A$
150 PRINT A$
というのは、140で#1のCRコードまでのデーターを一括して文字変数A$に読み込むって意味なんですよね?あんまりよく意味がわからないんですけど、つまり次のように書き換えて良いのでしょうか?
Private Sub MSComm1_OnComm()
  Dim Buffer As Variant
  Select Case MSComm1.CommEvent
     Case comEvReceive
     Buffer = MSComm1.Input
     Text2.Text = Text2.Text & Buffer
  End Select
End Sub

編集 削除
我龍院忠太  2005-09-22 14:48:31  No: 125580  IP: [192.*.*.*]

>というのは、140で#1のCRコードまでのデーターを
>一括して文字変数A$に読み込むって意味なんですよね?
CRコードは関係ないな、バッファに溜まってる文字列を全部読むって位の意味かな、多分。
それとBasicの意味をいちいち解釈して、同じようにプログラムを組もうとするのは意味が無い。
232Cでの通信の、プロトコルと設定さえわかれば、Basicは関係なし。
>Private Sub MSComm1_OnComm()
>  Dim Buffer As Variant
>  Select Case MSComm1.CommEvent
>     Case comEvReceive
>     Buffer = MSComm1.Input
>     Text2.Text = Text2.Text & Buffer
>  End Select
>End Sub
この方が良いかもしれない、理由は初めに書いた
> Loop Until InStr(buffer, Chr$(3) & "7F")
は、帰ってくるデーターの終わりがChr$(3) & "7F"で終結と仮定してるが、実際は最初の投稿からは
帰ってくるデーターのプロトコルはっきり読み取れないから。
提示された方法は、取りあえず帰ってくるデーターを全て表示する。

編集 削除
VS初心者  2005-09-22 18:40:41  No: 125581  IP: [192.*.*.*]

>>我龍院忠太さん
ありがとうございます。
最終的にこのようなプログラムをつくったので今から試してきます。
Private Sub Command1_Click()
 If MSComm1.PortOpen = False Then
        MSComm1.CommPort = 1
        MSComm1.Settings = "4800,N,8,1"
        MSComm1.InputLen = 0
        MSComm1.PortOpen = True
   End If
  
  Text2.Text = ""
  MSComm1.Output = Chr$(5) + "01" + Chr$(2) + "RPV01:01" + Chr$(3) + "7F"
 
End Sub

Private Sub Command2_Click()
    Unload Me
End Sub


Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Dim res As VbMsgBoxResult

    res = MsgBox("終了しますか?    ", vbYesNo, "確認")
    If res = vbNo Then
        Cancel = True
        Exit Sub
    End If
End Sub

Private Sub MSComm1_OnComm()
  Dim Buffer As Variant
  Select Case MSComm1.CommEvent
     Case comEvReceive
     Buffer = MSComm1.Input
     Text2.Text = Text2.Text & Buffer
  End Select
End Sub

編集 削除
我龍院忠太  2005-09-22 21:44:52  No: 125582  IP: [192.*.*.*]

開いたものは閉じましょう。    
If res = vbNo Then
      Cancel = True
      Exit Sub
ElseIf MSComm1.PortOpen = True Then
      MSComm1.PortOpen = False
End If
ガンガッて。

編集 削除
VB初心者  2005-09-25 20:28:08  No: 125583  IP: [192.*.*.*]

>>我龍院忠太さん
If res = vbNo Then
      Cancel = True
      Exit Sub
ElseIf MSComm1.PortOpen = True Then
      MSComm1.PortOpen = False
End If
これも付け加えたのですが、できませんでした。何が悪いと思います?

編集 削除
我龍院忠太  2005-09-26 08:17:59  No: 125584  IP: [192.*.*.*]

>これも付け加えたのですが、できませんでした。何が悪いと思います?
多分こうなる予感が。(^^;

先ず初めに
>120 OPEN “COM:N81NN” AS #1

>120 OPEN “COM1:N81NN” AS #1 
ですかね?
ノンパリ、データー長8ビット、ストップビット1、X/SパラOFF 

>130 PRINT #1 , CHR$(5)+”01”+CHR$(2)+”RPV01:01”+CHR$(3)+”7F”
は合ってますか?

>*CHR$(5):ENQ(問い合わせ)、”01”:機器番号、CHR$(2):STX(テキス  ト開始)、
>”RPV01:01”:データー要求命令、CHR$(3):ETX(テキスト終  結)、”7F”:?
この最後の”7F:?”の意味がわからないのですが、取説はこうなってるのですか?

先ず最初にチェックするところは
1、ハードウエアーはOKか?
    機器との接続ケーブルは仕様に有ったものを使用してますか?
    RS232Cのケーブルは2種類有ります、通常パソコンと機器との
    接続はストレートケーブルを使いますが、これはOKですよね?

2、機器には設定のディップスイッチはありますか?
    機器の設定とコマンドが合っていない可能性が有ります。
    通信速度の4800bpsはどのようにして決めましたか?
    ほかの選択が有れば1200bps位にしてやってみるのも手かな。  

それとチェックは私が最初に書いたコードでボーレートなどのパラメーターだけ変えて
チェックし、機器からACKが返って来た段階で、正式に書き換えた方が簡単かも。

編集 削除
VB初心者  2005-09-26 09:23:34  No: 125585  IP: [192.*.*.*]

>>我龍院忠太さん

ありがとうございます。
120 OPEN “COM:N81NN” AS #1
これは正しいです。

130 PRINT #1 , CHR$(5)+”01”+CHR$(2)+”RPV01:01”+CHR$(3)+”7F”
これの最後の”7F”は僕も意味がわからないのですが、たぶんチェックサムだと思います。説明書にSXの次からEXまでのキャラクターの総和を計算して、下位8ビットを上下4ビットに分け、0〜Fの文字に変換し、下位、上位の順に送受信するものです。と書かれているんです。

>1、ハードウエアーはOKか?
これは大丈夫です。

>2、機器には設定のディップスイッチはありますか?
これもあります。機器の初期値が4800、8、n、1となっているんです。

編集 削除
我龍院忠太  2005-09-26 10:54:56  No: 125586  IP: [192.*.*.*]

要するに、機器から何も返って来ないということですか?

>これの最後の”7F”は僕も意味がわからないのですが、たぶんチェックサムだと思います。
>説明書にSXの次からEXまでのキャラクターの総和を計算して、下位8ビットを上下4ビットに分け、
>0〜Fの文字に変換し、下位、上位の順に送受信するものです。と書かれているんです。
"RPV01:01" + Chr$(3)のサムチェックのリトルエンディアンですか、確かに"7F"にはなるが
Chr$(3)を入れるというのがどうもよくわかりませんね、"4F"にしてみるとか。
まあサンプルがそうなっているのなら間違いは無いと思うのですが。。。

編集 削除
VB初心者  2005-09-26 11:54:59  No: 125587  IP: [192.*.*.*]

そうなんです。測定器から何も返ってこないんですよ。
Bufferの設定は何もしなくても大丈夫なんですか?
MSCommのプロパティーでバッファーをみると
受信バッファーサイズ:1024
送信バッファーサイズ:512
受信データーサイズ:0
送信データーサイズ:0
読み出しデーター長:0
となっているんですよ。

後、測定器の通信仕様は
・調歩同期式
・半2重通信方式(ポーリングセレクティング方式)
・文字コード:ASCII
・BCC:チェックサム
・外部機器優先通信方式
・データー伝送手順:無手順
・仕様信号名:送受信データーのみ(制御信号は使用せず)
これらは問題に何か関係していますか?

編集 削除
あの  2005-09-26 12:24:30  No: 125588  IP: [192.*.*.*]

機器の仕様をよく理解してないからこうなってる予感
機器のIDとかを指定してるけど、サンプルと実機の設定は本当に合ってるの?
通信自体送り出せていることが確認できれば(ラインモニタをつなぐとか別のPCをつないでハイパーターミナルで受けるとか)
あとはプロトコルの問題だと思いますので、取扱説明書を読むなりメーカーに
問い合わせたりするほうが機器の仕様を知らない人に聞くより解決は近くなるでしょう。

そもそも、特定機器の使い方の掲示板を一般的なプログラムの掲示板で質問するのが。。。

編集 削除
VB初心者  2005-09-26 12:56:36  No: 125589  IP: [192.*.*.*]

>>あのさん
そうですよね。
サンプルと実機の設定は合っているんです。メーカーに問い合わせてみます。

編集 削除