Step 5 Ich komme hier nicht weiter

RoBop

Level-2
Beiträge
130
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe die ehrenvolle Aufgabe, ein S5 Programm mehr oder weniger in ein S7 wegen einem Umbau umzuschreiben.
Irgdwo ist bei mir der Wurm drin und ich verstehe nicht so ganz was das soll.
Das ganze Schrittprogramm besteht aus diesem Code.
Vorab M1.1 ist ein "High-Merker"

Ich vermute:
Es soll eine Klappe geöffnet werden. Die Klappe hat eine Stellungsrückmeldung. Diese Meldung wird mit einer Zeit überwacht. Ist die Meldung innerhalb einer vorgegebenen Zeit nicht da, bleibt das Programm stehen und nach Ablauf der Zeit wird eine Störung erzeugt.
Das Programm bleibt nicht so lange stehen, bis die Zeit abgelaufen ist sondern springt bei der tatsächlichen "Stellungsrückmeldung" in den nächsten Schritt.


Ich selbst hatte noch die den "SPZ" Befehl aus meiner Beobachtung würde ich behaupten, dass dieser Befehl dem "SPB" gleicht.

Hier der Code:

NETWORK
TITLE = ERSTFILTRAT V2.6 OEFFNEN

A M 145.7 // FREIGABE NW 32
S Q 16.1 // ERSTFILTRAT V2.6 OEFFNEN
S M 146.0 // FREIGABE NW 33
S M 101.0
R M 145.7

NETWORK
TITLE = WARTEN AUF RM ERSTFILTRAT OEFFN.

A M 146.0 // FREIGABE NW 33
AN M 141.0 // ZEIT NICHT ABGELAUFEN
AN T 70 // UEBERWACHUNGSTIMER

JCN X024

CALL FC 0 // TIMER STARTEN
( _TIME := T 70
, CNT := MW 10
, WERT := DBW 140
, RDY := M 141.0
);

X024: NOP 0

A M 146.0
A I 9.6 // RM ERSTFITRAT AUF
S M 146.1 // FREIGABE NW 34
R M 146.0
R M 140.4

JCN X025

CALL FC 1 // HILFSZAEHLER NORM.
( CNT := MW 10
, RDY := M 141.0
);

X025: NOP 0;
// --------------------------------
A M 146.0
A M 141.0 // MERKER ZEIT ABGELAUFEN
AN I 9.6 // KEINE RM ERSRTFILTRAT AUF
S M 140.4 // STOERUNG SPUELPROGRAMM

hier der Baustein der mich am meisten verwirrt: "FC0"

NAME: UEBWZEIT

VAR_INPUT
_TIME :timer; // TIME
CNT :word; // CNT
WERT :word; // WERT
END_VAR

VAR_OUTPUT
RDY :bool; // RDY
END_VAR

BEGIN
NETWORK
TITLE = UEBERWACHUNGS-ZEIT
L #WERT // ZEITWERT SIEHE DB10
L #CNT // ZAEHLERWERT
==I // ZEIT IST ABGELAUFEN
JZ M001
// -- HILFZAEHLER UM 1 ERHOEHEN ---
L 1
L #CNT
+I
T #CNT

AN M 1.1
L S5TIME#1s // 1 SEKUNDE
SE #_TIME // TIMER STARTEN
A M 1.1
L S5TIME#1s
SE #_TIME

JU M002 // ENDE

M001:A M 1.1
S #RDY // UEBERWACHUNGSZEIT ABGELAUFEN

L 0 // HILFZAEHLER AUF NULL SETZEN
T #CNT

M002:NOP 0


END_FUNCTION

Und hier der FC1:

FUNCTION FC 1 : VOID
NAME: CNT_NORM // CNT:NORM

VAR_INPUT
CNT :word; // CNT
RDY :bool; // RDY
END_VAR

BEGIN
NETWORK
TITLE = HILFSZAEHLER NORMIEREN

L 0
T #CNT // HILFSZAEHLER = 0

A M 1.1
R #RDY // RESET READY-MERKER


END_FUNCTION

