Step 7 Ein Array of Char im DB suchen und kopieren

Zuviel Werbung?
-> Hier kostenlos registrieren
Servus,

Ihr habt recht, das war falsch.

Aber die CPU geht immer noch in den Stopp.

Hier sagt die Diagnose, es fehlt der DB4098.

1733483682275.png


1733483718975.png


Wenn ich sage "Gehe zu" springt er zu der Stelle, die ich mit dem Pfeil markiert habe.

1733484105670.png


Wenn ich das Wort "Teil" wieder einfüge und übersetzte dann gibt es den Fehler, dass der Punkt unzulässig ist

1733484341945.png

Der erste Vergleich (siehe Pfeil) passt noch, dann ist die CPU im Stopp.

1733484710423.png
 

Anhänge

  • 1733484068048.png
    1733484068048.png
    42,5 KB · Aufrufe: 3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo MFreiberger,

Danke für deine Antwort und Hilfe.

In diesem Projekt gibt es keine 4000er-Datenbausteine. Ich glaube nicht, dass es an dem Simulator liegt.

Es gibt eine neue Erkenntnis. Er macht den Vergleich komplett und findet im QuellDB die richtige Position.

Fundstelle 3 ist richtig.



1733485875283.png

Ich glaube (leider) dass diese Zeile den Fehler verursacht und dass dabei der Wert 4098 ensteht.
ZielDB := tmpQuellDaten[Fundstelle];

Kann das möglich sein?
 
Möglich ist alles, wir kennen den Rest der Anlage ja nicht.

Welche Datenstruktur steht denn an der Stelle 3 deines Arrays?

Aber eigentlich sollte er an der Stelle nur das Element an der vierten Stelle (Stelle 3) deines Arrays an die Bausteinschnittstelle übergeben. Und da hast du ja dann ein Ziel hinterlegt. Warum hast du ZielDB als InOut deklariert? Greifst du darauf lesend zu?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Also ich habe die ganze Zeit mit dem Simulator gearbeitet.

OB 1 und da rufe ich den FC auf. Die beiden DBs 1222 und 2388 habe ich auch geladen und das wars.
Dann noch eine Variable Tabelle.


1733498248923.png
Aktueller Stand.

Code:
FUNCTION X_FC2396_Code_suchen_2 : VOID
TITLE = 'Suche'
//
// Baustein-Kommentar ...
//
VERSION : '1.0'
AUTHOR  : author
NAME    : name
FAMILY  : family

// Bausteinparameter
VAR_INPUT
    Start_suchen           : BOOL;                  // Trigger Signal
    PrCode                 : ARRAY[1..12] OF CHAR;               
END_VAR

VAR_IN_OUT
    // Durchgangsparameter
     QuellDaten             : ARRAY[1..127] OF "S_UDT_1203_TYP_ANLAGE";
     ZielDB                 : ANY;
    
END_VAR

VAR_OUTPUT
    // Ausgangsparameter
    PrCode_gefunden        : BOOL;    // Prägecode im Datenbaustein gefunden BT wird ausgeschleusst
    Fundstelle             : INT;     // An welcher Stelle wurde der Code gefunden. Schleifenwert 
    Done                   : BOOL;    // DB durchsucht und kein Prägecode gefunden
      
END_VAR

VAR_TEMP
    // temporäre Variablen
       i                   : INT;
       tmpQuellDaten       : ARRAY[1..127] OF "S_UDT_1203_TYP_ANLAGE";
            
END_VAR

BEGIN

tmpQuellDaten := QuellDaten;

PrCode_gefunden := FALSE;
Fundstelle := 0;
Done := FALSE;

IF Start_suchen THEN
        
   FOR i := 1 TO 127 DO           
        IF tmpQuellDaten[i].x27MS01.PraegeCode[1] = PrCode[1] THEN
            IF tmpQuellDaten[i].x27MS01.PraegeCode[2] = PrCode[2] THEN
                IF tmpQuellDaten[i].x27MS01.PraegeCode[3] = PrCode[3] THEN
                    IF tmpQuellDaten[i].x27MS01.PraegeCode[4] = PrCode[4] THEN
                        IF  tmpQuellDaten[i].x27MS01.PraegeCode[5] = PrCode[5] THEN
                            IF tmpQuellDaten[i].x27MS01.PraegeCode[6] = PrCode[6] THEN
                                IF  tmpQuellDaten[i].x27MS01.PraegeCode[7] = PrCode[7] THEN
                                    IF tmpQuellDaten[i].x27MS01.PraegeCode[8] = PrCode[8] THEN

                                        PrCode_gefunden := True;
                                        Fundstelle := i;
                                        ZielDB := tmpQuellDaten[Fundstelle];
                                        EXIT;
                                        
                                    END_IF;
                                END_IF;
                            END_IF;
                        END_IF;
                    END_IF;
                END_IF;
            END_IF;
        END_IF;
    END_FOR;
        Done := NOT PrCode_gefunden;
