_ARRAY_SHUFFLE anwenden ?!?!

Begonnen von mike_roh_soft, 11. Januar 2012, 19:04:09

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

mike_roh_soft

Hi,

ich glaub ich sitz schon zu lange vorm PC.

Ich möchte die Funktionen aus der Lib anwenden z.B. _ARRAY_SHUFFLE

...
VAR_OUTPUT
arWuerfel     :ARRAY[1..6] OF BOOL;
END_VAR
...


_ARRAY_SHUFFLE(ADR(arWuerfel), SIZEOF(arWuerfel));


Die SPS aufm CX9010 steigt mir dabei aus!
Wenn ich die Zeile auskommentiere läuft die SPS!

Wie muss ich die Funktion verwenden damit es geht?

Danke

EDIT: Was bedeutet der Unterstrinch am Funktionsnamen?

mike_roh_soft

Hää ... nun gehts obwohl ich nix geändert habe...

Ich rufe die _ARRAY_SHUFFLE() für einen Zyklus auf. Aber es sind immer die zwei gleichen bits im ARRAY auf 1 ???

peewit

#2
hallo

array_shuffle arbeitet mit einem array of REAL (siehe DOKU)

das heisst es werden immer REAL-Werte (32bit BINAER) untereinander vertauscht
dein bool_array belegt intern relativ sicher pro bool nur ein byte, somit kann nichts vernünftiges rauskommen


dein-test:  arWuerfel : ARRAY[1..6] OF BOOL
belegt in der praxis 6 bytes, das belegt umgerechnet den platz von 1,5 REAL-WERTE
und 1,5 REAL-Werte kann man nun uach nicht mischen


du könntest notfalls ein array_of_real benutzen und das array folgend belegen
arWuerfel : ARRAY[1..6] OF REAL := 1,0,1,1,0,1;

das kann man ja auch wieder sauber mit REAL_TO_BOOL wandeln
ein array of dword sollte genauso funktionieren, das frist weniger performance als real



du hattest noch eine frage:     Was bedeutet der Unterstrich am Funktionsnamen?

das heisst anfänger sollten die finger davon lassen, da mit diesen bausteinen der speicher per pointer direkt manipuliert wird
und bei falscher handhabung kann es zu problemen (auch abstürzen) kommen.

Siehe doku _Kapitel 2.2

gravieren

Hi
Zitat von: peewit in 11. Januar 2012, 21:17:54

dein-test:  arWuerfel : ARRAY[1..6] OF BOOL
belegt in der praxis 6 bytes, das belegt umgerechnet den platz von 1,5 REAL-WERTE
und 1,5 REAL-Werte kann man nun uach nicht mischen

Einspruch --> 6 Bit   -->  1 Byte

0er und 1er sortieren ist cool.

Oder habe ich hier einen Denkfehler.


Gruß Karl

peewit

hallo

1. wenn man performant mit boolschen variablen arbeiten will, kann man es nur einem BYTE pro BOOL Wert lösen
denn das maskieren der bits beim lesen und schreiben ist viel zu aufwendig für die sps
manche compiler haben noch eine "Steinzeit-Option" um auf gepackte Bits umschalten zu können, das ist aber total sinnlos
und nicht zeitgemaess

2. wir wollen mit shuffle auch nicht sortieren sondern die werte per zufall verteilen !

3. das das wirklich so ist, könnt ihr euch in der bildschirm-hardcopy ansehen

arBOOL : ARRAY[1..6] OF BOOL;
arBYTE : ARRAY[1..6] OF BYTE;

beide datenarray belegen 6 bytes im speicher



[gelöscht durch Administrator]

mike_roh_soft

#5
Hi,
danke schon mal für die Antworten und Hinweise.
Die Variante mit ARRAY OF DWORD und DWORD_TO_BOOL funktioniert!

Ich bin nicht ganz so unerfahren aber auch kein Guru.
Mit der OSCAT-Lib habe ich erst seit 2Monaten zu tun.

Was bedeutet jetzt der Unterstrich?
Außer mich zu tadeln hast dazu nichts gesagt ;)
Ich will doch noch was lernen!

Gruß Mike

peewit

ZitatWas bedeutet jetzt der Unterstrich?
Außer mich zu tadeln hast dazu nichts gesagt ;)
Ich will doch noch was lernen!

das hatte ich aber vorhin schon geschrieben

siehe oscat_basic dokumentation kapitel 2.2
da ist genau zu deiner frage eine erklärung


viel spass noch mit oscat