Verstehe ich das Programm so wie ich es oben vermute richtig?? Wenn ja werde ich das etwas einfacher umschreiben. Hatte man damals keine einfachere Möglichkeit? In der S7 geht das Programm zumindest gar nicht. CPU geht so auf "Stop"
Das ist keine Bequemlichkeit meinerseits sondern ich komme nach langen Rätseln wirklich nicht mehr weiter.

Vielen Dank für die Mühe
 
Ich selbst hatte noch die den "SPZ" Befehl aus meiner Beobachtung würde ich behaupten, dass dieser Befehl dem "SPB" gleicht.

Die Sprungbefehle sind komplett unterschiedlich, wenn das nicht passt, dann hast du vielleicht eine Endlosschleife.

Aus der Hilfe:
SRW 1
SPZ ZERO //Springe zur Sprungmarke ZERO, wenn das geschobene Bit = 0 ist.

Wenn ein Bit mit dem Wert 0 aus dem Akku geschoben wird, dann werden die Statusbits A1 = 0 und A0 = 0.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was mir auf die Schnelle auffällt:
  • Vorsicht! SPB und SPZ sind absolut nicht gleich.
    - SPZ verändert das VKE und /ER nicht! Die Verknüpfung wird nicht beendet sondern mitgeschleppt!
    - SPB setzt auf jeden Fall das VKE auf 1 und löscht /ER
    Da wo Du SPZ (JZ) verwendest gehört SPB (JC) hin.
  • "S #RDY" - dem FC-OUTPUT mußt Du unbedingt immer etwas zuweisen!
  • "T #CNT" - auf einen FC-INPUT schreiben ist sowas von pfui! und je nach Aktualparameter funktioniert es auch gar nicht --> Du mußt VAR_IN_OUT verwenden
  • "SE #_TIME" 2x - der Timer wird vermutlich niemals zum Ende kommen, weil Du ihn in jedem Zyklus neu startest

Wenn man ein Programm von einer Programmiersprache in eine andere Programmiersprache umschreibt, dann muß man beide Sprachen sehr gut beherrschen. "Ich würde behaupten" ist da absolut nicht zielführend, lieber einmal mehr in die Referenzhilfe schauen wenn man sich nicht 1000% sicher ist.

Bei der Umsetzung alter S5-Programme ist es oft keine gute Idee, den vorhandenen Code 1:1 übersetzen zu wollen.

Harald
 
Ich finde das Programm mehr als fürchterlich. Mir geht es nur darum, ob das Programm wirklich so funktioniert wie ich es vermute.
Möchte das Programm besser umschreiben.
Viele Dinge haben mich irritiert wie eben von dir beschriebene Fehler.
Auf "IN-Parameter" was schreiben, ob das in S7 überhaupt geht weiß ich nicht. Auf die Idee bin ich noch nie gekommen :D
Das Programm muss wohl so aber midestens 20 Jahre funktioniert haben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie sieht denn das originale S5-Programm aus? (Für welche CPU ist das eigentlich?)
Werden FC0 und FC1 auch von anderen Stellen aufgerufen?
Warum geht die S7 mit dem konvertierten Programm auf STOP? Zugriffsfehler auf DB?

Harald
 
Das Originalprogramm sieht genauso aus. Habe es auf einem Alten Field PG angeschaut. Die Original-CPU ist eine 115U 942.
Der gepostete Code ist ein Auszug einer Kette mit ca. 100 Schritten.
Das heißt, der FC0 und FC1 wird dort auch so oft aufgerufen. Es ist ein Spülprogramm für eine Filterkammer und es gibt 5 Filterkammern. Es gibt also insgesammt 5 fvon diesen Schrittprogrammen.
Bei jedem Ventil und jeder Klappe sind 120 Sekunden als "Überwachungszeit" eingestellt. Die Antriebe ohne Stellungsrückmeldung werden nicht mit dem FC0 überwacht.
Der FC0 wird auch nachher im Schritt für eine Spülzeit hernommen. Bis zum Ablauf der Spülzeit bleibt das Programm auf jeden Fall auch stehen.

