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”:?
ここは、VisualBasicに関する質問をする場所で、
仕事を依頼する掲示板ではありません。
無理っす。
シリアルポート操作してるわ、コンソールへの表示部分があるわで
とてもこのままでは VB6.0 へのリプレースはできません。
Visual Basic は名前こそ Basic ですが、PC9801 用の N88-Basic とは
完全に別物ですので、簡単に書換が出来るとは考えない方がよいかと。
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
後は自分で調べる。
ご意見ありがとうございます。
少しずつ解決していきたいのですが、まず
110 CLOSE
120 OPEN “COM:N81NN” AS #1
というのは、シリアルポートを開くということですとね?
ということは次のようにVBで書くことは間違っているのでしょうか?
Private Sub Command1_Click()
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
End If
>>我龍院忠太さん
ありがとうございます。今から試してみます。
>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
>>我龍院忠太さん
ありがとうございます。
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のようにする必要はないんですか?
>MSComm1.Output = Chr$(5) + "01" + Chr$(2) + "RPV01:01" + Chr$(3) + "7F"
文字列をセリアルポートから出力します。
>MSComm1.Output = Text1.Textのようにする必要はないんですか?
取りあえず無い。
何のコマンドを送ったかどうか判り易くするために、テキストボックスに入れてもいい。
>>我龍院忠太さん
返信遅れてすみません。
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
>というのは、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"で終結と仮定してるが、実際は最初の投稿からは
帰ってくるデーターのプロトコルはっきり読み取れないから。
提示された方法は、取りあえず帰ってくるデーターを全て表示する。
>>我龍院忠太さん
ありがとうございます。
最終的にこのようなプログラムをつくったので今から試してきます。
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
開いたものは閉じましょう。
If res = vbNo Then
Cancel = True
Exit Sub
ElseIf MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
ガンガッて。
>>我龍院忠太さん
If res = vbNo Then
Cancel = True
Exit Sub
ElseIf MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
これも付け加えたのですが、できませんでした。何が悪いと思います?
>これも付け加えたのですが、できませんでした。何が悪いと思います?
多分こうなる予感が。(^^;
先ず初めに
>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が返って来た段階で、正式に書き換えた方が簡単かも。
>>我龍院忠太さん
ありがとうございます。
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となっているんです。
要するに、機器から何も返って来ないということですか?
>これの最後の”7F”は僕も意味がわからないのですが、たぶんチェックサムだと思います。
>説明書にSXの次からEXまでのキャラクターの総和を計算して、下位8ビットを上下4ビットに分け、
>0〜Fの文字に変換し、下位、上位の順に送受信するものです。と書かれているんです。
"RPV01:01" + Chr$(3)のサムチェックのリトルエンディアンですか、確かに"7F"にはなるが
Chr$(3)を入れるというのがどうもよくわかりませんね、"4F"にしてみるとか。
まあサンプルがそうなっているのなら間違いは無いと思うのですが。。。
そうなんです。測定器から何も返ってこないんですよ。
Bufferの設定は何もしなくても大丈夫なんですか?
MSCommのプロパティーでバッファーをみると
受信バッファーサイズ:1024
送信バッファーサイズ:512
受信データーサイズ:0
送信データーサイズ:0
読み出しデーター長:0
となっているんですよ。
後、測定器の通信仕様は
・調歩同期式
・半2重通信方式(ポーリングセレクティング方式)
・文字コード:ASCII
・BCC:チェックサム
・外部機器優先通信方式
・データー伝送手順:無手順
・仕様信号名:送受信データーのみ(制御信号は使用せず)
これらは問題に何か関係していますか?
機器の仕様をよく理解してないからこうなってる予感
機器のIDとかを指定してるけど、サンプルと実機の設定は本当に合ってるの?
通信自体送り出せていることが確認できれば(ラインモニタをつなぐとか別のPCをつないでハイパーターミナルで受けるとか)
あとはプロトコルの問題だと思いますので、取扱説明書を読むなりメーカーに
問い合わせたりするほうが機器の仕様を知らない人に聞くより解決は近くなるでしょう。
そもそも、特定機器の使い方の掲示板を一般的なプログラムの掲示板で質問するのが。。。
>>あのさん
そうですよね。
サンプルと実機の設定は合っているんです。メーカーに問い合わせてみます。
ツイート | ![]() |