TIA CPU Fehlerwoher?

Frank_the_Tank

Level-1
Beiträge
29
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Morgen,

ich habe beim Tia Portal V12 das Problem das die Steuerung bei der Bearbeitung dieses Textes in den Stopp geht, wisst Ihr eventuell wo hier der Fehler liegt?

Danke für die Hilfe!

MfG Frank

Temporärer CPU-Fehler: Ausrichtungsfehler in FC 5
betrifft OB 1 Ausführung
Lesezugriff Gepufferter DB-Bereich
fehlerhafte Adresse, Operand ersetzt

|> Bearbeitung wird fortgesetzt (keine OB-Bearbeitung)

|> HW_ID= 52
interne Adressierungsdetails: Caddr=16#00002310, Bereich: DB 17

Code:
       Bool                                           Byte                                                   Byte

  "Sonstiges"."Endschalter fehlt"[0]:="Ketten DB 7"."Endschalter Aktuell".X0<>"Ketten DB 7"."Endschalter Endlage"["I"].X0;
  "Sonstiges"."Endschalter fehlt"[1]:="Ketten DB 7"."Endschalter Aktuell".X1<>"Ketten DB 7"."Endschalter Endlage"["I"].X1;
  "Sonstiges"."Endschalter fehlt"[2]:="Ketten DB 7"."Endschalter Aktuell".X2<>"Ketten DB 7"."Endschalter Endlage"["I"].X2;
  "Sonstiges"."Endschalter fehlt"[3]:="Ketten DB 7"."Endschalter Aktuell".X3<>"Ketten DB 7"."Endschalter Endlage"["I"].X3;
  "Sonstiges"."Endschalter fehlt"[4]:="Ketten DB 7"."Endschalter Aktuell".X4<>"Ketten DB 7"."Endschalter Endlage"["I"].X4;
  "Sonstiges"."Endschalter fehlt"[5]:="Ketten DB 7"."Endschalter Aktuell".X5<>"Ketten DB 7"."Endschalter Endlage"["I"].X5;
 
<> Vergleicher Ungleich.... du vergleichst zwei Bools miteinander (nicht zwei Bytes). Das geht nicht!

EXKLUSIV-ODER-Verknpüfung (XOR) wäre für dich sicherlich das richtige...
 
Zuletzt bearbeitet:
Mit XOR geht es auch nicht, ist auch nur für BOOL Format.

Und was ist das? :

