Array

Alles zur Software WinSPS-S7 bzw. WinPLC7

Moderatoren: Matthias, Weiss_MHJ

Antworten
Benutzeravatar
Weiss_MHJ
Site Admin
Beiträge: 674
Registriert: 13 Apr 2010, 16:34
Kontaktdaten:

Beitrag von Weiss_MHJ »

Hallo,

wenn Sie folgendes programmieren:

U "Sensor1"
FP M 0.1
= M 0.2 //Hat Status 1 wenn pos. Flanke

U M 0.2
SPB End1 //Sprung wird ausgeführt wenn M0.2 den Status 1 hat
..
call FB....
..
End1: Nop 1

dann wird beim Belegen des Sensors und davon ausgehender pos. Flanke der M0.2 auf 1 gelegt. In diesem Fall wird der Sprung danach ausgeführt, d.h. der Aufruf des FBs !nicht! ausgeführt.
Im nächsten Zyklus hat der M0.2 den Status 0, da ja keine pos. Flanke mehr ansteht, somit wird der Aufruf des FBs ab da immer bearbeitet. Es wird also in jedem Zyklus etwas eingefügt.
Ist dies so beabsichtigt?

Wenn die Rahmenbedingungen stimmen dann funktioniert das Ganze. Aber dies ist nicht der Fall.
Nochmals:
Wie die FBs aufzurufen sind, können Sie dem Beispiel entnehmen.

Gruss

Benutzeravatar
MAC
SPSTreff-Profi User
Beiträge: 267
Registriert: 13 Jul 2010, 09:48
Wohnort: Niederkassel

Array

Beitrag von MAC »

Bild

Was mache ich noch Falsch?

Der Wert 5 wird in das EW2 ( einfügeIndex) eingefügt, aber nicht im Wert (MB2) Einzufügender Wert.

Gruß
mac

Benutzeravatar
Weiss_MHJ
Site Admin
Beiträge: 674
Registriert: 13 Apr 2010, 16:34
Kontaktdaten:

Beitrag von Weiss_MHJ »

Hallo,

der Parameter "EinfuegeIndex" bestimmt, an welcher Stelle im Array der Wert der am Parameter "Wert" ansteht, eingefügt wird.
Wenn also z.B. als Einfügeindex die Zahl 5 angegeben wird, dann wird der Zahlenwert des Parameters Wert so eingetragen
ArrayName[5]=Wert

Der Parameter "Wert" wird also nicht beschrieben, er ist die Vorgabe!
Der FB wird dazu verwendet einen Wert in das Array einzufügen und nicht zu lesen (das macht der FB11).

Des Weiteren sollte ein Eingangswort nicht verwendet werden um einen Wert darin abzulegen. Eingänge werden aus den Eingangsbaugruppen gelesen und zwar nach jedem Zyklus. Der Wert wird also in jedem Zyklus überschrieben.

Dann verwenden Sie das MW2 um den Errorcode abzulegen, gleichzeitig wird das MB2 für die Wervorgabe verwendet.
MW2 besteht aus MB2 und MB3. Also wieder eine Übeschneidung.

Ich denke Sie sollten an dieser Stelle abbrechen und diese Aufgabe einige Zeit ruhen lassen.

Gruss

Benutzeravatar
MAC
SPSTreff-Profi User
Beiträge: 267
Registriert: 13 Jul 2010, 09:48
Wohnort: Niederkassel

Array

Beitrag von MAC »

Also wenn bei Wert z.B die Zahl 5 steht, dann soll diese in den EinfügeIndex geschrieben werden.
Habe ich das so richtig verstanden?


Gruß
mac

Benutzeravatar
Weiss_MHJ
Site Admin
Beiträge: 674
Registriert: 13 Apr 2010, 16:34
Kontaktdaten:

Beitrag von Weiss_MHJ »

Hallo,

ja.

Beispiele:

Wert=33, EinfuegeIndex=10
ArrayName[10]=33

Wert=233, EinfuegeIndex=0
ArrayName[0]=233

Wert=110, EinfuegeIndex=4
ArrayName[4]=110

Gruss

