先日、配列をバイナリモードで開いたファイルに「そのまま」書き込む方法をご伝授いただいたのですが、データの取り込みを終了した後に、テキスト形式に変換したいのです。どのようにすればよいのでしょうか?教えてください。
また、このままでは配列の書込みを同じ所に行うのですが、配列を取り込むたびに、データを溜めていきたい(新しい場所(名前)に保存したい)のです。どうすれば出来るのでしょうか?教えてください。
Private Sub Command1_Click()
Dim i As Long
Dim ff As Integer
Dim d(1 To 10000) As Double
For i = LBound(d) To UBound(d)
d(i) = Text1.Text
Next
ff = FreeFile()
Open "C:\DATA\text1.txt" For Binary Access Write Lock Write As ff
Put #ff, 1, d
Close ff
End Sub
言い忘れていました。
開発環境はVB6.0 OS:WIN2000
VBはじめたばかりの超初心者です。皆様よろしくお願いいたします。
こういうことですかね?
Dim Buf(9) As Byte
Buf(0) = &H82
Buf(1) = &HA0
Buf(2) = &H82
Buf(3) = &HA2
Buf(4) = &H82
Buf(5) = &HA4
Buf(6) = &H82
Buf(7) = &HA6
Buf(8) = &H82
Buf(9) = &HA8
Debug.Print StrConv(Buf, vbUnicode)
これで
あいうえお
と表示されます。
>新しい場所(名前)に保存したい
既存のファイルを移動(リネーム)したいのか
それとも開いたファイルの出力先を変えたいのかどっちでしょうか?
前者でしたら
Name "hoge.txt" as "hogehoge.txt"
後者でしたら
openするときのパスを変える。
通り巣鴨様ご返答ありがとうございます。
質問時の私の言葉が足りませんでした。後者の OPENするときのパスを変えるでOKです。
現状の質問にはかなり不足しているものがありました。
改めて質問させていただきます。
現在、
①データを配列に取込む。
→このときに1秒に1回データが入ってきます。これを最長72時間ぐらい連続して行います。このデータを随時保存したいのですがどうすればよいでしょうか?
②この連続したバイナリデータを、テキストデータに変換したいのですが、どのようにすればよいでしょうか?
このテキストデータへの変換は、配列にデータ取込が終了した時点で行う。
また、バイナリデータが分割して保存されているのをテキストデータ変換時に、連続した1つのデータにすることはできますでしょうか?
以上質問事項のわかり難いとこありましたら、また仰ってください。
よろしくお願いいたします。
1、についてですが、なにがわからないのでしょうか?
ダブらないファイル名の作り方がわからないのですか?
でしたら自分で仕様を考えてくださいとしか言い用が無いような気がします。
参考程度に
Date関数で日付 Time関数で時間を取得できるので
フィイル名を日付+時間で良いような気がします。
2、正直この説明は取り込んだデータはなに?って話になります。
データの変換が目的なのか、書きこみ方法の問題なのか
上の説明で答えになってないってことは書きこみ方式なんでしょうね。
ってな事で
Open "C:\DATA\text1.txt" For Binary Access Write Lock Write As ff
を
Open "C:\DATA\text1.txt" For output Access Write Lock Write As ff
にでもして書き込んでみてください。
putじゃ書き込めないので
write
やら
print
やらを使ってくださいね。
通り巣鴨様
度重なる質問時の意味のわからなさ大変申し訳ありません。
>正直この説明は取り込んだデータはなに?って話になります。
最初から詳しく説明していれば通り巣鴨様に何度もご説明いただくこともなかったのではないかと反省しております。以下もう一度説明させていただきます。
必要のない説明もあります。また、困っていること全てを書きます。
計測器(横河電気WE7000)より計測されたデータを取込みます。
計測器からのデータは、「モジュール」という4種類の計測器から送られてきます。そのうち2つのモジュールにはチャンネルが2つあり(2×2=4)、残り2つのモジュールにはチャンネルが1つずつあります。合計6種類のデータが送られてきます。
各モジュールより6種類のデータが10000個/秒送られてきます。
各モジュールより取込まれるデータ名
1 モータ回転数 (モジュール1−1ch)ScaleBuf1
2 ポンプ流量 (モジュール1−2ch)ScaleBuf1
3 騒音 (モジュール2−1ch)ScaleBuf2
4 振動 (モジュール2−2ch)ScaleBuf2
5 トルク (モジュール3) ScaleBuf3
6 油温 (モジュール4) ScaleBuf4
①各モジュールのデータを4つの配列に取込み、その配列を1つのファイルへ保存したいです。
以下現状のコード(一部)
Option Explicit
Dim ScaleBuf1(0 To 10000, 0 To 1) As Double ' 2ch用バッファ
Dim ScaleBuf2(0 To 10000, 0 To 1) As Double ' 2ch用バッファ
Dim ScaleBuf3(0 To 10000, 0 To 0) As Double ' 1ch用バッファ
Dim ScaleBuf4(0 To 10000, 0 To 0) As Double ' 1ch用バッファ
recSize1 =8(バイト)*2(ch数)* 10000(個)’2ch用バッファのバイトサイズ
recSize2 =8 * 2 * 10000 '2ch用バッファのバイトサイズ
recSize3 =8 *10000 '1ch用バッファのバイトサイズ
recSize4 =8 *10000 '1ch用バッファのバイトサイズ
Private Sub WE75211_WeBlock(ByVal blockNo As Long) 'モータ回転数、流量
Dim infoNum As Integer
Dim chNum As Integer
Dim i As Integer
Dim J As Integer
infoNum = 1
chNum = 0
ret = WE75211.WeGetScaleData(-1, blockNo, recSize1, ScaleBuf1)
For J = 0 To 1
For i = 0 To 1
If (WeIsNan(WE_DOUBLE, ScaleBuf1(i, J))) Then
WaveBuff(i, J + chNum) = 0
WaveBuff2(i, J + chNum) = 0
WaveBuff3(i, J + chNum) = 0
Else
WaveBuff(i, J + chNum) = ScaleBuf1(i, J)
WaveBuff2(i, J + chNum) = ScaleBuf1(i, J)
WaveBuff3(i, J + chNum) = ScaleBuf1(i, J)
End If
Next i
Next J
For i = 0 To 1 ’グラフ描画データ生成 モータ回転数
WaveBuff(i, chNum) = RpmSamp
WaveBuff2(i, chNum) = RpmSamp
WaveBuff3(i, chNum) = RpmSamp
Next i
For i = 0 To 1 'グラフ描画データ生成 流量
WaveBuff(i, chNum + 1) = Mnt.Flow
WaveBuff2(i, chNum + 1) = Mnt.Flow
WaveBuff3(i, chNum + 1) = Mnt.Flow
Next i
End Sub
同じく以下の3つも上記と同様のコードを作成しています。
ret = WE75211.WeGetScaleData(-1, blockNo, recSize2, ScaleBuf2)
ret = WE75211.WeGetScaleData(-1, blockNo, recSize3, ScaleBuf3)
ret = WE75211.WeGetScaleData(-1, blockNo, recSize4, ScaleBuf4)
②上記の各プロシージャの中に「ScaleBuf1〜4」を配列へ格納し、バイナリファイルへ保存しなさいという命令をすればよいのでしょうか?
それとも、別のプロシージャで配列へ格納し、バイナリファイル保存しなさいという命令をすればよいのでしょうか?
③バイナリファイルへ保存したデータファイルを計測終了後にテキストデータに変換し、変換後テキスト形式(CSV)に以下のように書き込みを行いたいです。
計測時刻 モータ回転数 ポンプ流量 騒音 振動 トルク 油温
1 **:**::: ***rpm ***l/min **dB **Hz ***N/M **℃
2 **:**::: ***rpm ***l/min **dB **Hz ***N/M **℃
3 **:**::: ***rpm ***l/min **dB **Hz ***N/M **℃
4 **:**::: ***rpm ***l/min **dB **Hz ***N/M **℃
5 **:**::: ***rpm ***l/min **dB **Hz ***N/M **℃
6 **:**::: ***rpm ***l/min **dB **Hz ***N/M **℃
7 **:**::: ***rpm ***l/min **dB **Hz ***N/M **℃
10000**:**::: ***rpm ***l/min **dB **Hz ***N/M **℃
④書き込み時、CSVファイルへは60000行書き込んだところで、新しいファイルを作成し、
⑤ファイル名には、計測日時-1〜計測日時-999999999というよう名前を付けていきたいです。
現状はこんな感じです。
Private Sub Command1_Click()
Dim hFso As FileSystemObject 'ファイル作成時必要
Set hFso = New FileSystemObject '〃
Dim intLoop As Integer 'ループ用変数
Dim strData2Info As String 'データ格納用変数
ファイルオープン
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 + ⑤(計測日時−1)+ ".csv"
Dim hTextStream As TextStream
Set hTextStream = hFso.CreateTextFile(strFilePath2)
'不要になった時点で参照を解放する
Set hFso = Nothing
Set hTextStream = Nothing
End If
End Sub
以上長々とプログラムの内容を書きましたが今まで教えてもらったり、調べたりして作成したプログラムなので全てを理解して書けておりません。
意味のわからないところもあると思います。これから勉強していきたいと思っていますので、どうかご理解お願いいたします。
hm。。。
あんまり芳しくないかもしれませんが、とりあえずAPIを捕まえてきました
http://supercon.lbl.gov/jlizarazo/public/Yokogawa/WE7000/Instruction%20Manuals/Japanese/%E5%8F%96%E6%89%B1%E8%AA%AC%E6%98%8E%E6%9B%B8/IM707742-61J_030.pdf
で、ご説明の方ですが
正直、読み返してみましたか?
とりあえず憶測で作っている最中気づいたことがあったのでいろいろ書いておきます:
・CSVファイルに書き出す「測定時刻」というのは一体何者でしょうか?
たぶん全ての測定機器は、ブロックデータ単位でバラバラの時刻に通知してくるはずです。
つまり見かけ上の測定時刻はバラバラの値になるべきであり、一意に定めるべき方法がわかりません。
追伸
以下殺伐とした表現が続きます
※とりあえずマル付き文字はMacとの相性が悪いと聞いたことがあるので即刻辞めるべきでしょう。
> 2 上記の各プロシージャの中に「ScaleBuf1〜4」を配列へ格納し、バイナリファイルへ保存しなさいという命令をすればよいのでしょうか?
それとも、別のプロシージャで配列へ格納し、バイナリファイル保存しなさいという命令をすればよいのでしょうか?
どちらでもお好きなように。
それよりも問題は、この二つに絞った理由です。
(しかも私はこの二つの疑問の意味がよくわかっていません)
> 3 バイナリファイルへ保存したデータファイルを計測終了後にテキストデータに変換し、変換後テキスト形式(CSV)に以下のように書き込みを行いたいです。
その場合測定データだけではなく、「測定時刻」もどうにかして一緒に記憶しておかなければならないことはお分かりでしょうか?
> 必要のない説明もあります。また、困っていること全てを書きます。
全体像を明かせないのは仕方の無いことかもしれませんが、
そういう場合はそもそも全体像を部分省略して載せないことです。
日記帳ではないのですから、問題点を絞ってみてください。
(´・ω・`)機種依存なんてもういいよ
ガッさんご返答本当にありがとうございます。
上記の質問( 2007/03/05(月) 22:43:50)に間違いがあります。
ret=WE72511となっているところが間違いで以下が正しいです。
同じく以下の3つも上記と同様のコードを作成しています。
ret = WE72351.WeGetScaleData(-1, blockNo, recSize2, ScaleBuf2)
ret = WE72451.WeGetScaleData(-1, blockNo, recSize3, ScaleBuf3)
ret = WE72411.WeGetScaleData(-1, blockNo, recSize4, ScaleBuf4)
ガッさんには先日の質問よりお世話になっており大変恐縮しております。
わざわざAPIまで持ってきていただき、感謝の限りです。
※とりあえずマル付き文字はMacとの相性が悪いと聞いたことがあるので即刻辞めるべきでしょう。
申し訳ありません。以後、気をつけます。
APIのPDFですが、読んでいるのですが正直なところ、意味がわかっておりません。
致命的なのですが、特に引数の入力、戻り値の使い方が理解しきれておりません。
>CSVファイルに書き出す「測定時刻」というのは一体何者でしょうか?
> 3 バイナリファイルへ保存したデータファイルを計測終了後にテキストデータに変換し、変換後テキスト形式(CSV)に以下のように書き込みを行いたいです。
その場合測定データだけではなく、「測定時刻」もどうにかして一緒に記憶しておかなければならないことはお分かりでしょうか?
御察しのとおりです。どうすればいいのか考えましたが、以下のようなことは可能でしょうか?また、どのように書いていけばいいでしょうか?
計測開始したときの時間を00:00:00又はその時の時刻とし配列データを取り込み、保存していくと同時に時間を書き込めないでしょうか?
> 2 上記の各プロシージャの中に「ScaleBuf1〜4」を配列へ格納し、バイナリファイルへ保存しなさいという命令をすればよいのでしょうか?
それとも、別のプロシージャで配列へ格納し、バイナリファイル保存しなさいという命令をすればよいのでしょうか?
どちらでもお好きなように。
それよりも問題は、この二つに絞った理由です。
(しかも私はこの二つの疑問の意味がよくわかっていません)
プロジェクトのどこに,計測器からのデータを、配列に取り込み、保存するプログラムを書くのが、理想的なのかがわからなかったのと、どう書けばよいかがわかりません。
二つに絞った理由というのもとくにはありません。思い浮かんだのがここかなと、思いましたので。
> 必要のない説明もあります。また、困っていること全てを書きます。
全体像を明かせないのは仕方の無いことかもしれませんが、
そういう場合はそもそも全体像を部分省略して載せないことです。
日記帳ではないのですから、問題点を絞ってみてください。
とりあえず、全体像を載せてみます。以下メインのフォームです。
Option Explicit
Dim KeikaHour As Long 'カウントダウン用
Dim KeikaMin As Long
Dim KeikaSec As Long
Dim KeikaHourB As Long 'カウントダウン用
Dim KeikaMinB As Long
Dim KeikaSecB As Long
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
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 1) As Double ' WE75211.WeGetScaleData用バッファ(1chモータ回転数・2chポンプ流量)
Dim ScaleBuf2(0 To 1, 0 To 1) As Double ' WE72351.WeGetScaleData用バッファ(1ch振動・2ch騒音)
Dim ScaleBuf3(0 To 1, 0 To 0) As Double ' WE72451.WeGetScaleData用バッファ(トルク)
Dim ScaleBuf4(0 To 1, 0 To 0) As Double ' WE72411.WeGetScaleData用バッファ(油温)
Dim WaveGrBuff(0 To 1, 0 To 6) As Double 'グラフ描画用バッファ1 070214
Dim WaveGrBuff2(0 To 1, 0 To 6) As Double 'グラフ描画用バッファ2 070214
Dim WaveGrBuff3(0 To 1, 0 To 6) As Double 'グラフ描画用バッファ3 070214
'運転準備確認SW
Private Sub Command3_Click()
If DioIn(1) = 1 Then
WEButton1_On (0)
End If
End Sub
Private Sub Form_Load()
Dim fname0 As String
Dim hFso As FileSystemObject 'ファイル作成時必要
Set hFso = New FileSystemObject '〃
'変数の初期化
lngFileNO = 1
lnglineCnt = 1
'測定時間、回転数のファイル読込 070205
fname0 = SetPath & "Setting.prm"
On Error GoTo Openerror 'ファイルオープンに失敗した場合、初期設定画面を開く
Open fname0$ For Input As #1
Input #1, SeqRev
Close #1
Openerror:
frmSetting.Show
'現在値初期化
Mnt.Rpm = 0: Mnt.Vibr = 0: Mnt.Noise = 0: Mnt.Trq = 0: Mnt.Temp = 0: Mnt.Flow = 0
RpmTotal = 0: RpmSamp = 0: RpmSmpCnt = 0
MntTotal = 0
MntSmpCnt = 0
Mnt.Noise2 = 0
frmSetting.NowTemp.Text = Mnt.Temp
frmSetting.call1_Click
frmSetting.SET_Click (0)
Call Command3_Click '運転準備 電源ON
Timer4.Enabled = True
End Sub
Private Sub cmdInputSingle_Click()
End Sub
Private Sub Check1_Click(Index As Integer)
If (Index < 14 Or Index > 20) Then
Exit Sub
End If
Dim LineIndex As Integer
LineIndex = Index - 14
If (WEGraph1.LineDispFlag(LineIndex)) Then
WEGraph1.LineDispFlag(LineIndex) = False ' 線を非表示に
Else
WEGraph1.LineDispFlag(LineIndex) = True ' 線を表示に
End If
If (WEGraph2.LineDispFlag(LineIndex)) Then
WEGraph2.LineDispFlag(LineIndex) = False ' 線を非表示に
Else
WEGraph2.LineDispFlag(LineIndex) = True ' 線を表示に
End If
If (WEGraph3.LineDispFlag(LineIndex)) Then
WEGraph3.LineDispFlag(LineIndex) = False ' 線を非表示に
Else
WEGraph3.LineDispFlag(LineIndex) = True ' 線を表示に
End If
End Sub
'異常発生時のOUT設定
'*******************
'(異常リセット)
Private Sub Command2_Click()
Dim i As Long
Beep
ER3.Caption = ""
ER4.Caption = ""
ER5.Caption = ""
ER6.Caption = ""
ER7.Caption = ""
ER8.Caption = ""
ER9.Caption = ""
ER10.Caption = ""
Call DioOut(4, 1, "m") '異常リセット
For i = 0 To LoopMax: Next i
Call DioOut(1, 1, "a") '測定準備完了ON出力
Call DioOut(3, 0, "a") '測定終了OFF出力*:::::*:***************************
MntTotal = 0
MntSmpCnt = 0
Mnt.Noise2 = 0
Mnt.Noise1 = 0
Mnt.Noise = 0
End Sub
Private Sub mnuWE7235_Click(Index As Integer)
Dim hWnd As Long
Dim asw As Integer
ret = WE72351.WeIsModuleWindow(asw) 'WE7235のパネルが開いているかを調べます。
If asw = 0 Then
ret = WE72351.WeShowModuleWindow(hWnd) 'WE7235パネルを開きます。
Else
ret = WE72351.WeCloseModuleWindow() 'WE7235パネルを閉じます。
End If
End Sub
Private Sub mnuWE7241_Click(Index As Integer)
Dim hWnd As Long
Dim asw As Integer
ret = WE72411.WeIsModuleWindow(asw) 'WE7241のパネルが開いているかを調べます。
If asw = 0 Then
ret = WE72411.WeShowModuleWindow(hWnd) 'WE7241パネルを開きます。
Else
ret = WE72411.WeCloseModuleWindow() 'WE7241パネルを閉じます。
End If
End Sub
Private Sub mnuWE7245_Click(Index As Integer)
Dim hWnd As Long
Dim asw As Integer
ret = WE72451.WeIsModuleWindow(asw) 'WE7245のパネルが開いているかを調べます。
If asw = 0 Then
ret = WE72451.WeShowModuleWindow(hWnd) 'WE7245パネルを開きます。
Else
ret = WE72451.WeCloseModuleWindow() 'WE7245パネルを閉じます。
End If
End Sub
Private Sub mnuWE7521_Click()
Dim asw As Integer
Dim hWnd As Long
ret = WE75211.WeIsModuleWindow(asw) 'WE7521のパネルが開いているかを調べます。
If asw = 0 Then
ret = WE75211.WeShowModuleWindow(hWnd) 'WE7521パネルを開きます。
Else
ret = WE75211.WeCloseModuleWindow() 'WE7521パネルを閉じます。
End If
End Sub
Private Sub mnuインバータ電源_Click()
Form2.Show
End Sub
'仮想現在値設定(納品前に消す)
Private Sub mnu仮想_Click(Index As Integer)
Form5.Show
End Sub
'データサンプリング設定画面
Private Sub mnu設定_Click(Index As Integer)
Form3.Show
End Sub
'トリガレベル設定画面
Private Sub mnu設定値_Click(Index As Integer)
frmSetting.Show
End Sub
'WE7000電源ON
Private Sub WEButton1_On(Index As Integer)
Dim ret As Long
Timer1.Enabled = True
WEComm1.WeInit 'WE7000との通信を確立します。
WEStation1.WeOpenStationEx 'WE7000のステーションとモジュールの使用を開始します。
WE72411.stMode = WE_EV_BLOCKEND
' WE72411.WeStart
WE72451.stMode = WE_EV_BLOCKEND
' WE72451.WeStart
WE72351.stMode = WE_EV_BLOCKEND
' WE72351.WeStart
WE75211.stMode = WE_EV_BLOCKEND
' WE75211.WeStart
Dim i As Integer
Dim J As Integer
For i = 0 To 3 ' ブロックデータバッファ用ステータスの初期化************
BlockEnd(i) = False '**********************************
For J = 0 To 1
WaveBuff(J, i) = 0#
WaveBuff2(J, i) = 0#
WaveBuff3(J, i) = 0#
Next J
Next i
'**************************************
recSize1 = 8 * 10000 '1ch用バッファのバイトサイズ
recSize2 = 8 * 2 * 10000 '2ch用バッファのバイトサイズ
'**************************************
Call DioOut(1, 1, "a") '測定準備完了ON出力
ER11.Caption = "電源ON"
ER12.Caption = ""
End Sub
'WE7000電源OFF
Private Sub WEButton1_Off(Index As Integer)
Dim ret As Long
Call DioOut(1, 0, "a") '測定準備完了OFF出力
ret = WEStation1.WeSaveSetup("")
WEStation1.WePower 0 'WE7000の電源をOFFにします。
WEStation1.WeCloseStation 'WE7000のステーションとモジュールの使用を終了します。
WEComm1.WeExit 'WE7000との通信を解除します。
ER11.Caption = ""
ER12.Caption = "電源OFF"
Timer1.Enabled = False
End Sub
Private Sub Timer1_Timer() '時計表示
KeikaSecB = KeikaSecB + 1
If KeikaSecB = 60 Then
KeikaMinB = KeikaMinB + 1
KeikaSecB = 0
If KeikaMinB = 60 Then
KeikaHourB = KeikaHourB + 1
KeikaMinB = 0
End If
End If
Text12.Text = Format(KeikaHourB, "00") + ":" + Format(KeikaMinB, ("00")) + ":" + Format(KeikaSecB, "00")
If DioIn(2) = 0 Then '計測開始OFF
Call WEButton2_Off
Timer4.Enabled = True
Timer7.Enabled = False
End If
End Sub
Private Sub Timer4_Timer()
Dim nRet As Long '関数の実行結果
If DioIn(2) = 1 Then 'DioInpBuf (0): 運転準備
Call WEButton2_On
Timer4.Enabled = False 'WEButton ONで、タイマー停止 ’
Timer7.Enabled = True '計測開始でカウントダウン、異常入力監視開始
ElseIf DioIn(2) = 0 Then
Call WEButton2_Off
Timer4.Enabled = True 'WEButton OFFで、タイマー再開 ’
If DioIn(1) = 0 Then '計測開始OFF
Call WEButton2_Off
Timer4.Enabled = True
End If
Else
Exit Sub
End If
End Sub
Private Sub ResetData_Click()
Call WEGraph1.ResetData 'グラフに設定しているデータを消去します。
End Sub
Private Sub WE75211_WeBlock(ByVal blockNo As Long) 'モータ回転数、流量
Dim infoNum As Integer
Dim chNum As Integer
Dim i As Integer
Dim J As Integer
Dim spanX As Double '回転数直線式用X軸スパン
Dim gainX As Double '回転数直線式用X軸ゲイン
Dim spanY As Double '回転数直線式用y軸スパン
Dim gainY As Double '回転数直線式用y軸ゲイン
infoNum = 1
chNum = 0
'データ取得
ret = WE75211.WeGetScaleData(-1, blockNo, recSize2, ScaleBuf2) 'データを取り出します。
ScaleBuf1(0 To 10000, 0 To 1)
For J = 0 To 1
For i = 0 To 1
If (WeIsNan(WE_DOUBLE, ScaleBuf2(i, J))) Then
WaveBuff(i, J + chNum) = 0
WaveBuff2(i, J + chNum) = 0
WaveBuff3(i, J + chNum) = 0
Else
WaveBuff(i, J + chNum) = ScaleBuf2(i, J)
WaveBuff2(i, J + chNum) = ScaleBuf2(i, J)
WaveBuff3(i, J + chNum) = ScaleBuf2(i, J)
End If
Next i
Next J
'モータ回転数計算式++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'モータ回転数:120rpm---2000pps----(3440rpm)
'インバータパラメータPr.55=86.4Hz(1440pps出力時の周波数[120*1440/2000=86.4])
'RpmSamp = WaveBuff(1, chNum) / 2000 * 3440
'実測値とモニタ値をあわす為計算式を求める
spanX = 93: gainX = 2451 '現在値
spanY = 90: gainY = 2488 '実測値
Text6.Text = ((gainY - spanY) / (gainX - spanX)) * ((WaveBuff(1, chNum) / 2000 * 3440) - spanX) + spanY
RpmSamp = ((gainY - spanY) / (gainX - spanX)) * ((WaveBuff(1, chNum) / 2000 * 3440) - spanX) + spanY
For i = 0 To 1 'グラフ描画データ生成 070214
WaveGrBuff(i, chNum) = RpmSamp
WaveGrBuff2(i, chNum) = RpmSamp
WaveGrBuff3(i, chNum) = RpmSamp
Next i
If RpmSamp > 0 Then
RpmTotal = RpmTotal + RpmSamp
RpmSmpCnt = RpmSmpCnt + 1
If RpmSmpCnt >= 10 Then
Mnt.Rpm = Format(RpmTotal / 10, "0")
RpmTotal = 0
RpmSmpCnt = 0
End If
Else
Mnt.Rpm = 0
End If
'流量計算式++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'流量計出力:6900pulse/L---モジュールに入力される信号はHz
'つまり1秒あたりのパルス数のため、60倍して1分当りのパルス数を出して6900で割るとL/minが算出される
' Text3.Text = WaveBuff(1, chNum + 1)
Text3.Text = Format(WaveBuff(1, chNum + 1) * 60 / 6900, "#0.000")
Mnt.Flow = Format(WaveBuff(1, chNum + 1) * 60 / 6900, "#0.000")
For i = 0 To 1 'グラフ描画データ生成 070214
WaveGrBuff(i, chNum + 1) = Mnt.Flow
WaveGrBuff2(i, chNum + 1) = Mnt.Flow
WaveGrBuff3(i, chNum + 1) = Mnt.Flow
Next i
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Text1(0).Text = Mnt.Rpm
Text1(5).Text = Mnt.Flow
' アラーム監視 7521-1(モータ回転異常発報)
If Mnt.Rpm < rpmA Or rpmB < Mnt.Rpm Then
'現在値 下限 上限 現在値
' Text5.Text = rpmA: Text7.Text = rpmB
ER3.Caption = "モータ回転数異常"
Call WEButton2_Off
Call DioOut(3, 1, "a") '測定終了出力ON*:::::*:***********************
End If
' アラーム監視 7521-2(ポンプ流量異常発報)
If Mnt.Flow < LA Or LB <= Mnt.Flow Then
'現在値 下限 上限 現在値
ER4.Caption = "ポンプ流量異常"
Call WEButton2_Off
Call DioOut(3, 1, "a") '測定終了出力ON*:::::*:*****************
'データチェック& 表示
If BlockStatusCheck(3) Then
Call WaveformDisp
End If
End Sub
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 = Format(WaveBuff(1, chNum), "#0.0")
' Text4(2).Text = Format(WaveBuff(1, chNum + 1), "#0.00")
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) = Abs(Mnt.Vibr)
WaveGrBuff2(i, chNum) = Abs(Mnt.Vibr)
WaveGrBuff3(i, chNum) = Abs(Mnt.Vibr)
Next i
Text4(2).Text = Format(WaveBuff(1, chNum + 1), "#0.00") '生データ
Mnt.Noise1 = Format((WaveBuff(1, chNum + 1) * 94 / 2.535), "#0.0") '騒音(dB)=入力*94dB/2.535V)
Mnt.Noise2 = Abs(Mnt.Noise1)
If Mnt.Noise2 < 60 = Mnt.Noise2 > 120 Then
Mnt.Noise2 = 85
Else
End If
If Mnt.Noise2 > 60 Then
MntTotal = MntTotal + Mnt.Noise2
MntSmpCnt = MntSmpCnt + 1
If MntSmpCnt >= 35 Then
Mnt.Noise = Format(MntTotal / 35, "0")
MntTotal = 0
MntSmpCnt = 0
End If
Else
End If
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 = Abs(Mnt.Vibr)
Text1(2).Text = Mnt.Noise
' アラーム監視 7235-1(振動異常発報)
If Abs(Mnt.Vibr) < HzA Or HzB < Abs(Mnt.Vibr) Then
'現在値 下限 上限 現在値
ER5.Caption = "振動測定値異常"
Call WEButton2_Off
Call DioOut(3, 1, "a") '測定終了出力ON*:::::*:*********************
End If
' アラーム監視 7235-2(騒音異常発報)
If Mnt.Noise < dbA Or DbB < Mnt.Noise Then
'現在値 下限 上限 現在値
ER6.Caption = "騒音測定値異常"
Call WEButton2_Off
Call DioOut(3, 1, "a") '測定終了出力ON*:::::*:*************************
End If
' データチェック&表示
If BlockStatusCheck(2) Then
Call WaveformDisp
End If
End Sub
Private Sub WE72451_WeBlock(ByVal blockNo As Long) 'トルク測定
'Dim strFilePath2 As String 'ファイルパス
Dim intLoop As Integer 'ループ用変数
Dim strData2Info As String 'データ格納用変数
Dim hFso As FileSystemObject 'ファイル作成時必要
Set hFso = New FileSystemObject '〃
Dim infoNum As Integer
Dim chNum As Integer
Dim i
infoNum = 1
chNum = 4
' データ取得
ret = WE72451.WeGetScaleData(-1, blockNo, recSize1, ScaleBuf1) 'データを取り出します。
For i = 0 To 1
WaveBuff(i, chNum) = ScaleBuf1(i, 0)
WaveBuff2(i, chNum) = ScaleBuf1(i, 0)
WaveBuff3(i, chNum) = ScaleBuf1(i, 0)
Next i
For i = 0 To 1
WaveBuff(i, chNum) = ScaleBuf1(i, 0)
WaveBuff2(i, chNum) = ScaleBuf1(i, 0)
WaveBuff3(i, chNum) = ScaleBuf1(i, 0)
Next i
'トルク変換器定格 1.501mV/V---500N・m
Text4(3).Text = Format(WaveBuff(1, chNum) * 500 / 1.501, "#0.0")
Mnt.Trq = Format(WaveBuff(1, chNum) * 500 / 1.501, "#0.0")
For i = 0 To 1 'グラフ描画データ生成 070214
WaveGrBuff(i, chNum) = Abs(Mnt.Trq) ' Absを使用して-数値を+へ転じさせる。
WaveGrBuff2(i, chNum) = Abs(Mnt.Trq)
WaveGrBuff3(i, chNum) = Abs(Mnt.Trq)
Next i
' Text4(3).Text = Mnt.Trq
Text1(3).Text = Abs(Mnt.Trq) ' Absを使用して-数値を+へ転じさせる。
' アラーム監視 7245 (トルク測定値異常発報)
If Abs(Mnt.Trq) < NMA Or NMB < Abs(Mnt.Trq) Then
'現在値 下限 上限 現在値
ER7.Caption = "トルク測定値異常"
Call WEButton2_Off
Call DioOut(3, 1, "a") '測定終了出力ON*:::::*:**************************************
End If
' データチェック&表示
If BlockStatusCheck(1) Then
Call WaveformDisp
End If
End Sub
Private Sub WE72411_WeBlock(ByVal blockNo As Long) '温度計測
Dim infoNum As Integer
Dim chNum As Integer
Dim Temp As Double
Dim i
Dim strMsg As Long
infoNum = 1
chNum = 5
' データ取得
ret = WE72411.WeGetScaleData(-1, blockNo, recSize1, ScaleBuf1) 'データを取り出します。
For i = 0 To 1
If (WeIsNan(WE_DOUBLE, ScaleBuf1(i, 0)) = False) Then
WaveBuff(i, chNum) = ScaleBuf1(i, 0)
WaveBuff2(i, chNum) = ScaleBuf1(i, 0)
WaveBuff3(i, chNum) = ScaleBuf1(i, 0)
Else
WaveBuff(i, chNum) = 0#
WaveBuff2(i, chNum) = 0#
WaveBuff3(i, chNum) = 0#
End If
Next i
Mnt.Temp = Format(WaveBuff(1, chNum), "#0.0")
For i = 0 To 1 'グラフ描画データ生成 070214
WaveGrBuff(i, chNum) = Mnt.Temp
WaveGrBuff2(i, chNum) = Mnt.Temp
WaveGrBuff3(i, chNum) = Mnt.Temp
Next i
Text1(4).Text = Mnt.Temp
' アラーム監視 7241 (油温異常発報)
If Mnt.Temp < CA Or CB <= Mnt.Temp Then
'現在値 下限 上限 現在値
ER8.Caption = "ポンプ油温異常"
Call WEButton2_Off
End If
If (Val(Mnt.Temp)) > Val(frmSetting.Tlv(13).Text) Then
'現在値 上限
Call DioOut(7, 1, "a") '冷却FAN回転
End If
If (Val(Mnt.Temp)) < Val(frmSetting.Tlv(14).Text) Then
'現在値 下限
Call DioOut(7, 0, "a") '冷却FAN回転停止
End If
' データチェック&表示
If BlockStatusCheck(0) Then
Call WaveformDisp
End If
End Sub
Private Function BlockStatusCheck(kind As Integer) As Boolean
BlockEnd(kind) = True
Dim i As Integer
For i = 0 To 3
If (BlockEnd(i) = False) Then
BlockStatusCheck = False ' まだ測定完了していないモジュールあり
Exit Function
End If
Next i
For i = 0 To 3
BlockEnd(i) = False
Next i
BlockStatusCheck = True ' 全モジュールのブロックデータがそろった
End Function
Private Sub WaveformDisp()
'生データによるグラフ描画
' Call WEGraph1.SetChartData(WaveBuff)
' Call WEGraph2.SetChartData(WaveBuff2)
' Call WEGraph3.SetChartData(WaveBuff3)
'変換後データによるグラフ描画 0702147
Call WEGraph1.SetChartData(WaveGrBuff)
Call WEGraph2.SetChartData(WaveGrBuff2)
Call WEGraph3.SetChartData(WaveGrBuff3)
End Sub
Private Sub WE7521Panel_Click(Index As Integer)
Dim asw As Integer
ret = WE75211.WeIsModuleWindow(asw) 'WE7521のパネルが開いているかを調べます。
Dim hWnd As Long
If asw = 0 Then
ret = WE75211.WeShowModuleWindow(hWnd) 'WE7521パネルを開きます。
Else
ret = WE75211.WeCloseModuleWindow() 'WE7521パネルを閉じます。
End If
End Sub
Private Sub WE7235Panel_Click(Index As Integer)
Dim hWnd As Long
Dim asw As Integer
ret = WE72351.WeIsModuleWindow(asw) 'WE7235のパネルが開いているかを調べます。
If asw = 0 Then
ret = WE72351.WeShowModuleWindow(hWnd) 'WE7235パネルを開きます。
Else
ret = WE72351.WeCloseModuleWindow() 'WE7235パネルを閉じます。
End If
End Sub
Private Sub WE7245Panel_Click(Index As Integer)
Dim hWnd As Long
Dim asw As Integer
ret = WE72451.WeIsModuleWindow(asw) 'WE7245のパネルが開いているかを調べます。
If asw = 0 Then
ret = WE72451.WeShowModuleWindow(hWnd) 'WE7245パネルを開きます。
Else
ret = WE72451.WeCloseModuleWindow() 'WE7245パネルを閉じます。
End If
End Sub
Private Sub WE7241Panel_Click(Index As Integer)
Dim hWnd As Long
Dim asw As Integer
ret = WE72411.WeIsModuleWindow(asw) 'WE7241のパネルが開いているかを調べます。
If asw = 0 Then
ret = WE72411.WeShowModuleWindow(hWnd) 'WE7241パネルを開きます。
Else
ret = WE72411.WeCloseModuleWindow() 'WE7241パネルを閉じます。
End If
End Sub
'計測終了
Public Sub WEButton2_Off()
ret = WE72411.WeStop() 'データ収集を終了します。
ret = WE72451.WeStop()
ret = WE72351.WeStop()
ret = WE75211.WeStop()
Timer7.Enabled = False 'WEButton offで、カウントダウン停止’
Timer5.Enabled = False
Call DioOut(2, 0, "a") '測定中OFF 出力
ER1.Caption = ""
ER2.Caption = "計測停止"
End Sub
'計測開始
Public Sub WEButton2_On()
Dim hFso As FileSystemObject 'ファイル作成時必要
Set hFso = New FileSystemObject '〃
ret = WE72411.WeStart() 'データ収集を開始します。
ret = WE72451.WeStart()
ret = WE72351.WeStart()
ret = WE75211.WeStart()
Timer7.Enabled = True 'WEButton ONで、カウントダウン開始、異常監視開始
Call DioOut(3, 0, "m") '測定終了出力OFF
Call DioOut(2, 1, "a") '測定中ON出力
ER1.Caption = "計測中"
ER2.Caption = ""
If Timer5.Enabled = False Then
Timer5.Enabled = True
'新しいファイルを作成する
strFilePath2 = SetPath + Format(Now(), "yymmddhhmmss") + ".csv"
Dim hTextStream As TextStream
Set hTextStream = hFso.CreateTextFile(strFilePath2)
'不要になった時点で参照を解放する
Set hFso = Nothing
Set hTextStream = Nothing
Else
Timer5.Enabled = False
End If
End Sub
'データ保存設定(CSVへ)
Private Sub Timer5_Timer()
Dim hFso As FileSystemObject 'ファイル作成時必要
Set hFso = New FileSystemObject '〃
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
'タイマー7 計測時間、シーケンサー、インバータ異常コード監視
'07.02.16 モータ容量不足のためインバータ異常(定格オーバーし異常発報するためKILL。5,6,9)
'07.02.26 解除
Private Sub Timer7_Timer()
KeikaSec = KeikaSec + 1
If KeikaSec = 60 Then
KeikaMin = KeikaMin + 1
KeikaSec = 0
If KeikaMin = 60 Then
KeikaHour = KeikaHour + 1
KeikaMin = 0
End If
End If
keisokujikan.Text = Format(KeikaHour, "00") + ":" + Format(KeikaMin, ("00")) + ":" + Format(KeikaSec, "00")
If SetteiTime = keisokujikan.Text Then
Call WEButton2_Off
Call DioOut(3, 1, "m") '****************************************************
MsgBox "計測終了"
Call DioOut(3, 0, "m") '****************************************************
Timer4.Enabled = True
frmSetting.NowTemp.Text = Mnt.Temp
frmSetting.call1_Click
keisokujikan.Text = ""
KeikaSec = 0
KeikaMin = 0
KeikaHour = 0
frmSetting.SET_Click (0)
End If
If DioIn(4) = 1 Then 'DioInBuf (4): 異常(PLCバッテリー寿命)
Call WEButton2_Off
Call DioOut(3, 1, "a") '測定終了出力ON*:::::*:*************************
Timer7.Enabled = False '異常中、タイマー停止
Form8.Show
ElseIf DioIn(4) = 0 Then
End If
'DioInpBuf (5): 異常 (PLCヒューズ断線)
If DioIn(5) = 1 Then 'DioInpBuf (5): 異常(シーケンサエラー)
Call WEButton2_Off
Call DioOut(3, 1, "a") '測定終了出力ON*:::::*:************************
Timer7.Enabled = False '異常中、タイマー停止
Form9.Show
ElseIf DioIn(5) = 0 Then
End If
If DioIn(6) = 1 Then 'DioInpBuf (6): 異常(シーケンサエラー)
Call WEButton2_Off
Call DioOut(3, 1, "a") '測定終了出力ON*:::::*:***********************
Timer7.Enabled = False '異常中、タイマー停止
Form10.Show
ElseIf DioIn(6) = 0 Then
End If
If DioIn(7) = 1 Then 'DioInpBuf (7): 異常(潤滑ポンプモータ過負荷)
Call WEButton2_Off
Call DioOut(3, 1, "a") '測定終了出力ON*:::::*:************************
Timer7.Enabled = False '異常中、タイマー停止
Form11.Show
ElseIf DioIn(7) = 0 Then
End If
If DioIn(8) = 1 Then 'DioInpBuf (8): 異常(冷却ファンモータ過負荷)
Call WEButton2_Off
Call DioOut(3, 1, "a") '測定終了出力ON*:::::*:************************
Timer7.Enabled = False '異常中、タイマー停止
Form12.Show
ElseIf DioIn(8) = 0 Then
End If
If DioIn(9) = 1 Then 'DioInpBuf (9): 異常(歯車回転インバータ異常)
Call WEButton2_Off '**************************************************
Call DioOut(3, 1, "a") '測定終了出力ON*:::::*:************************
Timer7.Enabled = False '異常中、タイマー停止
Form13.Show
ElseIf DioIn(9) = 0 Then
End If
If DioIn(10) = 1 Then 'DioInpBuf (10): 異常(非常停止ボタンON )
Call WEButton2_Off
Call DioOut(3, 1, "a") '測定終了出力ON*:::::*:**************************
Timer7.Enabled = False '異常中、タイマー停止’
Form14.Show
ElseIf DioIn(10) = 0 Then
End If
End Sub
※返信しようかかなり迷いました。
多分次の返信は可能性がかなり薄いです。
すみません
※1スレ1質問…
> プロジェクトのどこに,計測器からのデータを、配列に取り込み、保存するプログラムを書くのが、理想的なのかがわからなかったのと、どう書けばよいかがわかりません。
私もそばに居ない身なので、理想的なのはわかりません。
ただ、元のご質問は「既に配列としてのデータが存在している」状況での質問だったと記憶しています。
その辺りから、もう一度理解しなおしてみてはいかがでしょう?
追伸
> > 必要のない説明もあります。また、困っていること全てを書きます。
> > 全体像を明かせないのは仕方の無いことかもしれませんが、
> > そういう場合はそもそも全体像を部分省略して載せないことです。
> > 日記帳ではないのですから、問題点を絞ってみてください。
> とりあえず、全体像を載せてみます。以下メインのフォームです。
良く理解していらっしゃらないようですので、
「問題点を絞ってみてくだささい」ということです。
さらに言えば、完成された全体像がソースコードなら"問題"になりませんよね?
また、VB6の場合コントロールや参照設定などコード領域に無い情報も必要となるため、
ソースコードを載せるだけでは全てはありません。
(もっとも、全ての情報を見せろといっているわけでも無いので、いいのですが)
何度も言いますが、問題点を絞ってください。
失礼しました。
ガッ様申し訳ありませんでした。
問題点を絞ると言う意味がようやくわかりました。
1、測定時刻等は、省いていただいて、ScaleBuf1,2,3,4を配列に取込み、その配 列を1つのファイルに保存が出来るかどうかを教えてください。
その時のソースはどのように書けばよいでしょうか?
以上よろしくお願いいたします。
| ツイート |
|