TIA Software UART am Digitalout einer S7-1200 ?

Hesse

Level-2
Beiträge
933
Reaktionspunkte
170
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
gibt es sowas wie ein Software UART bei einer S7-1200 ?

Ich müsste 10 Ascii-Zeichen über eine DQ mit :
9600 Baud , 8 Datenbit, keine Parität, 1 Stoppbit ausgeben
Gibt es da etwas Fertiges?


Wenn "Nein" ist es dennoch machbar?


- Die Ausgabe wäre nur sehr selten

- Die Zeichenfolge ist immer dieselbe (könnte als fest Abgelegt sein)
- alles andere vom SPS Programm könnte während der Ausgabe ruhen.

10 Zeichen a. 10 Bit (Startbit, 8D,Stoppbit) = 100Bit

100Bit a 104us = 10,4ms

Sollte doch machbar sein oder warum nicht?
Auf einem Mikrocontroller wäre es einfach ….
 
Bei einem Soft-Uart schiebst du jedes Bit einzeln über Software raus. Mit einem Mikrocontroller geht das, denn selbst für 1 Euro das Stück ist um mehr als der Faktor 1000 schneller als eine SPS.
Wenn deine SPS 10ms Zykluszeit hat, kannst du ein Bit schnellstens 10ms High und 10ms Low ausgeben. Was dabei für eine Baudrate herauskommt kannst du dir ausrechnen.

Ein einfachstes Beispielprogramm für den Empfang habe ich hier mal angehängt:
Digitale Temperatursensoren an 313C-2DP
 
Hm,

An meine Zeit in der Ausbildung zurück denk ...

Eingänge lesen,
Programm durchrennen
Ausgänge schreiben
Und wieder von vorn

So schaut _ein_ SPS Zyklus aus. Da ist nix mit Bit Gewackel am Ausgang _innerhalb_ eines Zyklus.


Gesendet von iPhone mit Tapatalk
 
Das EVA Prinzip ist bei allen Controllern gleich. Auch bei µ-Controllern. Wie bereits gesagt, die sind schneller als ne SPS weshalb das ganze auch schneller abläuft. Manchmal haben diese Controler noch Zusatzbausteine die das ansteuern der Ausgänge oder das Senden der Daten übernehmen, sodass sich der Hauptprozess nicht um das senden auch noch kümmern muss.
Bei einer SPS werden die Ausgänge aber vom Hauptprozess angesteuert, d.h. es wird einmalig auf die Ausgänge geschrieben. Erst im nächsten Zyklus kannst du dann wieder einen neuen Wert zuweisen.

Wenn du die Daten über einen Netzwerkport der SPS senden willst, geht das genauso schnell weil das Senden über den Port parallel zum Zyklus einer SPS ablaufen kann. Der Netzwerkport einer SPS wird meines Wissens nach nicht vom Hauptprozess gesteuert.
Wenn du aber einen Ausgang ansprechen willst, musst du dich an das EVA Prinzip halten. Denn egal wie du dich anstellst, die SPS wird den Wert des Ausgangs nur einmal pro Zyklus ändern. Und das ist ganz am Ende.

Wenn ich mich jetzt korrekt an die paar Stunden µ-Controller Theorie erinnere dich ich mir damals angetan habe, ist eine SPS ebenfalls ein µ-Controller. Vermutlich aber mit mehr Funktionsumfang und anderem Befehlssatz.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Theoretisch kann auch eine SPS den Soft-UART für 9600 Bit/s, die ist durchaus schnell genug und kann auch mehrmals im OB1 Ausgangszustände zuweisen (Zauberwort: Peripheriezugriff).
Ich sehe das Problem nur darin, ob die SPS einen Zeitgeber hat, mit dem man die 0.104 ms abmessen kann.

Harald
 
Danke für eure Antworten:
Eingänge lesen,
Programm durchrennen
Ausgänge schreiben
Und wieder von vorn
So schaut _ein_ SPS Zyklus aus. Da ist nix mit Bit Gewackel am Ausgang _innerhalb_ eines Zyklus.
Und wozu gibt es dann
Peripheriezugriff :p ?

Danke Harald du hast verstanden wo ich hin möchte.
Ich sehe das Problem nur darin, ob die SPS keinen Zeitgeber hat, mit dem man die 0.104 ms abmessen kann.
Wenn ich jetzt an meine Zeit zurückdenke wo ich noch Z80 mit Befehlslisten in Maschinensprache Programmiert habe:
Da hat man dann solange NOP Befehle (evtl.in einer Schleife) eingesetzt bis die Zeit gestimmt hat.
Geht der Peripheriezugriff auf die Ausgänge nur im OB1 ?
 
Peripheriezugriff geht in jedem Codebaustein.

