SCL -Arrays mit einander vergleichen

Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es "angemessen frech sein"..weiss nicht. :confused:
Was ist "Gelbe Karte", bzw. die Folgen davon.. Punkte in Flensburg? :ROFLMAO:
V.

Ich und beleidigt, nö, deshalb stand doch das :ROFLMAO:ROFLMAO:ROFLMAO: dahinter!

@Matthias

Du mußt mein Funktionsbeispiel entsprechend umändern. Also Länge auf 32.
Da das Array ja als In Definiert ist mußt du in diesem Falle für jeden Datentyp einen eigene Funktion schreiben, das ist das Einfache.
Die zweite Möglichkeit wäre, nicht die Arrays zu übergeben, sondern nur Any oder Pointer und sich damit dann in dem FC unabhängig vom Typ eine Vergleichsroutine zu bauen. Wohl kompliziert und ich weiß nicht, ob das so gelingen würde.

Ich würde es dann so versuchen:

Input als Any
Aus dem Any die Daten über DB , Start und Länge herausholen.
Die Daten in ein internes Array (z.Bsp. Byte) umkopieren, evtl. geht das sogar ganz einfach mit dem SFC20 und dem Any!!!
Der Inhalt der Array of Byte ist dann zwar im Prinzip wirr, aber es geht ja nur darum zu sehen, ob gleich oder ungleich, also gleich wirr, reicht dazu.
 
Zuletzt bearbeitet:
Projekte und Sprachen

Hi,
Wie meinst du ob ich überhaupt SCl verwenden? Wenn du meine persönliche Programmierfähigkeit damit meinst dann kann ich das im mom nicht 100% bejahen:D

Wenn es um das Projekt geht dann ja. Das lustigste ist ja das ich gar nichts anderes machen soll. und an der fh lernt man nur awl und fup habe bis gestern noch nie was von SCL gehört gehabt...

Nein, deine persönliche Programmierfähigkeit wollte ich nicht checken, sondern ob du Step 7 mit SCL hast!
SCL und GRAPH sind Programmiereditoren, die normalerweise nicht im Step7 für "normalsterbliche"(Standard) vorhanden sind; das muss man extra kaufen, bzw. man kauft die "Step 7 Professional" Software.

Vladi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da wird mir ja schon vom lesen schlecht :ROFLMAO:.

Ne ich habe deins schonmal umgeschrieben um es an meine arrays anzupassen.

Das was ich benötige ist der vergleich auf ungleich aber das ist ja kein prob das zu ändern und das exit habe ich auch rausgemacht weil da ja noch mehere abfragen von anderen arrays kommen soll.

Was ich nur als frage habe wenn ich als ergebnis haben will -1,1,0 kann ich dann einfach sagen Ergebnis : INT;

bei der variablen deklaration?
 
Und wegen der Software wie am Anfang gesagt ich bin im Praxissemester bei einer Firma die nur Maschinen programmiert also die ham die "Professional" aber bis jetzt immer mit Beckhoff SPS und nicht mit Siemens nur der jetztzige Kunde will nun mal unbedingt Siemens SPS und wenn er das will bekommt er es auch.

Nur das Problem ist das wenige S7 können und die, die es können nehmen nur SCL
 
Scl

Klar, Ergebnis : INT; deklarieren.
Dann musst du in der Schleife auch enspr. Werte zuweisen, nicht TRUE oder FALSE!
.....
Ergebnis := 1;
usw.
V.
 
Hi ja ich hätte es wahrscheinlich in standard awl programmiert weil wir im studium da so drauf trainiert wordén sind. Aber ich muss agen umso mehr ich mit SCL mache umsoweniger verstehe ich wieso man uns das nicht im studium zeigt.

An vladi noch eine frage

das mit dem ergebnis als int deklarieren ist klar, aber das problem ist nur das ich egal welchen datentyp als array ich habe immer die ergebnise für kleiner -1 größer 1 und gleich 0 benötige

Ps: Einen wunderschönen Guten Morgen wünsche ich
 
An vladi noch eine frage

das mit dem ergebnis als int deklarieren ist klar, aber das problem ist nur das ich egal welchen datentyp als array ich habe immer die ergebnise für kleiner -1 größer 1 und gleich 0 benötige

Ps: Einen wunderschönen Guten Morgen wünsche ich

Ich frag mal was nach dazu. Heißt das, du willst die Ergebnisse des Vergleichs in einem weiteren Array speichern? Denn, wenn du 32 Werte vergleichst, wo ist dann die Grenze für größer oder kleiner? Ansonsten, wo ist das Problem? Du baust deine IF ... Then ... Else - Vergleiche und jeweils als Ergebnis (INT) weist du dann -1, 0 oder +1 zu.

