An FB übergebene INT-Variable als Array-Index nutzen

Gordon S

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo allerseits,

für Euch alte Hasen sicherlich PillePalle, mich treibt's zum Wahnsinn:

Ich möchte an einen FB zwei Integervariablen übergeben: "Index" und "Wert". Innerhalb des FB soll dann der "Wert" in ein Array "ary_Werte[]" an der Position "Index" gespeichert werden.

Etwa in der Form:
Code:
...
// --- Funzt so leider nicht ---
L #Wert // Wert laden
T #ary_Werte[#Index].Wert // und im Array speichern
...
[code]
 
Wäre nett, wenn sich jemand erbarmen würde...
 
Liebe Grüße
 
Gordon S
 
Mit Indizes kannst du nur in SCL arbeiten (leider). Ansonsten mußt du mit indirekter Adressierung selbst ran (Suche in Forum unter indirekte Adressierung)
 
Benutz lieber SCL!

Ich habe solche geschichten früher auch in AWL programmiert.
Blut Schweiss und Tränen für eine Geschichte die mit SCL ein lächeln kostet....
 
Hi

Schliesse mich der Meinung von "MAuksutat" an.

Zudem ist es möglich mit "structs" zu Arbeiten.


Der Erzeugte Code ist auch sehr Kompakt und somit schnell.
(Debugen unter SCL ist sehr EASY)




Karl
 
gravieren schrieb:
Der Erzeugte Code ist auch sehr Kompakt und somit schnell.
(Debugen unter SCL ist sehr EASY)
Karl

dem muss ich sehr wiedersprechen.

der von scl erzeugte code ist unter aller kanone. hast du dir so einen baustein schon mal angesehen?

wenn ich sowas in awl progge ist das bedeutend kürzer und ubersichtlicher.

awl ist was für 'könner';
scl was für 'anwendungsprogrammierer' ala vb c etc die auch mal eine sps programmieren wollen.

(es gibt sicherlich funktionen, die in scl einfacher (aber nicht unbedingt besser/kürzer) zu proggen sind (scheiss auf den speicherplatz und die zykluszeit. da muss dann halt eine schnellere cpu mit mehr speicherplatz her. windows lässt grüssen. ;) schaut euch mal bei siemens an wofür die scl vorgesehen haben. für standartverknüpfungen etc sollte man sowas aber in jedem fall meiden. also ich möchte kein 'windows' in meiner steuerung. )

kein compiler kann so gut übersetzten wie ein 'kluger geist'

aber diese diskussion, wann man scl einsetzen sollte, hatten wir schon öfter.

schauen wir uns mal ein simples beispiel an.
zuerst mal der code in awl
Code:
      U     E      0.0
      =     M      3.0

hier der scl-code der das gleiche bewirkt
Code:
    IF e0.0 THEN
        m3.0 := true;
    ELSE;
        m3.0:= false;
    END_IF;

und hier der code, der vom compiler aus dem scl-code erzeugt wird
Code:
      SET   
      SAVE  
      =     L      0.1
      U     E      0.0
      SPBN  M001
      SET   
      =     M      3.0
      SPA   M002
M001: CLR   
      =     M      3.0
M002: CLR   
      U     L      0.1
      SAVE

muss man da jetzt noch mehr zu sagen ?

und das ist nur ein sehr simples beispiel.
 
Ich bin zwar auch kein Freund von SCL,
aber wenn du das
U E0.0
= M3.0
so in SCL umsetzt, mit einer IF .. Then .. Else Anweisung,
brauchst du dich nicht wundern wenn da was aufgeblähtes rauskommt.

Probiers mal so:

M3.0 := E0.0


Dann kommt als AWL Code immerhin sowas raus:
Code:
SET   
      SAVE  
      =     L      0.1
      U     E       0.0
      =     M      3.0
      U     L      0.1
      SAVE  
      BE
Was allerdings das Spielchen mit L0.1 soll, weiß wahrscheinlich mal
wieder nur Siemens.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Volker

Heute Abend werde ich hier mal eine SCL-Code und das erzeugte AWL reinstellen.


Leider habe ich momentag keine Zeit.


Solltest du lust haben kannst du mir das mal in AWL umcoden.

Anschliesend Vergleichen wir mal beide.


P.S. Ich behaupte, dass etliche Projekte im Vornherein ohne SCL gescheitert worden wäre.
Ich benutze SCL nur da, wo dies Sinnvoll/Unverzichbar wegen der Übersicht ist. Simple Verknüpfungen schreibe ich naturlich auch in AWL.

