Scl

Adenauer

Level-1
Beiträge
121
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo habe folgendes in SCL

Code:
FUNCTION_BLOCK FB99

VAR_INPUT
    
i : WORD :=500;  
   
END_VAR

VAR_OUTPUT
    
stoffnummer1: word:= 540;   
stoffbreite: word:= 550;
stoffgewicht: WORD:= 560;
END_VAR

VAR_TEMP
   
    end_var
VAR

Stoffdaten :ARRAY[1..20,1..3]OF word;
END_VAR

begin
Stoffdaten[1,1]:=1;
stoffdaten[1,2]:=80;
stoffdaten[1,3]:=200;

Stoffdaten[2,1]:=2;
stoffdaten[2,2]:=180;
stoffdaten[2,3]:=400;

stoffnummer1:=stoffdaten[1,1];
stoffbreite:= stoffdaten[1,2];
stoffgewicht:=stoffdaten[1,3];



END_FUNCTION_BLOCK
Jetzt möcht ich in i oben also mw 500 eingeben können welches array ausgegeben wird.

Also unten in der Ausgabe

stoffnummer1:= stoffdaten[i,1];

so gings glaub ich in C auch mal
 
Ich habe den Code mal auskommentiert (bitte auch mal zur Seite scrollen):


Code:
FUNCTION_BLOCK FB99

VAR_INPUT
    
i : WORD :=500;  // deklariert eine Variable i vom Typ WORD und initalisiert sie mit dem Wert 500 (das hat nix mit MW 500 zu tun)
   
END_VAR

VAR_OUTPUT
    
stoffnummer1: word:= 540;  // deklariert eine Variable stoffnummer1 vom Typ WORD und initalisiert sie mit dem Wert 540
stoffbreite: word:= 550;   // deklariert eine Variable stoffbreite1 vom Typ WORD und initalisiert sie mit dem Wert 550
stoffgewicht: WORD:= 560;  // deklariert eine Variable stoffgewicht vom Typ WORD und initalisiert sie mit dem Wert 560
END_VAR

VAR_TEMP
   
    end_var
VAR

Stoffdaten :ARRAY[1..20,1..3]OF word;  // deklariert ein 2-dimensionales Array, Inhalte vom Typ WORD
END_VAR

begin
Stoffdaten[1,1]:=1;   // lädt   1 in Array 1,1
stoffdaten[1,2]:=80;  // lädt  80 in Array 1,2
stoffdaten[1,3]:=200; // lädt 200 in Array 1,3

Stoffdaten[2,1]:=2;   // lädt 2   in Array 2,1
stoffdaten[2,2]:=180; // lädt 180 in Array 2,2
stoffdaten[2,3]:=400; // lädt 400 in Array 2,3 
stoffnummer1:=stoffdaten[1,1];  // überschreibt den initalisierten Wert 540 mit dem Wert 1 (Inhalt aus Array 1,1)
stoffbreite:= stoffdaten[1,2];  // überschreibt den initalisierten Wert 550 mit dem Wert 80 (Inhalt aus Array 1,2)
stoffgewicht:=stoffdaten[1,3];  // überschreibt den initalisierten Wert 560 mit dem Wert 200 (Inhalt aus Array 1,3)



END_FUNCTION_BLOCK
Ist das denn so beabsichtigt?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Adenauer.

Schreib doch eine folgendes:


FUNCTION_BLOCK FB99​

VAR_INPUT
i : INT; // Vorwahl Stoffnummer
END_VAR

VAR_OUTPUT
stoffnummer1 , // Gewählte Stoffnummer
stoffbreite , // Gewählte Stoffbreites
stoffgewicht: WORD; // Gewähltes Stoffgewicht
END_VAR

VAR_TEMP
end_var

VAR
Stoffdaten :ARRAY[1..20,1..3]OF word;
END_VAR

begin
Stoffdaten[1,1]:=1;
stoffdaten[1,2]:=80;
stoffdaten[1,3]:=200;

Stoffdaten[2,1]:=2
stoffdaten[2,2]:=180;
stoffdaten[2,3]:=400;


IF i > 0 AND i <= 20 THEN // Überprüfe ob Stoffvorwahl zwischen 1 und 20 liegt
stoffnummer1:=stoffdaten[i,1];
stoffbreite:= stoffdaten[i,2];
stoffgewicht:=stoffdaten[i,3];
END_IF;

END_FUNCTION_BLOCK


Du Musst den "i" als Datentyp INT angeben damit er im ARRAY Register funktioniert. Außer du läst den "i" als WORD und schreibst z.b. bei Stoffnummer1 folgende :
Stoffnummer1 := Stoffdaten [WORD_TO_INT(i),1];
Aber das einfachere ist, wie ich es bei dir im geänderten Code geschrieben habe. Außerdem hast du noch eine Begrenzung vergessen wenn als eine Stoffvorwahl kleiner 1 oder größer 20 eingegeben wurde ist deine SPS in Stop gegangen, da auf den falschen Parametersatz zugegriffen wurde. Für weitere fragen stehe ich dir gerne zu Verfügung.
 