Ich kann mir aber nicht vorstellen, dass jeder Schritt beim Steuern eines Antriebes immer für 120 Sekunden stehen bleibt, selbst wenn die Stellungsrückmeldung auf jeden Fall da ist.
Stop war u.A. auch wegen dem DB. Das war auch klar der Mitauslöser. Aber das Hauptproblem schein wohl die Zykluszeit zu sein.

Mir ist nur wichtig, dass ich das alte Programm verstehe. Ich möchte es nicht einfach so übernehmen sondern übersichtlicher neu umschreiben.
So viele Timer und Merker die dafür benötigt werden, gefällt mir sowieso nicht.
 
Der falsche JZ ist die einzige Stelle, wo sich Dein gezeigter S7-Code vom ursprünglichen S5-Programm unterscheidet? Die anderen JCN/JU und die Sprungmarken sind korrekt übersetzt?
Also ich sehe in dem Code nichts, was zu Zykluszeit-Problemen oder gar Stop wegen Zykluszeit-Überschreitung führen könnte. Oder ist die neue (unbekannte) S7-CPU zu schwach auf der Brust?

Die 2 aufeinanderfolgenden Aufrufe des Timers im FC0 sind korrekt übersetzt?
Der Code sieht so aus, als ob die Zeitüberwachung gar nicht über den Timer-Ablauf funktioniert, sondern einfach nur gezählt wird, wie oft der FC0 aufgerufen wird (absichtlich oder Bug?). Der Programmcode wird in der S5 in welchem OB aufgerufen?

Ist das so schwer, zur Sicherheit einfach mal den original S5-Code zu zeigen (zumindest vom FC0)? Das würde einige Nachfragen ersparen und fundierte Antworten ermöglichen...

Das Drumrum um den FC0 sieht so aus, als ob der FC0 eine maximale Schrittzeit-Überwachung realisieren soll, die nur Fehler melden soll, wenn ein Schritt zu lange dauert. Also so wie Du Deine Vermutung formuliert hast.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich meine, es ist alles richtig übersetzt.
Ich habe mal schnell das Netzteil des alten Field PGs repariert.

Hier der abgeschriebe Code vom Original S5 Programm FC0:


Bez :TIME E/A/D/BT/Z: T
Bez :CNT E/A/D/BT/Z: E BI/BY/W/D: W
Bez :RDY E/A/D/BT/Z: A BI/BY/W/D: BI
Bez :WERT E/A/D/BT/Z: E BI/BY/W/D: W

L =WERT Zeitwert siehe DB10
L =CNT Zaehlerwert
!=F Zeit ist abgelaufen
SPZ =M001


--Hilfzaehler um 1 erhoehen--

L KF +1
L =CNT
+F
T =CNT

UN M1.1
L KT 100.0 1 Sekunde
SVZ =TIME Timer starten
U M1.1
L KT 100.0 1 Sekunde
SVZ =TIME Timer starten

SPA =M002 ENDE
M001 U M1.1
S =RDY Ueberwachungszeit abgelaufen

L KF +0 Hilfszaehler auf Null setzen
T =CNT

M002
BE
 
Ich werde es wohl nochmal übersetzten. Als Hilfsmittel habe ich das Programm "S5/S7 für Windows" als Demo und mein altes PG.

Ich meine es ist so vieles falsch gelaufen. FB ist eigentlich ein FC und ein PB ein FB. Wobei beim PB kein DB angelegt wird.

Morgen werde ich zum Testen es richtig umschreiben und berichte mal ob es geht. Z.B. der Befehl "SPA PB3" heißt nichts anderes als "CALL FB3/DB......"

Beim Convertieren wurde statt einem FB (PB vorher) ein FC angelegt. werde wohl alles in einen FB umschreiben...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
  • SPZ =M001 - ist eigentlich falsch (müßte SPB=, damit VKE begrenzend), glücklicherweise ohne Auswirkung in dem Code
  • SVZ =TIME - das ist in S7 kein SE sondern ein SV (also falsch übersetzt)! Der Timer wird auf der S7 aber trotzdem nicht funktionieren, weil der SV in jedem Zyklus neu gestartet würde. Ich weiß nicht, ob der Code auf der S5-115 überhaupt funktioniert hat, ob man da einen SV vor Ablauf neu starten konnte?

