ANY als Parameter in SCL

Züttu

Level-1
Beiträge
195
Reaktionspunkte
19
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte einen SFC in SCL aufrufen, dazu muss ich ein Ziel als ANY angeben. In AWL hat das wie folgt ausgesehen:

P#M4.0 BYTE10

Wie schreibe ich das in SCL?
 
Hallo,
möchtest du denn wirklich in den Merkerbereich hinein - oder vielleicht auf eine Baustein-interne Variable ?
Wenn Letzteres dann brauchst du nur der ANY-Variablen die interne Variable zuweisen. SCL baut sich dann selbst den Pointer.
Ansonsten hilft dir nur das Arbeiten mittels AT und passender Zuordnung ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mittel AT meinst du ca. wie unten stehend?


DR_ANY : ANY;
DR_ANY_AT AT DR_ANY : STRUCT
SyntaxID : BYTE := W#16#10;
Datentyp : BYTE := W#16#03;
db_Nummer : INT;:= 0
Speicherber : BYTE;
BytePointer : DWORD;
END_STRUCT;

Wie gebe ich denn BytePointer an? Der setzt sich ja aus Byte und Bit-Adresse zusammen?
 
Genau so ...
Die Bit-Adresse mußt du dir ausrechnen. Also z.B. für M4.7 := (4 * 8 ) + 7.
 
Zuletzt bearbeitet:
Hallo zusammen,
ich hab jetzt das Vergnügen an der Sache weiterarbeiten zu können. nur geschafft hab ich es heute immer noch nicht.
Mein Programm sieht so aus:

VAR
aRT_DATEN_RCV : ARRAY [0..20] OF BYTE;
RT_DATEN_RCV AT aRT_DATEN_RCV : STRUCT
ID : BYTE := 16#01;
SRC_LEN : WORD := 16#02;
SRC_DB_NR : WORD := 16#72;
SRC_POINTER : DWORD;
DST_POINTER : DWORD;
END_STRUCT;
aRT_DATEN_SND : ARRAY [0..20] OF BYTE;
RT_DATEN_SND AT aRT_DATEN_SND : STRUCT
ID : BYTE := 16#01;
DST_LEN : WORD := 16#02;
DST_DB_NR : WORD := 16#70;
DST_POINTER : DWORD;
SRC_POINTER : DWORD;
END_STRUCT;
GET : SFB14;
PUT : SFB15;
END_VAR

BEGIN
RT_DATEN_RCV.SRC_POINTER := DB112.DBW0;
RT_DATEN_RCV.DST_POINTER := DB114.DBW0;
RT_DATEN_SND.DST_POINTER := DB114.DBW0;
RT_DATEN_SND.SRC_POINTER := DB112.DBW0;
GET ( REQ := M0.1 // IN: BOOL
,ID := RT_DATEN_RCV.ID // IN: WORD
,ADDR_1 := RT_DATEN_RCV.SRC_POINTER // INOUT: ANY
,RD_1 := RT_DATEN_RCV.DST_POINTER // INOUT: ANY
);
PUT ( REQ := M0.1 // IN: BOOL
,ID := RT_DATEN_SND.ID // IN: WORD
,ADDR_1 := RT_DATEN_SND.SRC_POINTER // INOUT: ANY
,SD_1 := RT_DATEN_SND.DST_POINTER // INOUT: ANY
);
END_FUNCTION_BLOCK

Funktionieren tut es leider nicht. Wa smache ich mit dem AT falsch?
Ich möchte mit einer 315-2 PN/DP aus einer 1200 Steuerung lesen und rein schreiben. In FUP hat das auch geklappt, allerdings möchte ich das in SCL machen.

Danke und Grüße
Carsten
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Deine Struct ist falsch aufgebaut (siehe Beitrag #3 in diesem Thread).
Was genau steht in DB112.DBW0, zeig mal bitte.

Mit der AT-Ansicht tust du gar nichts.

Die dient eigentlich dazu einen den Any mit den richtigen Daten zu versehen.
 
Zuletzt bearbeitet:
Wenn du meinst das ich eine any Variable brauche dann würde ich die auch gerne haben, kann die aber in VAR nicht deklarieren und in VAR_TEMP gehts dann, aber dann mag der Editor das nicht in der deklaration der AT-Ansicht.
Im DB 112 sowie im Db114 sind lediglich je 16 Boolsche Werte. also zwei Byte oder ein Wort. Da mein Pointer nicht funktioniert hab ich eben das Wort dran geschrieben damit ich mal die 16 Bools abdecke...
Da das mit der deklaration nicht klappt mache ich anscheinend auch nichts mit der AT-Ansicht.
Soviel habe ich verstanden mit dem Any und den Daten aber es geht halt nicht.
 
Kannst du bitte mal den Sinn deines Tun erklären ...?
Mit deinem Code gerade in Verbindung mit den SFB's und den absoluten Adressen kann ich so gar nichts anfangen.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte mit eine einseitigen PUT/GET Verbindung mit einer 315-2PN/DP mit einer 1200er Steuerung kommunizieren und lediglich Boolsche Werte austauschen. Dafür habe ich in jeder Steuerung zwei DB's gemacht mit je 16 boolschen Werten. Dafür habe ich mir den SFB 14 und den SFB 15 hergenommen. Wenn ich diese nun in FUP aufrufe, dann kann ich den Pointer direkt an den Baustein schreiben. P#db112.dbx0.0 Byte 2 z.B.! Leider geht das so in SCL nicht. Ich will es aber trotzdem in SCL umsetzen und hoffe auf eure Hilfe weil ich es anscheinden alleine nicht hinbekomme... Ich hoffe nun ist es verständlicher.
 
OK ...
Du kannst dir innerhalb von SCL in diesem Fall das ANY-Bauen sparen.
Du kannst deine Quell-Variable direkt auf den deklarierten ANY zuweisen - SCL macht dann den Rest. Den ANY kannst du dann an den SFB schreiben ...
also etwas so :
Code:
mySrcAny := DB112.DBW0 ;
myDestAny := DB114.DBW0 ;
usw.
Verstehst du, was ich meine ?
Die AT-Geschichte etc. brauchst du hier nicht ...

Gruß
Larry
 
OK danke jetzt geht es.
UNd so sieht es jetzt aus:
VAR_TEMP
RT_DATEN_RCV : ANY;
RT_DATEN_SND : ANY;
END_VAR
VAR
GET : SFB14;
PUT : SFB15;
END_VAR

BEGIN
RT_DATEN_RCV := DB112.DBW0;
RT_DATEN_SND := DB114.DBW0;

GET ( REQ := M0.1 // IN: BOOL
,ID := 16#01 // IN: WORD
,ADDR_1 := RT_DATEN_RCV // INOUT: ANY
,RD_1 := RT_DATEN_SND // INOUT: ANY
);
PUT ( REQ := M0.1 // IN: BOOL
,ID := 16#01 // IN: WORD
,ADDR_1 := RT_DATEN_SND // INOUT: ANY
,SD_1 := RT_DATEN_RCV // INOUT: ANY
);
END_FUNCTION_BLOCK

Hab da irgendwie viel komplizierter gedacht als es ist... :idea:

Vielen Dank und schönen Abend noch!
Grüße
Carsten
 
Zurück
Oben