C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[12]: GPIB測定アプリのWin98->Win7移植への移植


(過去ログ 98 を表示中)

[トピック内 18 記事 (1 - 18 表示)]  << 0 >>

■58546 / inTopicNo.1)  GPIB測定アプリのWin98->Win7移植への移植
  
□投稿者/ AW (1回)-(2011/04/13(Wed) 16:51:10)

分類:[VB6 以前] 


OS:Win98
開発:VB6
使用する拡張ボード:NI PCI-GPIB
使用するライブラリ:NationalInstruments提供のライブラリ、モジュール

皆様、はじめまして。単純なことかも知れませんが、大変困っておりますので、
どうかお知恵をお貸しください。

上記の環境で、開発された、測定器計測のアプリがあります。
これを環境をそのまま、Windwos7のPCへ移行させました。
 ・当然Windows7側のGPIBボードは認識しており、正常な状態です)
 ・提供されている、ライブラリ、モジュールのインストールも完了
 ・フォルダ構造なども、Win98と全く同じにした
 ・GPIBのパラメータも全く同じにした

要するに、OSがWin7、GPIB関係(ドライバ等)がWin7用の物になった以外は、全て同じ状態だと思ってください。

この状態で、Win7で計測アプリを起動すると、
決められた手順でGPIB通信を行い、
計測を開始します。
ある一定回数数計測したら、
正常に終了します。

しかし、
計測のデータは全くめちゃくちゃな値が返ってきているのです。
(−から+ランダム)

このような場合、
NIより提供されたライブラリで通信は行っていますので、
そこまで違うとは思えません。ソース見る限り、
(Win98とWin7で関数の引数等、全く同じです。)
Win98とWin7でなぜこのようなことになるでしょう?











引用返信 編集キー/
■58548 / inTopicNo.2)  Re[1]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ todo (133回)-(2011/04/13(Wed) 17:16:26)
NI 技術サポート
http://www.ni.com/support/ja/

「NI製品ディスカッション」に投稿してみるとか。
引用返信 編集キー/
■58549 / inTopicNo.3)  Re[2]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ しるふぃん (13回)-(2011/04/13(Wed) 17:29:40)
> ソース見る限り
とはいうものの、あなた自身が作ったわけではないですよね。

開発会社にてWin7での動作確認済みと歌われてない以上はソースを見たとしても100%以前の環境と同じ動作を
するとは限りません。

todoさんがおっしゃるように、開発側にでも問い合わせたほうが早いと思います。
引用返信 編集キー/
■58553 / inTopicNo.4)  Re[1]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ shu (622回)-(2011/04/14(Thu) 08:04:12)
No58546 (AW さん) に返信

テキストならエンコーディングの違いとかあるかもしれません。

>(−から+ランダム)
数値が正しい値からずれているということでしょうか?

> ・当然Windows7側のGPIBボードは認識しており、正常な状態です)
なぜ正常な値を取得出来ていないのに当然、正常な状態なのでしょう?
引用返信 編集キー/
■58554 / inTopicNo.5)  Re[2]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ AW (2回)-(2011/04/14(Thu) 09:32:12)
No58553 (shu さん) に返信
> ■No58546 (AW さん) に返信
>
> テキストならエンコーディングの違いとかあるかもしれません。
>
> >(−から+ランダム)
> 数値が正しい値からずれているということでしょうか?
>
>>・当然Windows7側のGPIBボードは認識しており、正常な状態です)
> なぜ正常な値を取得出来ていないのに当然、正常な状態なのでしょう?


shu様
ご回答ありがとうございます

数値につきましては、ズレているというレベルではなく、
完全に16bitの乱数となっています。

ボードが正常な状態と判断しているのは、
GPIB通信アナライザを設置して、
トーカー、リスナーのやり取りを見て判断しています。
Win98とWin7では、通信上、全く同じ事をやっています(アナライザにて確認)。
ただ、Win7側は測定器に読み取りコマンドを送り、
測定結果を受信すると、
全く、見当違いな値が返ってきている状態です。

