TIA Verschiedene Datentypen auf Ausgang schreiben.... in SCL

Tmbiz

Level-2
Beiträge
634
Reaktionspunkte
21
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen, ich muss was bauen und weiss nicht genau wie ich das anstellen soll.

Ich habe 4 Byte als Ausgang und die sind mit einem Gerät verbunden, auf das ich verschiedene Werte übertragen muss.

z.B. Sollwert in Real, Start Toleranzkontrolle in Flot oder auch Daten in Unsigned Long.


Hier erst mal die Ausgänge:

aus.PNG

Hier werden die Daten z.B. der Sollwert aus dem DB (Commands.Sollwert) für Rezepte in einen Speicher geschrieben und die Werte aufbereitet:

Parameter laden FC1.jpg
Dann erfolgt die Übergabe an den nächsten Baustein:

Und hier dann auf den Ausgang bzw wird dann vom IS30_W.Steuerblock.Parameter.p2 bzw p3, p0, p1 dann direkt auf den Ausgang ABxx.x verwiesen: (die Verknüpfung der Bereiche p0 p1 p2 p3 sind in einem andern Baustein.

FC2.PNG


So wie ich das jetzt verstanden habe, wird der Wert Sollwert in Real in einen Speicher geschrieben. Dann wird nur eine bestimmter Teil des Speichers ausgelesen und wieder in einen Speicher geschrieben. Von dort aus, wird das ganze dann auf den Ausgang gegeben. Wenn es am Ausgang ansteht, wird eine Kommando auf das Gerät geschickt und das Gerät liesst denn Wert z.B. Sollwert ein. Mit andern Worten, ich möchte egal wie die Daten auf meiner SPS gespeichert werden Sie immer in der gleichen Art auf die 4 Ausgangs Byte legen.

Wie kann ich das in SCL umsetzen?
 
Zuletzt bearbeitet:
Moin Tmbiz,

Wenn ich dein Problem richtig verstanden habe, dann möchtest du den Code um irgendeinen Variablentyp (Real, Float, Unsigned Long) in ein Byte-Array[1..4] zu schupsen?
Das sollte im TIA auf den den neuen Steuerungen eigentlich mit dem Baustein Serialize funktionieren. Nun Habe ich den dafür noch nicht verwendet, weil der eigentlich für strukturierte Variablen ist (also Struct oder UDT -> Array of irgendwas), aber einen Versuch kannst du damit ja mal eben starten.
Oder habe ich die Frage doch falsch verstanden? :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie hast Du Dir vorgestellt wie der Empfänger/Gerät erkennen soll, was für einen Datentyp Du ihm da gerade schickst?
Und ist Dir klar, daß der SCL-Compiler (falls Du irgendwas hinkriegst) nicht prüfen kann ob Du den Spaghetti-Mix richtig programmiert und richtig verschaltet hast?

Harald
 
Ja das ist schon so wie du es verstanden hast. Ich habe halt ein Dword also 4 Byte und diese 4 Byte werden von dem Geräte einfach eingelesen. Jetzt soll es so sein, dass egal (fast) was ich da an Werten habe, diese einzelnen Bit dem DWord (4Byte) zugeordnet werden sollen.
 
Wie hast Du Dir vorgestellt wie der Empfänger/Gerät erkennen soll, was für einen Datentyp Du ihm da gerade schickst?
Und ist Dir klar, daß der SCL-Compiler (falls Du irgendwas hinkriegst) nicht prüfen kann ob Du den Spaghetti-Mix richtig programmiert und richtig verschaltet hast?

Harald

In dem alten AWL Programm geht es so. Da wird das was in meinem DB_Rezepte liegt, auf die 4Byte am Ausgang aufgeteilt und geschrieben. Dann muss man noch eine Kommando über eine andere Kommunikation setzen und das Gerät liesst es ein.
 
Ich habe hier eine 1512 aber das sollte schon für die Zukunft auch auf anderen Steuerungen gehen.
 
Also ein kurzer Test ergab: Serialize kann prinzipiell das was du brauchst:
Serialize.JPG
Der Real 0.123 wird in das Byte-Array kopiert. Dann musst du nur untersuchen, ob die Reihenfolge auch die ist, die dein angeschlossenes Gerät erwartet ;)
 
