ロードバイク走行データは、RASPIロガーでまとめて取得できるめどがたったので、データ解析方法を再検討してます。今までは、VBAで自動処理アルゴリズムを作ってきましたが、データがノイズが多かったり予想外の波形をしていた場合結局ケースバイケースでプログラムにパッチをあてないと使えない状況で、不便極まりない解析プログラムばかり作ってました。
=>これでは、来年にかけて、膨大な実走行データを解析処理するためには、役にたたないだろうということで
考え直しました。
●半手動型の解析プログラム
RASPIロガーからのデータをCSVで読み込んで、エラー処理したらCPLTに表示して、目視で確認しながら位相合わせ、ゲイン調整などをおこなって、処理しやすい波形セットを作ったら、手動で区間を決めて積分値を 計算させて、相関比較するというプログラムをつくったほうが、汎用性と異常なデータ波形に対する対応性があって、解析の生産性があがるというアイデアで作ってみることにしました。
●半手動にするための重要アイテム
⓪CPLTをCSVで関連付けアプリにする
CPLTは、インストーラーがないアプリなので、WINDOWSではアプリとして認識されてません。
そこで、強制的にCSVファイルに関連づけする方法を調べました。こちらの解説が良かったです。感謝
https://novlog.me/win/win10-default-app-non-install/
①CPLTをVBAで自動制御して、データを処理毎に目視確認できるようにする
今までEXCELのグラフで数万行のデータを表示してきましたが遅いし使いにくいし、どうにも
解析作業に使えない状態でした。そこで、高速でシンプルがCPLTを活用できないかとアイデア
をだしました。VBAのSHELLコマンド等で、アプリの起動、設定変更、ファイル読み書きなど
手動で可能な操作はできるのは知ってましたが、簡単な命令で可能になるので驚いてます。
参考にさせていただいたサイト(感謝です)
こちらは詳しいのですが、長かったので、シンプルな解説記事を探しました。
VBAで他アプリを起動する=>https://www.moug.net/tech/exvba/0100034.html
起動したアプリケーションの表示位置、サイズを指定する=>https://www.moug.net/tech/acvba/0010014.html
SendKeyの使い方=>https://e-vba.com/sendkeys/
CPLTへの自動制御 | VBA命令文 |
CPLTを起動する | rc = Shell(“D:\dowloads\cplt0104\cplt0104\CPLT.exe”, vbNormalFocus) If rc = 0 Then MsgBox “起動に失敗しました” ‘【アプリのパスを指定するだけshellコマンドが起動してくれます】 |
CPLTからCSVファイルを読み込ませる | csvfile = UserForm1.TextBox1.Text Application.SendKeys “^(o)”, True Application.SendKeys csvfile, True Application.SendKeys “{ENTER}”, True’【開くでダイアログが開いて、ファイル名をタブ位置に書き込む動作】 |
CPLTのグラフサイズを変更 | ’【サイズ変更が以外と大変なプログラムでした】
Private Function size() |
CPLTの横軸データ数を変更 | ‘【alt-s で設定を開いて同時にalt-hで横軸を開くのでshと入力します】 Application.SendKeys “%(sh)”, True ‘設定 Application.SendKeys “{TAB}”, True ‘下↓ Application.SendKeys “{TAB}”, True ‘下↓ Application.SendKeys “1000”, True ‘下↓ Application.SendKeys “{ENTER}”, True ‘下で水平設定↓ |
まだ、いろいろ可能です。 | 縦軸とかCH数を変えたりカーソル位置を示したりいろいろできそう |
●プログラムと実行
まだ、やりかけてですが、短いうちにアップしておきます。EXCEL2007です。
アプリ自動実行PGM例
VBA標準モジュール1
Private Declare Function GetForegroundWindow _ Lib “user32” () As Long Private Type POINTAPI x As Long y As Long End Type Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Type WINDOWPLACEMENT Length As Long flags As Long showCmd As Long ptMinPosition As POINTAPI ptMaxPosition As POINTAPI rcNormalPosition As RECT End Type Private Declare Function GetWindowPlacement _ Lib “user32” _ (ByVal hwnd As Long _ , lpwndpl As WINDOWPLACEMENT) As Long Private Declare Function SetWindowPlacement _ Lib “user32” _ (ByVal hwnd As Long _ , lpwndpl As WINDOWPLACEMENT) As Long Dim csvfile As StringSub CPLT() Dim myHwnd As Long Dim myWindowPlacement As WINDOWPLACEMENT Dim rc As Long ‘Dim csvfile As String ‘Program Filesのパス ‘csvfile = “C:\Users\dj1711572002\Desktop\csv_sample.csv” csvfile = UserForm1.TextBox1.Text rc = Shell(“D:\dowloads\cplt0104\cplt0104\CPLT.exe”, vbNormalFocus) If rc = 0 Then MsgBox “起動に失敗しました” If rc <> 0 Then Application.SendKeys “^(o)”, True Application.SendKeys csvfile, True Application.SendKeys “{ENTER}”, True a = size() Application.SendKeys “%(sh)”, True ‘設定 Application.SendKeys “{TAB}”, True ‘下↓ Application.SendKeys “{TAB}”, True ‘下↓ Application.SendKeys “1000”, True ‘下↓ Application.SendKeys “{ENTER}”, True ‘下で水平設定↓MsgBox “起動に失敗しました” End If End Sub Private Function size() Private Function Horizontal() End Function End Function |
USERFORM1
Dim wb1 As Workbook Dim wb2 As Workbook Dim wb3 As Workbook Dim dotsu As Integer Dim timespan As Double Dim startTime0 As Variant Dim wbName As String Dim MaxRow, MaxCol As Long Dim MaxRow0, MaxRow1, MaxRow2, MaxRow3 As Integer Dim sIndex, lIndex, rIndex As Variant Dim MaxCol0, MaxCol1, MaxCol2, MaxCol3 As Long Dim i, j, k, l, m, n As Long Dim Ma As Long Dim InnRise, InnFall As LongDim QMCNo As Long Dim Prange As Range Dim srange, lrange, rrange As Range Dim chcol As Long ‘ピークサーチで使うデータ列 Dim FNM(10) As String Dim ok1, ok2, ok3 As Long Dim startk, endk As Long Dim Peak_Min As Long Dim wb As Workbook Dim mabikiN, mabikid As Integer Dim seatrange As Range Dim leftrange As Range Dim rightrange As Range Dim ChartObj As Object Dim Srs As Series ‘===========================Zero Cross ==================================== Dim SeatB(60000) As Integer Dim SeatT(60000) As IntegerPrivate Sub CommandButton1_Click() CPLT End SubPrivate Sub CommandButton2_Click() ‘wbName = ActiveWorkbook.Name OpenFileName = Application.GetOpenFilename(“*,*.csv?”) Workbooks.Open OpenFileName TextBox1.Value = OpenFileName Set wb = ActiveWorkbook Debug.Print (wb.Name) ‘==========================Seat data Reading============================= TextBox1.Text = OpenFileName csvfile = TextBox1.TextEnd SubPrivate Sub TextBox1_Change()End SubPrivate Sub UserForm_Click() End Sub |
●以後
これで今日明日までに作って、さっそくデータ解析作業をしてみます。何とか10月末までに一段落させたいです