mit einem Zeiger auf ein komplettes ARRAY zeigen???

fk- princess

Level-1
Beiträge
112
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo...

ich muss an einer Funktion verschiedene Zieladressen unterschiedlicher Länge umschalten können.

ich dachte mir, einen Zeiger, die je nach Bedingung dann auf ein entsprechendendes Arrays zeigt, die in einem DB hinterlegt sind. dann folgt der Funktionsaufruf und im Ziel steht dann nicht der Datenbereich wo es hin soll, sondern nur ein zeiger

Kamm man überhaupt auf ein Array zeigen, incl der Array-Länge.

wie man auf ein byte, wird oder Dword zeigt, ist mir syntaktisch klar, aber auf ein komplettes Array, das versteh und weiss ich nicht...

danke
 
Das würde mit einem Any gehen oder mit zwei Variablen eine für das Ziel und eine für die Länge.
Sieh dir mal dazu im Foren-FAQ die entsprechenden Beiträge an.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
den ANY-zeiger habe ich mir als temp-variable erzeugt. und diese variable steht nun auch an der zielangabe der Funktion.

der für mich nun noch unklare teil ist die verknüpfung des ANY-zeigers mit dem Array´s im Datenbaustein...

ich schau mich mal im FAQ-Bereich mit um
dank dir
 
Du musst halt für den ANY-Zeiger die (Start-)Adresse des Array-Elements im DB vorher berechnen/deklarieren.

Hinweis:Zugriffe auf Array-Elemente lassen sich sehr elegant mit SCL lösen.
 
