Beckhoff EL6002 mit elektronischer Last

Svero

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi zusammen, ich habe aktuell ein Projekt im Rahmen meines Studiums, bei dem ich eine elektronische Last mittels RS232 Schnittstelle programmieren muss. Um dann eine Brennstoffzelle zu testen. Wir benutzen dazu eine EL6002 Klemme und eine CX5630. Erschwerend kommt hinzu, dass das ganze auch teilweise über Matlab programmiert werden muss. Ich bin bereits so weit, dass die grundlegende Kommunikation zwischen Last und SPS teilweise funktioniert und zwischen SPS und Matlab. Langfristig sollte es so sein, dass in Matlab eine Art Lastkurve programmiert wird (Stromstärken für gewisse Zeitintervalle), diese dann an die SPS übermittelt werden und von dort aus über RS232 an die Last. Dann sollen Werte wiederum ausgelesen werden und an Matlab gesendet. Den Code habe ich angehängt. Die Logik zum Setzen der Stromstärke funktioniert ohne Probleme, das konnte ich in der Online Beobachtung der Variablen sehen. Aber das Senden an die Last macht Probleme. Es kommt immer wieder zu einem Buffer Overflow im Send Baustein. Ich vermute, es ist ein Timing Problem, bin aber mittlerweile absolut überfragt. Ich arbeite das erste Mal mit so etwas, bin also Neuling auf dem Gebiet, also seit etwas nachsichtig. RTS und CTS sind deaktiviert, da die Kommunikation damit gar nicht funktioniert hat.
 

Anhänge

Wenn du einen BufferOverflow hast dann schickst du zu viele Daten über das 22-Byte Interface der EL6002.
Wenn du mehr Zeug in die Klemme stopfen willst musst du an der Zykluszeit arbeiten, d.h. den Basisbaustein SerialLineControl schneller aufrufen bzw. in eine POU werfen die schneller aufgerufen wird.
Prinzipiell: Der Baustein hat ein 300Byte Buffer (so meine Erinnerung). Wie gesagt ist das Interface zur EL6022 22 Byte groß.

Da du zur Baudrate nichts sagst kann man jetzt nichts zur Zykluszeit sagen. Mit einer Zykluszeit von 1msec solltest das Ganze funktioniere.
 
na super..... (das soll ironisch daherkommen). Und die Zykluszeit des Bausteinsaufrufes?

Ich habe jetzt keine Lust hier in Trippelschritten dir die Thematik vor Augen zu führen und auch mit deinem Code kann man nicht viel sagen da z.B. arrStepDuration nicht initialisiert wird (was nicht 100%ig korrekt ist da sie mit 0 initialisiert sind)

Schau dir die Variable Tx_Buffer an und überlege wann/wo die 300Byte voll sind und wie du abhilfe schaffen kannst.
Zykluszeiten der EL6002 und der SerialLineControl-FBs sind hierbei relevant.
 
Das war auch nicht meine Intention. Sollte es diesen Eindruck machen, möchte ich mich dafür entschuldigen. Mir reicht bereits ein Hinweis, aus welcher Richtung der Fehler zu vermuten ist. Daher vielen Dank für Ihre Tipps!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das war auch nicht meine Intention. Sollte es diesen Eindruck machen, möchte ich mich dafür entschuldigen. Mir reicht bereits ein Hinweis, aus welcher Richtung der Fehler zu vermuten ist. Daher vielen Dank für Ihre Tipps!
Dann antworte doch bitte auch mal vollständig auf die Fragen.
Die Baudrate hast Du zwar genannt, aber nicht die Zykluszeit der Task die Dein Programm aufruft.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie @Glon schon schrieb, sind 95ms sehr langsam und ein seltsamer Wert.
Nichts desto Trotz wird das die Ursache für Deine Probleme sein, denn das ist bei 9.600Baud eine viel zu langsame Zykluszeit für den Aufruf der SerialLineControl.
Schau Dir mal diesen Beitrag im Infosys an, da wird für 9.600Baud eine Zykluszeit von maximal 6ms empfohlen. Dort findest Du auch eine Formel zur Berechnung der Zykluszeit.
Oft wird der FB SerialLineControl in einer extra Task mit einer sehr geringen Zykluszeit ausgeführt und der Rest in einer "normalen" Task, mit z.B. 10ms. Die Daten zwischen den Tasks können dann zum Beispiel über globale Variablen ausgetauscht werden.
Nachtrag: Die globalen Variablen/Strukturen "stEL6002_In" und "stEL6002_Out" sind auch mit der Hardware verknüpft?
 
Zuletzt bearbeitet:
Zurück
Oben