グラフのリアルタイム表示は?・2


くりゅう  2004-11-06 08:16:28  No: 86522

>ねろさん
ロールのサンプル参考になりました。
まだまだ初心者ですが、なんとか大体わかりました。
しかし、この部分↓
> '描画が端に来たらPictureを切り替える
    If OLD_X > Picture1(0).Width Then
        If Picture1(0).Left < Picture1(1).Left Then
           Picture1(0).Left = Picture1(1).Left + Picture1(1).Width
           Picture1(0).Cls
            SCALE_DRAW (0)
        Else
           Picture1(1).Left = Picture1(0).Left + Picture1(0).Width
           Picture1(1).Cls
            SCALE_DRAW (1)
        End If
        OLD_X = 0
    End If

がいまいちわかりません。
まず、OLD_X  > Picture1(0).Widthとありますが、
OLD_Xは常に0ではないのでしょうか?
Picture1(0).Widthは9600ですよね?

>Picture1(0).Left < Picture1(1).Left 
は0<9600で常に成立すると思うのですが、思い違いでしょうか?

値がどう変化するか掴めません。
そして、最後になぜ、clsで画像を消しているのか。。

ご指導お願いします。


ねろ  2004-11-07 05:45:19  No: 86523

>OLD_Xは常に0ではないのでしょうか?
OLD_Xは一つ前に書かれた値です。
1、まずPicture1(0)を置きその右側にPicture1(1)を置きます。
    Picture1(0)の幅はFormの幅になっていますのでPicture1(1)は見えません。
    この時 OLD_X、OLD_Yは0です。
2、1回目のループでは
    Picture1(1).Line (0, 0)-(80, Y)
    が引かれます。TTT=80 です、そしてPicture1(0)とPicture1(1)が
    80ポイント分左にシフトします。次に、
    OLD_X = OLD_X + TTT  で  OLD_Xは80になります
    OLD_Y = Y  は   Y = Int(Rnd * 3500)で計算された値が入ります。
    Picture1(1)は右端80ポイント分顔を出します。
3、2回目のループでは    
    Picture1(1).Line (80, OLD_Y)-(160, Y)
    の線が引かれます。
    OLD_XはTTT=80ずつ増えていきます。
    そしてPicture1(0)とPicture1(1)を更に80ポイント分左にシフトします
    Picture1(1)は右端から更160ポイント分に顔を出します。
2と3を繰り返していくと OLD_XがPicture1(0).Widthとより大きくなった時
Picture1(0)が左端から見えなくなります。この時Picture1(0)をPicture1(1)
の右側に移して、OLD_Xを0にリセットしPicture1(0)をクリアーして今度は
Picture1(0)に線を書き込み始めます。線は常に右側にあるPicture1に書き込みます。
SCALE_DRAW(0)はPicture1(0)に SCALE_DRAW(1)はPicture1(1)に書き込む関数です。
Picture1(0)とPicture1(1)のバックカラーを違えて見ると解かります。


年寄りの冷や水  2004-11-07 09:35:38  No: 86524

くりゅうさんへ。
ねろさんのおっしゃっることそのまま、まねてみました。
(波形は見やすいようにサインカーブに変更しています)
参考にしてください。

ねろさん、ありがとうございます。参考になりました。
Picture1(0)とPicture1(2)の切替時に波形が途切れるの
とスケーるグッリドがおかしくなる件は、がんばって何
とか解決してみようとがんばってみます。
--------------------------------------------------------------------
Option Explicit
Const TTT = 5

Private Sub Command1_Click()
Me.Timer1.Enabled = False
End Sub

Private Sub Command2_Click()
Me.Timer1.Enabled = True
End Sub

