TIA Step-7 400 CPU auf TIA Portal 1500 CPU

Stefan2000

Level-2
Beiträge
34
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich habe gerade die Tolle Aufgabe ein Step-7 Projekt mit 400er Steuerung ins TIA V18 auf eine 1500er zu übertragen. Ich habe mehre Bausteine in denen
z.B. L LD 0 verwendet wird. Ich habe manche Baussteine schon mit Slicezugriffen umgesezt bekommen. Nun sitz ich vor folgendem Baustein und weis nicht wie ich das umsetzen soll. Vielleicht hat ja jemand eine Idee und kann mir weiter helfen.

Netzwerk1:

CALL "READ__CLK" //Systemzeit lesen
RET_VAL:=#fehler
CDT :=#sys_time //auf Lokalvariable
AUF DB 50
L LD 0 // Aktuelles Datum und Zeit in Chargennummer DB copieren
T DBD 4

L LD 4
T DBD 8

L #R_CH_DB_NR
T #db_nr
AUF DB [#db_nr]
L LD 0 // Aktuelles Datum und Zeit in Chargendaten DB copieren
T DBD 8

L LD 4
T DBD 12

Netzwerk2:
L LB 0 // Jahr in BCD Fromat
BTI // BCD -> Integer
T DB50.DBW 12 // Aktuelles Jahr

L LB 2 // Aktueller Tag
BTI // BCD -> Integer
T #tag
L LB 1 // Aktueller Monat
BTI // BCD -> Integer
T #monat
L 1
-I
L 50
*I
L #tag
+I
L 1000
<I // Nummer darf nicht grösser als 999 sein
SPBN NOK1
TAK
L 0
<I // Nummer darf nicht negativ sein
SPB NOK1
TAK
SPA OK1
NOK1: L 999 // Setze auf max Nummer wenn ausserhalb der erlaubten Zahlen
OK1: NOP 0
T DB50.DBW 14 // Aktuelle Tageszahl per Formel

Netzwerk3:
// Zaehler
L DB50.DBW 16
L 1
+I
L 1000
<I
TAK
SPB OK2
L 0 // Setze Zähler zurück wenn er grösser als 999 ist
OK2: T DB50.DBW 16
T #dint_speicher // Zwischenergebniss speichern
// Tageszahl
L DB50.DBW 14 // Aktuelle Tageszahl
L 1000
*D
L #dint_speicher
+D
T #dint_speicher // Zwischenergebniss speichern
// Jahreszahl
L DB50.DBW 12 // Aktuelles Jahr
L L#1000000
*D
L #dint_speicher
+D
T #dint_speicher // Zwischenergebniss speichern
// AG Nummer
L #AG_NR // AG Nummer
L 20
>I
SPB NOK3
TAK
SPA OK3
NOK3: L 0
OK3: NOP 0
L L#100000000
*D
L #dint_speicher
+D
T DB50.DBD 0 // Neue Chargennummer
L #R_CH_DB_NR
T #db_nr
AUF DB [#db_nr]
TAK
T DBD 0
 
ich habe gerade die Tolle Aufgabe ein Step-7 Projekt mit 400er Steuerung ins TIA V18 auf eine 1500er zu übertragen. Ich habe mehre Bausteine in denen
z.B. L LD 0 verwendet wird.
Und was ist jetzt dein Problem?
Weißt du nicht was LD 0 ist? Das ist eine Adresse im TEMP-Speicher.
Oder willst du diese problematischen direkt adressierten Speicherzugriffe rausschmeißen, weil du da die TEMP-Variablen im TEMP-Speicher nicht verschieben darfst?
Du könntest in TEMP z.B. eine Struktur deklarieren, die genau den empfangenen Daten entspricht und dann symbolisch auf die einzelnen Bytes der Struktur zugreifen.
Oder du durchdenkst, was der Code tut oder tun soll, und programmierst das sauber symbolisch neu, z.B. in SCL anstatt AWL.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

danke für deine Antwort. Sry ich bin leider Absolut noch kein AWL-Profi. Mein Problem ist der Datentyp Date and Time.

CALL "READ__CLK" //Systemzeit lesen
RET_VAL:=#fehler
CDT :=#sys_time

Ich kann bei CDT keine andere Struktur deklarieren.
 
Und wenn du CDT :=#sys_time als Out in deiner Bausteinschnittstelle deklarierst und dann symbolisch beim Aufruf darauf zugreifst?
 
Du hast ein S7-1500 und nicht ein S7-400.
Es gilt generell, wenn du ein Systembausteinaufruf in S7-400 hast, dann überleg welche Baustein in S7-1500 dieselbe oder ähnliche Funktion hat und verwende dies.
Dafür, nimm die RD_SYS_T aus die erweiterte Befehle für S7-1500.

Das ekstrahieren von die Einzelelemente wie Tag oder Monat geht einfach und symbolisch über die Unterelemente von den Datentyp DTL.
 
Hab es jetzt so umgesetzt. Gibt es in Zeile 20 Auch eine andere Möglichkeit mit veränderbarer DB_Nummer?


1742994926873.png1742994649257.png1742994873770.png
 
Zuletzt bearbeitet:
Ich kann bei CDT keine andere Struktur deklarieren.
Die DATE_AND_TIME-Variable in TEMP per AT mit einem Array oder einer Struktur (oder UDT) überlagern:
Code:
VAR_TEMP
  fehler : Int;
  Jahr : Int;
  Monat : Int;

  sys_time_1 : Date_And_Time;
   asys_time_1 AT sys_time_1 : Array[0..7] of Byte;
 
  sys_time_2 : Date_And_Time;
   asys_time_2 AT sys_time_2 : Struct
    BCD_Jahr : Byte;
    BCD_Monat : Byte;
    BCD_Tag : Byte;
    BCD_Stunde : Byte;
    BCD_Minute : Byte;
    BCD_Sekunde : Byte;
    BCD_MSEC12 : Byte;
    BCD_MSEC3_WT : Byte;
  END_STRUCT;
END_VAR

Dann kann man auf die Bestandteile des DATE_AND_TIME symbolisch zugreifen:
Code:
      CALL  RD_SYS_T
         date_type:=Date_And_Time
         RET_VAL :=#fehler
         OUT     :=#sys_time_1

      L     #asys_time_1[0]      //BCD_Jahr
      BTI
      T     #Jahr

      L     #asys_time_1[1]      //BCD_Monat
      ...

      CALL  RD_SYS_T
         date_type:=Date_And_Time
         RET_VAL :=#fehler
         OUT     :=#sys_time_2

      L     #asys_time_2.BCD_Jahr
      BTI
      T     #Jahr

      L     #asys_time_2.BCD_Monat
      ...

oder in SCL:
Code:
#fehler := RD_SYS_T(#sys_time_1);
#Jahr := BCD16_TO_INT( BYTE_TO_WORD(#asys_time_1[0]) );

#fehler := RD_SYS_T(#sys_time_2);
#Jahr := BCD16_TO_INT( BYTE_TO_WORD(#asys_time_2.BCD_Jahr) );


Die nächste Schweinerei sind die nur teilqualifizierten Zugriffe auf DBD xx ohne DB-Angabe.
Code:
AUF DB 50
L LD 0 // Aktuelles Datum und Zeit in Chargennummer DB copieren
T DBD 4

L LD 4
T DBD 8
in AWL nimm dafür besser MOVE oder MOVE_BLK
in SCL:
Code:
"DB50".DAT_Var_1 := #sys_time_1;

Zumindest am Ende des Netzwerk 3 wird es schwierig, das sauber zu programmieren, insbesondere in SCL:
Code:
AUF DB [#db_nr]
TAK
T DBD 0
Du solltest wirklich nicht versuchen, den S7-400-AWL-Code "sklavisch" irgendwie in S7-1500 zu übersetzen.
Besser komplett neu in SCL und vollsymbolisch programmieren.

PS: Und z.B. drüber nachdenken, ob du nun DTL oder weiter DATE_AND_TIME verwendest, zumal du anscheinend viele DATE_AND_TIME-Variablen in DB hast, die nicht einfach auf DTL geändert werden können, durch die vielen direkten absoluten Adressierungen.
 
Danke für deine Hilfe. Alles neu Programmieren würde natürlich am meisten Sinn ergeben. Eventuell werde ich das so auch angehen.
Auf die Zukunft betrachtet macht das nur Sinn. AWL ist altertümlich und haben auch nur die älteren Hasen wirklich gemacht.. selbst vor 10+ Jahren war zumindest bei mir/uns AWL keinerlei aktuelles Thema mehr.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Im Molkerei- und Brauerreibereich leider schon 😥
da bist du mit einer mit AWL programmierten S7-400 ja schon richtig modern ;)
Ich kenne Molkereien mit S5, die nach der Wiedervereinigung aus DE West nach DE Ost verlegt wurden, und vor 10 Jahren weiter nach Polen oder Litauen. Da stand auf den HMI Panels noch COROS drauf :cool:
 
Zurück
Oben