AGLink reagiert nicht mehr

ToSchum

Level-1
Beiträge
14
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
wir benutzen den neuen AGLink64. Ist alles auch soweit alles in Ordnung. Aber wir bereiten gerade ein neues Projekt vor. Kein Problem, die Anwendungen sind ferting und arbeiten
auch ganz gut. Aber wenn die Anwendung längere Zeit, Zeit nicht genau bekannt, auf Handshake wartet (pollt) an Adresse 0 (Handshake), reagiert die Anwedung nicht mehr.

Wir verwenden TCP/IP und die Verbindung wird bei Programmstart aufgebaut und bein Beenden wieder getrennt. Der Handshake sthet im DB, die Anwendung pollt auch auf die richtige Adresse,
aber nichts passiert. Starte ich die Anwendung neu, geht alles.

Hat jemand eine Idee dazu.

Danke Torsten
 
Brauche dazu mehr Infos:
- welche Programmiersprache wird verwendet?
- welche Version von ACCON-AGLink kommt genau zum Einsatz?
- wie wird zugegriffen, synchron oder asynchron?
- was bedeutet reagiert nicht mehr? Kommt keine Antwort? Kommt die falsche Antwort? Wir wird das geprüft?
- gibt es ein wireshark-Log zum Fehler?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wir verwenden die aktuelle Win64 Version von AGLink 4.5. Als Programmiersprache kommt c# zum Einsatz. Reagiert nicht mehr bedeutet, dass das Programm seit dem Programmstart immer auf den Handshake reagiert und seinen Teil erfüllt. Steht das Programm nun eine Weile, Fördertechnik usw. wird überarbeitet, reagiert das Programm eben nicht mehr auf diesen Handshake, soll heissen,
beim Debuggen kommen wir in die Funktion rein, es gibt keinen Fehler aber der Handshake(4) wird nicht erkannt sondern einen 0. Schauen wir in den DB rein steht dort eine 4. Starte ich das Programm neu wird dieser Handshake sofort erkannt. Die Connr ist gültig und alles stimmt. Ist hat komisch.
 
Bitte restlichen Fragen auch noch beantworten und außerdem:
- was bedeutet: das Programm steht eine Weile? Wird da nicht kommuniziert?
- Welche Funktion wird zum Lesen verwendet?
- Wie sieht der Rückgabewert der Funktion aus?
 
Guten Morgen Herr Höhnle,
ich dachte dass habe ich beschrieben. Aber gut:
Das Programm läuft an einem PC oder Server außerhelb der Produktion und ist per Etehernet verbunden. Es pollt ca alle 500ms einen DB auf Adresse 0.0 und soll
dort mit ReadDataBytes einen Handshake auslesen.
Code:
AGL4.WriteDataBytes(connnr, dbnr, start, bytes.Length, bytes, timeout);
Rückgabe ist ein Integer.
Das funktioniert auch sehr gut. Aber wenn die Linie lange gestanden hat, weil Material, Produkt oder Reparaturen durchgeführt werden, dann reagiert zwar der Timer weiter, aber die Funktion
liefert immer 0 zurück, obwohl der erwartete Wert an der Adresse steht. Nach einem Neustart geht alles wie gewohnt. Die Netzwerkverbindung ist natürlich beständig.
In Connr steht auch ein gültiger Wert. Ich verstehe es halt nicht.

mfg
Torsten
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich gehe davon aus, dass die Lese- und nicht die Schreibfunktion aufgerufen wird.
- wird diese synchron oder asynchron aufgerufen? Welcher Timeoutwert wird beim Aufruf angegeben?
- welchen Wert gibt diese Funktion zurück (ich weiß, dass der vom Typ Integer ist)? Mich interessiert nicht der Variablenwert sondern der Rückgabewert der Funktion.
 
