Modul Trend-Viewer

  • Hallo. Ich habe mich gestern mit SQLite beschäftigt. Jetzt schreibe ich Daten, die ich aus einer SPS auslese in eine Datenbank. Nun will ich die Werte wieder ordentlich in einem Trend-Modul anzeigen lassen. Das funktioniert auch so einigermaßen, aber ich will noch ein paar Extras einbauen. Zum Beispiel will ich den Zeitbereich dynamisch ändern können und mit einem Klick auf den Trend soll der aktuelle Wert für diesen Zeitbereich angezeigt werden.
    Vllt kann mir jemand helfen, da ich derzeit wenig Zeit habe, um mich darum zu kümmern. Raupi hatte mir schon mal mit einem ähnlichen Projekt geholfen, bei dem ich eine vertikale Scrollbar im Trendfenster eingebaut hatte.

    Das ganze ist nicht dringend, ich will es nur irgendwann perfektionieren. Also vielen Dank für jede Anregung und jedes Stück Code

    Anbei ist auch eine Test-Datenbank mit einer Stunde Analogwerten.

    Spoiler anzeigen
    [autoit]

    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    #Include <Date.au3>
    #Include <Array.au3>
    #Include <Misc.au3>
    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Startup ()
    If @error > 0 Then
    MsgBox(16, "SQLite Error", "SQLite.dll Can't be Loaded!")
    Exit - 1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Global $Titel = 'Trend-Viewer'
    Global $aResult, $iAnzahl, $hGraphic, $iSchritt, $iMax
    Global $hGui = GUICreate($Titel, 300, 300, -1, 20)
    GUISetOnEvent(-3, '_Ende')

    [/autoit] [autoit][/autoit] [autoit]

    $hMenu = GUICtrlCreateMenu('&Datenbank')
    GUICtrlCreateMenuItem('Ö&ffnen', $hMenu)
    GUICtrlSetOnEvent(-1, '_OpenDB')
    GUICtrlCreateMenuItem('B&eenden', $hMenu)
    GUICtrlSetOnEvent(-1, '_Ende')
    $hInfo = GUICtrlCreateMenu('&Info')
    GUICtrlCreateMenuItem('Ü&ber', $hInfo)
    GUICtrlSetOnEvent(-1, '_Ende')

    [/autoit] [autoit][/autoit] [autoit]

    Global $hLabelInfo = GUICtrlCreateLabel("", 10, 60, 280, 20, 0x201)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hLabelTrend = GUICtrlCreateLabel("Trend wählen", 10, 110, 90, 20, 0x200)
    Global $hComboTrend = GUICtrlCreateCombo("", 110, 110, 180, 50, 0x0003)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hLabelZeit = GUICtrlCreateLabel("Zeitbereich wählen", 10, 140, 90, 20, 0x200)
    Global $hComboZeit = GUICtrlCreateCombo("", 110, 140, 180, 50, 0x0003)
    GUICtrlSetData(-1, "5 min|15 min|30 min|60 min", "5 min")

    [/autoit] [autoit][/autoit] [autoit]

    Global $hBtn = GUICtrlCreateButton('Trend anzeigen', 50, 200, 200, 40)
    GUICtrlSetOnEvent(-1, '_OpenTrend')
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _OpenDB()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(10000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _OpenDB()
    Local $sFileDB = FileOpenDialog('Trend-Datenbank auswählen', '', 'Datenbank (*.db)', 3, "", $hGui)
    If @error Then Return
    Local $dbName = StringTrimLeft($sFileDB, StringInStr($sFileDB, '\', 0, -1))
    _SQLite_Close ()
    _SQLite_Open ($sFileDB) ; Öffne die gewählte Datenbank
    If @error > 0 Then
    MsgBox(16, "SQLite Error", "Can't Load Database!")
    Return
    EndIf
    WinSetTitle($Titel, "", $Titel & ' - '&$dbName)
    _UpDateTrendCombo()
    GUICtrlSetState(-1, $GUI_ENABLE)
    _SetDBInfos()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _UpDateTrendCombo()
    Local $hQuery, $aTrendNames, $sMsg = '|'
    _SQlite_Query (-1, "SELECT * FROM TrendDaten;", $hQuery)
    _SQLite_FetchNames ($hQuery, $aTrendNames)
    _SQLite_QueryFinalize($hQuery)
    For $i = 0 To UBound($aTrendNames) -1
    $sMsg &= $aTrendNames[$i] & '|'
    Next
    GUICtrlSetData($hComboTrend, $sMsg, $aTrendNames[0])
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SetDBInfos()
    Local $aResult, $iRows, $iColumns, $hQuery, $aDatum, $aZeit, $aRows
    _SQlite_Query (-1, "SELECT COUNT(*) FROM TrendDaten;", $hQuery)
    _SQLite_FetchData($hQuery, $aRows)
    _SQLite_QueryFinalize($hQuery)
    $iAnzahl = $aRows[0]
    GUICtrlSetData($hLabelInfo, $aRows[0] & ' Einträge / ' & StringFormat('%.1f', $aRows[0]/30) & ' Minuten in der Datenbank')
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _OpenTrend()
    If WinGetTitle($Titel) = $Titel Then
    MsgBox(48, 'Fehler', 'Bitte wählen Sie zuerst eine Datenbank aus')
    Return
    EndIf
    Local $iRows, $iColumns, $iMaxFaktor, $iStart = 0, $iBereich
    GUICtrlSetState($hBtn, $GUI_DISABLE)
    $iBereich = StringTrimRight(GUICtrlRead($hComboZeit),4) * 30
    _SQLite_GetTable(-1, "SELECT "&GUICtrlRead($hComboTrend)&" FROM TrendDaten WHERE ROWID > "&$iStart&" AND ROWID < "&$iBereich + 1 + $iStart&";", $aResult, $iRows, $iColumns)
    $iMax = _ArrayMax($aResult, 1, 2)
    $iMaxFaktor = 500/$iMax * 0.99
    GUICreate('Trend '& GUICtrlRead($hComboTrend), 956, 540)
    GUISetOnEvent(-3, '_CloseTrend')
    GUICtrlCreateLabel(GUICtrlRead($hComboTrend), 52, 2, 200, 34, 0x200)
    $hGraphic = GUICtrlCreateGraphic(52, 38, 902, 500)
    GUICtrlSetOnEvent(-1, '_ShowValue')
    GUICtrlSetBkColor(-1, 0xffffff)
    ;~ GUICtrlSetColor(-1, 0)
    GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xFF0000)
    $iSchritt = 900/$iBereich
    GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 1, 497 - $aResult[2]*$iMaxFaktor)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 3 To $aResult[0]
    GUICtrlSetGraphic(-1, $GUI_GR_LINE, ($i-1)*$iSchritt, 497 - $aResult[$i]*$iMaxFaktor)
    Next

    GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0x0000FF)
    For $i = 100 To 400 Step 100
    GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 0, $i)
    GUICtrlSetGraphic(-1, $GUI_GR_LINE, 902, $i)
    Next
    For $i = 100 To 400 Step 100
    GUICtrlCreateLabel(StringFormat('%.1f', $iMax/500 * $i), 2, 530 - $i, 50, 16, 0x201)
    Next

    GUISetState()
    GUISetState(@SW_HIDE, $hGui)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ShowValue()
    Local $Opt_Save = Opt('MouseCoordMode', 2)
    While _IsPressed(01)
    ToolTip($aResult[MouseGetPos(0)/$iSchritt])
    Sleep(10)
    WEnd
    ToolTip('')
    Opt('MouseCoordMode', $Opt_Save)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _CloseTrend()
    GUIDelete(@GUI_WinHandle)
    GUICtrlSetState($hBtn, $GUI_ENABLE)
    GUISetState(@SW_SHOW, $hGui)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Ende()
    _SQLite_Close ()
    _SQLite_Shutdown ()
    Exit
    EndFunc

    [/autoit]