Code:
:="Ketten DB 7"."Endschalter Aktuell".[COLOR=#ff0000][B]X0[/B][/COLOR]

für mich ein Bool (Slice-Zugriff auf das erste Bit des Bytes "Endschalter Akutell"). Du hast jedoch im ersten Beitrag geschrieben, dass das ein Byte ist.


Hilfreich wäre es noch zu wissen, ob du mit optimierten oder standard Bausteinen arbeitest...
 
In dem Byte sind die Zustande der Endschalter abgeleht und ich möchte vergleichen ob der abgelegte Zustand gleich dem Aktuellen ist.

Was sind optimierte Bausteine?

MfG
 
Ob X0 wirklich ein Bool oder nicht doch ein Byte oder was ganz anderes ist kann man überhaupt nicht erkennen, da X0, X1, ... auch erlaubte Variablenbezeichnungen sind.
Code:
#bool1 := "GlobalDb".data[0].X0.X0 <> "GlobalDb".data[1].X0.X0;
#bool1 := "GlobalDb".data[0].X0 <> "GlobalDb".data[1].X0;
wäre als Beispiel durchaus möglich. Das erste X0 ist eine Variable vom Datentyp Byte, das zweite X0 ist Bit-Zugriff auf ein Bit in einem Byte.

Wenn bei ihm XOR anstelle von <> nicht funktioniert, dann ist X0 nämlich kein Bit-Zugriff auf ein Byte/Word/Dword.

Ich finde die Syntax für diese Slice-Zugriffe nicht ganz glücklich gewählt, da man eben nicht ohne den ganzen Kontext zu sehen erkennen kann, um was es sich dabei handelt.

Ich vermute aber fast dass bei ihm der Array-Zugriff mit dem Index "I" aus dem gültigen Bereich läuft.
 
Naja, oberflächlich betrachtet scheinen die Datentypen wohl zu passen, sonst würde TIA beim Übersetzen bereits meckern ...

Gemäß deiner Fehlermeldung würde ich das jetzt eher so interpretieren,
das dein Index "I" nicht ganz dem entspricht was er sollte, sprich die Zahl zu klein oder zu groß für dein festgelegtes Array ist.

Natürlich wäre XOR dennoch eine Möglichkeit, aber vermutlich keine die dein konkretes Problem behebt.
Byte_Erg := Byte_1 XOR Byte_2 ;
In Byte_Erg stehen nun also an der entsprechenden Bitposition deine Unterschiede.

@thomasv2.1
Laut S7-1200 SHB gibt es auch auf Byte/Word/Dword Basis eine AND/OR/XOR Verknüpfung.

Mfg
Manuel
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@Thomas_v2.1:
vllt hast du Recht, dass X0 seine Byte Variable ist... Dies müsste der TE nochmals mitteilen, ob dem so ist.
Mit der SLICE-Fkt müssen wir jetzt leben. Und um sich nicht selber in die Irre zu führen, sollte man deratige Variablendeklarationen meiden. Ist leider so...
Seinen Index "I" habe ich beim Überfliegen, übersehen...
Auch hier wäre es gut vom TE einen Screenshot von seinem Datenbaustein on zu stellen, damit man Einblick in seine Struktur hat, und nicht alles erraten muss.
 
Hallo,

Code:
Endschalter Endlage"["I"]
ist die Vatiable und das
Code:
.X0
ist um nur das erste Bit anzusprechen. Ist bei der Anderen Variable genau so.

MfG
 
Ums nochmal klar auf die Formel zu bringen:
Wie womit und wo bildest du den Index "I"?

P.S.
Da du es ja nicht pflegst genaue Angaben zu machen:
Ist dein TIA auf dem neuesten Stand = V12 SP1 Update 3
Gerade der SCL-Editor von TIA ist in den "älteren" Versionen immer mal wieder ziemlich Buggy an verschiedenen Stellen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry, dachte es würde der DB Reichen.
Code:
      IF "FlaÄnMerWied" THEN
        "I":=1;
      ELSE
        "Zeitmessung Start Stop":=1;
         CASE "Austausch Panel"."Kette Nr" OF
           5  ://DB1
           "Ein=EinAlt":="Ketten DB 1"."Endschalter Aktuell"="Ketten DB 1"."Endschalter Endlage"["I"];
           10 ://DB2
           "Ein=EinAlt":="Ketten DB 2"."Endschalter Aktuell"="Ketten DB 2"."Endschalter Endlage"["I"];
           15 ://DB3
           "Ein=EinAlt":="Ketten DB 3"."Endschalter Aktuell"="Ketten DB 3"."Endschalter Endlage"["I"];
           20 ://DB4
           "Ein=EinAlt":="Ketten DB 4"."Endschalter Aktuell"="Ketten DB 4"."Endschalter Endlage"["I"];
           25 ://DB5
           "Ein=EinAlt":="Ketten DB 5"."Endschalter Aktuell"="Ketten DB 5"."Endschalter Endlage"["I"];
           30 ://DB6
           "Ein=EinAlt":="Ketten DB 6"."Endschalter Aktuell"="Ketten DB 6"."Endschalter Endlage"["I"];
           35 ://DB7
           "Ein=EinAlt":="Ketten DB 7"."Endschalter Aktuell"="Ketten DB 7"."Endschalter Endlage"["I"];
           40 ://DB8
           "Ein=EinAlt":="Ketten DB 8"."Endschalter Aktuell"="Ketten DB 8"."Endschalter Endlage"["I"];
         END_CASE;
         IF "Ein=EinAlt" THEN
           CASE "Austausch Panel"."Kette Nr" OF
             5  ://DB1
             "Schrittzahl":= "Ketten DB 1".Schrittzahl;
             10 ://DB2
             "Schrittzahl":= "Ketten DB 2".Schrittzahl;
             15 ://DB3
             "Schrittzahl":= "Ketten DB 3".Schrittzahl;
             20 ://DB4
             "Schrittzahl":= "Ketten DB 4".Schrittzahl;
             25 ://DB5
             "Schrittzahl":= "Ketten DB 5".Schrittzahl;
             30 ://DB6
             "Schrittzahl":= "Ketten DB 6".Schrittzahl;
             35 ://DB7
             "Schrittzahl":= "Ketten DB 7".Schrittzahl;
             40 ://DB8
             "Schrittzahl":= "Ketten DB 8".Schrittzahl;
            END_CASE;
              IF "I"< "Schrittzahl"-1 THEN
                "I":="I"+1;
                
                "Sonstiges"."Durchlauf Merker":=0;
              ELSE
                "I":=1;
                "Sonstiges"."Durchlauf Merker":=1;
                "Zeitmessung Start Stop":=0;
                "Austausch Panel"."Benötigte Ablaufzeit":="Aktuelle Zeitmessung";
            END_IF;
         END_IF;
          IF "Wiedergabe Merker" THEN
            CASE "Austausch Panel"."Kette Nr" OF
              5  ://DB1
              "Ketten DB 1"."Endschalter Wiedergabe":="Ketten DB 1"."Zustand der Taster"["I"];
              10 ://DB2
              "Ketten DB 2"."Endschalter Wiedergabe":="Ketten DB 2"."Zustand der Taster"["I"];
              15 ://DB3
              "Ketten DB 3"."Endschalter Wiedergabe":="Ketten DB 3"."Zustand der Taster"["I"];
              20 ://DB4
              "Ketten DB 4"."Endschalter Wiedergabe":="Ketten DB 4"."Zustand der Taster"["I"];
              25 ://DB5
              "Ketten DB 5"."Endschalter Wiedergabe":="Ketten DB 5"."Zustand der Taster"["I"];
              30 ://DB6
              "Ketten DB 6"."Endschalter Wiedergabe":="Ketten DB 6"."Zustand der Taster"["I"];
              35 ://DB7
              "Ketten DB 7"."Endschalter Wiedergabe":="Ketten DB 7"."Zustand der Taster"["I"];
              40 ://DB8
              "Ketten DB 8"."Endschalter Wiedergabe":="Ketten DB 8"."Zustand der Taster"["I"];
             END_CASE;
          END_IF;
      END_IF;
END_IF;

Der Datentyp ist "INT"
Die Maximale schrittzahl steht im DB, daher dachte ich das "I" nicht größer werden kann.
 
Unbenannt.png
I ist in der Standart Variablentabelle deklariert.
Der DB Passt weil die DB Nummer vom Programm 17 ist, die Nummer die ich ihm gegeben habe ist die 7
 
Zurück
Oben