Ergebnis := -1;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ne das ganze zeug dient nur zum vergleichen. da wir die andere programmteile aber eins zu eins von beckhoff zu siemens übersetzten können brauchen wir eben diesen vergleichs wert.

das problem ist aber wenn ich bei der variablen deklaration die arrays nicht als INT deklariere sagt er mir als fehlermeldung das ergebnis muss vom typ bool sein

Hier das prob

PHP:
FUNCTION FC100 : INT
VAR_INPUT
wert1:   ARRAY[1..32] OF Bool;
wert2: ARRAY[1..32] OF Bool;
END_VAR
VAR_IN_OUT
Ergebnis: Int;
 
END_VAR
 
VAR_TEMP
    i: Int;
END_VAR
    // Anweisungsteil
 
    FOR i := 1 TO 32 DO
1.        IF wert1[i] < wert2[i] THEN Ergebnis := -1;
        ELSIf
          wert1[i] > wert2[i] THEN Ergebnis := 1;
          ELSE
            Ergebnis :=0;         
        END_IF;
 
        //wert1 := wert2;
 
    END_FOR;      
 
 
    FC100 := 32;
END_FUNCTION

Fehlermeldung

Bei 1. der Ausdruck muss vom datentyp Bool sein
 
Naja '<' oder '>' macht bei Bool kein Sinn-zumindest in der S7-Welt.
Du musst das mit NOT, Vergleich auf FALSE, oder Konvertierungsfunktion machen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So also ich habe mal en bißchen weiter rum probiert. Ihr wißt ja langsam ernährt sich das Eichhörnchen :-)!

hier mal mein code mit natürlich der schleife von euch:-)

Code:
FUNCTION_BLOCK FB250
VAR
Wert1: ARRAY [1..2] OF INT;
Wert2: ARRAY [1..32] OF INT;
     // temporäre Variablen
iy: INT;
ix: INT;
iz: ARRAY [1..5] OF INT;
iu : INT;
END_VAR
VAR_INPUT
    start: BOOL;
END_VAR
    
VAR_OUTPUT
    
    ergebnis: BOOL;
END_VAR
 

BEGIN
IF start then    
  FOR ix := 0 TO 5 DO
  iz[ix]:= Wert1[1];
  iu := 2;
    Wert2[iu]:= iu;
     FOR iy := 0 TO 32 DO
       IF Wert1[iy] > Wert2[iy] THEN ergebnis := true;
       ELSE ergebnis := false;
      END_IF;
    END_FOR;
   END_FOR;    
 END_IF; 
END_FUNCTION_BLOCK

mein ziel ist das ich mit der ersten for schleife die funktion also der vergleich testen kann (mit unterschiedlichen werten die es laden soll) ob er auch sicher funktioniert. Wäre ja schlimm wir würden was abgeben und dann erst merken das es einen fehler gibt. Die vergleichsfunktion soll aber erst gehen wenn start = true ist. Start ist im Ob als eingang definiert den ich auf einschlaten kann.

WWenn ich das tue geht mein SPS in Stop.
 
STOP durch Programmierfehler (OB nicht geladen oder nicht möglich, bzw. kein FRB vorhanden )
Unterbrechungstelle im Anwenderprogramm: Zyklisches Programm (OB 1)
Prioritätsklasse: 1
FB-Nummer: 250
Bausteinadresse: 74
Bisheriger Betriebszustand: RUN
Angeforderter Betriebszustand: STOP (intern)
interner Fehler, kommendes Ereignis

das sagt er

im ob steht nur

CALL FB 250 , DB250
start :=E1.0
ergebnis:=M1.0
BE
 
Mal nebenbei bemerkt würde ich den Test des FB's nicht in den FB integrieren, sondern von aussen beschalten.
Sinn könnte unter anderem, statt den statischen Array's im FB anzugeben, zwei Datenbausteinnummern und deren Länge als Eingangsvariablen zu nehmen.
Und wenn es nur um ein "<>" geht reicht sogar ein FC der die Inhalte Word-weise vergleicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja es geht ja auch darum das es ich es net nur wort weiße auf ungleich untersuchen will. Bekomme echt noch die Krise solange halt das zeug nicht angeschlossen ist von denen ich die Arrays bekomme kann ich es nur über umwege testen und das kostet voll viel zeit...
 
Schau dir mal noch den Baustein "BLKMOV-SFC20" an, bei Festellung von Eingabeänderungen muss ja auch der Vorgängerzustand gerettet werden (DBxy - DatenAlt) oder sowas.
Allerdings ist mir auch nicht ganz klar, wieso eine Eingabe auf diese umständliche Weise erkannt werden muss?!? Was steckt da für ein Sinn dahinter?
 
Meinst du jetzt den Sinn weil es mit Arrays gemacht wird oder den vergleich auf Eingabeänderung?


Ja das mit den alten daten habe ich schon geht aber auch ohne BLKMOV.
 
Zurück
Oben