Private Sub Form_Load()
    Dim n As Integer
    Me.Width = 10000      'フォーム・ピクチャボックスの大きさ設定
    Me.Height = 6720
    For n = 0 To 1
       Picture1(n).Width = Me.Width
       Picture1(n).Height = 5550
       Picture1(n).Left = 0
       Picture1(n).Top = 240
       Picture1(0).BackColor = RGB(0, 0, 0)    '背景色を黒に設定
       Picture1(1).BackColor = RGB(150, 150, 250)    '背景色を?に設定

       SCALE_DRAW n
    Next
    Picture1(1).Left = Picture1(0).Left + Picture1(0).Width
    Timer1.Interval = 10
    Timer1.Enabled = True
End Sub

Sub SCALE_DRAW(n)
    Dim OLD_X As Integer, OLD_Y As Integer
    Picture1(n).AutoRedraw = True
    Picture1(n).DrawWidth = 1
    Picture1(n).DrawStyle = 0
    Picture1(n).ForeColor = RGB(50, 110, 50)
    For OLD_X = 0 To 10000 Step 300
        Picture1(n).Line (OLD_X, 0)-(OLD_X, 5550)
    Next OLD_X
    For OLD_Y = 0 To 5550 Step 300
        If OLD_Y = 2700 Then                        '水平位置基準線
           Picture1(n).DrawWidth = 1.3                 '若干太め
           Picture1(n).DrawStyle = 2                   '鎖線
           Picture1(n).ForeColor = RGB(0, 220, 0)      '明るい色
        Else                                        '標準目盛線
           Picture1(n).DrawWidth = 1                   '標準の太さ
           Picture1(n).DrawStyle = 0                   '目盛標準線
           Picture1(n).ForeColor = RGB(50, 110, 50)    '目盛標準色
        End If
        Picture1(n).Line (0, OLD_Y)-(10000, OLD_Y)
    Next OLD_Y
    Picture1(n).ForeColor = RGB(255, 255, 255)
    OLD_Y = 0
    OLD_X = 0
End Sub

Private Sub Timer1_Timer()
    Draw
End Sub

Private Sub Draw()
    Dim Y As Integer
    Static OLD_X As Integer
    Static OLD_Y As Integer
    Static YYY   As Integer
    Static ADJ   As Integer
    ADJ = 0
    
    'Y = Int(Rnd * 3500) + 1000
    
    Y = 1500 * Sin(YYY * 3.14 / 180) + 2700
    
    '描画が端に来たらPictureを切り替える
    If OLD_X > Picture1(0).Width Then
        If Picture1(0).Left < Picture1(1).Left Then
           Picture1(0).Left = Picture1(1).Left + Picture1(1).Width + ADJ
           Picture1(0).Cls
            SCALE_DRAW (0)
            
            
        Else
           Picture1(1).Left = Picture1(0).Left + Picture1(0).Width + ADJ
           Picture1(1).Cls
            SCALE_DRAW (1)
            
            
        End If
        OLD_X = 0
    End If
    
    '常に右側のPictureに描画
    If Picture1(0).Left < Picture1(1).Left Then
       Picture1(1).Line (OLD_X, OLD_Y)-(OLD_X + TTT, Y)
       Picture1(0).Left = Picture1(0).Left - TTT
       Picture1(1).Left = Picture1(0).Left + Picture1(0).Width + ADJ
    Else
       Picture1(0).Line (OLD_X, OLD_Y)-(OLD_X + TTT, Y)
       Picture1(1).Left = Picture1(1).Left - TTT
       Picture1(0).Left = Picture1(1).Left + Picture1(1).Width + ADJ
    End If
    OLD_X = OLD_X + TTT
    OLD_Y = Y
     YYY = YYY + 1
    If YYY > 360 Then YYY = 0
End Sub


くりゅう  2004-11-08 01:34:15  No: 86525

>ねろさん
大変わかりやすい解説、ありがとうございます。
ピクチャがどのように動くのか、切り替わるのか、
OLD_Xが何なのかなど全部わかることができました。

