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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Die drei Fragezeichen

  1. #1
    Registriert seit
    09.11.2013
    Beiträge
    14
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    wenn ich mit TwinCat 3 das Beispielprojekt erstelle, dann steht bei Value immer "<Value of the expression cannot be retrieved.>" und die Werte werden unten auch nicht Live angezeigt.
    Komischerweise zählt die Variable, wenn ich sie anklicke.

    fragezeichen.JPG
    fragezeichen2.JPG

    Vielen Dank im Voraus!
    teaage
    Geändert von teaage (10.11.2013 um 11:28 Uhr)
    Zitieren Zitieren Die drei Fragezeichen  

  2. #2
    teaage ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    09.11.2013
    Beiträge
    14
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Das komische ist auch, dass mit folgendem Code nur die festen Werte im Deklarationsteil abgelesen werden und nicht diejenigen, die ich in der SPS mit den Ein- und Ausgänge des EP4374-0002 verknüpfe.

    Code:
    Imports TwinCAT.Ads
    Imports System.IO
    
    
    Public Class Form1
        Inherits System.Windows.Forms.Form
    
    
        Private adsClient As TcAdsClient
        Friend WithEvents TextBox3 As System.Windows.Forms.TextBox
        Friend WithEvents Label3 As System.Windows.Forms.Label
        Friend WithEvents TextBox4 As System.Windows.Forms.TextBox
        Friend WithEvents Label4 As System.Windows.Forms.Label
        Private varHandles(2) As Integer
    
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim port As Integer
            port = TextBox3.Text
            Try
                adsClient = New TcAdsClient
                adsClient.Connect(port)
                varHandles(0) = adsClient.CreateVariableHandle("MAIN.ausgang1")
                varHandles(1) = adsClient.CreateVariableHandle("MAIN.ausgang2")
                varHandles(2) = adsClient.CreateVariableHandle("MAIN.eingang1")
            Catch err As Exception
                MessageBox.Show(err.Message)
            End Try
        End Sub
    
    
        Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
            adsClient.Dispose()
        End Sub
    
    
    
    
        Private Sub btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRead.Click
    
    
            Dim dataStream As AdsStream
            Dim reader As AdsBinaryReader
            Try
                dataStream = New AdsStream(30)
                reader = New AdsBinaryReader(dataStream)
    
    
                dataStream.Position = 0
                adsClient.Read(varHandles(0), dataStream)
                textBox1.Text = reader.Read
    
    
                dataStream.Position = 0
                adsClient.Read(varHandles(1), dataStream)
                textBox2.Text = reader.Read
    
    
                dataStream.Position = 0
                adsClient.Read(varHandles(2), dataStream)
                TextBox4.Text = reader.Read
    
    
    
    
            Catch err As Exception
                MessageBox.Show(err.Message)
            End Try
        End Sub
    
    
        Private Sub btnWrite_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWrite.Click
            Dim dataStream As AdsStream
            Dim writer As AdsBinaryWriter
            Try
                dataStream = New AdsStream(4)
                writer = New AdsBinaryWriter(dataStream)
    
    
                dataStream.Position = 0
                writer.Write(textBox1.Text)
                adsClient.Write(varHandles(0), dataStream)
    
    
                dataStream.Position = 0
                writer.Write(textBox2.Text)
                adsClient.Write(varHandles(1), dataStream)
    
    
                dataStream.Position = 0
                writer.Write(TextBox4.Text)
                adsClient.Write(varHandles(2), dataStream)
            Catch err As Exception
                MessageBox.Show(err.Message)
            End Try
        End Sub
    End Class
    Code:
    PROGRAM MAIN
    
    VAR
        ausgang1 AT %Q*: INT :=100;
        ausgang2 AT %Q*: INT;
        eingang1 AT %I*: INT;
    END_VAR
    Geändert von teaage (10.11.2013 um 13:12 Uhr)

  3. #3
    Registriert seit
    19.10.2009
    Beiträge
    194
    Danke
    8
    Erhielt 50 Danke für 44 Beiträge

    Standard

    Zitat Zitat von teaage Beitrag anzeigen
    wenn ich mit TwinCat 3 das Beispielprojekt erstelle, dann steht bei Value immer "<Value of the expression cannot be retrieved.>" und die Werte werden unten auch nicht Live angezeigt.
    Ich habe gerade im TwinCAT v3.1.4010.0 XAE (VS 2012) die gleiche Deklaration in MAIN eingegeben -> Konfiguration aktiviert -> PLC Projekt geladen und gestartet -> online Werte werden angezeigt.
    Unbenannt.GIF
    Also generell geht's.

  4. #4
    teaage ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    09.11.2013
    Beiträge
    14
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich danke dir fürs Ausprobieren! Jetzt funktioniert es. Ich habe auch VS2012 installiert und den Code neu gemacht.

    Nun bin ich bei einem anderen Problem:

    Ich möchte bei einem Modul mit 4 digitalen Ein- und 4 Ausgängen testen, ob diese alle einzeln kommen und die LEDs OK sind.
    Doch man sieht natürlich kein Blinken, weil der Code zu schnell ausgeführt wird.
    Gibt's in VB.net irgendetwas zum Verzögern? Die Sleep-Funktion funktioniert leider nicht.
    Außerdem sind diese if-Schleifen sehr umständlich. Mit for-next habe ich es auch nicht hinbekommen
    Hier mein Code:
    Code:
    Private Sub Button_blinken_Click(sender As Object, e As EventArgs) Handles Button_blinken.Click
            adsClient.WriteAny(digital_out0, True)
            If digital_in0 = True Then
                adsClient.WriteAny(digital_out1, True)
                adsClient.WriteAny(digital_out0, False)
            End If
            If digital_in1 = True Then
                adsClient.WriteAny(digital_out2, True)
                adsClient.WriteAny(digital_out1, False)
            End If
            If digital_in2 = True Then
                adsClient.WriteAny(digital_out3, True)
                adsClient.WriteAny(digital_out2, False)
            End If
            If digital_in3 = True Then
                adsClient.WriteAny(digital_out0, True)
                adsClient.WriteAny(digital_out3, False)
            End If
        End Sub

  5. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.404 Danke für 2.002 Beiträge

    Standard

    Hallo,
    Zitat Zitat von teaage Beitrag anzeigen
    Ich möchte bei einem Modul mit 4 digitalen Ein- und 4 Ausgängen testen, ob diese alle einzeln kommen und die LEDs OK sind.
    Doch man sieht natürlich kein Blinken, weil der Code zu schnell ausgeführt wird.
    weil der Code zu schnell ausgeführt wird ?
    Ich glaube eher, dass es daran liegt, dass du ihn nicht oft enug ausführst.
    Was möchtest du denn wann blinken lassen ?

    Zitat Zitat von teaage Beitrag anzeigen
    Gibt's in VB.net irgendetwas zum Verzögern? Die Sleep-Funktion funktioniert leider nicht.
    Für Hintergrund-Funktionen gäbe es generell mehrere Mögichkeiten.
    Die Einfachste (aus meiner Sicht) wäre eine Routine, die du mit einem VB-Timer in dem von dir gewünschten Intervall ausführst.
    Du kannst dir natürlich auch einen BackgroundWorker oder einen eigenen Thread dafür erstellen - hier würde dann auch ggf. die Sleep-Methode wieder korrekt arbeiten ...
    Das hängt so ein bißchen davon ab, was es werden soll ...

    Gruß
    Larry

  6. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    teaage (16.01.2014)

  7. #6
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.354
    Danke
    455
    Erhielt 692 Danke für 517 Beiträge

    Standard

    Ich hab von TwinCat jetzt keine Ahnung aber dein Code kommt mir schon etwas komisch vor...

    Code:
             If digital_in0 = True Then
                adsClient.WriteAny(digital_out1, True)
                adsClient.WriteAny(digital_out0, False)
            End If                                                        <-- Out1 ist jetzt auf TRUE...
    
            If digital_in1 = True Then                              <-- Wenn Out 1 TRUE... passiert das nicht im selben Durchlauf? 
                adsClient.WriteAny(digital_out2, True)         <-- Oder wird der neue Zustand von Out1 erst beim nächsten Durchlauf gelesen?
                adsClient.WriteAny(digital_out1, False)
            End If
    Wenn du alle LEDs in einem Durchlauf zum leuchten bringen willst braust du tatsächlich irgendeine Verzögerung dazwischen. Sonst wirst du nicht viel sehen.
    Oder wie Larry schon sagte die Routiune getimed aufrufen (Dann halt mit ein wenig anderem Code)
    Geändert von RONIN (04.01.2014 um 14:53 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  8. Folgender Benutzer sagt Danke zu RONIN für den nützlichen Beitrag:

    teaage (16.01.2014)

  9. #7
    teaage ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    09.11.2013
    Beiträge
    14
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Genau, ich möchte die LEDs nacheinander blinken lassen(also Ausgänge setzen).
    Um die Eingänge zu kontrollieren, sollen die nächsten Ausgänge erst gesetzt werden, wenn die jeweiligen Eingänge OK sind.
    Dazwischen soll jeweils z.B. eine halbe Sekunde vergehen, damit ich alle LEDs blinken sehen kann.
    Normalerweise wird das ganze ja Programm/der ganze Code so extrem schnell ausgeführt, dass man nichts sieht.
    Ein Timer führt die komplette If-Routine ja auch nur in einer eingestellten Zeit komplett und viel zu schnell aus.
    Ich bräuchte also mehrere Delays im Code oder eine for-next Schleife

    So ungefähr müsste es aussehen, aber das mit dem x funktioniert irgendwie nicht so.
    Code:
            For x As Integer = 0 To 3
                If digital_in(x) = True Then
                    adsClient.WriteAny(digital_out(x + 1), True)
                    adsClient.WriteAny(digital_out(x), False)
                End If
                Threading.Thread.Sleep(500)
            Next x

  10. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.404 Danke für 2.002 Beiträge

    Standard

    Nein ... du brauchst im Visual Studio eine Prozedur, die zyklisch aufgerufen wird (z.B.), in der du die Eingänge einliesst und dann entsprechend darauf reagierst.
    Das könntest du z.B. mit einem Timer (im Visual Studio lösen).

    Hier mal ein Beispiel :
    Code:
    Imports System.ComponentModel
    Public Class Taktgeber
        Inherits Timer
     
    #Region "Konstruktor / Dispose"
     
        Sub New()
            Frequenz = 2
            MyBase.Interval = 500 / Frequenz
     
            AddHandler MyBase.Tick, AddressOf BlinkTimer_Zyklus
            MyBase.Start()
        End Sub
     
        Sub New(ByVal frequenz As Single)
            If (frequenz < 0.5) Or (frequenz > 10) Then frequenz = 2
            MyBase.Interval = 500 / frequenz
     
            AddHandler MyBase.Tick, AddressOf BlinkTimer_Zyklus
            MyBase.Start()
        End Sub
     
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            MyBase.Stop()
            RemoveHandler MyBase.Tick, AddressOf BlinkTimer_Zyklus
            MyBase.Dispose(disposing)
        End Sub
     
    #End Region
     
    #Region "Blink-Funktionalität"
     
        Public Takt As Boolean = False
     
        ''' <summary>
        ''' ragiert auf den Blink-Timer-Takt und erzeugt ein entsprechendes Event
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub BlinkTimer_Zyklus(ByVal sender As Object, ByVal e As EventArgs)
            Takt = Not Takt
            RaiseEvent Changed(Me, Takt)
        End Sub
     
        Public Event Changed(ByVal sender As Object, ByVal status As Boolean)
     
    #End Region
     
    #Region "Properties zur Darstellung"
     
        <Category("Verhalten"), Description("Blink-Frequenz in Hz")>
        <RefreshProperties(RefreshProperties.All)>
        Property Frequenz As Single
            Get
                Return 500 / MyBase.Interval
            End Get
            Set(ByVal value As Single)
                MyBase.Interval = 500 / value
            End Set
        End Property
     
        <Category("Verhalten"), Description("Blink-Takt-Interval in Millisekunden")>
        <RefreshProperties(RefreshProperties.All)>
        Shadows Property Interval As Integer
            Get
                Return MyBase.Interval * 2
            End Get
            Set(ByVal value As Integer)
                MyBase.Interval = value / 2
            End Set
        End Property
     
    #End Region
     
    End Class
    Diese Klasse kannst du nun in deinen Code intergrieren (mit "WithEvents MeinTaktgeber as new Taktgeber(10)" ) und dann das Event davon nutzen um deine Einlese-Ausgabe-Routine zu betreiben ...

    Gruß
    Larry

  11. #9
    teaage ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    09.11.2013
    Beiträge
    14
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich habe das ganze mit einem Backgroundworker realisiert. Dankeschön!

  12. #10
    Registriert seit
    15.11.2012
    Beiträge
    41
    Danke
    3
    Erhielt 8 Danke für 8 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von teaage Beitrag anzeigen
    wenn ich mit TwinCat 3 das Beispielprojekt erstelle, dann steht bei Value immer "<Value of the expression cannot be retrieved.>" und die Werte werden unten auch nicht Live angezeigt.
    Komischerweise zählt die Variable, wenn ich sie anklicke.
    Schließe alle offenen Tabs. Danach kannst du die POU wieder öffnen und es sollte etwas angezeigt werden.
    Das soll auftreten, wenn man zu viele Variablen online betrachtet (hat). Dein Projekt ist aber so klein, dass das nicht der Grund sein kann. Ich habe das aber auch manchmal erst nach Öffnen von vielen POUs, manchmal direkt nach Öffnen von zwei kleinen POUs.

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 28.03.2013, 07:58
  2. Eigner FC ohne Fragezeichen
    Von Dennis auf der Arbeit im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 13.07.2012, 18:48
  3. Drei Temperaturen auswerten
    Von slider7 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 28.02.2011, 19:23
  4. drei Zähler hintereinander
    Von lieuthnant im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 20.09.2009, 11:48
  5. Antworten: 12
    Letzter Beitrag: 08.04.2008, 10:23

Lesezeichen

Berechtigungen

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