Zuletzt bearbeitet:
Danke schon mal das war bis jetzt auch nur nen ansatz.
Kommen noch einige Array elemente dazu.

Und ich muss noch ne funktion basteln so dass ich neue elemente ins array hinzufügen kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So das grundgerüst hätte ich jetzt.


Code:
FUNCTION_BLOCK FB99

VAR_INPUT
     i :WORD; 
     schreiben: BOOL;
     neu: int;
END_VAR

VAR_IN_OUT
  stoffnummer1: WORD;
stoffbreite: WORD  ;
stoffgewicht: WORD ;  

END_VAR

VAR_TEMP
   
END_VAR

VAR
    Stoffdaten:ARRAY[1..999,1..3]OF WORD;
    END_VAR
BEGIN
Stoffdaten[1,1]:=10;
Stoffdaten[1,2]:=20;
Stoffdaten[1,3]:=30;
Stoffdaten[2,1]:=0;
Stoffdaten[2,2]:=0;
Stoffdaten[2,3]:=0;
Stoffdaten[3,1]:=0;
......................................
.....................................
Stoffdaten[997,3]:=0;
Stoffdaten[998,1]:=0;
Stoffdaten[998,2]:=0;
Stoffdaten[998,3]:=0;
Stoffdaten[999,1]:=900;
Stoffdaten[999,2]:=990;
Stoffdaten[999,3]:=999;


IF WORD_TO_INT(i)>0 AND WORD_TO_INT(i) <=999 THEN
    stoffnummer1:=stoffdaten[WORD_TO_INT(i),1];
    stoffbreite:=stoffdaten[word_to_int(i),2];
    stoffgewicht:=stoffdaten[WORD_TO_INT(i),3];
    END_IF;
    
    
    
    IF schreiben THEN
        stoffdaten[WORD_TO_INT(i),1]:= stoffbreite;
    
    END_IF;

end_function_bloc

Jetzt bräuchte ich noch ne möglichkeit in mein Array werte reinzuschreiben.

Also ich hab mir das so gedacht ich setzte das Bit (schreiben)
wenn das Bit gesetzt ist wird der wert ( stoffbreite (MW...)in das angewählte array geschrieben.
Ist das so möglich??????????
 
Hallo Adenauer.

Verstehe deine Frage leider nicht so ganz. Willst du nun deine 999 Array von aus je nach Vorwahl der Variabel "neu" (1-999) mit Werte füttern, sofern das Steuerbit schreiben da ist? Oder willst du die Werte aus deinen intern Array nach ausen transferieren sofern das Steuerbit da ist? Bit um genauere Erklärung.
 
Also eigentilch soll es so aussehen.
Gelesen werden kann immer.
Wenn das Steuerbit gesetzt ist will ich in das Array welches angewählt ist neue Wert reinschreiben bzw bestehende ändern.
Und diese dann auch beibehalten.

Also muss ich mit einem W die Erste nummer anwählen 1ste Dimension und dann mit 3 weiteren Wörtern in die 2te Dimension 1...3 reinschreiben.
Diese Funktion soll quasi ein OP mit Rezepuren ersetzen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Adenauer,

...Jetzt bräuchte ich noch ne möglichkeit in mein Array werte reinzuschreiben.

Also ich hab mir das so gedacht ich setzte das Bit (schreiben)
wenn das Bit gesetzt ist wird der wert ( stoffbreite (MW...)in das angewählte array geschrieben.
Ist das so möglich??????????
Im Prinzip ist das schon möglich, nur müsstest du das Lesen in der ersten IF-Anweisung unterbinden wenn du schreiben möchtest. Ansonsten schreibst du nicht die Daten der Bausteinparameter, sondern die Daten die gerade erst gelesen wurden.

IF WORD_TO_INT(i)>0 AND WORD_TO_INT(i) <=999 and not schreiben THEN...

Oder, das Lesen generell nach dem Schreiben ausführen.


Gruß, Onkel
 
Zuletzt bearbeitet:
Statt einem 2-spaltigen Array leg doch lieber ein einfaches (einspaltiges Array) mit einer Struct als Element an, in welchem dann deine Daten im stehen. Dann wird das Ganze übersichtlicher.

Code:
Stoff: STRUCT
            Stoffnummer1 : Word   := 10;
            Stoffbreite: Word    := 0 ;
            Stoffgewicht : Word   := 0;
END_STRUCT ;
 
Stoffdaten : ARRAY[1..999] OF Stoff;
 
Zugriff:
 
Stoffdaten[i].Stoffnummer1 := 10;
Stoffdaten[i].Stoffbreite := 0;
Stoffdaten[i].Stoffgewicht := 0;
 
Zurück
Oben