Ultimate_01
Level-1
- Beiträge
- 5
- Reaktionspunkte
- 0
-> Hier kostenlos registrieren
Hallo liebe Forum-Gemeinde,
bin neu hier und möchte mich erstmal für zahlreiche Infos bedanken.
Leider stehe ich vor einem Problem, bei welchem ich alleine nicht weiter komme Google und Co. auch nichts brachbares finden.
Ich möchte eine Datenkommunikation via Profinet zwischen einer ET200S und einer 315-PN/DP aufbauen.
Es soll von der ET200S ein teil eines Datenbausteins DB300 an die 315 übertragen werden.
Der DB300 ist 12Byte gross. Davon sollen die ersten 8Byte gesendet (put) und die letzen 4 Byte empfangen (get) werden.
Nun habe ich mit der Siemens-"Hilfe" den Anypointer und die Übertragung im SCL zum Laufen bekommen..
ABER....
Hier kommt mein Problem
Ich muss bei der Übertragung immer die ganzen 12Byte übertragen. Sobald ich nur die ersten zwei oder vier Byte übertragen möchte, bringt die Funktion den Status 4 als Fehlermeldung. Und meine Funktion möchte dann wieder neu Senden/bzw. empfangen. Doch mit dem Status 4 kann ich mit der Siemens-"Hilfe" nichts anfangen... :-(
Hier mal meinen prinzipiellen Aufbau des SCL codes:
Teile der Input/Parameter (NICHT Vollständig!!)
VAR_INPUT
I_Int_ADDR_1: ANY; // Interne Adresse des DB´s "Symbolisch"
I_ID: WORD; // ID-Nummer der externen Steuerung
I_DB_Nr: INT; // Nummer des DBs
I_DB_Byte_Adr: INT; // Bereichszeiger auf Bit- und BYTE-Adresse
I_Byte_Count: INT; // Anzahl der Byte
END_VAR
VAR
Get_Data: "GET"; //"FB_Get"; // Struktur von FB14 "Get" in Instanz DB (GET=SFB 14 FB_Get=FB14)
Put_Data: "PUT"; //"FB_Put"; // Struktur von FB15 "Put" in Instanz DB (PUT=SFB 15 FB_Put=FB15)
Get_Impuls: BOOL; // Startimpuls DB empfangen
Put_Impuls: BOOL; // Startimpuls DB senden
END_VAR
VAR_TEMP
Buffer: "UDT_ANY_Pointer"; // Zwischenspeicher für Pointer
Temp_Any_Pointer AT Buffer: ANY; // Any-Pointer
END_VAR
//Teile des SCL Codes
//======================================
// Any Pointer deklarieren
//======================================
Buffer.Syntax_ID := b#16#10; //Pufferlänge
Buffer.DataTyp := b#16#02; //Code für Datentyp BYTE
Buffer.Count := INT_TO_WORD(AnzahlBytes); //Anzahl der Nutzdaten-Byte
Buffer.DB_Number := INT_TO_WORD(300); //Nummer des Ziel-DBs für die Nutzdaten
Buffer.Byte_Pointer := dw#16#84000000; //Pointer auf Globaldaten DBX0.0
//Byte-Adresse in Pointer laden
//Buffer.Byte_Pointer:= Buffer.Byte_Pointer OR (SHL(in:=WORD_TO_DWORD(INT_TO_WORD(StartByte)),N:=3));;
Schritt := Schritt;
//======================================
// Function"Get": DB receive
//======================================
Get_Data(REQ := Get_Impuls // DB empfangen
,ID := I_ID // ID-Nummer der externen Steuerung
,ADDR_1 := Temp_Any_Pointer //Temp_Any_Pointer // Externe Adresse des DB´s
,RD_1 := I_Int_ADDR_1); // Interne Adresse des DB´s
//======================================
// Function "Put": DB send
//======================================
Put_Data(REQ := Put_Impuls // DB senden
,ID := I_ID // ID-Nummer der externen Steuerung
,ADDR_1 := Temp_Any_Pointer // Externe Adresse des DB´s
,SD_1 := I_Int_ADDR_1); // Interne Adresse des DB´s
Habe is mit den SFC und den FC aus der Siemens Bibliotek versucht. Beides läuft nur wenn ich immer den ganzen DB übertrage. Ich möchte aber nur einen Teil senden und einen anderen Teil empfangen..
Mache ich was falsch, oder wo könnte der Fehler sein?
Besten dank schonmal..
Grüsse
bin neu hier und möchte mich erstmal für zahlreiche Infos bedanken.
Leider stehe ich vor einem Problem, bei welchem ich alleine nicht weiter komme Google und Co. auch nichts brachbares finden.
Ich möchte eine Datenkommunikation via Profinet zwischen einer ET200S und einer 315-PN/DP aufbauen.
Es soll von der ET200S ein teil eines Datenbausteins DB300 an die 315 übertragen werden.
Der DB300 ist 12Byte gross. Davon sollen die ersten 8Byte gesendet (put) und die letzen 4 Byte empfangen (get) werden.
Nun habe ich mit der Siemens-"Hilfe" den Anypointer und die Übertragung im SCL zum Laufen bekommen..
ABER....
Hier kommt mein Problem
Ich muss bei der Übertragung immer die ganzen 12Byte übertragen. Sobald ich nur die ersten zwei oder vier Byte übertragen möchte, bringt die Funktion den Status 4 als Fehlermeldung. Und meine Funktion möchte dann wieder neu Senden/bzw. empfangen. Doch mit dem Status 4 kann ich mit der Siemens-"Hilfe" nichts anfangen... :-(
Hier mal meinen prinzipiellen Aufbau des SCL codes:
Teile der Input/Parameter (NICHT Vollständig!!)
VAR_INPUT
I_Int_ADDR_1: ANY; // Interne Adresse des DB´s "Symbolisch"
I_ID: WORD; // ID-Nummer der externen Steuerung
I_DB_Nr: INT; // Nummer des DBs
I_DB_Byte_Adr: INT; // Bereichszeiger auf Bit- und BYTE-Adresse
I_Byte_Count: INT; // Anzahl der Byte
END_VAR
VAR
Get_Data: "GET"; //"FB_Get"; // Struktur von FB14 "Get" in Instanz DB (GET=SFB 14 FB_Get=FB14)
Put_Data: "PUT"; //"FB_Put"; // Struktur von FB15 "Put" in Instanz DB (PUT=SFB 15 FB_Put=FB15)
Get_Impuls: BOOL; // Startimpuls DB empfangen
Put_Impuls: BOOL; // Startimpuls DB senden
END_VAR
VAR_TEMP
Buffer: "UDT_ANY_Pointer"; // Zwischenspeicher für Pointer
Temp_Any_Pointer AT Buffer: ANY; // Any-Pointer
END_VAR
//Teile des SCL Codes
//======================================
// Any Pointer deklarieren
//======================================
Buffer.Syntax_ID := b#16#10; //Pufferlänge
Buffer.DataTyp := b#16#02; //Code für Datentyp BYTE
Buffer.Count := INT_TO_WORD(AnzahlBytes); //Anzahl der Nutzdaten-Byte
Buffer.DB_Number := INT_TO_WORD(300); //Nummer des Ziel-DBs für die Nutzdaten
Buffer.Byte_Pointer := dw#16#84000000; //Pointer auf Globaldaten DBX0.0
//Byte-Adresse in Pointer laden
//Buffer.Byte_Pointer:= Buffer.Byte_Pointer OR (SHL(in:=WORD_TO_DWORD(INT_TO_WORD(StartByte)),N:=3));;
Schritt := Schritt;
//======================================
// Function"Get": DB receive
//======================================
Get_Data(REQ := Get_Impuls // DB empfangen
,ID := I_ID // ID-Nummer der externen Steuerung
,ADDR_1 := Temp_Any_Pointer //Temp_Any_Pointer // Externe Adresse des DB´s
,RD_1 := I_Int_ADDR_1); // Interne Adresse des DB´s
//======================================
// Function "Put": DB send
//======================================
Put_Data(REQ := Put_Impuls // DB senden
,ID := I_ID // ID-Nummer der externen Steuerung
,ADDR_1 := Temp_Any_Pointer // Externe Adresse des DB´s
,SD_1 := I_Int_ADDR_1); // Interne Adresse des DB´s
Habe is mit den SFC und den FC aus der Siemens Bibliotek versucht. Beides läuft nur wenn ich immer den ganzen DB übertrage. Ich möchte aber nur einen Teil senden und einen anderen Teil empfangen..
Mache ich was falsch, oder wo könnte der Fehler sein?
Besten dank schonmal..
Grüsse