-> Hier kostenlos registrieren
Hallo!
Kurze Erklärung vorweg:
Ich programmiere eigentlich nur Hochsprachen (meist C++) und entwickle gerade ein neues Steuerungs-System unter Windows.
Als I/O-Ebene und für die nötigen Echtzeit-Routinen sind Phoenix ILC's geplant, die wir bislang nur für eher kleine Steuerungsaufgaben und dann meist mit der Web-Client-Schnittstelle verwendet haben. (Das machen bislang aber andere Kollegen)
Die Kommunikation soll über UDP und Sockets laufen, Tests mit kleinen Datenpaketen funktionieren bereits. Nun aber zu meinem Problem (das ist dann auch grundsätzlicher Natur):
Ich möchte eine Struktur (Sollwerte, Parameter, Outputs etc., insgesamt rund 8 KB) aus der Windows-Welt zyklisch auf die SPS-Ebene übertragen. Die Struktur beinhaltet INT16, INT32, Arrays, Chars usw. Auf PC-Seite wird dieser Block aufgrund der maximalen UDP-Paketgröße in 1400-Byte-Häppchen geteilt und versendet. (Dort caste ich die Struktur auf einen Char-Pointer und lasse eine Funktion entsprechend diesen 8K-Block 1:1 verschicken)
Auf der SPS-Seite habe ich die gleiche Struktur als TYP erstellt und möchte nun die jeweils empfangenen Pakete zu je 1400Byte wieder zu einem 8K-Block zusammenfügen und diesen Block dann entweder in die Struktur kopieren oder gleich jedes Paket an die richtige Stelle in die Struktur einfügen. Dazu hatte ich erwartet, einfach einen gecasteten Byte-Pointer auf den Anfang der Struktur (die ja eigentlich auch nur ein Memory-Block irgendwo im Speicher ist) legen zu können und die Einzel-Pakete uninterpretiert dort an die entsprechenden Stellen (alle 1400 Byte) hinein zu kopieren.
Aber ich finde bislang keine Möglichkeit dazu, auch die Kollegen kennen keine Pointer in dieser SPS und gucken mich mitleidig an wie einen Alien.
Ein Versuch über einen FB, der als Parameter einen Blockcounter, den Receive-Buffer und die Struktur bekommt (Was ja über sog. "Call-by-Reference", also Pointer erfolgt) bringt mich nicht weiter, weil PCWORX mich innerhalb des FB ebenfalls nur über die Struktur darauf zugreifen lässt.
Das muss doch irgendwie gehen!?!
(Und ich weiß auch, dass ich noch alle INTs noch Motorolafreundlich drehen darf - Das mache ich aber vorher schon auf dem PC)
Und wenn es schon keine CAST-Direktiven gibt, kennt jemand zumindest einen Workaround?
Danke im voraus..
Kurze Erklärung vorweg:
Ich programmiere eigentlich nur Hochsprachen (meist C++) und entwickle gerade ein neues Steuerungs-System unter Windows.
Als I/O-Ebene und für die nötigen Echtzeit-Routinen sind Phoenix ILC's geplant, die wir bislang nur für eher kleine Steuerungsaufgaben und dann meist mit der Web-Client-Schnittstelle verwendet haben. (Das machen bislang aber andere Kollegen)
Die Kommunikation soll über UDP und Sockets laufen, Tests mit kleinen Datenpaketen funktionieren bereits. Nun aber zu meinem Problem (das ist dann auch grundsätzlicher Natur):
Ich möchte eine Struktur (Sollwerte, Parameter, Outputs etc., insgesamt rund 8 KB) aus der Windows-Welt zyklisch auf die SPS-Ebene übertragen. Die Struktur beinhaltet INT16, INT32, Arrays, Chars usw. Auf PC-Seite wird dieser Block aufgrund der maximalen UDP-Paketgröße in 1400-Byte-Häppchen geteilt und versendet. (Dort caste ich die Struktur auf einen Char-Pointer und lasse eine Funktion entsprechend diesen 8K-Block 1:1 verschicken)
Auf der SPS-Seite habe ich die gleiche Struktur als TYP erstellt und möchte nun die jeweils empfangenen Pakete zu je 1400Byte wieder zu einem 8K-Block zusammenfügen und diesen Block dann entweder in die Struktur kopieren oder gleich jedes Paket an die richtige Stelle in die Struktur einfügen. Dazu hatte ich erwartet, einfach einen gecasteten Byte-Pointer auf den Anfang der Struktur (die ja eigentlich auch nur ein Memory-Block irgendwo im Speicher ist) legen zu können und die Einzel-Pakete uninterpretiert dort an die entsprechenden Stellen (alle 1400 Byte) hinein zu kopieren.
Aber ich finde bislang keine Möglichkeit dazu, auch die Kollegen kennen keine Pointer in dieser SPS und gucken mich mitleidig an wie einen Alien.
Ein Versuch über einen FB, der als Parameter einen Blockcounter, den Receive-Buffer und die Struktur bekommt (Was ja über sog. "Call-by-Reference", also Pointer erfolgt) bringt mich nicht weiter, weil PCWORX mich innerhalb des FB ebenfalls nur über die Struktur darauf zugreifen lässt.
Das muss doch irgendwie gehen!?!
(Und ich weiß auch, dass ich noch alle INTs noch Motorolafreundlich drehen darf - Das mache ich aber vorher schon auf dem PC)
Und wenn es schon keine CAST-Direktiven gibt, kennt jemand zumindest einen Workaround?
Danke im voraus..