Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Lesen aus Stream

  1. #1
    Registriert seit
    20.04.2007
    Beiträge
    81
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo

    ich habs nun fast geschafft und am Wochenende a weng rum Probiert und mir einige Befehle angeschaut und getestet....

    so dein Beispiel hab ich mir auch angesehen allerdings habe ich nun anbei wieder eine frage


    Also du nimmst den Stream den die in der Beckhoffanweisung angegeben hast und ließt daraus die daten...

    So wenn ich nun 60 Variablen habe wie kann ich auf den entsprechenden wert zurückgreifen...

    brauch ich dann für jede Variable einen anderen Stream oder wie wird das gehandhabt....

    Mfg
    Andre Wagner
    Zitieren Zitieren Lesen aus Stream  

  2. #2
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Daumen hoch

    Du kannst für jede Variable einen Stream (nur den ADSBinaryReader nehmen) aufmachen oder - und jetzt wird es etwas umständlich - nur einen Stream aufmachen und gibst dann beim Lesen mit stream.Read Offset und Länge an. Das bedeutet aber, du musst den Kram genau verwalten. Bsp:

    1. Var ist Boolean, dann ist Offset=0 und Länge=1
    2. Var ist INteger, dann ist Offset=1 und Länge=2
    3. Var ist Boolean, dann ist Offset 1+2=3 und die Länge 2
    usw.

    Da mach ich lieber für jeden Lesevorgang einen Stream auf. Bsp für Integer:

    Code:
            
    Dim reader As AdsBinaryReader
    Me.adsStream = New AdsStream(2)
    
    reader = New AdsBinaryReader(Me.Stream)
    Me.adsClient.Read(Me.hVar, Me.adsStream)
    Me.adsStream.Position = 0
    Me.value = reader.ReadInt16()
    Wenn das ganz in einem Objekt plaziert ist, schreibst du es nur einmal. Normalerweise liegt die Lese-Funktion in einem Thread, damit der Rest nicht blockiert ist.

    Das geht mit:

    Code:
            
    thread = New Thread(AddressOf DeineFunktion)
    thread.Priority = ThreadPriority.BelowNormal
    thread.IsBackground = True
    thread.Start()

  3. #3
    Registriert seit
    20.04.2007
    Beiträge
    81
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    aja... so in etwa hab ich mir das auch schon gedacht....

    jetzt habe ich nur ein problem...

    ich habe mich eingelesen das es ja möglichkeiten gibt einen Wert bei einem bestimmten ereigniss (zum beispiel Cmd_click) zu lesen....

    allerdings is mir aus vb6 bekannt das lese operationen eine bestimmte zeit brauchen und somit wird bei 60-70 vars das programm sehr langsam....

    bei VB6 konnte das einfach behoben werden ich dem ich die Vars einfach am Startanfang connecte und somit immer den aktuellen Wert habe..

    das ist wichtig da ich ständig im hintergrund mit den Werten rechnen muss um beispielsweise die Maschinengeschwindigkeit anzupassen.... daher is der einmalige Read befehl ungünstig...

    nun hat mir ja beckhoff erzählt das ich mit CreateVarHandle auch connecten kann....

    mein Code sieht bis her so aus (nur der ADS Code das andere is ja uninteresannt

    bei der Allgemeinen Dimensionierung:

    Code:
       Private tcAds As New TcAdsClient 'Ads Client einem Objekt zuweisen
    
        Private sStream As New AdsStream(2) 'Stream mit der länge 2 (für Int) erstellen
    
        Dim binReader As New AdsBinaryReader(sStream) 'BinReader für den Stream wie es mir von beckhoff gesagt wurde
    unter Form_Load

    Code:
            Try
    
                tcAds.Synchronize = True 'Verbinden mit Port und festlegen des Timeouts
                tcAds.Connect(301)
                tcAds.Timeout = 1000
    
    
                REM  tcAds.CreateVariableHandle("TEST.EINGÄNGE.TEST")
                tcAds.AddDeviceNotification(61472, 0, sStream, 0, 2, AdsTransMode.OnChange, 55, 100, varError)
    
               
    
            Catch
                MsgBox("Fehler")
    
    
            End Try
    das in REM gelegte funktioniert genau so wie das mit andere nur ich arbeite lieber mit Ports....

    so etz hab ich die device notification...

    so laut beschreibung von beckhoff wird ja nun bei änderung ein event ausgeführt

    wie kann ich dieses event mit Code versehen und meine variablen bsp "varInt16" mit dem wert befüllen ohne das ich alle 100 ms 60 lesebefehle ausführen muss....

    bei VB6 hat das ja mit Connect super geklappt....

    mfg
    Parallax

    PS: Catch wird nicht mehr angesprungen also müsste ja mein wirres gecode nun zumindest stimmen und arbeiten

  4. #4
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Ich arbeite zur Zeit nicht mit Notifications, sondern habe einen Timer, der die Funktion zum Lesen einmal ein der Sekunde startet. Damit die Anwendung nicht so träge ist, habe ich dafür einen Thread, der parallel zum Programm läuft.

    Code:
    Imports System.Threading
    
        Private Sub thread_a()
            While RunThreads
                 LeseAlleVariablen()
                Thread.Sleep(timeA)
            End While
        End Sub
    Das passte mir zur Zeit besser in den Kram, weil ich für die Notifications die Verwaltung aufboren muss. Ich weiss noch nicht, wie ich das mache.


    Der Ablauf sieht so aus:

    1) Client einrichten (kennst du auch):

    Code:
            Me.tcADS = New TcAdsClient()
            Me.tcADS.Synchronize = True
            Me.tcADS.Connect(Me.ADSAdress, Me.ADSPort)
            Me.tcADS.Timeout = ADSTimeout
    2) Variable connecten:
    2a) Stream initialisieren

    Code:
            Try
                Me.adsStream = New AdsStream(VarSize)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    2b) Connect Variable
    Code:
            Try
                Me.hVar = adsClient.CreateVariableHandle(VarPath)
            Catch ex As Exception
                Me.mConnect = False
            End Try
    3a) Lesen
    Code:
            Dim reader As AdsBinaryReader
    
            reader = New AdsBinaryReader(Me.Stream)   ' stream aus 2a)
            Me.adsClient.Read(Me.hVar, Me.adsStream)
            Me.adsStream.Position = 0
            Me.value = reader.ReadInt16()
            reader = Nothing
    3b) Schreiben

    Code:
           
            Dim writer As AdsBinaryWriter
            writer = New AdsBinaryWriter(Me.adsStream)
            Me.adsStream.Position = 0
            writer.Write(CType(Me.value, Int16))
            Me.adsClient.Write(Me.hVar, Me.adsStream)
            writer = Nothing

  5. #5
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Wenn du mit Threads arbeitest und noch nicht die Hilfe gelesen hast, dann bringe das hier in der Window_Load-Rouotine unter:

    Code:
            CheckForIllegalCrossThreadCalls = False

  6. #6
    Registriert seit
    20.04.2007
    Beiträge
    81
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi irgendwie geht das bei mir nicht.. ich gib dir mal wieder meinen Code, das ist einfacher

    Allgemein:

    Code:
    Public Class frmMain
    
    
        Private tcAds As New TcAdsClient
    
        Private sStream As New AdsStream(2)
    
        Dim binReader As New AdsBinaryReader(sStream)
    das bleibt ja gleich bei einer Testvariable

    Code:
            Try
    
                tcAds.Synchronize = True 'Verbinden mit Port und festlegen des Timeouts
                tcAds.Connect(301)
                tcAds.Timeout = 1000
    
                varTest = tcAds.CreateVariableHandle("TEST.EINGÄNGE.TEST")
                REM   varTest = tcAds.AddDeviceNotification(61472, 0, sStream, 0, 2, AdsTransMode.OnChange, 55, 100, varError)
    
                tcAds.Read(varTest, sStream)
    
    
    
                sStream.Position = 0
                REM   varTest = sStream.?
                sStream = Nothing
    
                Me.TextBox1.Text = varTest
    
            Catch
                MsgBox("Fehler")
    
    
            End Try
    was ich nicht ganz verstehe ist, normal müsste doch in varTest schon der Wert drin stehen der ein "Eingänge.Test" vorhanden ist weil wo will er den wert sonst hin tun.... als was muss ich varTest deklarieren... ich habs etz als Integer

    nur da steht a astronomisch hoher wert drin.....

    das zweite: sStream. kennt kein ReadInt sonder nur Read und ReadAny...??

    mfg
    Andre Wagner...

    mittlerweile hast net nur n Kaffee gut sondern a ganzen besäufniss (natürlich nur mit kaffee^^)

  7. #7
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Also erstmal:

    bei catch...

    schreibst du:

    Code:
    catch ex as TwinCat.Ads.AdsException
      MessageBox.Show(ex.Messge)
    Dann siehste, was schief geht.

    Dann steht da bei dir:
    Code:
    tcAds.Read(varTest, sStream)
    Du nimmst den Rückgabewert nicht entgegen und packst in dein Editcontroll das Händle der Verbindung rein


    Appropo Kaffe: Davon habe ich hier massen. Aber schreib lieber mal, wenn du fertig bist.

  8. #8
    Registriert seit
    20.04.2007
    Beiträge
    81
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Also nervlich fertig seid 1,5 Monaten....

    Mit der Anlage hoffentlich in 2 Wochen

    so mit dem Satz
    "Du nimmst den Rückgabewert nicht entgegen und packst in dein Editcontroll das Händle der Verbindung rein"

    kann ich etz mal gar nix anfangen... also das Handle wird doch durch
    varTest = tcAds.CreateVariableHandle("TEST.EINGÄNGE.TEST")
    erzeugt (wobei ich immer noch net ganz sicher bin was ein Handle ist....)

    So für mich heißt das das "Test.Eingänge.Test" überwacht wird....

    so varTest ist ja dann im Prinzip der Rückgabewert der Funktion der ja im normalfall hier nichts über den Inhalt der Var aussagt...

    also was is den das Handle und was soll ich anstatt
    tcAds.Read(varTest, sStream)

    sonst schreiben...

    Also Read sagt ja das er da VarHandle nimmt (was ich immer noch net weiß was es sein soll) und das in den Stream schreibt....

    ??
    und ich habs mit allen Readern probiert die ich gefunden hab ich hab immer noch kein ReadInt.... komisch..

    das mit der Errormessage wollte ich später noch machen damit ich dann bei einem Fehler gleich auslesen kann was los ist, das hab ich bisher nur so simpel gemacht damit ich überhaupt seh ob catch angesprungen wird

    mfg
    Parallax

  9. #9
    Registriert seit
    20.04.2007
    Beiträge
    81
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    ah ok hab den fehler gefunden... hab stream benutzt anstadt reader...


    ok bekomm nun den Wert....

    so die Handels create ich nun in Form_Load

    und auslesen tu ich den Stream in einem Timer ereigniss

    der reader sollte ja schnell genug sein um den stream von 60 vars einmal alle 50ms einmal abzudaten... oder...

    so das ganze etz noch mit write probieren und dann kanns los gehn...

    Ich kauf scho mal a Fass Bier... und Kaffee...^^


    was machst du eigentlich genau beruflich weil du scheinbar ja net in nächster nähe arbeitest..

  10. #10
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Das mit den 60Var sollte klappen, wenn du sie einmal die Sekunde liesst, aber bestimmt nicht alle 50ms. Du kannst auch einen Teil schneller lesen, als den anderen Teil der Variablen

    Wenn dann deine GUI etwas Träge wird, musst du dafür einen Thread einsetzen. Dann ist dein Fenster der 1. Thread wie du ihn schon hast und die Leseroutine der 2. Thread. Dann hast du sozusagen 2. Programme in einem und die behindern sich nicht gegenseitig und du bekommst Multitasking.

    Beruflich mache ich hier alles von Elektronikentwicklung für EOL-Testprozesse bis zur Automatisierung mit Beckhoff. Dann arbeite ich auch nicht in D, sondern in Norwegen und nach München sind es etwa 1900km.

Ähnliche Themen

  1. Mobotix-Kamera-Stream abfangen
    Von merlin im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 24.09.2011, 20:29
  2. TwincAT und TCP-Stream
    Von merlin im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 07.08.2011, 11:28
  3. Intouch 10 RSTP Stream
    Von MatMer im Forum HMI
    Antworten: 0
    Letzter Beitrag: 09.03.2011, 11:10
  4. Antworten: 1
    Letzter Beitrag: 25.01.2010, 15:57
  5. Variablen Handle per Stream schnell Abfragen
    Von Parallax im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 21.05.2008, 08:52

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •