配列にデータを取り込み、そのデータをバイナリ形式で保存するには?

解決


ちょび  2007-03-02 18:42:31  No: 135594

今回はじめてプログラムを作成しており超初心者です。VB6.0,Win2000にて作成中です。皆さんよろしくお願いいたします。

計測器から、10000個/秒のデータがブロックで送られてきます。それを配列に格納し、バイナリ形式で保存したいと考えています。

WeGetScaleDataで取得したデータをdouble形の配列に格納し、そのまま保存すればよいでしょうとのサポートからの返答がありました。しかしわかりません。

現在はそれができない(わからない)ため、VB側のタイマーコントロール内に計測器からのデータを保存する方法で行っております。計測器からは100個/秒のデータを送るように設定しており、現状保存数は毎秒60個程度です。
計測器からのデータは、「モジュール」という4種類の計測器から送られてきます。そのうち2つのモジュールにはチャンネルが2つあり、合計6種類のデータが送られてきます。計測器は横河電機のWE7000と言う計測器です。計測器とともにオプション添付されていた、APIも使用しております。
サポートセンターに問い合わせをしても、VBにて作成されたプログラムについてはサポート外となっており対応できないと言われ、途方にくれています。
誰か助けてください。
長々書きましたが、もし、助けてやろう!と思われる方いましたら、ソースをメールにて送りますので、メールください。よろしくお願いいたします。

以下現在のプログラムです(一部分)。

Dim lngFileNO As Long       'DataInfoファイルのファイルno管理
Dim lnglineCnt As Long      '書き込み行数
Dim WaveBuff(0 To 1, 0 To 6) As Double
Dim WaveBuff2(0 To 1, 0 To 6) As Double
Dim WaveBuff3(0 To 1, 0 To 6) As Double
Dim BlockEnd(0 To 3) As Boolean
Dim ret As Integer
Dim recSize1 As Long
Dim recSize2 As Long
Dim ScaleBuf1(0 To 1, 0 To 0) As Double       ' 1ch用バッファ
Dim ScaleBuf2(0 To 1, 0 To 1) As Double       ' 2ch用バッファ
Dim WaveGrBuff(0 To 1, 0 To 6) As Double   'グラフ描画用バッファ1 
Dim WaveGrBuff2(0 To 1, 0 To 6) As Double  'グラフ描画用バッファ2 
Dim WaveGrBuff3(0 To 1, 0 To 6) As Double  'グラフ描画用バッファ3 

Private Sub WE72351_WeBlock(ByVal blockNo As Long)  '振動、騒音
    Dim infoNum As Integer
    Dim chNum As Integer
    Dim i As Integer
    Dim J As Integer

      infoNum = 1
      chNum = 2

 'データ取得  データを取り出します。
    ret = WE72351.WeGetScaleData(-1, blockNo, recSize2, ScaleBuf2)

   For J = 0 To 1
   For i = 0 To 1
            WaveBuff(i, J + chNum) = ScaleBuf2(i, J)
            WaveBuff2(i, J + chNum) = ScaleBuf2(i, J)
            WaveBuff3(i, J + chNum) = ScaleBuf2(i, J)
        Next i
    Next J
    
    Text4(1).Text = WaveBuff(1, chNum) '生データ
    Mnt.Vibr = Format((WaveBuff(1, chNum) / 0.00504), "#0.00")       '振動(m/sec2)=入力/0.00504V
    
    
    
    For i = 0 To 1  'グラフ描画データ生成 070214
        WaveGrBuff(i, chNum) = Mnt.Vibr
        WaveGrBuff2(i, chNum) = Mnt.Vibr
        WaveGrBuff3(i, chNum) = Mnt.Vibr
    Next i
    
 Text4(2).Text = Format(WaveBuff(1, chNum + 1), "#0.00") '生データ
    Mnt.Noise = Format((WaveBuff(1, chNum + 1) * 94 / 2.535), "#0.0") '騒音(dB)=入力*94dB/2.535V)
    For i = 0 To 1  'グラフ描画データ生成 070214
        WaveGrBuff(i, chNum + 1) = Mnt.Noise
        WaveGrBuff2(i, chNum + 1) = Mnt.Noise
        WaveGrBuff3(i, chNum + 1) = Mnt.Noise
    Next i
  
    
    Text1(1).Text = Mnt.Vibr
    Text1(2).Text = Mnt.Noise