>年寄りの冷や水さん
コードありがとうございます。確かに背面色を変えるとわかりやすいですね。消す理由とかも、CLSのコードを消してみて試してみるとわかりますね。
少しずつですが、自分でコードの疑問を解決していく方法がわかりだしました。

もともと受信部と送信部にホストをおき、受信部で生体信号をどうリアルタイム表示するという書き込みから、ロールという技を知ってあとはそれを応用して、考えてみました。

サンプリング周波数は100ヘルツです。
これはアナログ信号の方で、もし1秒間に波が一つだったら、
その波を100個のデジタルデータで表すということで、いいのでしょうか?

受信したデータを取り込むには、コードのY座標を変える必要がありますが、
100万個(できれば、生体信号を流しいる間ずっと、可能?)
のデータを取り込むとして、仮に受信データをstrdataとすれば、
やはりLINEメソッドを使うべきでしょうか?strdata(i)〜(i+1)という風にしてi番目とi+1番目を線でつながないと点のグラフになってしまいますよね?

Y座標のデジタルデータの電圧の基準値をフォームの大きさと適確にあわせれば、波形は表示可能ですよね?

TTTの値はピクチャの動かす精度を表していると思うので、80のままでもいいと思いますが、どう思われますか?

ご指導お願いします。


年寄りの冷や水  2004-11-08 02:45:25  No: 86526

TTTは、グラフの左右の拡大縮小と考えていいと思います。
サンプリング間隔とデータ受信間隔とはちがいますよね。
生体データを100Hzでサンプリングしても、送信間隔(VB
から見れば受信間隔)が100Hzとは限りませんよね。
その辺は送受信環境を明記してもらわないと、適切なレス
が期待できないと思います。


ねろ  2004-11-08 18:07:26  No: 86527

>サンプリング周波数は100ヘルツです。
>これはアナログ信号の方で、もし1秒間に波が一つだったら、
>その波を100個のデジタルデータで表すということで、いいのでしょうか?
一秒間に波が一つと言う言い方は結構微妙ですね。
心電図のような波形は繰り返しは一秒に一回でも、その波形の中に無数の正弦波が
含まれています(フーリエ級数)。それらを全てサンプリングしないと、元の波形に
はなりません。サンプリング周波数が100Hzと言うことは理論上は50Hzの
正弦波まで情報が損なわれること無く再現が可能となります。
心電図のサンプリングを100Hzにしたと言うことはこれで十分と考えたからでしょう。
(再現周波数はフィルターが入りますので実際は40Hz位です)

>やはりLINEメソッドを使うべきでしょうか
好き好きですね。ただしドットだけで表示した場合、隣り合ったドットが左にあるのか
右に有るのか、瞬間的には見にくくなります。

>TTTの値はピクチャの動かす精度を表していると思うので、80のままでもいいと思いますが、どう思われますか?
この辺は実際には難しいのです、サンプリング周波数が100Hzと言うことはVBの処理として
10mSecに一回の描画を行わなければなりません。これはちょっとVBでは無理です、そこで
リサンプリングということを行います、たとえばデーターを10個ずつに分けて、その中の
最大値と最小値を抽出し、サンプリングデーター毎に書き込む代わりに、最大値と最小値を
10回に一回書き込みますこうすると処理が軽くなり、見た目もそれほど違和感がなくなり、
VBの描画処理も100mSecに1回で済みます、これなら可能でしょう。
さてTTTですが横送りの量で単位はtwipです、これを決めるには先ず画面に何秒のデーターを
表示するか、どのくらいの幅に表示するかを決める必要があります。
画面20cmの幅に10パルス(10秒間)表示する場合は、1cm=567tipsですから、
1パルスの幅は567(tips)x20(cm)/10(パルス数)=1134(tips)となり、これをリサンプルした10Hzで書き
込みますからTTT=113となります。20パルス表示したい場合はTTTはこの半分になります。

