SCL -Arrays mit einander vergleichen

An den FC10 mußt du dann auch einen Any als pVariablenname ranschreiben, der sieht anders aus, lies doch mal in der Foren-FAQ oder in der Siemenshilfe zum Typ Any nach!

"P#DB10.DBX2.0 Byte 20" z.Bsp. Du kannst auch mal versuchen, dein im DB definiertes Array Symbolisch an pVariablenname zu schreiben, also mit dem Symbolnamen des DB und dem Namen des Array in dem DB!
 
So aslo habe mich jetzt übers Wochenende mit zeiger in AWl eingearbeitet. da verstehte ich das Grundgerüst besser.

Jetzt versuche ich das langsam in SCl übersetzen nur ich komme schon nicht bei der eingabe der dbnr weiter...

Hier mal der code dazu
Code:
VAR_INPUT
    x : INT;
END_VAR
VAR_OUTPUT
    DBNR: INT;
END_VAR
VAR_TEMP
    // temporäre Variablen
MYPOINTER : ANY;
AnyPointer AT MYPOINTER: STRUCT
                        ID :  BYTE;
                        TYP   :  BYTE;
                        ANZ   :  WORD;
                        DBNR  :  WORD;
                        BZ    : DWORD;
                        END_STRUCT;            
END_VAR
BEGIN
MYPOINTER := x;
DBNR := WORD_TO_INT(AnyPointer.DBNR);
END_FUNCTION_block

das Problem ist nur wenn ich das im Debug modus durchlaufen lasse. Nimmt er Kommt bei DBNR nicht der Wert den ich bei x eingebe.

kann mir jemand sagen was ich da falsch mache.
 
was mir selber schon aufgefallen ist das, ich beim OB1 den Aufruf mache Call fb650,db65

und bei dem DBNR immer 65 raus kommt. Das heißt ja somit das er immer die Nummer des Instanzdaten Db nimmt was ich aber nicht will.

wenn ich jetzt mehere daten habe und einmal sollen sie im db10 und das andere mal in db11 gespeichert werden somit müsste ich das doch über die Variable 'x' machen können.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Matthias,
ich hatte dir das ANY-Pointer -Beispiel genannt, weil ich gedacht hatte, dass du etwas damit anfangen kannst.
Ein ANY-Pointer ist von der Systematik her die Angabe eines Speicher-Bereichs und deren Länge (falls gewünscht).

Wenn du in deinem Fall die DB-Nr. aus "x" einlesen willst, dann muss x der ANY-Pointer sein, den du dann zerlegst. Also so :
Code:
VAR_INPUT
    x : [COLOR=red]ANY[/COLOR];
 [COLOR=red]  AnyPointer AT x : STRUCT
                        ID :  BYTE;
                        TYP   :  BYTE;
                        ANZ   :  WORD;
                        DBNR  :  WORD;
                        BZ    : DWORD;
                        END_STRUCT;[/COLOR]            
END_VAR
VAR_OUTPUT
    DBNR: INT;
END_VAR
VAR_TEMP
    // temporäre Variablen
END_VAR
BEGIN
   DBNR := WORD_TO_INT(AnyPointer.DBNR);
END_FUNCTION_block

Beim Aufruf des Bausteinstein schreibst du dann als Datensatz an x :
Code:
   call FB10
       x := p#DB10.DBX0.0 
       DBNR := MW10
In MW10 sollte nun "10" stehen ...

Gruß
LL
 
Danke schonmal das funktioniert aber ich muss echt sagen das ich noch ziemlich probleme mit SCL habe.

wie kann ich z.b ein Eingangswort einlesenß bei AWl geht es ja einfach

L EW XX

aber wie geht das bei SCl?
 
:confused: im Prinzip genauso ...
Code:
myVar := EW10 ;
Es empfiehlt sich aber nicht, mit absoluter Adressierung zu arbeiten ...

Und ... wenn dir noch etwas unklar ist ... IMMER fragen ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja eigentlich darf ich da dazu gar nichts sagen... ist ja eigentlich logisch. Aber da ich bei SCL noch net so logisch denken kann wie bei AWl ist das, dass problem..

Ich probiere mal ob ich so weiter komme.

Danke
 