Reproduzierbar Zeit verstreichen lassen z.B. durch NOPs geht schwer, weil SPS Multitasking sind und wahrscheinlich nicht alle Unterbrechungsmöglichkeiten gesperrt werden können: Weckalarme, Prozessalarme, Kommunikation, ... Ich kenne die S7-1200 nicht genau genug, um fundiert geht/nicht sagen zu können. Ich würde es hoffnungsvoll ausprobieren.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mann kann das wirklich mit Peripherie Zugriffe lösen,
die Pausen kann man mit schleifen erzeugen. Die Anzahl
der Schleifendurchlöufe, die benötigt werden mit einem
Osziloskop ausmessen. Beachte das du die schnellen PWM
Ausgänge nutzen musst und auch belasten solltest da diese
kapazitiv sind. Man kann somit tatsächlich Ausgänge im
Mikrosekunden Bereich, während eines Zyklus öfter Ein.- bzw
ausschalten.
 
Interessante Spielerei :p
Speicheroszi auspacken und ausprobieren.

Die 9600 sind sicher eine Herausforderung für die 1200er

Gruß
Dieter
 
Dabei ist zu prüfen, ob der SPS Kern nicht durch irgendwelche anderen Prozesse zwischendurch unterbrochen wird. Bei einem Mikrocontroller funkt mir garantiert nichts dazwischen wovon ich nicht weiß.

Schade, meine 1200 hat nur Relais-Ausgänge. Sonst hätte ich das gleich mal getestet.
 
Ich hab das mal umgesetzt mit einer eigner HMI, wo Tasten, LED und 7-Segment anzeigen
über TTL Schieberegister angesteuert wird. Ist erstaunlich wie gut das läuft.

Dann aber wahrscheinlich mit einem separaten Taktsignal zu den Datenbits, oder?

Bei RS232 muss das Timing zumindest für die Dauer eines Zeichens, d.h. Startbit(s) + Datenbit + Stopbit(s) schon genau sein, da es währenddessen keinerlei Synchronisation mehr gibt. Am Startbit wird dann ja wieder neu aufgesetzt.
 
Ja wir hatten ein Taktsignal, aber die Impulse könnte wir ziemlich genau definieren.
Mann muss den, in diesem geforderten Thread aufpassen, das da kein Alarm OB oder
Ähnliches reindeutet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Pausendauer zwischen den Bytes ist unkritisch, die kann ruhig länger als ein Stopbit dauern.
Ich würde mal versuchen, das Erzeugen der 10 Bits eines Bytes in einem hochprioren Weckalarm zu programmieren, der alle 2ms aufgerufen wird (das wird dann der Zeitabstand zwischen den Startbits). Für die Zeitmessung 104us würde ich die Systemtime (RUNTIME) abfragen, die S7-1200 sollte sowas haben.

Harald
 
Danke für die rege Teilnahme und die sehr konstruktiven Beiträge,
Entschuldigung dass ich mich erst jetzt zurückmelde.Heute war Garten und Haus angesagt.
Beides geht bei mir noch nicht per Fernzugriff vom PC ;)
Reproduzierbar Zeit verstreichen lassen z.B. durch NOPs geht schwer, weil SPS Multitasking sind und wahrscheinlich nicht alle Unterbrechungsmöglichkeiten gesperrt werden können: Weckalarme, Prozessalarme, Kommunikation,
Weckalarme, Prozessalarme müsste ich in den Griff bekommen bzw. kann ich genau auf die Zwischenzeit Synchronisieren.
„Kommunikation“ das könnte das Problem geben Profinet bleibt wohl aktiv und
eigentlich bin ich zum Zeitpunkt wo ich dieses „Senden“ brauche auch zeitgleich online auf der SPS.
Es ist aber denkbar die SPS anzuhalten und das Senden beim Anlaufen im OB100 zu machen.
Unschön, wenn es aber sein muss ……

Beachte das du die schnellen PWM Ausgänge nutzen musst und auch belasten solltest da diese
kapazitiv sind.
Belastung sollte vorhanden sein da der Empfänger dafür ausgelegt sein sollte. Das ist eigentlich sein
„Normaler“ 24V externer DI, der auch als R×D dient.
Ich werde mir jetzt erstmal die Hardware nochmal für den Labortisch besorgen um
nachmessen zu können was da so abgeht.
Verbaut, Verdrahte und in Betrieb ist das alles schon vor Ort.Ich kann da aber nicht immer hinfahren.
Deshalb wäre es "noch toller" wenn es auch über die Normalen DQ funktioniert ohne die
PWM Ausgänge sonst muss ich halt vor Ort um Verkabeln, frei sind die PWM Ausgänge aber noch.