>送信間隔(VBから見れば受信間隔)が100Hzとは限りませんよね。
データーがサンプリング毎に送られてくるか、まとめて送られてくるかにも
よりますが、データーは人は生きている限り永遠に送られるわけですから、
長い目で見ると、同期していると言っていいでしょう。とりあえず
データーが送られてきたら表示するという方法で描画したらいかがでしょうか。
この辺を厳密にやりたいと場合は「タイムベースコレクタ」と言う方法を
使います。入ってくるデーターを一旦データーバッファに溜め込んで、正確な
クロックで吐き出します。ただしこの方法は、送信側と受信側のクロックが
正確に合っていないと、長い間に誤差が生じデーターバッファがオーバーフロー
するなどの問題が起きますのでその辺の対策は必要でしょう。


ぴろあき  2004-11-08 19:43:30  No: 86528

>くりゅうさん
>OLD_Xは常に0ではないのでしょうか?
Debug.Print OLD_X
今後の為に上のような方法を知っておいた方がよろしいかと。

>もし1秒間に波が一つだったら、
>その波を100個のデジタルデータで表すということで、いいのでしょうか?
サンプリング周波数というのは、
無限に連続したデータ(アナログデータ)から、
有限個の標本点を取り出す(デジタル化)際の周波数の事。
ひらたくいえば、1秒間の波を100個のデジタルデータで表すという事。
100Hzという事は0.01秒周期なので、標本点と標本点の間隔は0.01秒になる。
植木算的な考え方も理解しておく事。

>やはりLINEメソッドを使うべきでしょうか
点ではみずらいので、普通は線を使用すると思います。
Lineメソッドの場合、
AutoRedrawやらRefreshやらの設定に注意

>strdata(i)〜(i+1)
データが無限の場合、配列にデータを格納していると、
配列の上限(Long型の範囲)でエラーが発生すると予想されます。
作図側のルーチンは、YとOLD_Yでいいかと。。。
#ファイル書き込み側のルーチンは適当な大きさの配列を用意するといいと思いますが

>Y座標のデジタルデータの電圧の基準値をフォームの大きさと適確にあわせれば、
>波形は表示可能ですよね?
もちろんです。
が、DC分のズレを補正してやる必要があるでしょうね。

>ねろさん
>「タイムベースコレクタ」と言う方法を
この方法はよく知りませんが、
くりゅうさんが必要としている『リアルタイム』は、
データの再生を記録時と同じスピードにする事では無く、
できるだけ記録と同時に再生する事だと思いますので、
この方法は必要ではないと思います。
>データーが送られてきたら表示するという方法で描画したらいかがでしょうか。
こちらの方法に同意です。

>サンプリング周波数が100Hzと言うことはVBの処理として
>10mSecに一回の描画を行わなければなりません。
>これはちょっとVBでは無理です
ただ描画するだけならば、問題ありませんよね?
上で述べたように、『正確』に10mSecに一回描画する必要はありませんから。

#下のコメント文を色々いじってください。
Private Sub Command1_Click()
    Randomize
'    Me.AutoRedraw = True
'    Me.AutoRedraw = False
    Start_Time = Timer
    For i = 1 To 1000
        OLD_X = X
        OLD_Y = Y
        X = Rnd * 1000
        Y = Rnd * 1000
        Line (OLD_X, OLD_Y)-(X, Y)
        'If i Mod 100 = 0 Then DoEvents
        'DoEvents
    Next i
    End_Time = Timer
    MsgBox End_Time - Start_Time & "秒"
End Sub


ねろ  2004-11-08 23:17:22  No: 86529

