SPS-Verbindungsaufbau + Daten lesen/schreiben

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    SPS-Verbindungsaufbau + Daten lesen/schreiben

    Moin,

    mal ganz allgemein gefragt:

    Ich verbinde mich mit SPS’en und lese/schreibe entsprechend
    Daten aus den Steuerungen. Sowohl der Verbindungsaufbau als auch die
    Datenoperationen dauern ihre Zeit, weswegen die Form entsprechend hängen bleibt
    / einfriert. Den Verbindungsaufbau muss ich nur einmal machen, von daher ist
    dieser erstmal egal.

    Nun habe ich eine Prozedur, die alle x Sekunden aufgerufen
    wird und mir Daten aus der SPS zieht (Daten werden dann in verschiedene Bytebuffer
    geschrieben). An dieser Stelle suche ich eine Möglichkeit, den Lesevorgang von
    der Hauptform zu entkoppeln, damit diese während des Datenlesens nicht einfriert.
    Hat jemand Erfahrungswerte mit dieser o.Ä. Problematik bzw. eine Idee?


    MfG
    Refra
    Hi,

    habe zwar schon ein paar mal was mit BackGroundWorkern gemacht, weiß aber nicht ob das hier der richtige Ansatz wäre. Weiter habe ich mich aber noch nicht mit Threading beschäftigt. Ich verwende Adapter von Delta Logic zur Kommunikation mit den SPS'en.

    MfG
    Refra
    @Refratechnik BackgroundWorker ist Steinkohle.
    Über was für eine Schnittstelle kommunizierst Du mit der SPS?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    Refratechnik schrieb:

    TCP/IP
    Das kannst Du doch vollständig in einem Thread laufen lassen, und wenn Daten angekommen sind, wirfst Du ein Event und feddich.
    docs.microsoft.com/de-de/dotne…ous-server-socket-example
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Und zwar habe ich immer noch das Problem, dass ich Lese-/Schreiboperationen
    für SPS-Daten von der Visualisierung trennen muss. Derweilen habe ich mir eine
    Klasse geschrieben, die alle Lese-/Schreiboperationen, Konvertierungsfunktionen,
    Fehlermanagement etc. implementiert. Pro SPS wird dann halt eine Instanz dieser Klasse erstellt.

    Nun möchte ich die Klasse um einen Timer erweitern, der mir regelmäßig ein Event
    für die Hauptform abfeuern soll (intern wird geprüft, ob die Verbindung
    hergestellt werden kann bzw. noch steht. Wenn nicht, wird Timer für Hautform
    deaktiviert…). In diesem Event sollen dann die Lese-/Schreiboperationen laufen,
    gefolgt von der Datenvisualisierung. Wie kann ich es elegant lösen, dass ich
    Datenabfrage und Visualisierung voneinander entkoppeln kann, obwohl ich quasi
    beides gleichzeitig mittels Timer-Event der Klasseninstanz auslöse, ohne für
    jedes Steuerelement extra ein Delegate zu erstellen bzw. invoken zu müssen?

    MfG
    Refra
    @Refratechnik Fang an und pack jedes in getrennte Prozeduren.
    Die Visualisierung könnte in ein eigenes UserControl, wo Du nur die Daten reinschiebst und den Rest macht das Control.
    Die Kommunikation selbst kann in eine separate Klasse, die dann mit Events an das Haupthenster meldet, wenn was empfangen wurde.
    Wenn das länglich dauert, pack die Kommunikation selbst noch in einen separaten Thread, um die GUI zu entlasten.
    Der Timer stößt die Datenabfrage an.
    Sobald die Daten da sind, erfolgt ein Event von der Datenklasse an dsas Hauptfenster, die Daten packst Du in Deine EventArgs.
    Der Eventhandler kann ne Validitätsprüfung vornehmen und übergibt dann die Daten an die Visualisierungsinstanz.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich hab mal Daten per TCP/IP aus einer SPS ausgelesen. Da hatte ich die Daten in einem separaten Thread ausgelesen. Ein Timer hat in der Klasse nichts zu suchen. Den kannst du dann in deiner Form benutzen um die Daten alle 100ms oder so neu anzuzeigen. Ggf ist ein SyncLock nötig wenn du sichergehen willst, dass die Pakete komplett gelesen wurden bevor Sie angezeigt werden.
    ​Die Kommunikation selbst kann in eine separate Klasse, die dann mit Events an das Haupthenster meldet, wenn was empfangen wurde.
    Wenn das länglich dauert, pack die Kommunikation selbst noch in einen separaten Thread, um die GUI zu entlasten.


    @RodFromGermany Kommunikation läuft derweilen so, dass ich im Hauptthread die entsprechenden Methoden meiner SPS-Klasse aufrufe. Das entspricht doch dem Auslagen der Kommunikation in eine separate Klasse? Datenempfang per Event an Hauptfenster melden und Daten per EventArgs zu übergeben werde ich probieren!

    ​Wenn das länglich dauert, pack die Kommunikation selbst noch in einen separaten Thread, um die GUI zu entlasten.
    Der Timer stößt die Datenabfrage an.


    Damit meinst du quasi meine Prozedur zum Datenlesen/-schreiben in der Hauptform in einen separaten Thread auszulagern?

    Refratechnik schrieb:

    in der Hauptform in einen separaten Thread auszulagern
    Wenn Du es anfasst, mach da gleich ne separate Klasse draus, da kannst Du ggf. Konvertierungen und einzelne Item-Abfragen und so reinbauen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!