# Zeigerprogrammierung WinSPS - Codesys



## Daniela (15 Februar 2010)

Hallo zusammen,

ich habe hier ein Problem einen Ansatz zu finden für eine Zeigerprogrammierung bei WinSPS (AWL) und Codesys (ST).

Problemdarstellung:
Ich habe 2 Steuerungen welche mit einem DP/DP verbunden sind.
Ich habe auf der WinSPS Seite insgesamt 30 Byte Daten, welche ich jeweils in Paketen zu je 5 Worten über den DP/DP Koppler schieben möchten. Auf der anderen Seite (Codesys) möchte ich diese Daten nehmen und entsprechenden Ausgängen zuweisen.
Es handelt sich hierbei um eine Anzeige (Codesys-Seite) die Hilfe- und Störmeldung von der WinSPS der Fertigung anzeigt.

Bisher werden die Daten 1 zu 1 rübergeschoben über den Koppler, dies funktioniert leider nicht an allen Bosch-Steuerungen, da die Zykluszeiten zu lang werden.

WinSPS:

; Transferiere Daten auf Ausgänge
;-----------------------------------------------
L D 306,B ;Start Ausgänge
L D 20,C ;Start Stationen
L D 78,D ;Ende Stationen 

Loop:

L B D[C],A
T B A,A*
VGLA B C,D
SPZ  Out
INC B C,2
INC B B,1
SP  Loop
Out:

Die Bytes werden in dieser Schleife auf die Ausgänge transferiert für den DP/DP Koppler



Codesys:

  _002S960 AT %IX3.11  : BOOL;  (* Linienstop *)
                               (* Line Stop *)
  _002S961 AT %IX3.13  : BOOL;  (* Hilferuf *)
                               (* Help Call *)

So ist es bisher programmiert (Beispiel für eine Station).


Meine Frage ist halt, wie ich diesen Zeiger beidseitig realisiere, der die Datenpakete auf der WinSPS-Seite schnürt und auf der anderen Seite (Codesys) wieder entpackt und den Variablen wie "_002S960" wieder zuweist.*


----------



## cybertracepda (16 Februar 2010)

Hallo Daniela !

Wieviele Daten kann der DP/DP ? Ist es ein DP-DP Koppler oder welches Gerät ist es.

Man kann be Codesys mit des syslibmem.lib die Funktion
sysmemCpy(dest, source, anzahl Byte) verwenden, um auf beliebige Adressen zu schreiben (auch auf allokierte Eingänge -> normalerweise nicht beschreibbar).

ist sehr leicht in ST zu machen oder auch Fup

sysmemcpy(ADR(_002S960), ADR(Quelle_DP),30)

Fup habe ich als Anhang beigelegt, Eingänge musst Du anpassen

Viel Erfolg


----------



## Daniela (16 Februar 2010)

Super, danke für den Tipp!

Es stellt mich nur eine Frage wie ich es dann in einer Art "Schleife" programmiere?
Ich habe 30 Stationen die jeweils Hilfe und Störung als Signal bekommen für die Anzeige. Die Stationen haben im CodeSys fortlaufende Nummer:

Station 1:
  _001S960 AT %IX3.3  : BOOL;  (* Linienstop *)
                               (* Line Stop *)
  _001S961 AT %IX3.5  : BOOL;  (* Hilferuf *)
                               (* Help Call *)

Station 2:
  _002S960 AT %IX3.11  : BOOL;  (* Linienstop *)
                               (* Line Stop *)
  _002S961 AT %IX3.13  : BOOL;  (* Hilferuf *)
                               (* Help Call *)

Station 3:
  _003S960 AT %IX4.3 : BOOL;  (* Linienstop *)
                               (* Line Stop *)
  _003S961 AT %IX4.5 : BOOL;  (* Hilferuf *)
                               (* Help Call *)

usw... und die Bytes müssten dann vom DP/DP-Koppler entsprechend auf die Stationen kopiert werden.
Also die ersten 10 Bytes auf die ersten 10 Stationen, die nächsten 10 Bytes auf die nächsten 10 Stationen...


----------



## cybertracepda (16 Februar 2010)

Hallo Daniela !
Da anscheinend die Adressen des DP-Bereichs ja wortweise aufgelegt sind (sehe ich an ..IX3.3, 3.5 , 3.11, 3.13 -> 3.11 := 3.3 + 8 bit = 1 byte, IX3.5 + 8 = IX3.13) und die sysmemcpy byteweise kopiert, kann man das ganze in einem Rutsch oder auch in einer schleife für 30 Stationen machen, Vorraussetzung ist, das der Speicherbereich geschlossen allokiert wird,