>ただ描画するだけならば、問題ありませんよね?
問題は有りません。
どのようにデーターが送られてくるのか、定かでは有りませんが、処理時間は実際は、
外部から入って来るデーターを取り出す時間も考慮に入れる必要があるかと。
それと入って来たデーターはファイルに保存しますよね、このファイルをもう一度
波形にして見たいといった場合、同じプログラムで再現するとしたら、10mSecの
タイマーを作らなければならないのでですが、VBではこれは無理で、他の方法を
とらなければなりません、その時実際にリアルタイムで見た波形と、ファイルから
再現された波形との印象が違ってしまいという可能性があります。
またサンプリング周波数が高くなっても対応が可能な様にリサンプリングのフィーチャーを
入れておいた方がより柔軟性の高いプログラムとなります。
Wavファイルの波形表示もこのソフトで可能となります。
間違っても、表示側の処理時間が長すぎて、送り側又は受け取り側のバッファを
溢れさせてはいけません。その為にもかなり余裕を持たせる必要があるかなと。
PCのソフトが原因で「不整脈」が出たら大変ですから。

>「タイムベースコレクタ」
なぜこんなことを書いたかというと、質問の内容からはデーターが外部からどのような
形式やタイミングで送られてくるか定かでは有りません。
受ける側にバッファを持ちタイマーでデーターをたたき出す方式をとると、送り側からのデーターの
フォーマットには基本的には依存しません。普通私がこのソフトの注文を受けたら間違いなく
この方式をとりますが、問題は送り側の時間のクロックと、受け側のタイマーの精度が違っていると
長時間データーのやり取りをしているうちにバッファがオーバーフローしてしまうような、
致命的な問題が発生することがあると言うことを言いたかったのです。


ぴろあき  2004-11-09 01:25:34  No: 86530

>ねろさん
くりゅうさんに誤解を与えそうだったので、
勝手ながら、補足させていただきました。
私の考えとは異なる部分もありますが、
仕様がハッキリしてませんし、
どちらをよしとするかはくりゅうさん次第ですね。

ところで、よくドラマなどで見かける心電図風に波形描画サンプルを作成してみました。
ポイントは残像です。
#フォームにピクチャーボックス、コマンドボタン、タイマーを設置。
#ピクチャーボックス内にLineコントロールを設置。
#LineコントロールのIndexプロパティを0に設定。
Dim X                As Long
Dim OLD_Y            As Long
Const TTT            As Long = 75
Const XXX            As Long = 750   
Const Haba           As Long = 7500

Private Sub Command1_Click()
    Timer1 = Not Timer1
End Sub

Private Sub Form_Load()
    
    Me.Width = Haba + 365         
    Me.Height = 6720
    
    With Me.Picture1
        .Width = Haba
        .Height = 5250
        .Left = 120
        .Top = 240
        .BackColor = &H4000&
        .ForeColor = &HFF00&
        .AutoRedraw = True
        .DrawWidth = 6
    End With
    
    Randomize
    Call SCALE_DRAW                              '目盛を描画
    Me.Timer1.Interval = 100
End Sub

Sub SCALE_DRAW()
    Dim i As Long

    Line1(0).BorderColor = RGB(50, 100, 50)
    For i = 1 To 11
        Load Line1(i)
        Line1(i).Visible = True
    Next i
    
    For i = 0 To 8
        Line1(i).X1 = XXX + i * XXX
        Line1(i).X2 = XXX + i * XXX
        Line1(i).Y1 = 0
        Line1(i).Y2 = 5250
    Next i
    For i = 9 To 11
        Line1(i).X1 = 0
        Line1(i).X2 = Haba
        Line1(i).Y1 = (5250 \ 4) * (i - 8)
        Line1(i).Y2 = (5250 \ 4) * (i - 8)
    Next i
    
End Sub

Private Sub Timer1_Timer()