Wenn du im Code auf serialisize gehst und F1 drückst, bekommst du die Hilfe zum Baustein. Retval wird ein Int sein.

Für das Array gehst du in den Bausteinkopf(Dekalrationsteil) oder den DB, gibst dort den Variablennamen ein und dann unter Typ Array, dann wird dir dort eingetragen Array[lo..hi] of type.
Hier ersetzt du lo durch 0, hi durch 3 und type durch byte, dann sollte es gehen.
 
Wenn du im Code auf serialisize gehst und F1 drückst, bekommst du die Hilfe zum Baustein. Retval wird ein Int sein.

Für das Array gehst du in den Bausteinkopf(Dekalrationsteil) oder den DB, gibst dort den Variablennamen ein und dann unter Typ Array, dann wird dir dort eingetragen Array[lo..hi] of type.
Hier ersetzt du lo durch 0, hi durch 3 und type durch byte, dann sollte es gehen.

Ok. Das mit dem Array habe ich geschafft. Kannst du mir noch sagen was pos seine soll?

im Beispiel steht 0->4 bei mir wird da 4->4 angezeigt.

Leider habe ich unter hilfe nichts gefunden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
'F1' :-)

Aus der Hilfe kopiert, daher ist die Formatierung hin, aber das steht es drin.
Also 0 dort hinein, würde ich meinen, zumindest, wenn man ein das Array bei 0 beginnen läßt.
Im Beispiel beginnt es bei 1!!!, aber davon halt ich nichts, zumal Siemens-HMI bei Arrays, die anders als mit 0 beginnen, Probleme haben.

Parameter
Deklaration
Datentyp
Speicherbereich
Beschreibung
SRC_VARIABLE
Input
VARIANT
D, Bausteinschnittstelle eines FB
PLC-Datentyp (UDT), STRUCT, ARRAY of <Datentyp>, der in eine sequenzielle Darstellungsform umgewandelt wird.
DEST_ARRAY
InOut
VARIANT
D, Bausteinschnittstelle eines FB (Die Abschnitte Input, Output, Static und Temp sind möglich.)
Datenbaustein, in dem der erzeugte Datenstrom gespeichert wird.
POS
InOut
DINT
E, A, M, D, L
Der Operand am Parameter POS speichert den Index des ersten Bytes nach der Gesamtzahl der Bytes, die die umgewandelten Kundendaten belegt haben. Der Parameter POS wird nullbasiert berechnet.
Funktionswert
INT
E, A, M, D, L
Fehlerinformation
 
'F1' :-)

Aus der Hilfe kopiert, daher ist die Formatierung hin, aber das steht es drin.
Also 0 dort hinein, würde ich meinen, zumindest, wenn man ein das Array bei 0 beginnen läßt.
Im Beispiel beginnt es bei 1!!!, aber davon halt ich nichts, zumal Siemens-HMI bei Arrays, die anders als mit 0 beginnen, Probleme haben.

Nee Sorry, ich verstehen es nicht. pos habe ich zu einem DInt gemacht. Soll ich eine 0 rein schreiben??????
 
POS ist ein Index, der dir sagt von welchem Element bis zu welchem Element in dein Ziel-Array kopiert wurde. 1-> 4 ist die Darstellung von In/Out Variablen und bedeutet 1 ging in den Baustein rein (ab stelle 1 im Ziel-Array schreiben) 4 kam am Baustein raus (bis zu Element 4 im Array wurde geschrieben)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Beim Deserialisieren, wo steht denn die Status-Information um welchen Datentyp es sich gehandelt hat oder wird die gar nicht mitgegeben?
Gruß
 
Zuletzt bearbeitet:
Hallo das sieht so aus als ob Du einen Bizerba Dosiercontroller bzw. Wägeterminal mit einen Datensatz für eine Komponente versorgen willst.
Hast Du das Teil per Profibus angebunden? Wenn ja schick die Daten einfach per SFC 14 rüber und lese die Daten per SFC 15 aus.

Ich würde an deiner stelle noch einmal genau das Handbuch lesen. Ich kann mir nicht vorstellen das eine Wägeterminal so kompliziert angebunden wird.
 
Zurück
Oben