今回はじめてプログラムを作成しており超初心者です。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
で、結局何がどのように分からないのですか?
> しかしわかりません。
この一文がもっとも重要な部分だと思うのですが、正直何も分かりません。
当てずっぽうですが、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をお勧めします。
ガッさんありがとうございます。
質問の方法が悪かったです。「しかしわかりません。」のあとに「ココを教えてください」と入力すべきでした。申し訳ありません。
ガッさんに教えて頂いた内容にもとずいて、作ってみます!
配列をバイナリモードで開いたファイルにそのまま書き込むことは出来ましたが、やはり、そのままではなく、テキストファイルへの変換が必要でした。
この質問では、配列の取り込みだけを質問してましたので、別の質問で「バイナリをテキストに変換するには?」と新しく質問させていただきます。
ガッさん本当にありがとうございました。今後も(次の質問も)よろしくお願いいたします。
ツイート | ![]() |