Dim Y           As Long
Dim i           As Long
    With Picture1
        '残像
        .DrawMode = 9
        .ForeColor = &H404040
        If X = TTT * 10 Then
            Picture1.Line (Haba - XXX * 2, 0)-(Haba - XXX, 5500), , BF
            .DrawMode = 3
            .ForeColor = &H808080
            Picture1.Line (X, 0)-(X - XXX, 5500), , BF
            .ForeColor = &HB0B0B0
            Picture1.Line (Haba - XXX, 0)-(Haba, 5500), , BF
        ElseIf X = TTT * 20 Then
            Picture1.Line (Haba - XXX, 0)-(Haba, 5500), , BF
            .DrawMode = 3
            .ForeColor = &H808080
            Picture1.Line (X, 0)-(X - XXX, 5500), , BF
            .ForeColor = &HB0B0B0
            Picture1.Line (X - XXX, 0)-(X - XXX * 2, 5500), , BF
        Else
            Picture1.Line (X - XXX * 2, 0)-(X - XXX * 3, 5500), , BF
            .DrawMode = 3
            .ForeColor = &H808080
            Picture1.Line (X, 0)-(X - XXX, 5500), , BF
            .ForeColor = &HB0B0B0
            Picture1.Line (X - XXX, 0)-(X - XXX * 2, 5500), , BF
            If X = Haba Then X = 0
        End If
        
        '波形
        .DrawMode = 13
        .ForeColor = &HFF00&
        For i = 1 To 10
            Y = Int(Rnd * 5000)
            Picture1.Line (X, OLD_Y)-(X + TTT, Y)
            X = X + TTT
            OLD_Y = Y
        Next i
    End With

End Sub


ねろ  2004-11-09 04:36:52  No: 86531