Zur Info: "Modular PID" und "Standard PID Control" sind in SCL geschrieben. der Nutzer bemerkt den unterschied NICHT, da sich AWL und SCL mischen lassen.


Wir gesagt Volker, solltest du Interesse an der "Demo" haben rühre dich hier im Forum.
(Ist so ein "Glaubenskrieg" wie Win und Linux ;-) )


Karl
 
gravieren schrieb:
Solltest du lust haben kannst du mir das mal in AWL umcoden.
Anschliesend Vergleichen wir mal beide.
ja stell mal rein

Ich benutze SCL nur da, wo dies Sinnvoll/Unverzichbar wegen der Übersicht ist. Simple Verknüpfungen schreibe ich naturlich auch in AWL.
kluge entscheidung. es gibt aber auch leute die schreiben das komplette programm in scl. wir haben zum beispiel einen alu-schmelzofen der so programmiert ist wie oben erwähnt.

@msb. M3.0 := E0.0
das ist natürlich schon bedeutend besser, aber immer noch doppelt so lang ;)

Zur Info: "Modular PID" und "Standard PID Control" sind in SCL geschrieben.
eben genau für solche anwendungen ist scl entwickelt worden. für sowas macht das auch sinn.

fazit ist aber das der compilierte scl-code länger ist.
ich gebe unumwunden zu, dass sich manche anwendungen in scl einfacher realisieren lassen.
 
Hi Volker


Anbei der Code für den "Modular PID V5.1" Baustein FB 16 Name "Norm".


Das Handbuch kannst du dir hier runterladen.

http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=de&siteid=cseus&aktprim=0&extranet=standard&objid=10805416&DataKey=10805416&treeLang=de


Kapitel 2-77

Physikalische Normierung.



ALSO WAS AUS DER PRAXIS


//***************************************************
//* Version vom 21.06.2006 getestet
//***************************************************
FUNCTION_BLOCK FB16
TITLE= 'physical norm'
NAME: NORM
FAMILY: MODCONT
AUTHOR: AUT_SCL
VERSION: '1.0'

VAR_INPUT
INV : REAL := 0.0; // input variable
IN_HVAL : REAL := 100.0; // physical input value high
OUT_HVAL : REAL := 100.0; // physical output value high
IN_LVAL : REAL := 0.0; // physical input value low
OUT_LVAL : REAL := 0.0; // physical output value low
END_VAR

VAR_OUTPUT
OUTV : REAL := 0.0; // output variable
END_VAR
BEGIN

OUTV := ((((OUT_HVAL - OUT_LVAL) *INV ) / (IN_HVAL - IN_LVAL)) + OUT_LVAL) - (((OUT_HVAL - OUT_LVAL) * IN_LVAL) / (IN_HVAL - IN_LVAL));

END_FUNCTION_BLOCK




Den AWL-Code kannst du dir selbst erzeugen.

(Er hat keinen Know-How-Protect wie der Orginale FB )
(Verwendung NUR für Informationszwecke, Copirigth von der Fa. Siemens ! ! ! )
(Wie alle Runtimes von Siemens)

(NUR FUER STUDIENZWECKE ! ! !)


Ich bin auf deine Lösung gespannt !
(Vermutlich wir dein Code länger sein als mit SCL ! )


Karl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es scheint sich in eine ideologische Diskussion zu wenden, nun gut.

Natürlich kann man das in AWL programmieren.
Natürlich kann man hier und dort eine Milisekunde einsparen.
Aber man programmiert ja nicht um sich auf die Schultern zu klopfen sondern um den Kunden zu befriedigen und übersichtlichen und sauberen Code zu erzeugen, den man auch noch in einem Jahr versteht wenn der Kunde das Projekt erweitern möchte.
Wenn man als "Könner" ineinander verschachtelte UDTs verarbeitet mit Index usw. und am besten noch Datensätze verschiebt kopiert pipapo dann ist man meiner unbedeutenden Meinung nach dammig ineffektiv.
Mein Grundsatz beim programmieren ist: Datenverarbeitung mit SCL
den Rest mit den anderen IEC Sprachen.
Bei Motorensteuerungen hat z.B. SCL nichts zu suchen.
 
Hi

>Mein Grundsatz beim programmieren ist: Datenverarbeitung mit SCL
>den Rest mit den anderen IEC Sprachen.
Grundsätzlich stimmt es.