Schade, meine 1200 hat nur Relais-Ausgänge. Sonst hätte ich das gleich mal getestet.

Das würde die Herausforderung wohl noch um einiges toppen, das über eine Relaisausgang zu bewerkstelligen. :) Anzugs- und Abfall- verzögerung mit einbeziehen …..

Ich würde mal versuchen, das Erzeugen der 10 Bits eines Bytes in einem hochprioren Weckalarm zu programmieren, der alle 2ms aufgerufen wird (das wird dann der Zeitabstand zwischen den Startbits

Guter Ansatz ! Danke
 
Wenn du dann für Zeitverzögerungen irgendwelche "sinnlosen" Anweisungen einfügst die Zeit verbrauchen sollen, musst du im Hinterkopf haben, dass der Code bei der 1200 (wahrscheinlich) bei der 1500 (garantiert) optimiert wird. D.h. wenn der Compiler feststellt, dass dort unnötige Anweisungen vorhanden sind, dann werden diese entfernt / zusammengefasst / optimiert.

Beispiel:
Du willst Zeit schinden durch eine Schleife:
x := 0;
FOR i := 1 To 10000 DO
x := x + 1;
END_FOR;

könnte der Compiler einfach durch eine einfache Zuweisung:
x := 10000
ersetzen.

Bei C-Compilern beispielweise ist sowas dokumentiert, lässt sich entweder durch Compilereinstellungen oder einen volatile Qualifizierer an Variablen aufheben. Bei Siemens TIA ist jedoch nichts dokumentiert was da abläuft.
Und da nichts dokumentiert ist, kann Siemens mit jedem Versionssprung/SP/Update/Hotfix an diesen Sachen herumdrehen. Wahrscheinlich ist darum auch so wenig dokumentiert wie etwas funktioniert.
Zugriffe auf Merkerbereiche scheinen zumindest so eine Art volatile zu sein, zumindest werden solche Anweisungen nicht weitergehend optimiert.

Vielleicht lässt sich hier aber das an anderen Stellen nachteilige Verhalten der TON-Timer einmal sinnvoll nutzen, nämlich dass Timer bei jeder Abfrage aktualisiert werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Beachte das du die schnellen PWM
Ausgänge nutzen musst und auch belasten solltest da diese
kapazitiv sind.
Ich vermute mal, rostiger Nagel wollte sagen, daß Du Transistor-Ausgänge nehmen musst, weil mit Relais-Ausgängen geht es bekanntlich nicht so schnell.

Was ist das eigentlich für ein Empfänger? Kannst Du das Protokoll vielleicht noch ändern zu einer einfacheren 2-Leitungs-Übertragung ähnlich I2C oder eine Prüfsumme einbauen? Kann der Empfänger 24V-Pegel verarbeiten oder wie willst Du Pegel wandeln?

Harald
 
Ich vermute mal, rostiger Nagel wollte sagen, daß Du Transistor-Ausgänge nehmen musst, weil mit Relais-Ausgängen geht es bekanntlich nicht so schnell.
Die S7-1200 hat extra PWM Ausgänge die noch schneller sind , die sind gemeint .


Was ist das eigentlich für ein Empfänger?
Der Sensor:
https://www.wenglor.com/fileadmin/f...rating_instructions_OCP662X0135.pdf&zip=false

Die Adapterbox bei Verwendung vom PC aus (die ich nicht verwenden möchte )
https://www.wenglor.com/fileadmin/f...ile=Operating_instructions_A232.pdf&zip=false

Das Schnittstellenprotokoll:
https://www.wenglor.com/fileadmin/f...E/&sfile=Interface_Protocol_OCP.pdf&zip=false


Kannst Du das Protokoll vielleicht noch ändern zu einer einfacheren 2-Leitungs-Übertragung ähnlich I2C oder eine Prüfsumme einbauen?
Nein, so fertiges „Teil“ (außer die Baud noch schneller machen …..)

Kann der Empfänger 24V-Pegel verarbeiten
Ich vermute es so. Vom Hersteller habe ich noch keine weitern Angaben. Angefragt habe ich.
Die A232 Box habe ich noch nicht, das ich nachmessen kann was da abläuft.

oder wie willst Du Pegel wandeln?
Das kommt drauf an ob ich dies muss … ich möchte es nicht, da ich nach Möglichkeit
überhaupt nicht zur Anlage hin will.
Der Eingang ist jetzt zur Zeit direkt auf einen SPS Ausgang verschaltet.

Die Antwort vom Sensor will ich nicht auswerten.


Eine alternative wäre eine A232 Box für jeden Sensor und ein Rs232Modul an der SPS und das RS232 Signal umschalten
 
Zuletzt bearbeitet:
Zurück
Oben