Der Result der Funktion ist 0. Der Timeout ist 30000. Da ich immer auf AGL4.AGL40_SUCCESS prüfe und er keinen Fehler meldet sollte das OK sein.
Code:
rv = AGL4.ReadDataBytes(connnr, dbnr, start, num, bytes, timeout);
if (rv == AGL4.AGL40_SUCCESS)
        Data = AGL4.ReadInt16(ref bytes[0]);
            {
 
Zuletzt bearbeitet:
Dann besten den ausführlichen Quellcodeausschnitt und idealerweise ein wireshark-log zu meinen Händen an support AT deltalogic.de schicken. Werde mir dann mal die Kommunikation ansehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was ist in ein wireshark-log?

Ein Timer führt alle 500 ms folgende Funtion aus:
Code:
      Private Int32 LeseSPS()
     {
          if ((db.LeseHandshake() == EleConst.c_SPS_Daten_in_DB) && (IsBusy == false))
          {
            //Tuwas
          }

     }
:cool:

        public Int32 LeseHandshake()
        {
            Int32 res = AGL4.AGL40_PARAMETER_ERROR;
            Int32 Data = 0;
            res = AGL4ReadInteger(SPSConNr, SPSTimeout, KommDB, 0, 2, out Data);
            if (res == AGL4.AGL40_SUCCESS)
            {
                return Data;
            }
            return res;
        }
 
Code:
if ((db.LeseHandshake() == EleConst.c_SPS_Daten_in_DB) && (IsBusy == false)) { //Tuwas }

und wie erkennst du die Fehlersituation wenn du den Fehlercode oder das Ergebnis zurückgibst?

ich würder erstmal den Code aufräumen

Code:
 Private Int32 LeseSPS()
{
  Int32 data = 0;
  if( db.LeseHandshake(out data) == AGL4.AGL40_SUCCESS )
  {
     if( ( data == EleConst.c_SPS_Daten_in_DB ) && (IsBusy == false))
     {
     }
  }
  else
  {
     MessageBox.Show("LeseSPS -> db.LeseHandshake(out data) != AGL4.AGL40_SUCCESS");
  }
}

public Int32 LeseHandshake(out Int32 the_Data)
{
  Int32 data=0;
  Int32 res = AGL4ReadInteger(SPSConNr, SPSTimeout, KommDB, 0, 2, out data);
  the_Data = data;
  return res;
}
 
Zuletzt bearbeitet:
noch Fragen...

1#

Was für einen Timer verwendest du

  • System.Windows.Forms.Timer - also den aus dem Designer
  • System.Timers.Timer
  • System.Threading.Timer
#2

Funktioniert deine Applikation unter 32Bit korrekt?
 
Übersehe zwar nicht alles, aber wenn alle 0,5 sek der Timer kommt und der Timeout grösser als diese Periode ist, könnte das das Problem sein?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
deswegen die Timerfrage

auch deswegen meine Timerfrage:

System.Windows.Forms.Timer:
Benutzt die GUI-Thread-Queue und ist "schön" sequenziell

System.Timers.Timer:
Benutzt Threads aus dem Threadpool für jeden Aufruf - kann aber so eingestellt werden das
er immer den gleichen Thread benutzt

System.Threading.Timer:
Hier kann es dann wirklich passieren das mehrere Timer-Aufrufe gleichzeitig laufen
--> dann sind seine Variablen ihres Inhalts(Lebens) nicht mehr sicher :)
 
Die Frage ist auch, ob er das IsBusy dafür verwendet und wo dieses zurückgesetzt wird. Interessant wäre auch die Funktion AGL4ReadInteger, die nicht von uns ist.
 
Guten Morgen,
also IsBusy ist zu diesem Zeitpunkt false; der Timer ist ein Forms.Timer und die AGL4ReadInteger ist aus der Bibliothek vom AGLink API Guide. Aber das mit dem Fehlerauswerten hat etwas gebracht, denn es wird ein Fehler gemeldet. Dabei haben wir festgestellt, dass die Netzwerkkarte vom BS in StandBy geschickt wird. Das ist deaktiviert worden. Jetzt sehen wir esrt einmal weiter.
Ich will bei einem Fehlerfall einen Reconnect einbauen, vielleicht hilft das Weiter.

Vielen Dan an alle!!!
Und frohe Weihnachten:D

PS: Wie kann ich die Verbindung am Besten überwachen? Mit der Funktion GetRedConnState bekomme ich einen Fehler. Wir verwenden eine S7 400.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Was kam bis jetzt raus? Funktioniert es mittlerweile?

GetRedConnState ist für redundante Verbindungen einer H-CPU. Wenn der Rückgabewert ordentlich ausgewertet und alle 500 ms gelesen wird, dann ist keine zusätzliche Verbindungsüberwachung notwendig. Wenn nur bei Bedarf gelesen wird und das nur alle (viele) Minuten oder Stunden, dann kann eine Verbindungsüberwachung Sinn machen. Dies kann dann durch das Lesen einer Variablen oder des Betriebszustandes in geringerem Zeitraster etc. erfolgen.
 
Zurück
Oben