通信で同じやり取りを行っているので、
測定器から見ると、変化はないはずです。
OSが変わろうが、GPIBさえ使えていれば、
関係ないと思っていたんですが・・・





引用返信 編集キー/
■58556 / inTopicNo.6)  Re[3]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ オショウ (581回)-(2011/04/14(Thu) 12:38:09)
> 通信で同じやり取りを行っているので、
> 測定器から見ると、変化はないはずです。
> OSが変わろうが、GPIBさえ使えていれば、
> 関係ないと思っていたんですが・・・

  OSが変わると、関係大有りです。
  文字列として扱われているのであれば、Win7はUNICODEなので
  OSに対応した変換処理が必要になる場合があります。

  因みにVB6では、StrConv等使ってますか?
  尚、NI社のライブラリと言うかSDKと言うか・・・は、
  いくらVB6対応だからといって、Win7対応?非対応?を調べま
  したか?

以上。
引用返信 編集キー/
■58563 / inTopicNo.7)  Re[4]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ AW (3回)-(2011/04/15(Fri) 13:26:55)
No58556 (オショウ さん) に返信
>   OSが変わると、関係大有りです。
>   文字列として扱われているのであれば、Win7はUNICODEなので
>   OSに対応した変換処理が必要になる場合があります。
>
>   因みにVB6では、StrConv等使ってますか?
>   尚、NI社のライブラリと言うかSDKと言うか・・・は、
>   いくらVB6対応だからといって、Win7対応?非対応?を調べま
>   したか?
>

オショウ様
貴重なご意見ありがとうございます。

NI社のライブラリにつきましては、
別の測定装置で、同じGPIBボードを使用して、
動作しているPCがあります。
このPCのアプリはWin7、VB6で作成されており、
GPIB関数も同じものが使われております。
こちらは正常に動作しています。

このPCを使用して、問題のアプリの動作確認もしてみたのですが、
症状は全く同じでした。

自分の会社で開発した物ではないので、
ソースの検証は、そこまで詳しく行っておりません。(怪しそうな箇所をざっと見ただけです)
作った会社は倒産したみたいで、仕様書、マニュアルすらありません・・・
(愚痴っぽくなってすみません)

最後に、皆様にご質問させていただきたいのですが、

このような症状の場合は、
コーディングを見直すことで、解決するのでしょうか?

どうぞ皆様のお力をお貸しください。



引用返信 編集キー/
■58564 / inTopicNo.8)  Re[5]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ ごう (235回)-(2011/04/15(Fri) 13:36:39)
No58563 (AW さん) に返信

※投稿フォームにある注意書きに
  半角カナは使用しないでください。文字化けの原因になります。
とあります。ご注意くださいね。



> 最後に、皆様にご質問させていただきたいのですが、
>
> このような症状の場合は、
> コーディングを見直すことで、解決するのでしょうか?

■58556のオショウさんの発言の意味はお分かりいただけましたでしょうか?
通信でやり取りされているデータが、「文字列」として扱われているのであれば、
文字コードを疑って見てはどうでしょうか。

ドキュメント等何もないとのことですが、デバッガを使ってソースコードやデータの流れを追うことは出来ますか?
引用返信 編集キー/
■58569 / inTopicNo.9)  Re[6]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ ごう (236回)-(2011/04/15(Fri) 15:15:16)
おせっかいかもしれませんが、一応、VB6のデバッガの使い方を紹介しておきます。
http://homepage1.nifty.com/rucio/main/shokyu/jugyou24.htm

※作った会社は倒産とのことですが、引き継いでいる会社等もないのでしょうか?
 あれば、そこに問い合わせるのが一番だと思います。

 
>このような症状の場合は、
>コーディングを見直すことで、解決するのでしょうか?


 それが無理なのであれば、ソースコードが手元にあるということで自力でソースコードを改修することも選択肢の一つですが
