Zugriff auf einen UDT / Array mit Variablen?

Warum zweidimensionale Arrays ?

Warum muß es denn unbedingt ein 2-dimensionales Array sein, wenn Step 7 damit so schlecht umgehen kann? Ich würde vielleicht für jede Zeile einen DB nehmen und dann für die Spalte mit einfachen Arrays arbeiten. Oder ein einfaches durchgehendes Array aller Fächer nehmen und den Index berechnen aus x und y. (x*Zeilenanzahl + y)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

was möchtest du machen?

Alle Werte einer Matrix in eine Liste schreiben?
Einen Vektor aus einer Matrix ausmaskieren?
Oder willst du einen neuen Datenbaustein erzeugen?
:confused:

Eine Standard-Konvertierungsfunktion, wie FELD3D_TO_FELD2D oder ähnliches gibts nicht, die müßtest du selber stricken, wenn der Aufwand lohnt.

hth
 
2-Dimensionales Array

Ja das Umwandeln von eimem 2- in ein 1-dimensionales Array hab ich jetzt mit
2 in einander geschachtelten For Schleifen gemacht,und das Maskieren mit einem AND, wie kann man nun das Array in einen anderen DB-kopieren ,kann man dann die Liste irgendwo sichtbar machen.
 
Die Werte kannst du ohne Probleme vom Array in eine Liste kopieren, wenn die Größer der Liste >= Zeilen * Spalten deines Arrays ist und die Typen übereinstimmen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Matrix

Hallo, was ist an diesem Schiebefehl zur Vekorisierung einer Matrix falsch:
Matrix[index1,index2]:=DWORD_TOD_INT(SHR(IN:index1, N:=16) AND
SHR(IN:index2,N:=24));
nach der Bearbeitung haben die Matrix Fächer den Wert 0 .
 
... du möchtest warscheinlich nicht ...
Code:
Matrix[index1,index2] := DWORD_TO_DINT (SHR(IN:index1, N:=16) [B][COLOR=red]AND [/COLOR][/B]SHR(IN:index2,N:=24)) ;
schreiben ... sondern :
Code:
Matrix[index1,index2] := DWORD_TO_DINT (SHR(IN:index1, N:=16) [B][COLOR=red]OR[/COLOR][/B] SHR(IN:index2,N:=24)) ;

Ansonsten wäre es interessant zu wissen was du damit bewirken willst ...
 
mit der Matrix will ich die Zufälligkeit eines Zufallgenerators bestimmen,also die
Zahlenfolge, ich mache auf der Technikerschule(2.Semester) ein Referat über SPS
und da will ich ein SPS Programm Lampenspiel vorstellen, mit 7 Lampen, wo man sich die
Folge merken und mit Tasten eingeben muß, und da hab ich mir gedacht das das mit der Matrix eine gute Idee wäre ein SCL Programm vorzustellen.
Wir haben erst im 2.Jahr SPS Programmieren.
 
Zuletzt bearbeitet:
kann mir jemand helfen, immer wenn ich diesen Code mit dem Schalter aray dazu schalte bleibt das Programm im Simulator(PLCSIM) stehen:

WHILE aray = false DO
IF Matrizze[index1,index2] < 10000000 THEN
shrhilf1:=INT_TO_DWORD(index1);
shrhilf2:=INT_TO_DWORD(index2) ;
Matrizze[index1,index2]:=DWORD_TO_DINT(SHR(in:=shrhilf1, N:=16)
OR SHR(in:=shrhilf2, N:=24));
END_IF;
END_WHILE;
Matrizze[index1,index2]:=Matrizze[index1,index2] +1;
 
Schaltest du aray auch mal wieder aus? Das Programm geht doch in die Schleife und bleibt darin hängen? Nimm mal statt der While-Schleife eine IF ... then... end if, dann sollte es auch gehen.

Ich denke mal der Simulator bleibt nicht nur stehen sondern geht wegen Zykluszeitüberschreitung in Stop.
 
als der Computer ausgeschaltet war ist mir das selber eingefallen,
trotzdem danke, jetzt läuft das Programm, gibt es irgend eine Liste wo man
das ARRAY anschauen kann.
index1 und index2 werden mit der Zufallszahl (1 bis 7) abwechselnd indiziert.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Als was ist Matrize denn definiert, wenn es eine Stat in einem FB ist kannst du die zugehörigen Var aus dem IDB in der Variablentabelle beobachten.
 
