初めて質問します。今、大学生で卒業研究しているのですが外部の機械からサンプリング(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.1
- 回答日時:
VB の環境がないので、記憶にたよって書きます。
誤りがあるかも知れません。
16進数文字列の先頭に"&h" を付けて、 Val() 関数を使えば整数に変換できると思います。
ただし、このままだと&H8000 以上の数が負の数になってしまうので、32768 を足して、
Voltage1 As Double '←適当な型にしてやってください
Voltage1 = (Val("&H" & Data1) + 32768) / 65536 * 20 - 10
のようにすれば、V 数に変換できると思います。
A/D 変換などについては全く分からないので自信はないのですが、単純に質問文に沿って数値の変換をするだけであれば、こんな感じだと思います。
頑張ってください。
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.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と出ます。さて
こんなものでいいのでしょうか。全く見当はずれでないか
心配ですが、その時は笑って許してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 電気工事士 【理論】単相3線式で200Vの作り方について 5 2023/02/26 09:12
- その他(社会・学校・職場) 長くなるのですが、バイトのことで相談があります。 私は専門学生です。介護のバイトをしています。 面接 6 2022/12/20 11:29
- 物理学 2物体の単振動 1 2023/08/17 20:27
- テレビ テレビの地上波が映らなくなりました 10 2023/07/14 13:26
- 物理学 写真図3の回路の入力電圧CH1と出力電圧CH2の波形をオシロスコープで測定しました。発振器を使って矩 3 2022/09/25 14:44
- アルバイト・パート バイトを変えるかどうか 2 2023/05/09 01:49
- SQL Server SQL 期間内の実施数を合計したい 2 2023/03/03 22:28
- スピーカー・コンポ・ステレオ 電源トランス交換について(真空管アンプ) 3 2023/01/29 22:47
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- YouTube Googleアカウント1個で複数のYouTubeチャンネルを作った場合、登録者数などは通算される? 4 2022/05/16 14:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
セル内の文字列が日本語か英語...
-
「彡」って文字はなんという文...
-
std::stringからLPCWSTR型への変換
-
S-JIS → JIS コード変換するには
-
EBCDICへの変換
-
ふりがなをアルファベット化す...
-
JIS → S-JIS コード変換するには
-
英数字を含む文字列(0-9,A-Z)...
-
ExcelVBA実行後に時々落ちる
-
Symfowareでのデータ型変換につ...
-
10進数→2進数への変換
-
COBOLによる全角・半角混...
-
フォームのコントロールのバッ...
-
VS 2008(VB.NET)
-
%fと%gについて
-
COBOLのデータ型
-
ビット反転(Not)が機能しない
-
画像データ(png)をcsvファイル...
-
コード変換ライブラリについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
セル内の文字列が日本語か英語...
-
「彡」って文字はなんという文...
-
std::stringからLPCWSTR型への変換
-
VS 2008(VB.NET)
-
ExcelVBA実行後に時々落ちる
-
ふりがなをアルファベット化す...
-
Excelマクロにて30分単位の計算...
-
英数字を含む文字列(0-9,A-Z)...
-
Symfowareでのデータ型変換につ...
-
JIS → S-JIS コード変換するには
-
sedで日本語の置換方法について
-
COBOLによる全角・半角混...
-
フォームのコントロールのバッ...
-
数字5桁文字コード?
-
バイナリデータ→ASCII 変換プ...
-
2バイト文字をJEFからSJISに変...
-
CString ←→ BSTRの変換について
-
VBScript ASC関数:文字エンコ...
-
入力した文字を全て自動で全角...
おすすめ情報