Code:
L #ZAE1;             //Lade Speicherstelle
SLW 3;                         //Schalterstellung in BYTE Adressieren
T #ADRZ;                      //Transferie in Adressregister
U #Z_1;
FP #FO1;
SPBNB M001;                
L #XW_E;                    //lade Einzulesender Wert
T DBW [#ADRZ];           
L #ZAE1;                     //alte Speicherstelle
+ 2;                            //erhöhe die Speicherstelle um 2
T #ZAE1;                     //neue Speicherstelle
L #ZAE3;                     //lade Anzahl einzulesende/auszulesende Stellen
+ 1;                            //erhöhe um 1
T #ZAE3;                    //Transferiere
L #LAE;                     //Lade maximale Anzahl der Speicherstellen
L -1;                        //Lade -1
+I;                            //Addiere -1 von alten Wert
L 2;                           //L 2
*I ;                          //Multipliziere LAE um den Faktor 2
L #ZAE1;                   //Lade Speicherstelle ZAE1
TAK;                         
>I;                             
Spbn M001;  // Springe Bedingt zu M001 ( wenn Akku 1 nicht größer als Akku2)
L 0;   // L 0
T #ZAE1;  // Transferie '0' in den zeiger der einzulesenden Daten
M001: nop 0; // falls Sprung NOP 0 (no operation)

Das ist mal der AWl Code (Ein Teil davon) von meiner zeiger geschichte. Aber ich weiß nicht wie ich es mit SCL machen soll mit der adressvergabe und erhöhen der Adresse das er die richtige speicherstelle nimmt
 
naja ...

SCL hat eine andere Syntax, die einer Progarmmiersprache eben (in diesem Fall stark an Pascal angelehnt).

SCL ist auch nicht das Allerheilmittel - man muß schon wissen, wo es Sinn macht es einzusetzen. Ganz generell würde ich sagen immer dann, wenn man mit Schleifen oder komplizierten Berechnung arbeitet. Hier wird die Lesbarkeit des Codes (nicht der übersetzte AWL-Code sondern der SCL-Code) doch ganz erheblich verbessert. Manche komplizierten AWL-Scripts werden in SCL ggf. zu einem übersichtlichen Dreizeiler ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst alles, was du in AWL hinbekommst auch irgendwie mit SCL machen ... manche Sachen sehen nur in SCL nicht so schön aus ... dafür dann aber andere umso schöner ...

Etwas anderes wollte ich nicht sagen ...
 
ja ich habe nie behauptet das es das dafür nicht geeignet ist. ich bekomme es nur im Mom nicht hin. leider! Aber ich gebe die hoffnung nicht auf.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja ich habe nie behauptet das es das dafür nicht geeignet ist. ich bekomme es nur im Mom nicht hin...

Wo hängst du denn gerade ...
Oder anders ... was ist das Problem ...?
Du must schon gezielt fragen ... nicht nach dem Motto "ich kriege es nicht hin - kann es vielleicht einer von euch gerade bauen ..."

Gruß
LL
 
Es gibt da wäre man am liebsten gar nicht aufgestanden!

Ich muss nochmal zu meinem ursprünglichen problem zurück kommen.

Da es sich jetzt herausgestellt hat das man es nicht über eine for schleife machen kann wegen Zykluszeit.

jetzt soll ich es über eine if abfrage mache die auch die arrays einzel abfrägt. mal schauen was dabei raus komtm

hier mal der 1.te Versuch:

Code:
FUNCTION_BLOCK FB1
VAR_INPUT   
   Wert1 : ARRAY [1..32] OF BOOL;
   Wert2 : ARRAY [1..32] OF BOOL;
    F2 : BOOL;
END_VAR
VAR_OUTPUT
    erg: BOOL;
    Berechnung: BOOL;
END_VAR
VAR
 edge : BOOL := 0;
 ix : INT;
 FP: BOOL;
END_VAR
BEGIN

  FP := NOT(F2) AND Edge;       //F_Trig Funktion   
  edge := F2;                   //F_Tric Funktion

IF FP THEN
    IF wert1[ix] <> wert2[ix] then 
       ix := ix +1;
       erg := TRUE;
    ELSE
        erg := FALSE;
    END_IF;
END_IF;
END_FUNCTION_BLOCK
 
Zuletzt bearbeitet:
und ... sollte doch funktionieren ... oder nicht ?

Wo bekommst du ein Problem mit der Zykluszeit ? Wenn du eine FOR..TO-Schleife über 32 Elemente laufen läßt ganz sicher nicht ...

Willst du nur Bit-Array's mit 32 Elementen überprüfen ?
Wenn ja, dann könntest du dir die Sache auch noch einfacher machen ...
Code:
FUNCTION_BLOCK FB1
VAR_INPUT   
   Wert1 : ARRAY [1..32] OF BOOL;
      dw_Wert1 at Wert1 : dword ;
   Wert2 : ARRAY [1..32] OF BOOL;
      dw_Wert2 at Wert2 : dword ;
    F2 : BOOL;
END_VAR
VAR_OUTPUT
    erg: BOOL;
    Berechnung: BOOL;
END_VAR
VAR
 edge : BOOL := 0;
 ix : INT;
 FP: BOOL;
END_VAR
BEGIN
 
IF F2 and not Edge THEN
    dw_wert1 <> dw_wert2 then 
       erg := TRUE;
    ELSE
        erg := FALSE;
    END_IF;
END_IF;
edge := F2;                   //F_Tric Funktion
 
END_FUNCTION_BLOCK
 
Zurück
Oben