Ausgabe auf com1 - Ascii-Salat

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich möchte gern mit einer S7-200 über deren 2. seriellen Port (com1) mit der Außenwelt (PC+Terminalprog) kommunizieren. Ich habe dazu das Beispiel aus dem Handbuch auf Seite 95 (PDF Seite 109) als Basis benutzt, bei dem Zeichen seriell empfangen und dann zurückgeschickt werden. Das Ganze funktioniert soweit auch ganz gut. Nach dem Empfang eines Linefeeds als "end of message character" taucht laut online Speicherüberwachung das/die gesendete/n Zeichen auch im definierten Eingangspuffer auf, anschließend wird durch den "Ende des Empfangs-Interrupt" das Senden einer Nachricht ausgelöst.

Leider kommt in meinem Terminal-Programm (egal welches, habe mehrere probiert) nur Ascii Buchstabensalat oder kryptische Zeichen an. Dabei ist es egal ob ich das Empfangene zurück ans Terminal sende oder eine festgelegte Message verschicke. Auch kommt die selbe Message, getriggert durch einen Taster am Eingang korrekt am Terminal an. Lediglich dann, wenn ich das Versenden der Message durch den "Ende des Empfangs-Interrupt" steuere kommt Salat an.

Hat jemand eine Idee, wo der Fehler liegen könnte?

MfG

Arne
 
hast du die schnittstelle korrekt eingestellt?