Benutzeravatar
MAC
SPSTreff-Profi User
Beiträge: 267
Registriert: 13 Jul 2010, 09:48
Wohnort: Niederkassel

Array

Beitrag von MAC »

Hallo,

wenn ich den Wert 5 in das MB2 schreibe, dann wird dieser in
MYArray [5] stelle ein getragen?

Wert=33, EinfuegeIndex=10 wieso 10 ?
ArrayName[10]=33

aber der Wert 5 wird nicht in den einfügeIndex (MW30) geschrieben?

einfügeIndex= MW30 hier sollte der wert 5 stehen

wert= MB2 hier wird der wert 5 eingefügt

error= MW60


Gruss
mac

Benutzeravatar
MAC
SPSTreff-Profi User
Beiträge: 267
Registriert: 13 Jul 2010, 09:48
Wohnort: Niederkassel

Array

Beitrag von MAC »

erledigt
Zuletzt geändert von MAC am 18 Okt 2011, 20:45, insgesamt 1-mal geändert.

Benutzeravatar
Weiss_MHJ
Site Admin
Beiträge: 674
Registriert: 13 Apr 2010, 16:34
Kontaktdaten:

Beitrag von Weiss_MHJ »

Hallo,

ja bei Ihrer Belegung, wenn das MB2 den Wert 5 hat, dann wird der Wert des EW2 in den Index 5 des Arrays eingefügt.

Gruss

Benutzeravatar
MAC
SPSTreff-Profi User
Beiträge: 267
Registriert: 13 Jul 2010, 09:48
Wohnort: Niederkassel

Array

Beitrag von MAC »

ist die Belegung denn so richtig? weil im einfügeIndex der Wert 5 nicht steht.

Gruss
mac

Benutzeravatar
MAC
SPSTreff-Profi User
Beiträge: 267
Registriert: 13 Jul 2010, 09:48
Wohnort: Niederkassel

Array

Beitrag von MAC »

Hallo Herr Weiss, Herr Habermann

FB10:
U(
U "Sensor1"
BLD 100
FP M 0.1
)
NOT
SPBNB _003
CALL FB 10,DB10
AnyPointerArray:=P#DB1.DBX 0.0 BYTE 3
DBNummer:=W#16#0001
EinfuegeIndex:=MW30
Wert:=MB2
Error:=MW60
_003: NOP 0

EinfügeIndex= MW30 hier gebe ich in das MW30 die stelle an, wo der Wert der vor gegeben ist eingefügt wird. Z.B EinfügeIndex 1

Wert= MB2 hier wird der wert eingefügt der z.B bei Sensor 1 in das MB2 eingefügt wird.
Das wäre für die flache Kiste z.B 1 index 1 wert 1
Und für die hohe Kiste z.B 2 index 1 wert 2

FB11:
U(
U "Sensor6"
BLD 100
FP M 0.2
)
NOT
SPBNB _006
CALL FB 11,DB11
AnyPointerArray:=P#DB1.DBX 0.0 BYTE 11
DBNummer:=W#16#0001
ReadIndex:=MW40
Error:=MW70
Wert:=MB6
_006 :NOP 0

MW40= hier gebe ich die Stelle an wo ausgelesen werden soll (aber wo?)

MB6= hier wird an gezeigt welcher wert an der stelle aus gelesen wurde.

Habe ich das so richtig verstanden?
Ich weiß nicht an welcher selle ich einfügen soll und wo ich auslesen soll?

Für Hilfe wäre ich sehr Dankbar.

Gruss
mac

Benutzeravatar
MAC
SPSTreff-Profi User
Beiträge: 267
Registriert: 13 Jul 2010, 09:48
Wohnort: Niederkassel

Array

Beitrag von MAC »

Hallo,
ich weiß noch nicht an welcher stelle ich einfüge,und wo ich auslesen soll.



U E 0.1
FP M 0.0
= M 0.1

UN E 0.1
SPB End1
CALL FB 10,DB10
AnyPointerArray:=P#DB1.DBX 0.0 BYTE 11
DBNummer:=W#16#0001
EinfuegIndex:=W#16#0004
Wert:=MB10
Error:=MW30
End1: NOP 1