「どういう条件で」やり取りしているデータが異なってしまうのか見極めが必要です。
よって、状況次第では100%解決できるとは、私は断言できません。 (状況次第では自力で解決できるとは思いますが)

引用返信 編集キー/
■58581 / inTopicNo.10)  Re[7]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ AW (4回)-(2011/04/15(Fri) 18:26:27)
No58569 (ごう さん) に返信
> おせっかいかもしれませんが、一応、VB6のデバッガの使い方を紹介しておきます。
> http://homepage1.nifty.com/rucio/main/shokyu/jugyou24.htm
>
> ※作った会社は倒産とのことですが、引き継いでいる会社等もないのでしょうか?
>  あれば、そこに問い合わせるのが一番だと思います。
>


ごう様
色々とアドバイスありがとうございます。

引き継いでいる会社もございません・・・

それと、デバッガーにて、最初のほうに記入しております、
16bit乱数になるのを確認しております。

C++が専門ですので、VBはあまり得意ではありませんが、
この部分で文字列は、使用されてないと思いますので、
ご指摘のあった文字コード違いは当てはまらないと思いますが、、、

受信部ソース抜粋いたします。
大変あつかましいとは思いますが、何かお気づきありますでしょうか?

Declare Function ibrd32 Lib "Gpib-32.dll" Alias "ibrd" (ByVal ud As Long, sstr As Any, ByVal cnt As Long) As Long
Global IF_buff() As Integer

sub 測定ルーチン
開始処理

色々と送信

受信準備
ReDim IF_buff(0 To IL_cnt) <−「IL_cnt」デバッグ時は80を確認

受信
Read_If_graph = RDI_LDT(GPIB_ID, IF_buff()) <−ちなみに、このIF_bufを覗いてます。

描画

終了

End Sub


Function RDI_LDT(Unit_ID%, buf() As Integer) ' 16ビットデータ読み込み
Dim cnt&

cnt& = CDbl((UBound(buf) - LBound(buf))) * 2

If (ilrdi(Unit_ID%, buf(), cnt&) < 0) Then
GPIB_ERROR = iberr%
RDI_LDT = NG
Exit Function
End If
RDI_LDT = OK

End Function

Sub ibrdi(ByVal ud As Integer, ibuf() As Integer, ByVal cnt As Long)
' Check to see if GPIB Global variables are registered
If (GPIBglobalsRegistered = 0) Then
Call RegisterGPIBGlobals
End If

' Call the 32-bit DLL.
Call ibrd32(ud, ibuf(0), cnt)

Call copy_ibvars
End Sub


Sub ibrd(ByVal ud As Integer, buf As String)
Dim cnt As Long

' Check to see if GPIB Global variables are registered
If (GPIBglobalsRegistered = 0) Then
Call RegisterGPIBGlobals
End If

cnt = CLng(Len(buf))

' Call the 32-bit DLL.
Call ibrd32(ud, ByVal buf, cnt)

Call copy_ibvars
End Sub









引用返信 編集キー/
■58584 / inTopicNo.11)  Re[8]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ Mira (29回)-(2011/04/15(Fri) 19:33:46)
プログラムをWin7で再コンパイルとかはされてますか?
してないなら一度試してみたらいかがですか?

Win98環境でコンパイルしたままのExeだったら互換性なさそうな気がします
引用返信 編集キー/
■58587 / inTopicNo.12)  Re[9]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ AW (5回)-(2011/04/16(Sat) 00:21:39)
No58584 (Mira さん) に返信
> プログラムをWin7で再コンパイルとかはされてますか?
> してないなら一度試してみたらいかがですか?
>
> Win98環境でコンパイルしたままのExeだったら互換性なさそうな気がします


Mira様

ありがとうございます。
Win7で再コンパイルしております。
(特にエラー等ありませんでした)

引用返信 編集キー/
■58589 / inTopicNo.13)  Re[8]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ shu (624回)-(2011/04/16(Sat) 07:56:43)
No58581 (AW さん) に返信