9600 baud 8 datenbits keine parität.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, habe ich. Die Kommunikation funktioniert ja auch generell (senden von Zeichen auf Knopfdruck und Empfang). Nur in diesem speziellen Fall kommt dieser Blödsinn an :(.
 
Ich vermute du erwartest Zeichen im ASCII Format,
sendest aber im Binär-Format (du müsstes vorher mit HTA umwandeln).
Das Windows Hyperterminal kann nur ASCII Zeichen darstellen.
Versuche mal einen String-Konstante zu senden z.b. "Hallo".
 
Hast du am Kabel beide Steckergehaeuse mit dem Shield verloetet ?
Wenn eins der beiden Geraete nicht geerdet ist kann es zu Datenverfaelschungen kommen... :wink:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hmm

@benvontschirnhaus: Sehr unwahrscheinlich, schließlich kommt es nur zu Verfälschungen, wenn ich in dieser speziellen Anwendung sende. Wie oben erwähnt habe ich das Problem nicht, wenn ich das Senden über einen Knopf am Eingang starte.

@Gast: Es handelt sich um ASCII Zeichen, die ich per Knopf am Eingang problemlos korrekt verschicken kann.


Hmm bin ratlos :( , wieso habe ich das Problem nur in diesem speziellen Szenario? Kann es an irgendwelchen Parametern oder Timeouts o.ä. liegen?
 
Das PC/PPI Kabel hat eine eigene Umschaltzeit zwischen empangen und senden (<50mikrosec, im aktuellen HB nur als Verweis angegeben
[zwischen senden und empfangen noch kleiner als anders herum]), welche du berücksichtigen muss.
Das Beispiel im Handbuch startet deshalb auch erst einen Zeitinterrupt bevor es dann sendet.
Unabhängig davon wird bei Protokollen eine Totzeit von typ. 1,5 x Zeichenübertragungszeit vereinbart.
(d.h. bei 9600 Baud und 10 Bit -> 1,5 x 1,04ms = mindestens 1,5ms)
 
Moin, da bin ich wieder - sorry war im Urlaub.

Leider hängt das Problem nicht oder nicht so mit den Laufzeiten zusammen.
Wenn ich das Bsp. aus dem Handbuch 1:1 kopiere und lediglich die Speicherbereiche und IRs auf Com1 umstelle, habe ich folgenden Effekt:

Manchmal bekomme ich einen Teil der gesendeten Zeichen zurück, gekürzt um den 1. Buchstaben. Dies allerdings nur vielleicht jedes 10. mal.
Ansonsten kann man bei der Live-Beobachtung sehen, dass die XMT-Funktion rot aufblinkt.
Schaut man nun in die SPS Info-Box, steht dort ein Error:
simultaneous RCV XMT operation.
Dies deutet nun wieder auf das von Gast erwähnte Problem hin - aber wieso nicht immer und wieso trotz 10ms Interrupt?

MfG
Arne
 
>> simultaneous RCV XMT operation.
musst mal im Diagnosepuffer nachschaun. Da steht dann irgendwas von leichter FEhler 007 XMT und RCV gleichzeitig aktiv.

Das ist quasi das 'Echo' was am Terminal ankommt weil Sender und Empfänger gleichzeitig aktiv auf dem Bus einen Kurzschluss ('break') verursachen. Die Wechselsprechkommunikation funktioniert nur wenn das vorher sauber umgeschaltet wird. Dafür muss in einem der SMBs (187.7) das Empfangsfreigabebit jedesmal explizit umgelegt werden.
Wie das genau ging habe ich momentan nicht vorrätig, notfalls helfen die Tips&Tricks (52a -- Drucker) und dortiger Zustandsautomat weiter.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tritt das Problem den bei Port_0 nicht auf ?

Zur Fehlerlokalisierung solltest du bei Sendeanstoss bzw. RCV (Ende)Interrupt jeweils die zugehörigen Sondemerker zwischenspeichern
und auswerten.
Dazu gehören SMB186, SMB4 (speziell SM4.6), ferner die ersten empfangenen Zeichen und die empfangene Zeichenanzahl
(vielleicht empfängst du die Zeichen bereits falsch).

Versuche mal auch folgendes Tesprogramm
(Als AWL Datei importieren).

Code:
ORGANIZATION_BLOCK MAIN:OB1
TITLE=*****************************************************************
// *******							 ********
// ******* Dies ist ein Übungsprogramm für den Freeportmodus********
// *******							 ********
// *****************************************************************
//  Wenn Programm Start und im Hyperterminal alle Einstellungen eingestellt
//  sind startet man dort die Verbindung mittel des "Telefon"-Symbols
//  Dann wird bei drücken von A=Ausgan A0.1 gesetzt,bei B=Ausgang A0.1
//  zurückgesetzt,bei C=blinklick auf A0.2 aktiviert das mit B zurückgesetzt
//  wird. Alle anderen Tasten haben keine Funktion.
//  Wird E0.1(Flanke) gesetzt wird der Meldungsempfang aktiviert und die
//  vorgehnden Funktionen außer Kraft gesetzt.
//  Der Meldungsempfang(einzelner Zeichen,Anzahl in VB500,einzelne Zeichen
//  Byteweise ab VB501)wird solange fortgesetzt biß die max. Anzahl der Zeichen
//  erreicht ist(SMB94=10) oder die Tatste X gedrückt wird,was als Ende des
//  Meldungsempfangs gewertet wird(SMB89= X).
//  Mittels der Flanke auf E0.1 wird der Meldungsempfang wieder zurückgesetzt
//  und dadurch der Empfang einzelner Zeichen aktiviert (A,B,C) bis wieder
//  Flanke aud E0.0 den Meldungempfang wieder aktiviert wird.
// *****************************************************************
// 			Initialisierung Freeport
// *****************************************************************
// 
BEGIN
Network 1 
LD     SM0.1                       // Im ersten Zyklus Schnittst. paramet
MOVB   9, SMB30                    // 5 für 19200 Baud 9 für 9600 Baud, keine Parität,8Bits,Stopbit=1,Protokoll=keon
ATCH   INT0, 8                     // Zeichenempfang auf INT 0 
ENI                                // Interrupt freigeben

//*****************************************************************
//		Meldung senden das Ausgang gesetzt wurde
//*****************************************************************
Network 2 
LD     E0.0
EU
MOVB   16#B0, SMB87
MOVB   'X', SMB89                  //Ende Zeichen
MOVW   +5, SMW90
MOVB   5, SMB94                    //Maximal 100 Zeichen
ATCH   INT1, 23
RCV    VB500, 0                    //Anzahl plus Zeichen bei VB500 ablegen
Network 3 // RCV ausschalten um wieder Senden zu können
LD     E0.1
EU
R      A0.5, 1
R      SM87.7, 1                   //Meldungsempfang sperren
RCV    VB500, 0                    //RCV SM neu lesen
Network 4 
LD     A0.1                        // Bei aufsteigender Flanke von 
EU                                 // Ausgang 0.1
S      M0.0, 1                     // Setze Merker 0.0
Network 5 
LD     M0.0                        // Wenn Merker 0.0 gesetzt
TON    T32, +1                     // Starte eine Millisekunde Zeit
Network 6 
LD     T32                         // Wenn Zeit abgelaufen
XMT    VB100, 0                    // Versende Zeichen und
R      M0.0, 1                     // setze Merker 0.0 zurück

//****************************************************************
//		Meldung senden das Ausgang zurückgesetzt wurde
//*****************************************************************
Network 7 
LD     A0.1                        // Bei abfallender Flanke von
O      M1.0                        // Merker 1.0 oder Ausgang 0.1
ED                                 // 
S      M0.1, 1                     // Setze Merker 0.1
Network 8 
LD     M0.1                        // Wenn Merker 0.1 gesetzt
TON    T33, +1                     // Starte zehn Millisekunden Zeit
Network 9 
LD     T33                         // Wenn Zeit abgelaufen
XMT    VB200, 0                    // Versende Zeichen und
R      M0.1, 1                     // setze Merker 0.1 zurück

//*****************************************************************
//		Meldung das Blinklicht aktiviert wurde
//*****************************************************************
Network 10 
LD     M1.0                        // Bei aufsteigender Flanke von 
EU                                 // Merker 1.0
S      M0.2, 1                     // Setze Merker 0.2
Network 11 
LD     M0.2                        // Wenn Merker 0.2 gesetzt
TON    T34, +1                     // Starte zehn Millisekunden Zeit
Network 12 
LD     T34                         // Wenn Zeit abgelaufen
XMT    VB300, 0                    // Versende Zeichen und
R      M0.2, 1                     // setze Merker 0.2 zurück

//*****************************************************************
//			Blinklicht verknüpfen
//*****************************************************************
LD     M1.0                        // Wenn empf. Zeichen = "C"
U      SM0.5                       // und Sekundentaktmerker = "1"
=      A0.2                        // = Ausgang 0.2

//*****************************************************************
Network 13 
//  MEND   			// Ende Hauptprogramm
// 
END_ORGANIZATION_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=*****************************************************************
// 		Interruptprogramm für Zeichenempfang
// *****************************************************************
// 
BEGIN
Network 1 //  Interruptprogramm für 
//  INT    0			// Zeichenempfang
// 
Network 2 
LDB=   SMB2, 16#41                 // Wenn empfangenes Zeichen ein
S      A0.1, 1                     // A ist dann setze Ausgang 0.1
Network 3 
LDB=   SMB2, 16#42                 // Wenn empfangenes Zeichen ein
R      A0.1, 1                     // B ist dann setze Ausgang 0.1
R      M1.0, 1                     // zurück
Network 4 
LDB=   SMB2, 16#43                 // Wenn empfangenes Zeichen ein
S      M1.0, 1                     // C ist dann setze Merker 1.0
Network 5 
//  RETI   			// Ende Interruptprogramm
// 
END_INTERRUPT_BLOCK
INTERRUPT_BLOCK INT_1:INT1
TITLE=
BEGIN
Network 1 
LD     SM0.0
S      A0.5, 1
END_INTERRUPT_BLOCK
 
@Fritz: wo finde ich den Diagnosepuffer? Und diese Angabe mit den Tips&Tricks worauf bezieht sich die? Im Handbuch find ich nix.

@Gast: Danke werde ich probieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
>>> Tricks & Tipps
In MicroWin /Hilfe/S7 im Web befindet sich ein Link. Auf diesem PC verweist der jedoch nur ins Nirwana (altes SPK).
Das ist eine CD bzw. Download aus dem KnowledgeSupport der Simatic Webseite. Da musst du mal suchen, sind vier Beispiele zur S7-200 AsCII Kommu drin. Eines davon Interruptgesteiert.

>>> mini DiagnoseStack ( im Prinzip)
Das findet sich unter MicroWin/ Zielsystem/ Informationen. Musst bei verbundener AG starten dann zeigts Fehler, Zykluszeit etc. an.
 
..was ihr mit Diagnose Stack meint, meinte ich schon mit dem Info-Fenster ;)

Nach einigem hin- und her-gefummele und teilweiser Umstrukturierung meines Programmes nach dem Vorbild von Gasts Demoprog hat es geklappt!

Ich kann leider nicht genau sagen, woran mein Problem lag. Eigentlich habe ich nur in IRs auf die Schnittstelle zugegriffen und diese Zugriffe entsprechend verzögert. Habe nun lediglich die Logik aus Unterprogrammen ins Hauptprogramm verlegt und mit Merken getriggert, anstatt sie aus der IR aufzurufen. Der Verdacht läge nahe, dass durch diese Aurufe die IR nicht richtig beendet wurde...ich weiß es nicht im Diagnose Fenster war keine entsprechende Fehlermeldung.

Ich danke auf alle Fälle allen die mir geholfen haben!

MfG

Arne
 
Hi,

mit 200ter habe ich bis jetzt noch nichts gemacht, aber wenn der Speicher wie bei der 300ter und 400ter CPU Word-Orientiert ist würde ich mal eben die Hi- und Lowbytes in jedem ASCII-Zeichen miteinander tauschen bevor ich die Daten seriell(zum PC) übertrage.

Bei der S7-300/400 heisst der Befehl TAW (damit werden die Bytes im rechten Datenwort des Akku 1 miteinander getauscht).

Falls die Gegenseite kein PC ist, sondern eine S7 - brauchst du diese Konvertierung natürlich nicht.

Gruss
ANo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das klappt mittlerweile ja alles problemlos, aber Danke.

Aber ein Problem hab ich noch, das mich von der Perfektion trennt ;).
Undzwar würde ich gern meinen Empfang nicht per Interrupt beenden oder zumindest nicht nur, sondern mit einem Endzeichen. soweit so gut, denn das ist ja mit dem Byte 189 festlegbar und mit Bit 187.5 aktivierbar. Allerdings funktioniert das leider nicht, wenn ich das Bit 186.5 abfrage, wird dies niemals 1. :(

@Gast in deinem Demoprogramm steht zwar was davon, dass der Zeichenempfang mit einem Endzeichen enden kann, aber du fragst den Empfang des Zeichens nie ab!?
 
Zurück
Oben