初めて質問します。今、大学生で卒業研究しているのですが外部の機械からサンプリング(A/D変換)するという簡単なものなのです。A/D変換は2チャンネル使っています。その二つのデータが、16進数の4バイトで出しています。上位2バイトがチャンネル2、下位2バイトがチャンネル1になっています。16進数8000hが0V、FFFFhを10V、0000hを-10Vとしたいのですがどうすればいいかわかりません。
例えば8003C000hと出たとき8003が約0V、C000が約5Vとなるようにしたいのです。
Data1=Mid(Hex(SmplData(0,0)),5,4) '下位2バイトチャンネル1のデータ
Data2=Mid(Hex(SmplData(1,0)),1,4) '上位2バイトチャンネル2のデータ
これを上で書いたように変えたいのです。教えてください。使っているA/D変換機はインターフェイスのPCI-3178を使っています。簡単なことかもしれませんが、今月中に、この後もまだまだしなくてはいけないのでお願いします。文章も苦手なもので、わからないことがあるかもしれませんがその時は言ってください。
No.3ベストアンサー
- 回答日時:
とりあえずさっきの発言についての補足です。
比の定義が定まったら、#1のtailkuppaさんの発言を参考に行うと、できると思います。
さらにtailkuppaさんの発言についての補足です。
>16進数文字列の先頭に"&h" を付けて、 Val() 関数を使えば整数に変換できると思います。
たしかに、その通りだとおもいます。
>ただし、このままだと&H8000 以上の数が負の数になってしまうので、32768 を足して、
この処理はあまりお勧めしません。。。
いくつ以上の時・・・
いくつ以下の時・・・
と処理を分けるのではなく、符号無しへの変換をするようにしましょう。
符号無し定数とビット単位での比較を行う事により、符号ありから符号無しへの16進数へ変換が可能です。
Sub main()
Const LNG_FFFF As Long = &HFFFF&'変換定数
Dim lngWork As Long
'取り敢えず値代入
lngWork = &HFFF0
'出力
Debug.Print lngWork '-16 (符号ありの状態なので、負の値)
Debug.Print (lngWork And LNG_FFFF) '65520(符号なしの状態なので、正の値)
End Sub
No.4
- 回答日時:
文系人間でA/D変換など詳しく分からない者です。
16進数を10進数に変換する私の使うロジックを下記に書きます。
8バイトの文字(0からFのどれか)で2+2=4バイトを表しているとします。ファイルの中でA~Fが小文字のときはa~fに変えてください。
Private Sub Form_Click()
Dim s, x, y As String
Dim tbl As String
Dim w(5) As Long
Dim u As Long
Dim v As Long
tbl = "0123456789ABCDEF"
s = "FAC33FA8" '1例として設定
x = Mid$(s, 1, 4)
y = Mid$(s, 5, 4)
Form1.Print x, y
'-------
For i = 1 To 4
w(i) = InStr(tbl, Mid$(x, i, 1)) - 1
Form1.Print w(i)
Next i
'----
u = w(1) * 4096 + w(2) * 256 + w(3) * 16 + w(4)
Form1.Print u
'--------
For i = 1 To 4
w(i) = InStr(tbl, Mid$(y, i, 1)) - 1
Form1.Print w(i)
Next i
'-----
v = w(1) * 4096 + w(2) * 256 + w(3) * 16 + w(4)
Form1.Print v
End Sub
ここでuとvのそれぞれに付いて65536/20=3276で
20等分してint(u/3276)-10を計算すると65536は+10、
32768は0、0は-10と出ます。さて
こんなものでいいのでしょうか。全く見当はずれでないか
心配ですが、その時は笑って許してください。
No.2
- 回答日時:
よく理解していませんが・・・
例で上げられている
(1)&HFFFF& = 65535 → 10V
(2)&H8000& = 32768 → 0V
(3)&H0000& = 0 → -10V
は、正確な例では無いように思えます。
(2)-(1)=65535 - 32768 = 32767
(3)-(2)=32768 - 0 = 32768
となり、10Vの等差になりません。
それが定まれば、あとは比率で算出できると思います
No.1
- 回答日時:
VB の環境がないので、記憶にたよって書きます。
誤りがあるかも知れません。
16進数文字列の先頭に"&h" を付けて、 Val() 関数を使えば整数に変換できると思います。
ただし、このままだと&H8000 以上の数が負の数になってしまうので、32768 を足して、
Voltage1 As Double '←適当な型にしてやってください
Voltage1 = (Val("&H" & Data1) + 32768) / 65536 * 20 - 10
のようにすれば、V 数に変換できると思います。
A/D 変換などについては全く分からないので自信はないのですが、単純に質問文に沿って数値の変換をするだけであれば、こんな感じだと思います。
頑張ってください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セル内の文字列が日本語か英語...
-
EBCDIC⇒SJIS変換の方法
-
「彡」って文字はなんという文...
-
ExcelVBA実行後に時々落ちる
-
VB.NETのコンソールアプリケー...
-
CString ←→ BSTRの変換について
-
sedで日本語の置換方法について
-
英数字を含む文字列(0-9,A-Z)...
-
error C2679 がとれません><
-
2バイト文字をJEFからSJISに変...
-
ImageMagickで透過以外を黒に
-
std::stringからLPCWSTR型への変換
-
latin-1 (ISO-8859-1)への変換
-
XMLデータの中の改行コードにつ...
-
COBOLによる全角・半角混...
-
VS 2008(VB.NET)
-
10進数→2進数への変換
-
VB.NET TextBoxへの入力をキャ...
-
C#でバイナリデータをテキスト...
-
byte配列の内容をstringにコピ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「彡」って文字はなんという文...
-
EBCDIC⇒SJIS変換の方法
-
セル内の文字列が日本語か英語...
-
std::stringからLPCWSTR型への変換
-
ExcelVBA実行後に時々落ちる
-
VS 2008(VB.NET)
-
Symfowareでのデータ型変換につ...
-
2バイト文字をJEFからSJISに変...
-
COBOLによる全角・半角混...
-
VB.NETのコンソールアプリケー...
-
フォームのコントロールのバッ...
-
ふりがなをアルファベット化す...
-
sedで日本語の置換方法について
-
PL/SQLでSJISの文字コードを取...
-
数字5桁文字コード?
-
画像データ(png)をcsvファイル...
-
CString ←→ BSTRの変換について
-
英数字を含む文字列(0-9,A-Z)...
-
error C2679 がとれません><
-
RubyでUTF8のコード値を文字に...
おすすめ情報