END_IF;

END_FUNCTION

Die Fundstelle für die 3

1733498763555.png

@ Januar
Genau man muss lesend drauf zugreifen können. Hier der ZielDB gleiches UDT.

1733499116864.png

Nur zur Info wie ich begonnen habe in KOP zum Testen.
Wie man sieht sind die Zugriffsbreiten identisch.

1733499834256.png

Hier noch der Ausschnitt vom UDT


1733500264629.png

Ich hoffe ich habe nichts vergessen.

Wenn ein UDT in einem anderen UDT aufgerufen wird sollte keine Rolle spielen da ich ja von Adresse zu Adresse kopiere oder ??

Vielen Dank für Eure Hilfe.
 
Servus Circlehook,

Ich denke es ist besser ich stelle das Projekt von der Simulation zur Verfügung.
So kann man das besser beurteilen.

Vielen Dank für deine Unterstützung.

Grüße Tommylik
 

Anhänge

Habs mir nochmal angesehen.

Der Parameter "ZielDB" hatte den falschen Datentyp.
Dieser muss den gleichen UDT haben wie der Array of UDT und nicht vom Typ ANY.
Deswegen auch der Zeiger auf einen DB, den es nicht gibt.

Außerdem hab ich nochmal das mit den temporären Daten gelassen, da der UDT doch nicht so klein ist.

Anbei noch der neue SCL Code.

Code:
FUNCTION X_FC2396_Code_suchen_2 : VOID
TITLE = 'Suche'
//
// Baustein-Kommentar ...
//
VERSION : '1.0'
AUTHOR  : author
NAME    : name
FAMILY  : family

// Bausteinparameter
VAR_INPUT
    Start_suchen           : BOOL;                  // Trigger Signal
    PrCode                 : ARRAY[1..12] OF CHAR;               
END_VAR

VAR_IN_OUT
    // Durchgangsparameter
     QuellDaten             : ARRAY[1..127] OF "S_UDT_1203_TYP_ANLAGE";
     ZielDB                 : "S_UDT_1203_TYP_ANLAGE";
    
END_VAR

VAR_OUTPUT
    // Ausgangsparameter
    PrCode_gefunden        : BOOL;    // Prägecode im Datenbaustein gefunden BT wird ausgeschleusst
    Fundstelle             : INT;     // An welcher Stelle wurde der Code gefunden. Schleifenwert 
    Done                   : BOOL;    // DB durchsucht und kein Prägecode gefunden
      
END_VAR

VAR_TEMP
    // temporäre Variablen
       i                   : INT;
            
END_VAR

BEGIN

PrCode_gefunden := FALSE;
Fundstelle := 0;
Done := FALSE;

IF Start_suchen THEN
        
   FOR i := 1 TO 127 DO           
        IF QuellDaten[i].x27MS01.PraegeCode[1] = PrCode[1] THEN
            IF QuellDaten[i].x27MS01.PraegeCode[2] = PrCode[2] THEN
                IF QuellDaten[i].x27MS01.PraegeCode[3] = PrCode[3] THEN
                    IF QuellDaten[i].x27MS01.PraegeCode[4] = PrCode[4] THEN
                        IF  QuellDaten[i].x27MS01.PraegeCode[5] = PrCode[5] THEN
                            IF QuellDaten[i].x27MS01.PraegeCode[6] = PrCode[6] THEN
                                IF  QuellDaten[i].x27MS01.PraegeCode[7] = PrCode[7] THEN
                                    IF QuellDaten[i].x27MS01.PraegeCode[8] = PrCode[8] THEN

                                        PrCode_gefunden := True;
                                        Fundstelle := i;
                                        ZielDB := QuellDaten[Fundstelle];
                                        EXIT;
                                        
                                    END_IF;
                                END_IF;
                            END_IF;
                        END_IF;
                    END_IF;
                END_IF;
            END_IF;
        END_IF;
    END_FOR;
        Done := NOT PrCode_gefunden;
END_IF;

END_FUNCTION
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus circlehook,

Super, vielen Dank für deine tolle Hilfe und den Code. Auch vielen Dank an alle anderen.
Es war schön zu beobachten, dass die CPU nicht in den Stopp ging.

Eine Frage hätte ich noch, wegen der symbolischen Programmierung (siehe rote Markierung),
kann ich diesen FC ohne Änderung nicht für etwas anderes verwenden. Z.B. eine andere Station.
Symbolisch Programmieren ist gut, aber wenn man eine Funktionalität öfters braucht, dann ungünstig.

1733735239134.png

Falls das ein zu großer Aufwand wäre, dann erstelle ich mir lieber Kopien und ändere die Namen.

Also nochmals vielen Dank und ich wünsche dir und auch allen anderen fröhliche Weihnachten und einen guten Rutsch ins neue Jahr.

Grüße, Tommylik
 
Zurück
Oben