Harald
 
Mich würde hier mal interessieren, was als S7-CPU zum Einsatz kommt.
Der gepostete Baustein macht für mich so gar keinen Sinn - ich könnte mir nur vorstellen, dass er auf der doch relativ langsamen 942 vielleicht irgendwie funktioniert hat.
Wenn nun die S7-CPU eine 315 (oder schneller) ist dann ... 8)

In jedem würde ich hier dem Ansatz des TE folgen und nicht mehr weiter über eine Code-Übersetzung nachdenken sondern den Programm-Ablauf analysieren und in vernünftig neu programmieren.
Für mich sieht es ein bißchen so aus, als wenn das ein echter "Könner" am Werk gewesen war ...

@TE:
Lieber ein Ende mit Schrecken als ein Schrecken ohne Ende ... ;)

Gruß
Larry
 
Also als Ersatz kommt eine 315er rein.

Laut Siemens ist das so mit den Bausteinen:


STEP5 STEP7

FB,FX FC

OB OB

Integrierte Sonder OBs SFC, SFB

PB FB

SB ------

DB,DX DB

DK,DKX,FK,FKX,PK ------




Alles wurde im PB in Step5 erstellt. Nur der Überwachungsbaustein und die Normierung wurde im FB geschrieben.
Demnach würde ich gerne die 5 Spülprogramme als FB (Step7) schreiben.
Alleine wegen den statischen Variablen. Selbstverständlich verwende ich auch Ein/Ausgänge vom Baustein.
Direkter Aufruf eines Merkers oder DB-Adresse im FB ---> Nogo.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
demnach würde ich gerne die 5 spülprogramme als fb (step7) schreiben.
Alleine wegen den statischen variablen. Selbstverständlich verwende ich auch ein/ausgänge vom baustein.
Direkter aufruf eines merkers oder db-adresse im fb ---> nogo.

*ack* ..........
 
  • SPZ =M001 - ist eigentlich falsch (müßte SPB=, damit VKE begrenzend), glücklicherweise ohne Auswirkung in dem Code
  • SVZ =TIME - das ist in S7 kein SE sondern ein SV (also falsch übersetzt)! Der Timer wird auf der S7 aber trotzdem nicht funktionieren, weil der SV in jedem Zyklus neu gestartet würde. Ich weiß nicht, ob der Code auf der S5-115 überhaupt funktioniert hat, ob man da einen SV vor Ablauf neu starten konnte?

Harald

Laut Ralle ja:
http://www.sps-forum.de/simatic/27727-zeiten-simatic-s5-2.html#post199018

Laut:
[url]http://www.sps-programm.info/zeit-s5-verlaengerter-impuls

auch


[/URL]
 
SV <Zeit>
[...]
Wechselt das VKE von "0" auf "1", bevor die programmierte Zeit abgelaufen ist, wird die programmierte Zeitdauer neu gestartet.
Ich kenne keine S5-Dokumentation welche diesen Satz enthält. Das Gerätehandbuch der S5-115U enthält diesen Satz ebenfalls nicht, und auch keine andere diesbezügliche explizite Erklärung oder Diagramm. Allerdings enthält "Die Zeit wird bei steigender Flanke des VKE gestartet" diese Aussage implizit.

Ob das Rücksetzen eines noch nicht abgelaufenen SV funktioniert spielt hier aber keine Rolle - der FC0 wird nur aufgerufen, wenn der Timer abgelaufen ist. Dazwischen wird der Timer gar nicht aufgerufen, sondern nur abgefragt:
A M 146.0 // FREIGABE NW 33
AN M 141.0 // ZEIT NICHT ABGELAUFEN
AN T 70 // UEBERWACHUNGSTIMER

JCN X024

CALL FC 0 // TIMER STARTEN
( _TIME := T 70
, CNT := MW 10
, WERT := DBW 140
, RDY := M 141.0
);

Harald
 
Zuletzt bearbeitet:
Zurück
Oben