Man legt eine Variable an z.B. DPBereich AT %IB3 : Byte; (*wird als Anfangszeiger auf Bereich der 1. Station verwendet *)

Beispiel : Ziel, Quelle, Länge
ST
sysmemcpy(ADR(DPBereich),ADR(QuelleDPSpeicher), 30); (* Das ganze ist in einem Rutsch kopiert *)
FUP wie im vorigen Beispiel gezeigt beschalten.
Ich glaube nicht, dass wir hier eine Schleife brauchen, da der Speicherbereich zusammenhängend adresseiert wird.
Wenn sonst noch Fragen auftreten bitte melden.
Vielleicht die Deklaration der gesamten Stationen wäre hilfreich

mfg
Cybertracepda


----------



## Daniela (17 Februar 2010)

Gesamte Stationen siehe Anhang.

Ich übertrage also immer ein Byte pro Station (ist vom bestehenden Programm von WinSPS so vorgegeben, andere Bits entsprechen anderen Stationssignalen).
Daraus folgt dann im CodeSys, dass jeweils immer %IXx.3 und %IXx.11 für Störung ist und %IXx.5 und %IXx.13 für Hilfe.

Und was muss ich denn für "QuelleDPSpeicher" einsetzen?
Entschuldigt bitte meine "doofen" Fragen, aber ich bin in Sachen CodeSys und strukturiertem Text ein absolut blutiger Anfänger


----------



## cybertracepda (17 Februar 2010)

Hallo nochmal !

WIe ist Codesys an das andere System hardwaretechnisch angebunden ?
Dieser DPDP, welches Produkt ist das.

Sind die %IX3.3 ...  die Ausgänge des DPDP zu Codesys.

Ist es dir möglich, mir das Codesysprojekt zu schicken mit der richtigen Steuerungskonfiguration.

Oder gibt es ein Blockschaltbild, wie die Steuerungen (Stationen) vernetzt sind.

Ich nehme an, das der QUelleDPSpeicher der DPDP ist, dessen Adressbereich in der Codesys eben bei IX3.3 beginnt und 30 Byte lang ist.
Was wird dann in der COdesys gemacht mit den Infos vom DPDP ?

Wenn ich alle Eckdaten weiß, kann  ich heir gerne helfend zur Seite stehen, arbeite schon seit 1999 mit Beckhoff und 3 S.

Schicke mir deinen Kontakt, dann können wir über email die Sache zum Laufen bringen.

mfg
Cybertracepda


----------



## Daniela (18 Februar 2010)

soo.. aktueller stand:

meine Fertigungsseite ist fertig programmiert.
es ist jetzt "nur" noch die CodeSys Seite die zu programmieren ist.

In jedem Byte was ich übertrage steht die Information für eine Station (ein Bit Hilferuf, ein Bit Störung, Rest ist uninteressant).
Ich übertrage nun über den DPDP-Koppler genau 10 Bytes pro Zyklus und das Ganze 3x. Also insgesamt 30 Bytes

Diese 10 Bytes (also 10 Ausgänge am DPDP-Koppler) sind immer die gleichen die genutzt werden. Also im 1. Zyklus übertrage ich die ersten 10 Bytes über die Ausgänge A306-A315. Im 2. Zyklus übertrage ich die nächsten 10 Bytes über die gleichen Ausgänge.. und im 3. Zyklus das Gleiche.

Ich brauche nun also einen "Befehl" mit welchem ich im 1. Zyklus in Codesys die Bytes nehme und auf die ersten 10 Stationen übertrage,
im 2. Zyklus wieder auf den gleichen Bereich am DPDP-Koppler zugreife und auf die Stationen 11-20 übertrage und im 3. Zyklus wieder vom gleichen DPDP-Bereich auf die letzten Stationen 21-30.

Ebenso übertrage ich noch ein Byte (A301) in welchem steht, welcher Block gerade Übertragen wird (1. 2. oder 3.) damit Codesys weiß wohin die Daten kopiert werden sollen (ob Station 1-10, 11-20 oder 21-30).

Kann mir wer sagen wie ich das nun umsetzen muss????

Im Anhang habe ich ein Bild eingefügt von meinem DPDP-Array..
A301 ist der Ausgang der sagt im wievielten Block man sich befindet.
und A306-A315 sind mein Bereich für die jeweiligen Blöcke der Übertragung.


----------



## Daniela (18 Februar 2010)

anhang vergessen ^^

jetzt aber...


----------