送信にも文字列は使用されていませんか?文字列の場合、もしかすると別の命令として
判断されているかもしれません。

integerの配列で受けてますが、byte配列でなくて良いのでしょうか?byte配列を
想定しているのにintegerで受けてしまうと各2byteが逆になってしまいます。


今回の問題には関係ないですが、
> cnt& = CDbl((UBound(buf) - LBound(buf))) * 2
ですがCdblはDoubleに変換してしまうので、誤差が生じる可能性があります。変換は不要かと思います。
引用返信 編集キー/
■58591 / inTopicNo.14)  Re[8]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ 魔界の仮面弁士 (2152回)-(2011/04/16(Sat) 12:38:53)
No58581 (AW さん) に返信
> Function RDI_LDT(Unit_ID%, buf() As Integer)   ' 16ビットデータ読み込み
戻り値の「As」がありませんが、VarType 宣言されているのでしょうか?
せめて As Variant でも構いませんので、関数にしても定数にしても変数にしても、
型宣言は省略しない方が望ましいかと。

今回は OK / NG を返しているようなので、戻り値の型は列挙型、
もしくはそれらの定数に相当するプリミティブ型(Integerなど)を付与しましょう。


> Global IF_buff() As Integer
Global は、VB2 時代の構文です。VB6 では Public を利用してください。
(VB2 の頃は逆に、Public というキーワードは使えませんでしたが)


> ReDim IF_buff(0 To IL_cnt) <−「IL_cnt」デバッグ時は80を確認
つまり 162バイト分のバッファーになりますが、その長さは妥当なのですね?


> Function RDI_LDT(Unit_ID%, buf() As Integer) ' 16ビットデータ読み込み
>     Dim cnt&
>     cnt& = CDbl((UBound(buf) - LBound(buf))) * 2
この cnt がバッファ長を示しているのだとしたら、算出式は
 cnt = (UBound(buf) - LBound(buf) + 1) * 2
になるのでは無いでしょうか。

たとえば、buf 配列の要素が 0 To 2 の場合、識別子のエリアを除けば
6 バイト分のバッファとなるはずですが、上記の式に照らし合わせて計算すると、
AWさんのコードでは「4」、私のコードでは「6」として算出されます。


No58589
>> ですがCdblはDoubleに変換してしまうので、誤差が生じる可能性があります。
UBound や LBound は Long 型を返しますので、CDbl が不要という点は同意しますが、
それによって誤差を生じることは無いはずです。結果に小数部が含まれるわけでも
ありませんし、その値も常に長整数型の有効範囲範囲内で計算されるわけですから。


> Sub ibrd(ByVal ud As Integer, buf As String)
>     Dim cnt As Long
>(略)
>     cnt = CLng(Len(buf))
>     ' Call the 32-bit DLL.
>     Call ibrd32(ud, ByVal buf, cnt)
CLng が無意味という点はさておき(Len関数は Long を返す)、
上記の処理が危なっかしいように見えます。


まず、buf にはどのような値が入ってくるのでしょうか?
また、上記の cnt は、何を表わす値として組まれていますか?

というのも、この部分で buf に格納される値が
 (1) 常に ASCII 文字列が格納されている
 (2) 漢字やひらがななどの日本語を含む文字列が格納されている
 (3) GPIB の通信内容を表すバイナリが格納されている
のいずれであるのかによって、結果は大きく変わってくるからです。

たとえば、buf に格納されている内容が
 buf = "漢字TEST"
である場合、Len(buf) という式が返す値は 6 となります。
この場合の Len は、『文字数』を表すからです。

# ちなみに LenB(buf) なら、VB2 の場合は 8、VB6 では 12 を返します。


buf の内容が上記 (1) であることを保証できるなら、現状のコードは
このままで構わないと思います。