>Bei Motorensteuerungen hat z.B. SCL nichts zu suchen.
Was verstehst du unter Motorensteuerung ?

Schau dir mal die Runtime "Easy Motion Control" an, ist auch in SCL programiert.

Lagegeregeltes Positionieren mit Software. (Irgendwie was mit Motoren,Drehgeber, Schleppabstandsüberwachung, Handbetrieb .... für
Motoren und Servo-Achsen)


Handbuch dazu:

http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=de&siteid=cseus&aktprim=0&extranet=standard&objid=10805423&DataKey=10805423&treeLang=de

Karl
 
Da haben wir uns missverstanden, ich meinte natürlich nicht Regeln und Positionieren, das läuft meiner Meinung nach unter Datenverarbeitung.

ich meinte solche Dinge wie:
U Motorschutzschalter
U Reparaturschalter
U Folgemotor_läuft
=Freigabe Motor

Mit freigabe Motor kann dann ein SCL Baustein freigegeben werden der regelt.

Grosse logische Blöcke sind in KOP/FUP/AWL übersichtlicher.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi MAuksutat

>Mit freigabe Motor kann dann ein SCL Baustein freigegeben werden der >regelt.
>Grosse logische Blöcke sind in KOP/FUP/AWL übersichtlicher.

Da gebe ich dir noch meiner Meinung 100 % recht ! :p





Karl
 
gravieren schrieb:
Physikalische Normierung.
ALSO WAS AUS DER PRAXIS

(Vermutlich wir dein Code länger sein als mit SCL ! )
sicher. aber nicht im ag. ;)
und das die formel in scl einfacher einzugeben ist bestreite ich auch gar nicht.

der code geht noch. habe schon schlechter übersetzte gesehen. ;)

hier der compilierte. 42 zeilen. 5 davon überflüssig.
Code:
      SET   
      SAVE  
      =     L      0.1
      L     #OUT_HVAL
      L     #OUT_LVAL
      -R    
      L     #INV
      *R    
      L     #IN_HVAL
      TAK   
      T     LD     2
      TAK   
      L     #IN_LVAL
      -R    
      L     LD     2
      TAK   
      /R    
      L     #OUT_LVAL
      +R    
      L     #OUT_HVAL
      TAK   
      T     LD     2
      TAK   
      L     #OUT_LVAL
      -R    
      L     #IN_LVAL
      *R    
      L     #IN_HVAL
      TAK   
      T     LD     6
      TAK   
      L     #IN_LVAL
      -R    
      L     LD     6
      TAK   
      /R    
      L     LD     2
      TAK   
      -R    
      T     #OUTV
      SAVE  
      BE
hier meiner
Code:
//OUTV := ((((OUT_HVAL - OUT_LVAL) *INV ) / (IN_HVAL - IN_LVAL)) + OUT_LVAL) - (((OUT_HVAL - OUT_LVAL) * IN_LVAL) / (IN_HVAL - IN_LVAL))
//24 zeilen
      L     #IN_HVAL
      L     #IN_LVAL
      -R    
      T     #inval
      L     #OUT_HVAL
      L     #OUT_LVAL
      -R    
      T     #outval
      L     #IN_LVAL
      *R    
      L     #inval
      /R    
      T     #puffer1
      L     #outval
      L     #INV
      *R    
      L     #inval
      /R    
      L     #OUT_LVAL
      +R    
      L     #puffer1
      -R    
      T     #OUTV
NOCH FRAGEN ? :ROFLMAO: :ROFLMAO:
 
Zuletzt bearbeitet:
Hi Volker

Schau dir mal die Baustenlänge im AG an.

5 Zeilen sind bei SCL scheinbar "immer" überflüssig !


" SET
SAVE
= L 0.1

SAVE
BE
"


Test doch noch mal unter "gleichen Bediengungen" :)

D.g. Code doch mal SCL mit hilfe der Temp-Variablen puffer1, inval, outval.


Du wirst bemerken, dass die Anzahl der Zeilen in etwa den deines Codes entspricht.



Ich habe den Code NICHT überprüft, jedoch reduziert sich die Anzahl der Anweisungen AWL-Befehle wie den code beweist.

Ohne Temp-Variablen ist der Code (bis auf die 5 Zeilen ) identisch.
(Von der Reihenfolge abgesehen identisch.)
Bin mir da ziemlich sicher.


Könntest du das noch testen ?
(Würde mich stark Interessieren)
(Nicht, das ich recht haben will, Danke im Voraus).