Jetzt geht PLCSIM in Stop wenn ich diesen Code dazuschalte:
index3:=0;
REPEAT
FOR index1 := 6 TO 0 BY -1 DO
FOR index2 := 6 TO 0 BY -1 DO
index3 := index3+1;
sortierpuffer[index3]:= Matrizze[index1,index2];
END_FOR;
END_FOR;
UNTIL index3>=49
END_REPEAT;
im Diagnosepuffer steht:
Bereichslängenfehler beim Lesen,InstanzDB,Doppelwortzugriff,Zugriffsadresse 0,

die Arraybereiche müßten schon stimmen:
Matrizze: ARRAY[0..6,0..6] of DINT;
Sortierpuffer: ARRAY[1..49] of DINT;


 
Zu deinem Code fällt mir folgendes auf :
- den "Repeat ... Until" kannst du dir eigentlich sparen, da nach einem Durchlauf der beiden "FOR ..TO"-Schleifen index3 sowieso auf 49 ist ... und wenn nicht du sicherlich etwas über-adressierst ...
- Das Script ist sonst m.E. in Ordnung - hast du den zugehörigen I-DB auch ins PLCSim übertragen ? Manchmal vergisst man das schonmal ...
- Beinhaltet der Baustein noch weitere Funktionen ?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Evtl. hast du im Programm Änderungen vorgenommen und keinen neuen IDB erzeugt, arbeitest lso mit dem alten IDB weiter. Dann ist mit allerdings die Zugriffsadresse 0 nicht ganz plausibel, könnt schon sein, daß Larry eher Recht hat ;) .
 
Es liegt an diesem Programmteil:
IF sort=true then
REPEAT
tauschen:= false;
FOR index3:=49 TO 0 BY -1 DO
puffer1:=DINT_TO_DWORD(sortierpuffer[index3]);
puffer2:=DINT_TO_DWORD(sortierpuffer[index3-1]);
sortierpuffer[index3]:= DWORD_TO_DINT(puffer1 AND 16#0000FFFF);
sortierpuffer[index3-1]:= DWORD_TO_DINT(puffer2 AND 16#0000FFFF);
IF sortierpuffer[index3-1] > sortierpuffer[index3] THEN
sortierpuffer[index3-1]:=DWORD_TO_DINT(puffer1);
sortierpuffer[index3]:= DWORD_TO_DINT(puffer2);
tauschen:= true;
ELSE sortierpuffer[index3]:= DWORD_TO_DINT(puffer1);
sortierpuffer[index3-1]:=DWORD_TO_DINT(puffer2);
END_IF;
END_FOR;
UNTIL NOT tauschen
END_REPEAT;
END_IF;
puffer1,puffer2:DWORD;
 
Zuletzt bearbeitet:
die markierten Zeile erhalten einen negativen Wert im index3 :
Code:
[SIZE=1]IF sort=true then 
REPEAT 
tauschen:= false;
FOR index3:=49 TO 0 BY -1 DO
puffer1:=DINT_TO_DWORD(sortierpuffer[index3]);
puffer2:=DINT_TO_DWORD(sortierpuffer[COLOR=red][B][index3-1]); [/B][/COLOR]
sortierpuffer[index3]:= DWORD_TO_DINT(puffer1 AND 16#0000FFFF);
sortierpuffer[COLOR=red][B][index3-1]:=[/B][/COLOR] DWORD_TO_DINT(puffer2 AND 16#0000FFFF);
IF sortierpuffer[COLOR=red][B][index3-1][/B][/COLOR] > sortierpuffer[index3] THEN
sortierpuffer[COLOR=red][B][index3-1]:=[/B][/COLOR]DWORD_TO_DINT(puffer1);
sortierpuffer[index3]:= DWORD_TO_DINT(puffer2);
tauschen:= true;
ELSE sortierpuffer[index3]:= DWORD_TO_DINT(puffer1);
sortierpuffer[COLOR=red][B][index3-1]:=[/B][/COLOR]DWORD_TO_DINT(puffer2); 
END_IF;
END_FOR;
UNTIL NOT tauschen
END_REPEAT;
END_IF;[/SIZE]
Schleife läuft bis "0" - Arrayindex = index3-1 also -1 !!!

Gruß
LL
 
Zurück
Oben