SCL code

awl-scl

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo leute,ich habe ein probleme mit umsetzung ein code von AWL zu SCL ,hier ist ein teil von awl code :
TAR1 #AR1_Speicher
AUF #Data_block_DB
LAR1 P##Record // Anfangsadresse des Anyponters laden
//Sprungverteiler PPO-Typ
L DBW 60
// L 1
// ==I
// SPB PPE1
// TAK
L 2
==I
SPB M001
// TAK
// L 3
// ==I
// SPB PPE3
TAK
L 4
==I
SPB M002
TAK
L 5
==I
SPB M003
BEA
L 4 // Laenge (Wiederholfaktor) 12 Bytes
T LW [AR1,P#2.0]
L P#DBX 38.0 // Anfang Speicherbereich Adresse 30
T LD [AR1,P#6.0]
SPA M004
M001: L 12 // Laenge (Wiederholfaktor) 20 Bytes
T LW [AR1,P#2.0]
L P#DBX 38.0 // Anfang Speicherbereich Adresse 30
T LD [AR1,P#6.0]
SPA M004
L 4 // Laenge (Wiederholfaktor) 4 Bytes
T LW [AR1,P#2.0]
L P#DBX 38.0 // Anfang Speicherbereich Adresse 38
T LD [AR1,P#6.0]
SPA M004
M002: L 12 // Laenge (Wiederholfaktor) 12 Bytes
T LW [AR1,P#2.0]
L P#DBX 38.0 // Anfang Speicherbereich Adresse 38
T LD [AR1,P#6.0]
SPA M004
M003: L 20 // Laenge (Wiederholfaktor) 28 Bytes
T LW [AR1,P#2.0]
L P#DBX 38.0 // Anfang Speicherbereich Adresse 30
T LD [AR1,P#6.0]
M004: NOP 0
L W#16#1002 // Byte 0 fuer S7, Byte 1 Datentyp
T LW [AR1,P#0.0]
L DBNO // DB Nummer
T LW [AR1,P#4.0]
L #Adress_Drive
T #Adresse_Antrieb_Wort
CALL "DPRD_DAT"
LADDR :=#Adresse_Antrieb_Wort
RET_VAL:=#RET_VAL_SFC_14
RECORD :=#Record

kann jemand mich veilleicht weiter helfen,
danke.
 
hallo leute,ich habe ein probleme mit umsetzung ein code von AWL zu SCL

kann jemand mich veilleicht weiter helfen

Mit was hast du denn da probleme, bzw. was verstehst du nicht.

Weist du nicht was das bedeutet, weist du nicht wie man es übersetzt oder willst du dir einfach nur die arbeit sparen:cool: ???
 
Zuviel Werbung?
-> Hier kostenlos registrieren
zu scl code

ich habe den code nicht so ganz verstanden,und muss unbedingt das in SCL umsetzen,mir dem zeit ist auch richtig herr MW,mir dringt der Zeit und möchte dass jemand mich helft.
danke noch mal
 
Hallo,
nach meiner bisherigen Erfahrung ist es Unsinn ein AWL-Programm direkt in SCL übersetzen zu wollen.
In dem von dir eingestelltem Teil-Code wird m.E. tatsächlich ein Pointer zerlegt.
Ich würde beim Erstellen von SCL-Programmen grundsätzlich von der Aufgabenstellung her vorgehen und versuchen diese Dinge mittels des SCL-Befehlssatzes zu realisieren.
Vielleicht fängst du mal so an und beschreibst, was du vorhast oder das Programm letztendlich leisten soll. Dann kommen wir vielleicht weiter ...

Gruß
LL
 
Larry hat Recht. Beschreibe mal wie die Daten abgelegt sind, die sich hinter dem ANY-Pointer verbergen (UDT, STRUCT, ARRAY). Das was als Sprungverteiler bezeichnet ist, kannst du mit einer case-Anweisung umsetzen. Mit dem Adressregistern direkt rumwurschteln, ist dir unter SCL vergönnt.


Gruß, Onkel
 
... ist ja lustig.
Und der Schluß-Beitrag, auf den dann keine Antwort mehr kam, ähnelt doch sehr dem von mir.
Ist dann hier jetzt auch Schluß ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... keine weiteren Fragen mehr - von meiner Seite ...

Moment - eine hab ich noch :
Kann mir mal einer erklären, warum immer wieder Leute in ihren Step7-Programmen den Timer 14 verwenden obwohl man doch genauso gut den Timer 27 nehmen könnte ?
...
Nur so am Rande ...
 
Hi


Fragedatum o.g. Beitrags ist der:
10.12.2007, 17:51


4 Wochen später hat er keine Zeit mehr ?


O.K! War Weihnachen dazwischen, ziehen wir 1 Tage ab :twisted:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wir haben ja ein schönes Motto im Forum (s.o.) und mich interessiert es mal. Folgender Vorschlag, das Ganze ohne Gewähr, ich hab weder die Lust, noch die Möglichkeit, den Code zu testen, übersetzen läßt er sich so jedenfalls.

Code:
FUNCTION FC100 : INT

VAR_INPUT
  Data_DB: Block_DB;       
  Adresse_Drive: WORD;   //Adresse des Antriebes (Z.Bsp. W#16#12C für 300)
END_VAR    

VAR_TEMP
    Quelle: Any;
    QuellPointer AT Quelle : STRUCT
                                bySyntaxID : BYTE;
                                byDatentyp : BYTE;
                                iLaenge : INT;
                                idb_Nummer : INT;
                                dwPointer : DWORD;
                            END_STRUCT;
    PPO_TYP: INT; 
    Laenge: INT;
    ErrorNr: INT;
    RET_VAL_SFC_14: INT;
    DBNr: INT;
END_VAR

    // Anweisungsteil
    DBNr := WORD_TO_INT(BLOCK_DB_TO_WORD(Data_DB));
    PPO_Typ := WORD_TO_INT(Data_DB.DW60);
//oder so:  PPO_Typ := WORD_TO_INT(WORD_TO_BLOCK_DB(BLOCK_DB_TO_WORD(Data_DB)).DW60);    
    ErrorNr := 0;
    
    CASE PPO_Typ OF
        2 : Laenge := 12;  // Laenge (Wiederholfaktor) 20 Bytes ?????????
        4 : Laenge := 12;  // Laenge (Wiederholfaktor) 12 Bytes ?????????
        5 : Laenge := 20;  // Laenge (Wiederholfaktor) 28 Bytes ?????????
    ELSE:
        ErrorNr := 1;
        Laenge := 0;
    END_CASE;

     QuellPointer.bySyntaxID    := b#16#10; 
     QuellPointer.byDatentyp    := b#16#4;
     QuellPointer.iLaenge       := Laenge;
     QuellPointer.idb_Nummer    := DBNr;
     QuellPointer.dwPointer     := SHL (IN := INT_TO_DWORD(38), N := 3); 
     
     
    IF ErrorNr = 0 THEN
       RET_VAL_SFC_14 := DPRD_DAT(LADDR :=  Adresse_Drive, // IN: WORD
                                   RECORD := Quelle // OUT: ANY
                                   ); // INT
       ErrorNr := RET_VAL_SFC_14; 
    END_IF;
       
    FC100 := ErrorNr;
END_FUNCTION
Die Angaben in der Case-Anweisung habe ich dem AWL-Code entnommen, irgendwie scheint das jedenfalls nicht zu passen, wenn man die Byteangaben im Kommentar ansieht. Also solltest du für die PPO-Typen mal nachschlagen, wie lang denn die Datenpakete wirklich sind.
 
Zuletzt bearbeitet:
hat sich doch jemand 'dummes' gefunden?

du bist ja auf dem besten wege zu 'kairalle'. es fehlt aber noch das gezippte projekt und die pdf :ROFLMAO:

willst wohl unbedingt user2007 werden. würdest du aber ohne.... ;)

edit
ok. ich halte dir zu gute, dass du wissbegierig bist und selbst keine zeit zum testen hast.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ralle

Wo ist der Rest des Programms. ?
Das von dir ist nur ein kleiner Teil.
Hab mal das komplette angehängt. :ROFLMAO:
(Funktion.zib)



LOB Ralle, der SCL-Code schaut optisch recht "Passabel" aus. :s12:
 

Anhänge

  • FUNCTION.zip
    11,6 KB · Aufrufe: 26
RND+ und NEGI in SCL

hallo leute,hat jemand vielleicht ein idee wie kann ich die befehl (RND+ )und (NEGI )in scl umsetzen.


beispiel in meine programme :




L DBD 196;
SPA M010;

M010: L DBD 62;
/R ;
L 1.638400e+004;
*R ;
RND+ ;
UN #REV;
O #WR_VU;
SPB M032;
NEGI ;
M032: NOP 0;
T DBW 10;



danke im voraus
 
Also da hier offensichtlich ein Drezahl / Drehmomentsollwert gebildet wird,
denke ich nicht, das es auf das RND+ so ankommt.
Ein einfaches RND welches in SCL Round heißt sollte es auch tun.
Sollte das + hinter dem RND wirklich sooo wichtig sein,
dann entspräche das einem TRUNC + 1, bei Zahlen größer 0.

Zum Befehl NEGI, die Antwort steht in der Hilfe zu NEGI.
Die Operation 2-Komplement Ganzzahl entspricht einer Multiplikation mit "-1".

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
AWL

RND+ (Umwandlung einer Gleitpunktzahl, 32 Bit, IEEE-FP, in eine Ganzzahl, 32 Bit) wertet den Inhalt von AKKU 1 als eine Gleitpunktzahl (32 Bit, IEEE-FP) aus. Die Operation wandelt die Gleitpunktzahl (32 Bit, IEEE-FP) in eine Ganzzahl (32 Bit) um und rundet das Ergebnis zur kleinsten ganzen Zahl, die größer oder gleich der umgewandelten Gleitpunktzahl ist (IEEE-Rundungsmodus "Round to +infinity"). Liegt die Zahl außerhalb des zulässigen Bereichs, werden die Statusbits OV und OS auf "1" gesetzt. Das Ergebnis wird in AKKU 1 gespeichert.

Tritt ein Fehler auf (Vorliegen einer NaN oder einer Gleitpunktzahl, die nicht als Ganzzahl, 32 Bit, dargestellt werden kann), wird die Umwandlung nicht ausgeführt, sondern Überlauf angezeigt.

MD10 = "100.5" => RND+ => MD20 = "+101"
MD10 = "-100.5" => RND+ => MD20 = "-100"

SCL

ROUND
REAL
DINT
Runden (Bilden einer DINT-Zahl).

Gemäß DIN EN 61131-3 wird immer zum nächsten geraden Integer-Wert hin gerundet, d.h. 1.5 wird nach 2 gerundet, 2.5 wird ebenfalls nach 2 gerundet.

TRUNC
REAL
DINT
Abschneiden (Bilden einer DINT-Zahl)






Hinweis

Sie haben außerdem die Möglichkeit, weitere IEC-Funktionen zur Datentyp-Konvertierung zu nutzen. Informationen zu den einzelnen Funktionen finden Sie im STEP 7-Referenzhandbuch "System- und Standarfunktionen für S7-300/400".



Beispiel

// Hier wird abgerundet (Ergebnis: 3)
ROUND (3.14) ;

// Hier wird aufgerundet (Ergebnis: 4)
ROUND (3.56) ;

// Hier wird abgeschnitten (Ergebnis: 3)
TRUNC (3.14) ;

// Hier wird abgeschnitten (Ergebnis: 3)
TRUNC (3.56) ;

Also RND+ rundet immer auf. In SCL würde ich TRUNC nehmen (schneidet ab) und bei Real-Ausgangszahlen größer Null Eins dazu addieren.

Code:
    IF rZahl > 0 THEN
        diZahl := TRUNC(rZahl) + 1;
    ELSE
        diZahl := TRUNC(rZahl);
    END_IF;

AWL

NEGI (2-Komplement Ganzzahl, 16 Bit) bildet das Zweierkomplement des 16-Bit-Wertes in AKKU1-L. Beim Bilden des Zweierkomplements werden die einzelnen Bits umgekehrt, d. h. die Nullen werden durch Einsen ersetzt und die Einsen durch Nullen. Dann wird eine "1" addiert. Das Ergebnis wird in AKKU1-L gespeichert. Die Operation 2-Komplement Ganzzahl entspricht einer Multiplikation mit "-1". Die Statusbits A1, A0, OS und OV werden als Ergebnis der Operation gesetzt.

Also in SCL:

Code:
iZahl_Negi := iZahl * (-1);

Aber mal ehrlich, das habe ich alles aus der Online-Hilfe von Step7 (einmal AWL und dann SCL) zusammengesucht!
 
@MSB

Dar hab ich doch glatt zu lange am Outfit rumgefeilt, aber sieh mal, unser Ergebnis ist identisch :ROFLMAO: !
 
NOP in SCL

Hallo leute,habe eigentlich 2 bis 3 fragen :
L 0;
T LW 3;

L DBW 38;
T LW 3;
habe das in SCL so geschrieben :
Data_block_DB.LW3 := 0;
Data_block_DB.LW3:= Data_block_DB.DW38 ;der compiler sagt(Die angegebene Bitnummer ist semantisch nicht korrekt. Als Bitnummer sind nur ganze Zahlen zwischen 0 und 7 zulässig.)

zu NOP :
wie kann ich das in scl programmieren :als BS aus m programme :
M010: L DBD 62;
/R ;
L 1.638400e+004;
*R ;
RND+ ;
UN #REV;
O #WR_VU;
SPB M032;
NEGI ;
M032: NOP 0;
T DBW 10;

danke im voraus

Gruss
 
Zurück
Oben