Ich habe dutzende Codes (SCL --> AWL) untersucht und nach Optimierungsmöglichkeiten / Optimierungsfehler im Comiler gesucht.



Bis auf Sprungmarken:
z.b.

SPA A7d0 // Könnte mann sich sparen !
A7d0: L #ER
T #ErKp


Keine Optimierungsfunktion gefunden.
(Zutreffend ab SCL V5.01 und höher)





Karl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
D.g. Code doch mal SCL mit hilfe der Temp-Variablen puffer1, inval, outval.

weil ich jetzt selbst wissen wollte.

Code:
inval := IN_HVAL - IN_LVAL;
outval := OUT_HVAL - OUT_LVAL;
puffer1 := outval * IN_LVAL / inval;
OUTV := outval * inv / inval + out_lval - puffer1;
erzeugt absolut den identischen code den ich geschrieben habe. hier hatte der compiler aber auch gar keine andere wahl. ;)

nun gut. ohne die temps wäre meiner natürlich auch länger geworden.
aber ich bin halt so intelligent diese zu benutzen.:p

Keine Optimierungsfunktion gefunden.
(Zutreffend ab SCL V5.01 und höher)
das sagt mir jetzt irgendwie garnichts ?
 
Zuletzt bearbeitet:
Hi Volker


>erzeugt absolut den identischen code den ich geschrieben habe. hier >hatte der compiler aber auch gar keine andere wahl. :wink:
O.K!


>nun gut. ohne die temps wäre meiner natürlich auch länger geworden.
Interesant.


>aber ich bin halt so intelligent diese zu benutzen.:razz:
Will dir nicht zu nahe tretten, ist ein SCL-Compiler.

Er hört aufs "Wort" und bei dem 2 Code hat er auch auf dich gehört und temps benutzt. :rolleyes:


Ich hatte den Code bereits mit temps als Quell-Code.
(Siemens macht diesen Baustein auch ohne temps)

Frage nach Code-Länge und Zykluszeit ?
Brauchen bestimmte Code mehr Taktzyklen ?



Zitat:
Keine Optimierungsfunktion gefunden.
(Zutreffend ab SCL V5.01 und höher)
>das sagt mir jetzt irgendwie garnichts ?

Unglücklich von mir ausgedrückt. Ich meinte, dass der Compiler schon optimierten Code erzeugt, den ich nicht mehr verbessern kann.
(Bin natürlich nicht der Obercrack aber dennoch)


(Bis auf 1-2 unsinige/unnötige "SPA-Anweisungen" bei ca. 5 k erzeugten AWL-Code)



>aber ich bin halt so intelligent diese zu benutzen (temps)
Optimierung erfolgt wie du bereits sagtest durch "Brain"
Der Algorythmus bestimmt Geschwindigkeit und Codelänge. :cool:



P.S. Gibt es irgendwo Informationen über die
Anzahl der Takte für einen bestimmten Befehl.
(Finde nur Informationen für Step 5)


Danke Volker für deine Mühe.


Karl
 
gravieren schrieb:
[>aber ich bin halt so intelligent diese zu benutzen.:razz:
Will dir nicht zu nahe tretten, ist ein SCL-Compiler.
fasse ich auch so nicht auf.
vielleicht sollte ich meine meine meinung zu scl nochmal überdenken. :rolleyes:

Er hört aufs "Wort" und bei dem 2 Code hat er auch auf dich gehört und temps benutzt.
leider.
wäre doch schön wenn er so intelligent wäre. ;)
auf der anderen seite könnte sowas evtl auch zu probs führen.

Ich hatte den Code bereits mit temps als Quell-Code.
(Siemens macht diesen Baustein auch ohne temps)
ahh. also zum ärgern. ;)
imho ist der kostenpflichtig. da ich den noch nie gebraucht habe, hab ich den auch nicht. hat siemens den in scl oder awl geproggt?


>>Frage nach Code-Länge und Zykluszeit ?
die codelänge:
fb16 158
fb17 128
fc16 114
zeit habe ich nicht getestet

>>Brauchen bestimmte Code mehr Taktzyklen ?
denke nicht.
meine mal irgendwo gehört zu haben, dass diverse transferoperation u.u. mehr als einen zyklus dauern. weiss nicht mehr genau... sfc20 evtl. oder irgendwelche send/receive via profibus

>>P.S. Gibt es irgendwo Informationen über die Anzahl der Takte für einen bestimmten Befehl.
falls du die ausführungszeit meinst findst du die in der
operationsliste
 
Zurück
Oben