'  アラーム監視    7235-1(振動異常発報)
    
 If Mnt.Vibr < HzA Or HzB < Mnt.Vibr Then
    '現在値    下限    上限    現在値
                                                                            ER5.Caption = "振動測定値異常"
      Call WEButton2_Off
  End If

'  アラーム監視    7235-2(騒音異常発報)
 If Mnt.Noise < dbA Or DbB < Mnt.Noise Then
     '現在値    下限    上限    現在値
                                                                         ER6.Caption = "騒音測定値異常"
   Call WEButton2_Off
  End If

' データチェック&表示
    If BlockStatusCheck(2) Then
        Call WaveformDisp
    End If
End Sub

'データ保存設定(CSVへ)
Private Sub Timer5_Timer()

Dim intLoop As Integer              'ループ用変数
Dim strData2Info As String           'データ格納用変数

'    データ取得
    For intLoop = 0 To 5
        If intLoop = 0 Then
        strData2Info = strData2Info + Format(Now, "hh:mm:ss") + ","
        End If
        strData2Info = strData2Info + Text1(intLoop).Text + ","
    Next

'    ファイルオープン
    Open strFilePath2 For Append As #10
    Print #10, strData2Info
    Close #10
'    行数カウントアップ
    lnglineCnt = lnglineCnt + 1

'    書き込み行数が設定値よりもオーバーしてないか
    If lnglineCnt >= 60000 Then
'    オーバーしてたら、ファイルnoの添え字をカウントアップ
     lngFileNO = lngFileNO + 1
'     書き込み行数初期化
     lnglineCnt = 1
    
     '新しいファイルを作成する
    strFilePath2 = SetPath + Format(Now(), "yymmddhhmmss") + ".csv"
        Dim hTextStream As TextStream
        Set hTextStream = hFso.CreateTextFile(strFilePath2)
        '不要になった時点で参照を解放する
        Set hFso = Nothing
        Set hTextStream = Nothing
    
    End If
End Sub


ガッ  2007-03-03 01:57:40  No: 135595

で、結局何がどのように分からないのですか?
> しかしわかりません。
この一文がもっとも重要な部分だと思うのですが、正直何も分かりません。

当てずっぽうですが、Double型の配列をバイナリモードで開いたファイルに
"そのまま"書き込むなら次のようにすればいいでしょう。
Option Explicit
Private Sub Form_Load()
    Dim i As Long
    Dim ff As Integer
    Dim d(1 To 10) As Double
    For i = LBound(d) To UBound(d)
        d(i) = Rnd
    Next
    ff = FreeFile()
    Open "c:\Hoge" For Binary Access Write Lock Write As ff
        Put #ff, 1, d
    Close ff
End Sub

出力した内容を確認する良い方法が見つからないのなら、
私はバイナリエディタBzをお勧めします。


ちょび  2007-03-03 02:47:12  No: 135596

ガッさんありがとうございます。
質問の方法が悪かったです。「しかしわかりません。」のあとに「ココを教えてください」と入力すべきでした。申し訳ありません。
ガッさんに教えて頂いた内容にもとずいて、作ってみます!


ちょび  2007-03-05 17:43:12  No: 135597

配列をバイナリモードで開いたファイルにそのまま書き込むことは出来ましたが、やはり、そのままではなく、テキストファイルへの変換が必要でした。
この質問では、配列の取り込みだけを質問してましたので、別の質問で「バイナリをテキストに変換するには?」と新しく質問させていただきます。
ガッさん本当にありがとうございました。今後も(次の質問も)よろしくお願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加