一方、それが (2) の場合は、Sub ibrd の処理を
 cnt = LenB(StrConv(buf, vbFromUnicode, 1041))
 Call ibrd32(ud, ByVal buf, cnt)
にした方が良いと思われます。今のコードのままだと、9x 系 OS と NT 系 OS では
微妙に異なる結果を返しますし、どちらの場合であってもデータ破損がありえます。


そして (3) の状態、すなわち buf が文字列データになっておらず、
数値(≠数字)や制御記号などの生のバイナリデータを保持している場合には、
 Dim bin() As Byte
 bin = buf
 If LBound(bin) <= UBound(bin) Then
  Call ibrd32(ud, bin(LBound(bin)), LenB(buf))
 End If
という感じになります。buf が Unicode バイナリな文字列の場合もこの方法です。


いずれにせよ、DLL の仕様も実環境も手元にないため、すべて憶測になってしまいますけれども。

引用返信 編集キー/
■58592 / inTopicNo.15)  Re[9]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ shu (625回)-(2011/04/16(Sat) 14:23:47)
No58591 (魔界の仮面弁士 さん) に返信

> No58589
> >> ですがCdblはDoubleに変換してしまうので、誤差が生じる可能性があります。
> UBound や LBound は Long 型を返しますので、CDbl が不要という点は同意しますが、
> それによって誤差を生じることは無いはずです。結果に小数部が含まれるわけでも
> ありませんし、その値も常に長整数型の有効範囲範囲内で計算されるわけですから。
確かに長整数は10桁までしかないので有効桁数15桁のDoubleに変換しても*2程度では桁落ちは
発生しないですね。
無用な型変換により思わぬ結果になることがあるという程度にとっておいて下さい。 >>AW さん
引用返信 編集キー/
■58593 / inTopicNo.16)  Re[10]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ オショウ (582回)-(2011/04/17(Sun) 01:40:26)
GPIB通信アナライザを使えるならば、コマンド文字列以外に
受信されているデータ部が正しいか直接判読できますよネ?!

データ部のバイト長も含め、16進ダンプでもして、語長で区
切って調べれば、送受信データが正しいのであれば、残るは
プログラムのバグだけでしょう。

その辺は、魔界の仮面弁士さんが指摘されていますので、簡
単に追えるのでは?

※ そうそうGPIB通信アナライザは使えない・・・と言うか
  使わせてもらえなかったので、こういうケースの場合、
  結構難儀した記憶があります。
  環境的には恵まれているので、アナライザ使って確認で
  きているならば、何とでもなるでしょう!

以上。
引用返信 編集キー/
■58594 / inTopicNo.17)  Re[11]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ オショウ (583回)-(2011/04/17(Sun) 01:46:31)
補足
NI社ボードで、アジレント社計測機器と通信させた場合、
設定やNI社ドライバーバージョンで、不都合があったよう
な・・・

その辺は大丈夫ですか?

以上。
引用返信 編集キー/
■58595 / inTopicNo.18)  Re[12]: GPIB測定アプリのWin98->Win7移植への移植
□投稿者/ AW (6回)-(2011/04/17(Sun) 11:11:38)
魔界の仮面弁士様、オショウ様、shu様

大変貴重なアドバイス
ありがとうございました。

実は、本件、あまり工数をかけずに
実現する方法を模索中に投稿させて頂きました。

クライアント様が、「こんなの簡単にできるはず!!」と、
この事象を見ていただいても、なかなか判って貰えず、
単純にPC代程度しか予算がございません。

オショウ様の仰いますように、
アナライザーが使えるので、解析しつつ、
修正点を絞り込み、改良していけば、
どうにかとは思っておりました。

皆様のご意見をお聞きして
やはり工数ほぼ0では、実現不可能であることが
確信もてましたので、
クライアント様と交渉して方針を決めたいと思います。
(仕事なんでタダではできません^^)


色々と大変貴重なご意見ありがとうございました。
完全に解決したわけでは御座いませんが、
一旦解決済みとさせていただきます。






解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -