LAR1 P##AnyPointer
L W#16#10 //SyntaxID. bei S7 immer 10
T LB [ AR1 , P#0.0 ]
L W#16#7 //Typ 7 = DINT
T LB [ AR1 , P#1.0 ]
L 1 //Anzahl Bytes
T LW [ AR1 , P#2.0 ]
[B] L 1002 //Quell-DB 1002 = globaler DB[/B]
T LW [ AR1 , P#4.0 ]
L 0 //Anfang der Quelle
SLD 3
T LD [ AR1 , P#6.0 ]
[B]L B#16#84 //Speicherbereich (hier DB) 84 = DB / 85 = IDB[/B]
T LB [ AR1 , P#6.0 ]
...
CALL #MbClient01
REQ :=#xReq01
DISCONNECT :=0
MB_MODE :="MbKonfig".ModeOut01
MB_DATA_ADDR :="MbKonfig".Data_AddrOut01
MB_DATA_LEN :=1
DONE :=#xDone01
BUSY :=#xBusy01
ERROR :=#xError01
STATUS :=#wStatus01
MB_DATA_PTR :=[B]#AnyPointer[/B]
CONNECT :="MbKonfig".Connect01
Beschreibung
L DINO: Nummer eines Instanz-Datenbausteins in Akkumulator 1 laden
Mit der Anweisung "Nummer eines Instanz-Datenbausteins in Akkumulator 1 laden" laden Sie die Nummer eines über das Datenbausteinregister geöffneten Instanz-Datenbausteins in Akkumulator 1. Der vorherige Inhalt des Akkumulators 1 wird dabei in Akkumulator 2 verschoben.
Wenn vor der Ausführung der Anweisung kein Instanz-Datenbaustein über das Datenbausteinregister geöffnet worden ist, wird in Akkumulator 1 der Wert "0" geladen.
Die Statusbits werden durch die Anweisung nicht beeinflusst.
Beispiel
Das folgende Beispiel zeigt die Funktionsweise der Anweisung:
AWL ErläuterungAUFDI "InstanceDataBlock" // Datenbaustein öffnen und die Nummer des Datenbausteins in das DI-Register übertragen. L DINO // Nummer des geöffneten Datenbausteins in Akkumulator 1 laden. L "MyTag_1" // Vergleichswert laden ==I // Vergleichen, ob die Nummer des Datenbausteins gleich dem Wert des Operanden "MyTag_1" ist. = "MyTag_2" // Abfrageergebnis dem Operanden "MyTag_2" zuweisen.
Beschreibung
L DBNO: Nummer eines Global-Datenbausteins in Akkumulator 1 laden
Mit der Anweisung "Nummer eines Global-Datenbausteins in Akkumulator 1 laden" laden Sie die Nummer eines über das Datenbausteinregister geöffneten Global-Datenbausteins in Akkumulator 1. Der vorherige Inhalt des Akkumulators 1 wird dabei in Akkumulator 2 verschoben.
Wenn vor der Ausführung der Anweisung kein Global-Datenbaustein über das Datenbausteinregister geöffnet worden ist, wird in Akkumulator 1 der Wert "0" geladen.
Die Statusbits werden durch die Anweisung nicht beeinflusst.
Beispiel
Das folgende Beispiel zeigt die Funktionsweise der Anweisung:
AWL ErläuterungAUF "GlobalDataBlock" // Globalen Datenbaustein öffnen und die Nummer des Datenbausteins in das DB-Register übertragen. L DBNO // Nummer des geöffneten Datenbausteins in Akkumulator 1 laden. L "MyTag_1" // Vergleichswert laden ==I // Vergleichen, ob die Nummer des Datenbausteins gleich dem Wert des Operanden "MyTag_1" ist. = "MyTag_2" // Abfrageergebnis in den Operanden "MyTag_2" schreiben.
Hallo,
ich kenne den MbClient Baustein nicht genau, aber versuch doch mal an MB_DATA_PTR das Symbol deiner Instanzvariable zu schreiben.
Normalerweise wird dann der passende Pointer intern erzeugt.
FUNCTION "CopyAnyPtr" : VOID
TITLE =
VERSION : 0.1
VAR_INPUT
IN : ANY ; //Quellpointer
END_VAR
VAR_OUTPUT
OUT : ANY ; //Zielpointer
END_VAR
BEGIN
NETWORK
TITLE =ANY-Pointers kopieren
L P##IN;
LAR1 ;
L P##OUT;
LAR2 ;
// Syntax-ID / Datentyp
L W [AR1,P#0.0];
T W [AR2,P#0.0];
// Länge
L W [AR1,P#2.0];
T W [AR2,P#2.0];
// DB-Nummer
L W [AR1,P#4.0];
T W [AR2,P#4.0];
// Pointer
L D [AR1,P#6.0];
T D [AR2,P#6.0];
NETWORK
TITLE =ENO in KOP/FUP aktivieren
SET ;
SAVE ;
END_FUNCTION
Warum musst du diese Umschaltung machen ?Bei unserer Anwendung wird mit zwei unterschiedlichen Instanzvariablen gearbeitet, eine zum Lesen der Daten vom Typ UDInt udn eine zum Schreiben der Daten vom Typ UInt. Deswegen arbeite ich ja mit dem Anypointer um diese Umschaltung zu gewährleisten.
Du machst nur 1 Aufruf von MB_CLIENT, aber durch Manipulation von die Parameter ist es funktionell 2 Aufrufe mit Verzögerung ?@JesperMP. Bei einem Mehrfachaufruf des MbClients kann es schnell zu einer Kollission kommen, da eine gewisse Zeit benötigt wird, um den Verbindungsaufbau zum Teilnehmer zu erreichen und beide gleichzeitig nie aktiv sein dürfen, weil diese auf den selben TN mit der selben ID zugreifen wollen. Daher wollte ich einfach einen simplen Aufruf eines MB-Clients aufbauen, was nun funktioniert.
Einen FB mehrfach aufrufen und multiinstanzfähig sind zwei verschiedene Paar Schuhe. Multiinstanzfähig muß ein FB sein, wenn in seinen Instanzdaten andere FB-Instanzen deklariert werden sollen oder wenn eine Instanz von ihm selbst in anderen FB-Instanzen deklariert werden soll (er als Multiinstanz verwendet wird).Generell wird ein FB geschrieben, der mehrfach aufgerufen werden soll und somit multiinstanzfähig sein muss.
Es gibt mehr Möglichkeiten. Wenn Du einen Lese- und einen Schreibauftrag hast, dann mußt Du noch mehr Parameter umschalten, dann würde ich das Basteln sein lassen und 2 MB_Client-Aufrufe programmieren - für jeden Auftrag einen (wie auch schon von Jesper empfohlen).Darum blieb mir nichts anderes übrig als über einen Pointer den entsprechenden Datenbereich anzusprechen wenn ich lese oder schreibe.
Einen FB mehrfach aufrufen und multiinstanzfähig sind zwei verschiedene Paar Schuhe. Multiinstanzfähig muß ein FB sein, wenn in seinen Instanzdaten andere FB-Instanzen deklariert werden sollen oder wenn eine Instanz von ihm selbst in anderen FB-Instanzen deklariert werden soll (er als Multiinstanz verwendet wird).
Jetzt willst Du einen ANY-Pointer auf eine Variable in den FB-Instanzdaten bilden? Dann funktioniert Deine "kurz geschossene" "Lösung" nur, wenn Dein FB NICHT als Multiinstanz verwendet wird. Damit der FB auch wirklich als Multiinstanz verwendbar ist, musst Du auch multiinstanzfähig programmieren. Dann musst Du noch den Multiinstanz-Offset aus AR2 zur Adresse der Instanzvariable addieren
Es gibt mehr Möglichkeiten. Wenn Du einen Lese- und einen Schreibauftrag hast, dann mußt Du noch mehr Parameter umschalten, dann würde ich das Basteln sein lassen und 2 MB_Client-Aufrufe programmieren - für jeden Auftrag einen (wie auch schon von Jesper empfohlen).
PS: Wieso bastelst Du old style in AWL 'rum wenn Du eine S7-1500 und TIA verwendest?
Harald
/ Ermittlung der IDB - Nr
L DINO
T #IDB_Nr
// Lesemodus
L #MbClient01.MB_MODE
L 0
==I
SPBN RD
LAR1 P##AnyPointer //Lade Daten vom AnyPointer in das Adressregister 1
L W#16#10 //SyntaxID. bei S7 immer 10
T LB [ AR1 , P#0.0 ] //Lade die Syntax ID in das AR1
L W#16#7 //Typ 7 = DINT
T LB [ AR1 , P#1.0 ] //Lade den Datentyp in das AR1
L 1 //Anzahl der zu übertragenen Bytes
T LW [ AR1 , P#2.0 ] //Lade die Datenanzahl in das AR1
L #IDB_Nr //Quell-IDB aktuelle IDB-Nr
T LW [ AR1 , P#4.0 ] //Lade die IDB-Nr in das AR1
L 16 //Anfang der Quelle - Bei FB-Änderung zu überprüfen
SLD 3 //Schiebe um 3 nach links, um in den Bytebereich zu kommen - vorher Bit
T LD [ AR1 , P#6.0 ] //Lade den Offset in das AR1
[B] L B#16#84[/B] //Speicherbereich (hier DB) - 84 = DB / 85 = IDB
T LB [ AR1 , P#6.0 ] //Lade den Datenspeicherbereich in das AR1
RD: NOP 0
PS: Wieso bastelst Du old style in AWL 'rum wenn Du eine S7-1500 und TIA verwendest?
Nur meiner Meinung, ich habe mit TIA kein Bedarf gehabt mit AWL zu basteln. Ich verstehe wenn man viel AWL code die man von STEP7 Classic in TIA übernehmen will und man hat kein Zeit um es in eine modernere Sprache zu konvertieren. Aber neue AWL Code in TIA erstellen ?zu PS: Darüber reden wir lieber nicht
Ist das was du meinst. Beispiel mit interne Instanzdaten:Hat irgendjemand gegebenenfalls eine Idee meine Anwendung rein symbolisch aufzubauen ohne Absolutadressen. (Das war in erster Linie mein Wunsch)
Nur meiner Meinung, ich habe mit TIA kein Bedarf gehabt mit AWL zu basteln. Ich verstehe wenn man viel AWL code die man von STEP7 Classic in TIA übernehmen will und man hat kein Zeit um es in eine modernere Sprache zu konvertieren. Aber neue AWL Code in TIA erstellen ?
Tust du dies, um deiner Job zu schützen? Zukünftige Programmierer, die deiner Code pflegen sollen, werden es dir nicht danken.
Ist das was du meinst. Beispiel mit interne Instanzdaten:
Anhang anzeigen 51070
Hallo,Nur meiner Meinung, ich habe mit TIA kein Bedarf gehabt mit AWL zu basteln. Ich verstehe wenn man viel AWL code die man von STEP7 Classic in TIA übernehmen will und man hat kein Zeit um es in eine modernere Sprache zu konvertieren. Aber neue AWL Code in TIA erstellen ?
Tust du dies, um deiner Job zu schützen? Zukünftige Programmierer, die deiner Code pflegen sollen, werden es dir nicht danken.
Ist das was du meinst. Beispiel mit interne Instanzdaten:
Anhang anzeigen 51070
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?