hab eine sehr gute beschreibung im FAQ bereich gefunden und es hat, was das thema angeht, nun richtig "klick" gemacht. die funktion fordert aber am ausgang einen pointer, und akzeptiert den any-zeiger nicht :(

und der anyzeiger war nun die elegante lösung variable ziele an dem ausgang zu ermöglichen. bei der funktion handelt es sich um den FC6

die nachrichten sollen aufgeteilt werden...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann solltest Du anders herangehen. Der FC6 sollte in einen festen Bereich schreiben. Meinetwegen einen Empfangsbaustein.
Wenn der NDR dann auf TRUE geht, kannst Du die Daten (vermutlich ein String) aufteilen und woanders hinschreiben.
 
mmh ich meine das anders. kurze nachrichten sollen in einen anderen breich gespeichert werden, wie lange nachrichten. entweder in einen bereich der 12byte gross ist, oder in einen der 24 byte gross ist.

die grösser der ankommenden nachricht kann ich im vorfeld schon herausbekommen. entsprechend möchte ich an den ausgang von fc6 nur einen zeiger der entsprechend der kommenden nachricht auf den einen bereich zeigt, oder in auf einen anderen.

das hauptproblem ist immer noch, das bei einem neuen empfang einer nachricht der datenbereich am fc6 nicht wieder von vorn beschrieben wird, sondern dort wieder anfängt, wo die letzte nachricht aufgehört hat.
die nachrichtenlängen sind wie oben beschrieben fest.
ich muss das so realisieren, das die nachrichten so empfangen werden, das der zeilenumbruch (ende nachricht) immer am ende steht
 
Ich glaube, das geht einfach nicht.
Du solltest einen festen Empfangsbereich vorsehen.
Du kennst die Endposition des letzen empfangenen Datenpaketes.
Du kennst die Länge der zu empfangenden Nachricht.
Wenn die Nachricht das Ende des Empfangsfaches übersteigt, wird der Rest vorn beginnend in das Fach eingetragen.
Mit diesen Infos mußt du dir den empfangenen String selbst zusammenbauen und ihn anschließend mit einem Blockmove an die Stelle kopieren, an der du sie haben willst.

Zugegeben, das ist recht aufwändig, aber ich mußte das auch schon einmal machen für eine Ethernetkommunikation, dort gabs eine feste Endekennung, mit der konnte man das Ende des empfangenen Strings finden, da die Länge unbekannt war. Es ist zumindest machbar, empfehlen würde ich dafür SCL.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
das thema lässt mir keine ruhe... ich habe mir in einem extra funktionsbaustein nach dem vorbild der siemenshilfe: 870 75 70 einen ANY-pointer geschaffen, der es mir nun erlaubt variable längen, bzw wiederholungen anzugeben,, je nachdem, welche nachrichten empfangen werden ( 24byte oder 12byte).

ABER:

nach der ermittlung, welche nachrichtenlänge als nächstes empfangen werden soll, wird die länge in der Int-variable für den anypointer mit dem wert gefüllt. dann erfolgt der Funktionsbaustein aufgerufen, der den anypointer enthält, wie auch den FC6 aufruf.

laut variablentabelle sehe ich jedoch, das die neue, kurze, nachricht nicht empfangen wird. das NDR signal kommt noch nicht. der Empfangsbaustein scheint immernoch eine 24byte nachricht zu erwarten. sende ich nochmals eine kurze nachricht, kommt es zur bereichsüberschreitung, da nun 24byte gesendet wirden, die jedoch noch nicht im empfangsspeicher stehen, der aber nur 12 byte gross ist.

gebe ich nun wieder als empfangslänge 24byte an, stehen die beiden kurzen nachrichten im puffer der langen nachricht, und dann kommt auch wie gehabt das NDR signal.

ich weiss einfach nicht, was ich beim umschalten vergessen habe, anzugeben, damit die kurzen nachrichten sauber empfangen werden.
anbei am ende noch ein sps code, wie ich das mit dem pointer gelöst heba und wie er mit dem FC6 verbunden ist

TAR2
UD DW#16#FFFFFF
LAR1 P##RECV_BUF
+AR1
// Adresse des Zeigers in das Adressregister laden

L B [AR1,P#0.0]
T LB 0
L B [AR1,P#1.0]
T LB 1
L B [AR1,P#2.0]
T LB 2
L B [AR1,P#3.0]
L #PASS_FAIL // hier steht entweder 24 oder 12, jenachdem welche nachricht als nächstes kommt
T LB 3
L W [AR1,P#4.0]
T LW 4

L W [AR1,P#6.0]
T LW 6
L W [AR1,P#8.0]
T LW 8 // empfangspuffer start ist hier der selbe. einmal soll er mit 24byte gefüllt werden, oder mit 12byte


CALL "Empfangsbaustein"
ID :=#ID
LADDR :=#LADDR
RECV :=#VAR_BUF
NDR :=#RCV_NDR
ERROR :=#RCV_ERR
STATUS:=#RCV_STAT
LEN :=#RCV_LEN

Puffer ist mit 40 byte gross genug

edit: auch den status habe ich mal angesehen. bei empfang der langen nachricht kommt auch immer ein wechsel zwischen 8181(busy) und 8180(ready for new). wechselt nun die nachricht auf eine kurze, so bleibt der empfänger in 8180(ready for new) die kurze nachricht wird also einfach nicht übertragen... irgendwas scheint noch zu fehlen :(
 
Zuletzt bearbeitet:
das thema lässt mir keine ruhe... ich habe mir in einem extra funktionsbaustein nach dem vorbild der siemenshilfe: 870 75 70 einen ANY-pointer geschaffen, der es mir nun erlaubt variable längen, bzw wiederholungen anzugeben,, je nachdem, welche nachrichten empfangen werden ( 24byte oder 12byte).

ABER:

nach der ermittlung, welche nachrichtenlänge als nächstes empfangen werden soll, wird die länge in der Int-variable für den anypointer mit dem wert gefüllt. dann erfolgt der Funktionsbaustein aufgerufen, der den anypointer enthält, wie auch den FC6 aufruf.

laut variablentabelle sehe ich jedoch, das die neue, kurze, nachricht nicht empfangen wird. das NDR signal kommt noch nicht. der Empfangsbaustein scheint immernoch eine 24byte nachricht zu erwarten. sende ich nochmals eine kurze nachricht, kommt es zur bereichsüberschreitung, da nun 24byte gesendet wirden, die jedoch noch nicht im empfangsspeicher stehen, der aber nur 12 byte gross ist.

gebe ich nun wieder als empfangslänge 24byte an, stehen die beiden kurzen nachrichten im puffer der langen nachricht, und dann kommt auch wie gehabt das NDR signal.

ich weiss einfach nicht, was ich beim umschalten vergessen habe, anzugeben, damit die kurzen nachrichten sauber empfangen werden.
anbei am ende noch ein sps code, wie ich das mit dem pointer gelöst heba und wie er mit dem FC6 verbunden ist

TAR2
UD DW#16#FFFFFF
LAR1 P##RECV_BUF
+AR1
// Adresse des Zeigers in das Adressregister laden

L B [AR1,P#0.0]
T LB 0
L B [AR1,P#1.0]
T LB 1
L B [AR1,P#2.0]
T LB 2
L B [AR1,P#3.0]
L #PASS_FAIL // hier steht entweder 24 oder 12, jenachdem welche nachricht als nächstes kommt
T LB 3
L W [AR1,P#4.0]
T LW 4

L W [AR1,P#6.0]
T LW 6
L W [AR1,P#8.0]
T LW 8 // empfangspuffer start ist hier der selbe. einmal soll er mit 24byte gefüllt werden, oder mit 12byte


CALL "Empfangsbaustein"
ID :=#ID
LADDR :=#LADDR
RECV :=#VAR_BUF
NDR :=#RCV_NDR
ERROR :=#RCV_ERR
STATUS:=#RCV_STAT
LEN :=#RCV_LEN

Puffer ist mit 40 byte gross genug

edit: auch den status habe ich mal angesehen. bei empfang der langen nachricht kommt auch immer ein wechsel zwischen 8181(busy) und 8180(ready for new). wechselt nun die nachricht auf eine kurze, so bleibt der empfänger in 8180(ready for new) die kurze nachricht wird also einfach nicht übertragen... irgendwas scheint noch zu fehlen :(

Versteh ich da etwas falsch? (rote Markierungen)
Wer übermittelt dir die kommende Länge?

Ich hab dir einen anderen Lösungsweg genannt, was ist damit?
Ich bin mit nicht sicher, wann genau einen neue Bufferlänge übernommen wird, vielleicht ist die nach dem Erstaufruf der Bausteine fix????
 
RECV_BUF ist ein eingangspointer

VAR_buf ist der temporäre pointer der dann auf den datenbreich zeigt, der im eingangspointer angegeben ist. ich übertrage ja die daten des eingangspointers auf den temporären, da die funktion von mehreren teilnehmern aufgerufen werden kann und sich da dann natürlich die datenbreiche ändern können.

die längen information bekomme ich über eine digitale leitung, die mir sagt, welche nachricht kommt. 1 lang 0 kurz

laut siemens hilfe soll die länge mit einem any pointer variable sein. das die neue länge evtl erst im nächsten zyklus geändert wird, könnte sein, deckt sich aber nicht mit dem obigen beispiel von siemens.
die rufen im selben zyklus doch einmal den fc6 auf um die länge zu ermitteln, dann noch einmal zum empfang des string mit der ermittelten länge. den ersten aufruf kann ich mir sparen, da ich die länge der nachricht ja schon kenne.

also da ich bei zwei kurzen nachrichten den status 81B1 bekomme ( bereichsüberschreitung) muss die 12 als widerholung ja erkannt worden sein, aber der empfangsteil, cp oder was weiss ich erwartet dennoch eine 24 byte nachricht und startet das schreiben in den empfangsbuffer erst, wenn die 24 byte angekommen sind. da der datenbreich aber 12byte gross ist, da der pointer ja geändert wurde, kommt es zum status 81B1

deine lösung mit dem suchen des LF mit einer neusortierung erarbeite ich neben bei mit als ersatzlösung. der chef wünscht aber eine synchron linksbündig empfangene nachricht, egal wie lang sie ist...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah ok, Any in Lokal, und du schreibst dann direkt auf die LW, ist klar.

Der FC scheint das zu wissen, aber die Baugruppe nicht. ist das Teil neu? Vielleicht ist die FW zu alt?
 
Zurück
Oben