• 締切済み

ターミナルサーバーでの通信ポートエラーについて

始めて質問いたしますので宜しくお願い致します。 ターミナルサーバー(Windows Server 2003 R2 SP2)上でVB5のアプリを動かしています。 FormからMSCommのコマンドにて通信ポート(COM1)のラベルプリンタ(SATO SR412)に 印刷を行うのですが1回目の印刷ではポートも正常に開けて印刷されますが フォームを閉じずにそのまま2回目を印刷した際に8012(デバイスが開けません)のエラーが 発生し印刷できません。 フォームを閉じると印刷は可能となります。 Windows XP SP3上で同じVB5のアプリを動かすとフォームを閉じなくても2回目の印刷が可能 となります。 ターミナルサーバー側の設定をどのように変更すればエラーが発生せず 印刷できるかご教授頂ける方、宜しくお願い致します。 ちなみにマイクロソフトのパッチ:838291は適用しています。 【デバッグを行った状態】 MSCommのコマンドにてデバッグを行った際、1回目の印刷時にはメッセージBOXで 状態を表示致しましたが正常にPortOpen=FALSEとなりポートがクローズされています。 2回目の印刷時にもポートがオープンされている場合にもPortOpen = Falseにて 一度、クローズしたのちPortOpen = Trueにて開こうとしていますがエラーとなります。 実行のコマンドは以下となります。 With X_oMSComm If .PortOpen = True Then .PortOpen = False End If .CommPort = 1 .DTREnable = True .RTSEnable = True .NullDiscard = False .Settings = "9600,N,8,1" .Handshaking = 0 .SThreshold = 0 .RThreshold = 0 .InputLen = 0 .PortOpen = True  ← このコマンドにてエラーとなります。 End With

noname#146743
noname#146743

みんなの回答

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

同じ環境(ターミナルサーバ)で使ったことがあるわけではないので確証は何もありませんが ・回線クローズ・オープンの間に一定時間のwaitを入れたらどうなるでしょうか  (Sleepもしくは仮にボタン操作などでクローズ・オープンのイベントを分ける) もしそれで動くのであればターミナルサーバ上の操作ということで 処理に何らかの遅延などが発生するのかもしれません >ターミナルサーバー上でCOMポートをオープンしたままにしますと他のユーザーより使用する際にオープンできない そりゃそうです(これは別にターミナルサーバに限った話ではありません) 複数ユーザで同じアプリ使うなら確かに占有されるので使う時だけ オープン/クローズしないとリソースが占有されてしまいますが 書かれてるコードだとほとんど占有に近くなるのでは?   (テストコードとして書かれてるのなら良いんですが)   使い終わってすぐクローズしてるならそもそも再オープンなど不要だし   (念のためとかいう事ならこれまた支障なし)   自分以外のプログラムでリソース占有されてたら再オープンでエラーになります   (クローズはそのまま動くはず) と書いて(多分ないとは思うけど)気になる点が一つ出ました 他のユーザなどでリソース占有してるとかいう事は無いですよね? 私にはそれぐらい使思いつきません

noname#146743
質問者

お礼