>ぴろあきさん
良い感じですね。(^^
画面の色といい、輝線のボケ方といい昔有ったヒューレットパッカードの
ストレージ管を使ったアナログのストレージスコープそっくりですね。
ちょっと懐かしい気分になりました。
セレクトボタンをつけて、このリピートモードと「年寄りの冷や水」さんの
ロールモードと選択できるようにしたら面白いかも。


くりゅう  2004-11-10 03:27:08  No: 86532

返信ありがとうございます。

>年寄りの冷や水さん
データの受信間隔は悩んでいるのですが、とりあえず100HZにできるならそれでいこうと思います。

>ねろさん
やはりラインメソッドを使ったほうがいいようですね。

>画面20cmの幅に10パルス(10秒間)表示する場合は、1cm=567tipsで>すから、1パルスの幅は567(tips)x20(cm)/10(パルス数)=1134(tips)とな  >り、これをリサンプルした10Hzで書き込みますからTTT=113となります。20>パルス表示したい場合はTTTはこの半分になります。

長さの設定についてイメージをつかむことができました。
環境はバッファに一度溜め込んでから、送るというやつです。
しかし、バッファの扱いが初めてなため、なかなか苦戦しております。
おっしゃるとおり、オーバーフローだけは抑えなければ、いけないのでなんとかがんばってみます。

>ぴろあきさん

>Debug.Print OLD_X
>今後の為に上のような方法を知っておいた方がよろしいかと。

どのように変化していくのかわかるようになりました。助かりました。
その他の回答も参考になりました。

サンプルコードどうもです。
いろいろいじってもう少しがんばってみることにします。

今頭を抱えている問題は、送られてきたデータをどうOLD_XとX,OLD_YとYに
はめ込むかということです。
周波数やら、時間やら、バッファやら、ポートやら、データ数やその制限、などで頭がぐちゃぐちゃになっています。
互いに関連しあう物事を解決していくのは難しいですね。


年寄りの冷や水  2004-11-10 08:59:45  No: 86533

受信したデータを代入するのはYだけですよ。
誤解の無いように・・・・念のため。


くりゅう  2004-11-12 10:07:03  No: 86534

あれから、グラフのリアルタイム表示のプログラムを組んだのですが、なかなかうまくいきません。。みなさんがのせてくれたサンプルコードをいじってやってみたのをのせます。

'フォームが立ち上がった時の処理
    Option Explicit
Const TTT = 113
Public fmane2 As Variant

Private Sub Form_Load()

    Dim n As Integer
    Me.Width = 20 * 567  'フォーム・ピクチャボックスの大きさ設定
                          '幅を20cmにし、10パルス表示
                        
    Me.Height = 6720
    For n = 0 To 1
       Picture1(n).Width = Me.Width
       Picture1(n).Height = 5550
       Picture1(n).Left = 0
       Picture1(n).Top = 240
       Picture1(n).BackColor = RGB(0, 0, 0)    '背景色を黒に設定
       SCALE_DRAW n
    Next
    Picture1(1).Left = Picture1(0).Left + Picture1(0).Width
    Timer1.Interval = 50
    Timer1.Enabled = True
    fname2 = Receiver.DirList.path & "\Plotpart" & Format(Now, "yyyy-mm-dd_hh_mm_ss") & ".csv"
    Open fname2 For Output As #10
    Print #10, "Plot Data", Format(Now, "mm.dd-hh.mm.ss")
End Sub

End Sub

Sub SCALE_DRAW(n)
    Dim OLD_X As Integer, OLD_Y As Integer
    Picture1(n).AutoRedraw = True
    Picture1(n).DrawWidth = 1
    Picture1(n).DrawStyle = 0
    Picture1(n).ForeColor = RGB(50, 110, 50)
    For OLD_X = 0 To 10000 Step 300
        Picture1(n).Line (OLD_X, 0)-(OLD_X, 5550)
    Next OLD_X
    For OLD_Y = 0 To 5550 Step 300
        If OLD_Y = 2700 Then                        '水平位置基準線
           Picture1(n).DrawWidth = 1.3                 '若干太め
           Picture1(n).DrawStyle = 2                   '鎖線
           Picture1(n).ForeColor = RGB(0, 220, 0)      '明るい色
        Else                                        '標準目盛線
           Picture1(n).DrawWidth = 1                   '標準の太さ
           Picture1(n).DrawStyle = 0                   '目盛標準線
           Picture1(n).ForeColor = RGB(50, 110, 50)    '目盛標準色
        End If
        Picture1(n).Line (0, OLD_Y)-(10000, OLD_Y)
    Next OLD_Y
    Picture1(n).ForeColor = RGB(255, 255, 255)
    OLD_Y = 0
    OLD_X = 0
End Sub

Private Sub Timer1_Timer()
    Draw
End Sub

Private Sub Draw()
    Dim X As Integer
    Dim Y As Integer
    Static OLD_X As Integer
    Static OLD_Y As Integer
    
    
    '描画が端に来たらPictureを切り替える
    If OLD_X > Picture1(0).Width Then
        If Picture1(0).Left < Picture1(1).Left Then
           Picture1(0).Left = Picture1(1).Left + Picture1(1).Width
           Picture1(0).Cls
            SCALE_DRAW (0)
        Else
           Picture1(1).Left = Picture1(0).Left + Picture1(0).Width
           Picture1(1).Cls
            SCALE_DRAW (1)
        End If
        OLD_X = 0
    End If
    
    '常に右側のPictureに描画
    If Picture1(0).Left < Picture1(1).Left Then
        OLD_X = X
        OLD_Y = Y
        X = 0.01 * 567 '標本点の間隔を0.01秒とする
              
        Y = CSng(Receiver.strData) 'Yに受信データ(strdataー文字列)を代入する
        
       Picture1(1).Line (OLD_X, OLD_Y)-(X, Y)
       Picture1(0).Left = Picture1(0).Left - TTT
       Picture1(1).Left = Picture1(0).Left + Picture1(0).Width
    Else
        OLD_X = X
        OLD_Y = Y
        X = 0.01 * 567 '標本点の間隔を0.01秒とする

        Y = CSng(Receiver.strData)
    

       Picture1(0).Line (OLD_X, OLD_Y)-(X, Y)
       Picture1(1).Left = Picture1(1).Left - TTT
       Picture1(0).Left = Picture1(1).Left + Picture1(1).Width
    End If
    OLD_X = OLD_X + TTT
    OLD_Y = Y
End Sub

'アンロード
Private Sub HideGraph_Click()
    Close #10
    Unload Me
End Sub

こんな感じでやってみたのですが、リサンプリングのコードの書き方がわからなかったので(サンプリング個数というのがよく理解できなくて、)
完成とはいえませんが。

ファイルへの書き出しもなぜかエラーになってしまいます。
どこか、まずい場所のでしょうか?

ご教授お願いします。


033  2004-11-12 13:48:02  No: 86535

>ファイルへの書き出しもなぜかエラーになってしまいます。
>どこか、まずい場所のでしょうか?

「なぜか」ですか?
エラーコードもエラーメッセージもエラーの発生した場所も表示されずにエラーになるということですか?

ぱっと見る限り提示されたコードだけではReceiver.DirList.pathの内容が不明ですね。
あと、ファイル番号を10固定でとっているようですが何か意味があるのですか?


くりゅう  2004-11-12 19:44:48  No: 86536

>033
返信ありがとうございます。

エラーはfname2のところが青で選択され、「変数が定義されていません」と表示されます。

>'フォルダの移動
>Private Sub DirList_Change()
>    pathname = DirList.path
>   FileList.path = pathname
>    fname = path & "\"
>End Sub
というのが、Receiverフォームにあります。

ファイル番号は他にも1や2は使っているのですが、1〜255までは
何でもいいと思ったので、特に気にせず使っています。
識別番号は重要な意味があるのでしょうか?


。。。  2004-11-12 20:42:45  No: 86537

単なる書き間違えですね
宣言部分と使ってるところの変数名を良く見比べて下さい。
もうすこしエラーメッセージのいうことを信用してやってください。

Public fmane2 As Variant
fname2 = Receiver.DirList.path & "\Plotpart" & Format(Now, "yyyy-mm-dd_hh_mm_ss") & ".csv"

fmane2で宣言されてますよ


くりゅう  2004-11-15 07:11:28  No: 86538

>。。。さん

単なる書き間違えでした。
ありがとうございます。

>ねろさん
X,Y座標の設定これではまずいと思うんですが、どこがまずいか
指導してやってください。


ねろ  2004-11-15 17:32:56  No: 86539

どこから行きましょうか。
1、先ずTimerを10msecに設定してると思いますが、VBでは10msecは短すぎて
無理です、早い処理で30〜50msec余裕を見て100msec位でしょう。
そうすると全部のデーターは書けないわけで、データーの間引きをするわけです。
20個分のデーターを読んでその中の最大値と最小値を書き込みのデーターとします。
もちろんどちらのデーターが先に出てきたかによって、最大値から書くか、最小値から
書くか決めます。とりあえずこれはデーターをファイルから読み込んで書く方法として
おきましょう。データーが次から次に来るのであれば、Timerを使わずに、データーが
10個溜まったら、一挙に書き込む方法を先に試された方がいいのでは。
データーがどのように送られて来るか不明なので、この辺はアドバイス出来ません。

2、Y軸に関してはVBの問題というか、数学の問題というか、Receiver.strDataの最大値が
データーが仕様によって決まっていると思いますが、そのデーターがPictureBoxの縦いっぱいに
書かれるわけですから、そのようにデーターを正規化する必要がある訳で、X軸でやった様に、
PictureBoxのデフォルトの長さの単位はtipsです、1cmは567(tips)ですからこれを頭に入れて、
X軸の計算を参考に考えて見てください。この辺の理解は避けて通れません。
>Y = CSng(Receiver.strData) 'Yに受信データ(strdataー文字列)を代入する
従ってこれではだめですね。
>X = 0.01 * 567 '標本点の間隔を0.01秒とする
これは要りません。


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

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






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