Zyklischen Prozess mit Sleep/Warte-Funktion implementieren (SocketReceive-Execute)

Kutsubato

Level-1
Beiträge
26
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

in der Dokumentation steht für den FB SocketReceive:

For this reason, the instance has to be called cyclically (polling) within the PLC task, until all required data have been received. During this process, an rising edge is generated at the bExecute input, e.g. every 100ms. If successful, the data received last are copied into the receive buffer.

Ich arbeite mit TwinCat 3 auf Windows 10 mit einer CX9020.
Dafür suche ich eine Methode, um eine Art "Sleep Function" zu implementiere, wie sie in anderen Programmiersprachen üblich ist. Also

1) Execute aktivieren
2) Sleep()
3) Zurück zu 1)

Bisher habe ich mit TON/TOFs etwas gebastelt, was aber nur mäßig stabil funktioniert.
Was habe ich sonst für Möglichkeiten?

Danke,
Kutsubato
 
Ein SPS-Programm bzw. eine SPS-Task geht schon von ganz alleine zyklisch "schlafen". Man muß und darf kein eigenes Sleep einbauen.
Du brauchst einfach nur eine Abfrage einbauen, ob zwischenzeitlich ein Ereignis aufgetreten ist oder ein Programmzustand erreicht ist, ab dem das Programm weiterarbeiten kann. Für Mindest-Wartezeiten oder Maximalzeit-Überwachungen verwendet man TON, TOF, ...

Was willst Du denn eigentlich tun?
Wie sieht Dein "mäßig stabiler" Programmcode aus?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn Dir die Ausführungshäufigkeit eines FB zu hoch ist hast Du von Hause aus mehrere Möglichkeiten.
Die einfachsten:
1. Du lagerst den Programmaufruf in eine separate Task aus, die mit Deiner gewünschten Aufrufrate arbeitet
2. Du rufst den FB in der bisherigen Task nicht in jedem Durchlauf auf. Da könnte zum Beispiel ein Zähler mitlaufen, in dessen Abhängigkeit der FB aufgerufen wird.
3. Ein bedingter Aufruf ereignisgesteuert

sleep ist in einem SPS-Programm unüblich, da dadurch die gesamte Task im Sleep festgehalten wird und alle anderen Aufrufe der Task währenddessen nicht bearbeitet werden.
 
Ich sehe schon, dass es nicht lohnt mein Programm weiter zu nutzen, sondern dass ich besser mit Tasks alles organisiere.

____________________________________________________________________________________________________


Zur besseren Beschreibung:

Ich habe für eine TCP-Verbindung (CX 9020 als Server) alles hergestellt und ein Programm in Python verbindet sich damit. Jetzt sollen in diesem korrekten Aufbau bloß Daten an die SPS gesendet werden
und auch das klappt vom Ablauf her schon einmal. Alle Server-Teile sind richtig konfiguriert.

Es fehlt nur noch das zyklische Aufraufen des Receive-Blocks und außerdem das darauffolgende abspeichern der empfangenen Daten. Also sollen zyklisch die Daten gespeichert und verarbeitet werden und der Receive-Block dazu ausgeführt werden. Das geht über den besagten Execute-Eingang.

Man erhält am Ausgang ein Array mit den empfangenen Daten als String in ASCII-Code, also Zahlen, und außerdem einen Counter für die Wortlänge der Daten. Das Array wird immer wieder neu geschrieben, wenn man im Receive-Block Execute betätigt. Bisher ist der Array-Schreibpunkt (Pointer) bei [0], also an der ersten Stelle, und das dauerhaft.
Man könnte diesen natürlich auch immer weiter setzen, um mehr Daten zu speichern bzw. zu behalten.

Ich verstehe den Ablauf so:

1) Die Folge Hi-Lo-Hi an Execute von SocketReceive lässt Daten empfangen.
2) Immer wenn dann wieder -Lo-Hi folgt, werden anschließend empfangene Daten geschrieben und gleichzeitig für neue Daten gelauscht, die beim nächsten Wechsel aufgerufen werden.
3) Das ganze soll kontinuierlich ausgeführt werden, damit dauerhaft Daten gesendet werden können.
 
Zuletzt bearbeitet:
Zurück
Oben