U E 0.6
FP M 0.2
= M 0.3

UN M 0.3
SPB End2
CALL FB 11,DB11
AnyPointerArray:=P#DB1.DBX 0.0 BYTE 11
DBNummer:=W#16#0001
ReadIndex:=W#16#0006
Error:=MW40
Wert:=MB12

End1: NOP 1


L B#16#33
T MB 11 und hier?


U E 0.7
FP M 0.4
= M 0.5

UN M 0.5
SPB End3
CALL FB 12,DB12
AnyPointerArray:=P#DB1.DBX 0.0 BYTE 11
DBNummer:=W#16#0001
WriteIndex:=W#16#0008
Wert:=MB14
Error:=MW50
End3: NOP 1

Gruß
mac
Zuletzt geändert von MAC am 18 Okt 2011, 20:47, insgesamt 1-mal geändert.

Benutzeravatar
MAC
SPSTreff-Profi User
Beiträge: 267
Registriert: 13 Jul 2010, 09:48
Wohnort: Niederkassel

Array

Beitrag von MAC »

Hallo,
ich bekomme eine Fehlermeldung, AG schaltet auf Stop wenn Sensor 6 auf 1 wechselt.
Fehlermeldung: Fehler beim Zugriff auf Datenbaustein über das DB-Register.
FB11,108 Stop durch Programmier fehler.

Ich habe am FB11 nichts geändert, eine Zeit lang ging der Aufruf des FB.

Hier die Fehlerzeile: Baustein FB11

/Aufschlagen DB
AUF DB [DIW10]
//Pointer bilden
L #ReadIndex
SLD 3 //Um Bitstellen nach links
T #OffsetPointer
//AR1 mit Anfangspointer belegen
L #AnfangsPointer
LAR1
//Offsetpointer hinzu
L #OffsetPointer
+AR1 //zum AR1 dazu addieren
//DB-Datum laden
L DBB [AR1,P#0.0] in dem Befehl soll der Fehler sein
T #Wert

Hier der Aufruf des FB11:

U E 0.6
FP M 0.3
= M 0.4

UN M 0.4

SPB End2
CALL FB 11,DB11
AnyPointerArray:=P#DB1.DBX 0.0 BYTE 11
DBNummer:=W#16#0001
ReadIndex:=W#16#0007
Error:=MW200
Wert:=MB20

End2: NOP 1

Der Fehler ist Behoben, es war ein Tippfehler bei der Angabe des DBs.

Gruß
mac

Benutzeravatar
Weiss_MHJ
Site Admin
Beiträge: 674
Registriert: 13 Apr 2010, 16:34
Kontaktdaten:

Beitrag von Weiss_MHJ »

Hallo,

zur Ergänzung:

Man fügt bei diesem Beispiel immer im nullten Index des Arrays ein.
Wenn man z.B. drei Kisten erfasst hat, dann befindet sich in den Indeces 0, 1, 2 jeweils die Information einer Kiste.
An der Verladeposition ist dann der Index 2 auszulesen. Man muss sich immer merken wieviele Kisteninformationen im Array vorhanden sind. D.h. beim Einfügen einer neuen Kiste erhöht man die Anzahl, beim Auslesen verringert man diese.
Die Anzahl merkt man sich z.B. in einem Merkerwort (oder DB-Wort usw.).

Gruss

Benutzeravatar
MAC
SPSTreff-Profi User
Beiträge: 267
Registriert: 13 Jul 2010, 09:48
Wohnort: Niederkassel

Array

Beitrag von MAC »

Hallo,
ich das Problem, das der BD10-11-12 diesen Fehlermeldung kommt.
siehe Foto.


Gruß
macBild

Benutzeravatar
Weiss_MHJ
Site Admin
Beiträge: 674
Registriert: 13 Apr 2010, 16:34
Kontaktdaten:

Beitrag von Weiss_MHJ »

Hallo,

der Aktualwert
P#0.0 VOID 0
ist eigentlich keine gültige Angabe. Dies wird angezeigt, wenn der Any-Zeiger den Wert 0 hat.
Ersetzen Sie den Zeiger z.B. durch
P#M0.0 BYTE 0

Gruss

Antworten