NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Real - Time chart - VB.NET

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
sNN_
Člen
Avatar
sNN_:22.2.2018 8:28

Ahoj,
řeším teď nějakou vizualizaci dat z SQL databáze.. Chtěl bych si hodnoty vizualizovat z SQL do grafu (Chart control). Nyní ale řeším, jak pravidelně aktualizovat již vytvořený graf.. Měl by mi stačit pevná frekvence obnovení grafu. Mým cílem je např. vytvořit SPC graf, který by měl zobrazovat aktuální výrobní data.

Neřešil někdo tuhle situaci? Budu muset vždy celý graf překreslit?

Díky moc za informace!

Edit: Jedná se o Windows Form aplikaci - níže pouze zkušební form pro graf..

Imports System.Data
Imports System.Data.SqlClient
Imports System.Windows.Forms.DataVisualization.Charting
Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Timer1.Interval = 10000

        Dim strConn As String = "Data Source=OPC-SERVER;Initial Catalog=OPC;User ID=***;Password=*****"
        Dim conn As New SqlConnection(strConn)
        Dim sqlLiti As String = "SELECT Top 20 Mereni_ID, Jaderna_S1 FROM Sila ORDER BY Mereni_ID DESC"
        Dim da As New SqlDataAdapter(sqlLiti, conn)
        Dim ds As New DataSet()

        Dim ChartArea1 As ChartArea = New ChartArea()
        Dim Legend1 As Legend = New Legend()
        Dim Series1 As Series = New Series()
        Dim Chart1 = New Chart()
        da.Fill(ds, "Sila")

        Me.Controls.Add(Chart1)

        ChartArea1.Name = "ChartArea1"
        Chart1.ChartAreas.Add(ChartArea1)
        Legend1.Name = "Legend1"
        Chart1.Legends.Add(Legend1)
        Chart1.Location = New System.Drawing.Point(13, 13)
        Chart1.Name = "Chart1"
        Series1.ChartArea = "ChartArea1"
        Series1.Legend = "Legend1"
        Series1.Name = "Series1"
        Chart1.Series.Add(Series1)
        Chart1.Size = New System.Drawing.Size(800, 400)
        Chart1.TabIndex = 0
        Chart1.Text = "Chart1"

        Chart1.Series("Series1").XValueMember = "Mereni_ID"
            Chart1.Series("Series1").YValueMembers = "Jaderna_S1"

        Chart1.DataSource = ds.Tables("Sila")

    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

    End Sub
End Class
Editováno 22.2.2018 8:29
 
Odpovědět
22.2.2018 8:28
Avatar
Odpovídá na sNN_
Erik Šťastný:22.2.2018 8:53

Ve VB se nevyznám ani prd, takže konkrétně ke kódu nic neřeknu.

Nicméně pokud chce člověk ponechat timeline, škálování atp. je běžné, že se celý dat překreslí při změně vstupních dat.

Editováno 22.2.2018 8:53
 
Nahoru Odpovědět
22.2.2018 8:53
Avatar
Odpovídá na sNN_
Michal Žůrek - misaz:22.2.2018 9:20

Jo, budeš muset celý graf nechat překreslit. ALe to by neměl být problém, prostě mu změníš data a on se překreslí sám.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
22.2.2018 9:20
Avatar
sNN_
Člen
Avatar
sNN_:22.2.2018 12:29

To znamená pravidelné volání následujícího?

Chart1.Series("Series1").XValueMember = "Mereni_ID"
Chart1.Series("Series1").YValueMembers = "Jaderna_S1"
 
Nahoru Odpovědět
22.2.2018 12:29
Avatar
Odpovídá na sNN_
Michal Štěpánek:22.2.2018 15:52

Ta pravidelnost závisí na "aktuálnosti dat". Ideální by bylo, kdyby sis ta data načítal někde v nějaké třídě nějakou funkcí nebo procedurou a tu pak pokaždé, při změně dat, zavolal s určitými parametry (novými daty)...

Editováno 22.2.2018 15:53
Nahoru Odpovědět
22.2.2018 15:52
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
sNN_
Člen
Avatar
sNN_:22.2.2018 15:56

V mém případě se jedná o pravidelné ukládání z OPC serveru do SQL databáze, kde je přesně stanovený trigger. V tom případě bych asi volil to první řešení.. Kdyby to nebylo opravdu tak pravidelný, tak bych to řešil asi více do hloubky..

Pro představu posílám:

Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration

Public Class Form1

    Private Sub LoadData()

        Chart1.DataSource = GetData()
        Chart1.Series("Spechovatelnost").Points.Clear()
        Chart1.Series("Spechovatelnost").XValueMember = "Mereni_ID"
        Chart1.Series("Spechovatelnost").YValueMembers = "Jaderna_S1"

    End Sub

    Private Function GetData() As DataTable

        Dim strConn As String = "Data Source=OPC-SERVER;Initial Catalog=OPC;User ID=****;Password=******"
        Dim sqlComm As String = "SELECT Top 20 Mereni_ID, Jaderna_S1 FROM Sila ORDER BY Mereni_ID DESC"
        Dim dtChartData As New DataTable()
        Dim conn As New SqlConnection(strConn)
        Using cmd As New SqlCommand(sqlComm, conn)

            cmd.CommandType = CommandType.Text

            conn.Open()

            Dim reader As SqlDataReader = cmd.ExecuteReader()
            dtChartData.Load(reader)
        End Using

        Return dtChartData

    End Function

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'OPCDataSet.Sila' table. You can move, or remove it, as needed.
        Me.SilaTableAdapter.Fill(Me.OPCDataSet.Sila)
        Timer1.Interval = 10000
        Timer1.Start()

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        LoadData()
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        LoadData()
    End Sub
End Class
 
Nahoru Odpovědět
22.2.2018 15:56
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.