koi1234さん。 連絡が遅くなりましたが一定期間でのwait等試しましたが同様のエラーとなりました。 もう少し調べました所、何故このような動きになるかわかりませんが2回目に印刷指示を行った際、 ターミナルサーバー上でCOMポートをオープンするとターミナルサーバー上のCOMポートが見えなくなることが判明致しました。 回避策として印刷処理(MSCommにて制御する処理)を別のフォームに切り出すことにより、2回目でも印刷させる事ができました。 (フォームの動きとしてはメインのフォームで対象データを抽出した後、サブフォームにて印刷指示を行います。1回目の印刷処理が終了した後、 サブフォームはクローズしメインフォームに遷移します(この時点でCOMポートが通信可能となります)。 2回目に印刷指示を行う際は、再度、メインフォームからサブフォームに遷移します。この動きにより1回目、2回目を意識せずCOMポートが 通信可能な状態となります。 ターミナルサーバー上同一フォームで再オープンした際にCOMポートが見えなくなるのかは不明でしたのでこのような逃げ方をしました。 情報を頂きありがとうございました。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

何でエラーになるのかの追求にはなってません プログラムの仕様にもよってくるので何とも言えませんが アプリ起動中はずっとオープンにしておく方が一般的ではないかと思いますが それでは問題があるのでしょうか?(わざわざクローズする必要がありますか?)

noname#146743
質問者

補足

koi1234さん連絡ありがとうございます。 情報不足で申し訳ありません。 ポートがオープンできない状況を調査した際に切り分けとしてローカルでも同様の箇所でエラーになるのかそれともターミナルサーバー上のみでエラーとなるかをまず区別しました。その上でどのコマンドにてエラーとなっているかを調べた際にMSCommのオープン時にエラーとなっていました。 又、ターミナルサーバー上でCOMポートをオープンしたままにしますと他のユーザーより使用する際にオープンできないとの情報よりこのような作りとしています。 このようなエラーのケースの場合にはどのようにしてエラーを究明すればよいかアドバイスを頂ければと思います。 宜しくお願い致します。

関連するQ&A

  • VB6.0で音声発信したい

    VB6.0を使って、電話(音声)を自動でかけたいのです。 MSCommを使って、ポートを開いて電話をかけるところまではできたのですが、「ピー」という音がず~~と相手に聞こえてしまいます。 これはプログラムが悪いのでしょうか? それともモデムが悪いのでしょうか??? プログラムは以下の通りです。 MSComm1.CommPort = 1 MSComm1.Settings = "9600,n,8,1" If MSComm1.PortOpen = False Then    MSComm1.PortOpen = True End If MSComm1.Output = "ATD" & 電話番号 & Chr(13) 申し訳ありませんが、ご教授ください。

  • MSCommによるCOMポートの制御

    W2k+VB6にて開発しております。 シリアル通信におけるCOMポート制御についての質問なのですが、 ポートをOPENしようとすると「ポートは既に開かれています」というエラーが出てしまいます。 -------------------------------------- if me.comm1.portopen = False then me.comm1.portopen = True end if -------------------------------------- としているにもかかわらずOPENできません。 このような場合どういった要因が考えられるのでしょうか? よろしくお願いします。

  • ハイパーターミナルとMSCommとの通信の違い。

    今回USB→RS232Cの変換ケーブルを使いRS232Cを追加したのですが 起動した最初の段階でMSCommを使い通信をしようとすると 何故かコマンドの送信ができません。(受信は行える) (通常のポートを使用した際は正常に動作します。) しかし、ハイパーターミナルを使い通信をすると正常に送信ができます。 ちなみに、ハイパーターミナルで通信をした後はMSCommを使った送信でも 正常に行えます。 どなたかこのような現象の解決方法を教えてください。 又、VBからハイパーターミナルを使いコマンドを送信するやり方がわかる方が いらしたら教えていただけないでしょうか?

  • MELSEC-QシーケンサをVBAで通信したい!

    三菱のシーケンサMELSEC-Qシリーズのシーケンサ「QJ71C24N」にエクセルVBAで 通信したいと考えています。なかなかうまくいかず、困り果てています・・・。 下記、進めてきた経緯と組んだプログラムを書きます。 どこがおかしいか、どなたか教えてください・・・ ■ゴール シーケンサ内部のM300という変数に格納されている値を、VBAで作成した テキストボックスに表示させたい。 1.使用するエクセルのバージョンは2003です。 MSCOMMが入ってなかったため、「vb6sp6rt4.exe」というランタイムを用いて MSCOMMはインストールできました。 2.以下プログラム Dim R As String Private Sub CommandButton1_Click() Sheets("Sheet1").Select MSComm1.DTREnable = True MSComm1.RTSEnable = True MSComm1.inputLen = 0 'Input プロパティ使用時に、バッファ全体を読み取る。 MSComm1.commport = 1 'これは必要かと考え、テキストにはないが追加。 MSComm1.Settings = "9600,N,8,1" MSComm1.portopen = True MSComm1.inbuffercount = 0 ' 0文字受信するまで待機 MSComm1.output = Chr$(H5) + "F90000FF0004010000D*0010200050" + Chr$(H31) + Chr$(H43) End Sub +でいいのでしょうか?&というのも見ましたが・・・。 一応下記の通りだと取扱説明書をみながら、進めました。 'chr$(H5):制御コードENQuiry(問合せ):ヘッダ 'F900:識別番号+フレーム+局番号 '00FF:ネットワーク番号+PC番号 '00:自局番号 '0401:コマンド(一括読み出し) '0000:サブコマンド(モニタ条件指定無し、デバイスメモリ拡張指定無し) 'D*:デバイスコード '001020:先頭デバイス '50:デバイス点数 ' Chr$(H31) + Chr$(H43):サムチェックコード ↓ここからが、テキストボックスへの表示になりますが・・・。これもうまくいかず。 Private Sub CommandButton2_Click() R = MSComm1.input text1.Text = R text2.Text = Mid$(R, 6, 4) End Sub そして、ポートオープン。これは、エラーが出ず、うまくいったと考えています。 Private Sub Form_Load() Sheets("Sheet1").Select MSComm1.DTREnable = True MSComm1.RTSEnable = True MSComm1.inputLen = 0 'Input プロパティ使用時に、バッファ全体を読み取る。 MSComm1.commport = 1 'これは必要かと考え、テキストにはないが追加。 MSComm1.Settings = "9600,N,8,1" MSComm1.portopen = True End Sub そして、ポートクローズ。こちらも、エラーが出ず、うまくいったと考えています。 Private Sub CommandButton3_Click() MSComm1.portopen = False End Sub 最大の問題は、しっかりとコードが送信できているのかというところです。 解らないところも多々あるため不明な点も多いですが、なにとぞ、教えてください。

  • COMポートマクロ入りのxlsファイルが動かない

    今までwindows XPのPCのエクセルで動作差せていたCOMポート通信を利用したマクロ機能付きのエクセルファイルをwindows8.1のPCで動作差せようとすると次のようなエラーが発生して利用できません。 Microsoft Forms ”はこのマシンでは利用できないため、オブジェクトを読み込めませんでした。” そしてMicrosoft Visual Basic というデバッグウィンドウが開き If MSComm1.PortOpen = False Then という分の”MSComm1”という部分が反転表示されて、 ”コンパイルエラー : 変数が定義されていません。” このようなエラーが発生してこのエクセルのマクロ機能が使用できません。 このエラーを解決する方法をご教授頂きますよう、よろしくお願い致します。

  • VB.NETでのシリアル通信

    .NET初心者です。 VB.NETでシリアル通信をしようとしています。 参照設定のところに Microsoft MSCOMM CONTROLというのがあったので 選択しました。 すると、MSLib.MSCommというのがでてきたので Vb6の Dim test As mscomm のように宣言して使えるかと思い Dim test As MSLib.MSComm test.PortOpen と書いてみたところ、 オブジェクト参照・・・インスタンス化されていません。と、エラーがでました。 ブレイクしてみたところ、test = Nothingでした。 testが無いのでインスタンス化されていないという エラーがでるのだなということは分かったのですが なぜこのエラーがでるのか、 どうしたらこのエラーを回避し、 .NETでシリアル通信ができるのか教えてください。 よろしくお願いします。

  • シリアル通信:オフライン時にうまく終了してくれません

    シリアルプリンタの制御をVB6で行っております。 以下のようなコードですが、うまく終了してくれません。 'グローバル 'プリンタの状態 Dim BUF as String '起動時 Private Sub Form_Load() MSComm1.PortOpen = True Text1.Text = "" Timer1.Enabled = True End Sub '終了 Private Sub Form_Unload(Cancel As Integer) Timer1.Enabled = False MSComm1.PortOpen = False End Sub 'タイマー Private Sub Timer1_Timer() Timer1.Enabled = False Call CheckPrint Timer1.Enabled = True End Sub Private Sub MSComm1_OnComm() Dim TimeOut As Long Dim sTime As Long Dim eTime As Long Select Case MSComm1.CommEvent '受信 Case comEvReceive TimeOut = 100 sTime = timeGetTime Do If (TimeOut - eTime) < 0 Then Exit Do End If eTime = (timeGetTime - sTime) Loop Until MSComm1.InBufferCount >= 82 BUF = MSComm1.Input End Select End Sub プリンタの状態チェック Private Sub CheckPrint() Dim sTime As Long Dim eTime As Long Dim TimeOut As Long Dim i As Integer Dim n As Integer BUF = "" 'プリンタの情報取得コマンド MSComm1.Output = "~HS" 'タイマ開始 TimeOut = 400 sTime = timeGetTime eTime = 0 Do DoEvents If BUF <> "" Then Exit Do End If eTime = (timeGetTime - sTime) Loop Until TimeOut - eTime < 0 If BUF <> "" Then ... .. 宜しくお願いします。

  • VBで二つの信号を送るには?

    よろしくお願いします VBで計測機械の制御をしようと考えているのですが、うまくいきません 具体的にはコマンドボタンを押して、計測機器に設定を送る際 先発の信号が受け付けられず、後発の信号のみが受け付けられる結果になります それぞれの信号が間違いないことは確認しているので 入力ごとにコマンドボタンを設定することも考えましたが、 見た目もごちゃごちゃしてよくないので、できればボタンひとつで行きたいと思います 一部ですがコードを貼っておきます よろしくお願いします Private Sub Command4_Click(Index As Integer) If MSComm1.PortOpen = False Then MSComm1.PortOpen = True End If Dim W As Single W = Text1.Text W = W / 1000 MSComm1.Output = ":WAVELENGTH " & W & "e-06" & vbCrLf Static R As Integer If Combo1 = "3μw" Then R = 3 If Combo1 = "10μw" Then R = 4 If Combo1 = "30μw" Then R = 5 MSComm1.Output = ":RANGE " & R & vbCrLf End Sub

  • RS232Cによる定電圧・定電流直流電源ZXシリーズの制御方法

    VB2005によるTAKASAGOのZX-800Lの操作を行いたいのですがRS232Cのポートオープンができません。 MSCommかNspComを用いて何とかしたいのですがどうしたらいいでしょうか??現在のプログラムと設定が以下のものです。 Comport = 1,OP="9600,1,8,1",機器アドレス="01" MSComm.CommPort = 1 'RS-232Cポート番号 MSComm.Settings = "9600,n,8,1" Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click ret = Me.NspCom.ComOpen(Comport, OP) If ret = False Then MsgBox("ポートのオープンに失敗しました") End If End Sub もしくわ、MSComm.PortOpen = TrueをNspComの代わりに入れるかといったところなのですが…[HRESULTからの例外0x800A1F45]というエラーが出たりして通信できません。ポートオープンでき通信できるとZX-800LのREMOTEランプが点灯するはずなのですが点灯せず行き詰っています。アドバイス、解決方法、例になるプログラムありましたら教えてください。 ※拙い文章で申し訳ありません。補足等必要でしたら聞いてください。

  • VB2005によるRS232C制御

    VB2005でZX-800L(TAKASAGO)を動かしたいのですがポートオープンできません。(オープンできるとREMOTOが点灯するはずなんですが…) 現在MSCommまたは確認の意味でNSPcomを用いています。(シリアルポートもあるんですができれば前者でやりたい) 機器の設定は何度も確認して間違いはないと思われます。(windowsXP使用)プログラムは以下です。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '<RS232C constant> STX = "02" EOT = "04" ENQ = "05" '伝送キャラクタ設定 ACK = "06" NAK = "15" ETX = "03" RTN = "0A" Comport = 1 OP = "9600,n,8,1" 'baud rate,stop bit,data bit,parity ADD = "01" 'RS232Cアドレス BC = "\" & EOT & ADD 'EOT+ADD Call ATH(BC) 'アスキー変換サブルーチンです。 EOTADD = BCH または (MSComm.CommPort = 1 'RS-232Cポート番号 MSComm.PortOpen = True MSComm.Settings = "9600,n,8,1" MSComm.RThreshold = 1 MSComm.SThreshold = 1 MSComm.RTSEnable = False MSComm.InputMode = MSCommLib.InputModeConstants.comInputModeBinary) End Sub この後、クリックイベント ret = Me.NspCom.ComOpen(Comport, OP) If ret = -1 Then MsgBox("miss") End If または (MSComm.PortOpen = true) でオープンさせたいのですが… 機器のHPにもサンプルプログラムもなく困っています。助言&ご指摘お願いします。