Kurze Frage zu Threads



  • Hallo,

    ich hab 100 Tore und jedes Tor hat 15 Signale. ( Meine Firma macht Torsteuerungen, ist jetzt kein Fake ) Die Tore wollen Sie nun testen.
    Da alles von einander unabhängig ist bräuchte ich 100 mal 15 Threads also 1500 Threads. Ist das zuviel ?

    In C# gibt es auch die Klasse Threading Timer. Statt normaler Threads könnte ich auch die benutzen. Indem ich einfach die Zeit auf Indefinite setze und die gleiche Wirkung hätte. Aber ich weiß nicht mal ob Threading Timer jeweils selbst eigenen Threads sind. Das ist halt immer das Problem wenn man irgendwelche Klassen verwendet wo man nicht weiß wie die intern funktionieren. Oder wo kann man das nachlesen ?



  • Kolibri21 schrieb:

    ich hab 100 Tore und jedes Tor hat 15 Signale. ( Meine Firma macht Torsteuerungen, ist jetzt kein Fake ) Die Tore wollen Sie nun testen.
    Da alles von einander unabhängig ist bräuchte ich 100 mal 15 Threads also 1500 Threads. Ist das zuviel ?

    Sicherlich ja, denn der Verwaltungsaufwand für die Threads wäre sehr hoch, was das System stark belasten würde.

    Können diese "Signale" ihren Zustand nicht zwischenspeichern bis zur nächsten Abfrage?



  • Kolibri21 schrieb:

    Das ist halt immer das Problem wenn man irgendwelche Klassen verwendet wo man nicht weiß wie die intern funktionieren. Oder wo kann man das nachlesen ?

    Du kannst es mit einem .NET Decompiler (ILSpy, ...) nachgucken.
    Du kannst es dir ergoogeln.
    Du kannst es einfach ausprobieren (guck wie viele Threads dein Prozess mit 1 Timer hat und wie viele mit 100 Timern - dann solltest du es wissen).

    Davon abgesehen denke ich dass du ziemlich aufm falschen Dampfer bist.

    Beschreib mal etwas genauer. Was genau meinst du mit "Signalen" und warum meinst du für jedes Signal einen eigenen Thread oder Timer zu brauchen?



  • Also jedes Signal läuft in seinem eigenen Takt. Ich könnte ein Signal z.b. so parametrieren.

    5 Sekunden ; 3 Sekunden ; 4 Sekunden etc.

    Wie mach ich das. Es läuft halt immer ein Timer. Der läuft 5 Sekunden , läuft er ab, dann wechselt das Signal auf low für 3 Sekunden, dann nach 4 Sekunden wieder auf High für 4 Sekunden. Deswegen immer eigene Threads für jedes Signal.



  • Hallo Kolibri21,

    was genau soll mit deinem Programm denn getestet werden?

    Die reinen Signale? Die würde man einfach mit einem PG auslesen können. - Ist also keine Anwendung notwendig.



  • also wir wollen die Software halten testen. Wie sie reagiert wenn Signale gesetzt sind oder sich ändern. Wenn am Containerhafen von Rotterdam etwas schief läuft dann wars wohl mein Fehler 🙂



  • Das macht es jetzt nicht einfacher dir zu helfen. Welche Ausgaben soll das Testprogramm machen, welche Eingaben sollen durch den Benutzer gemacht werden?

    Wie ist die Kommunikation mit den Toren realisiert?



  • Das ganze läuft auf ner SPS. Und Siemens hat da so nee C# Library wo man bestimme Merker setzen kann. Und dann setz ich eben die Merker. Das ist alles 🙂

    Auf dem Containerhafen da läuft nämlich alles automatisiert und vor kurzem hatte unsere Software einen Fehler und jemand konnte aufs Gelände was ziemlich gefährlich ist da fahrerlose Fahrzeuge rumfahren .

    Und ich habs jetzt mal ausprobiert. Der Threading Timer scheint weniger Threads zu brauchen wie normale Threads. Den Anschein hat es jedenfalls.



  • Das alles automatisiert läuft habe ich schon verstanden. Auch dass eine SPS die Steuerung übernimmt, war mir durchaus bewusst.

    Dass mit der Bibliothek von Siemens bringt uns aber schonmal einen Schritt weiter. Also sind es Merker, die von der SPS gesetzt / rückgesetzt werden?

    Reicht es da nicht, wenn du einen Thread startest, der eine Schleife ausführt? Innerhalb der Schleife prüfst du dann alle Merkerwerte, von mir aus auch mit einem Regelobjekt oder ähnlichem.

    In Pseudocode halt sowas:

    Solange Test läuft
       Für jeden Merker
             Lese Wert
             Prüfe letzten Wert und erwarteten Wert
             aktualisiere letzten Wert
             Gebe Ergebnis aus
       Ende Für Schleife
       Warte 1 Sekunde
    Ende Test Schleife
    


  • Also ich muss die Merker setzen !! Wir simulieren das ganze ja nur, da wir nicht am Hafen Rotterdam sind. Deswegen benutzen wir Merker die dann die Eingänge simulieren sollen.



  • Ok, aber das ändert am Ablauf ja nichts. Du erstellst einen Thread. Der Pseudocode ändert sich dann natürlich etwas ab in z.B.:

    Solange Test läuft
        Für jeden Merker
            Ist neuer Wert zu setzen?
                Ermittle zu schreibenden Wert
                Wert schreiben
        Ende Für Schleife
        Warte 1 Sekunde
    Ende Test Schleife
    


  • hmm. Würde vielleicht gehn. Aber jedes Signal hat ja seinen eigenen Timer und die laufen sowieso immer in einem eigenen Thread.



  • Du bringst mich langsam aus dem Konzept. 😮

    Deshalb soll ja innerhalb der Schleife geprüft werden, ob wirklich ein neuer Wert zu schreiben ist.

    Quasi:

    while(!bStop)
    {
        foreach(Signal signal in signals)
        {
              if(Signal.LastUpdate > DateTime.Now.SubtractSeconds(Signal.CurrentUpdateTick))
              {
                   Signal.Write(Signal.CurrentUpdateValue);   
                   Signal.LastUpdate = DateTime.Now;
                   Signal.CurrentUpdateTick = Signal.GetNextTickRate();
                   Signal.CurrentUpdateValue = Signal.GetNextUpdateValue();
              }
        }
    
        // wait lock
        lock(_lockObject)
        {
            Monitor.Wait(_lockObject, 1000);
        }
    }
    

    Das nur als einfachstes Beispiel. Vor Start des Threads initialisierst du die Signal-Objekte mit den jeweiligen Parametern und jagst das ganze dann durch den Test.

    Du willst ja das Programm testen. - Dem Programm ist doch Wurst, wie die Daten in die SPS kommen. - Hauptsache die sind in den definierten Intervallen da.



  • Also praktisch nur einen einzigen Timer und den für alle Signale verwenden.
    Und dann eine Schleife in der prüfen ob ein neuer Wert gesetzt werden muss ?



  • Einen Timer würde ich dafür nicht verwenden, sondern wirklich einen Thread. - Aber sonst ja, einen Thread, der zyklisch für alle Signale prüft ob ein neuer Wert zu setzen ist.



  • Ein Timer reicht doch. Oder willst du 1500 Timer also für jedes Signal einen Timer ? Wie gesagt meine Aufgabe ist es nur das Signal zu erstellen . Das ist alles. Ich schreibe ausschließlich in die SPS !



  • Aber sagen wir mal 2 Signale laufen zur gleichen Zeit ab und das Signal soll sich ändern dann werden die sicherlich nicht zur gleichen Zeit geändert. Aber das würde sich ja mit eigenen Threads auch nicht verhindern lassen ?



  • Richtig, die eigenen Threads würden das nicht verhinden. Ich schätze den Schreibzyklus aber eigentlich so schnell ein, dass es ziemlich unkritisch ist.

    Und falls doch, kann man dannach ja weiter denken und eventuell für jedes Tor einen Thread machen, der die 15 Signale durchgeht.

    Im ersten Schritt würde ich es jedoch ganz pragmatisch so einfach wie möglich machen. Ich kann mir nämlich nicht vorstellen, dass euer Unternehmen das Budget hat, dich 2 Wochen lang an einer Testanwendung basteln zu lassen.



  • inflames2k schrieb:

    Ich kann mir nämlich nicht vorstellen, dass euer Unternehmen das Budget hat, dich 2 Wochen lang an einer Testanwendung basteln zu lassen.

    Wie meinst du das ? 2 Wochen = 2000 Euro Gehalt . Soviel hat doch jedes Unternehmen .



  • Wenn ich das lese wird mir schwummerig.

    Freund Vogel, lern programmieren. Bevor dir noch jemand draufkommt dass du viel zu wenig Plan von irgendwas hast um Dinge zu programmieren wo man normalerweise nur grosse Jungs dranlassen sollte.


Anmelden zum Antworten