Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: SCL Daten von FB in beliebigen DB schreiben

  1. #1
    Registriert seit
    23.07.2013
    Beiträge
    16
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    nachdem ich jetzt weis wie ich Daten in den DB eines FB schreibe möchte ich nun folgendes.
    Für euch sicher kein großes Ding. Ich bin allerdings C Programmierer und finde mich in der SCL-Welt noch nicht so zurecht.


    Bsp.

    FB52 call FB15 -> schreibt Daten in DB52

    Also Der FB52 ruft einen Funktionsbaustein FB15 auf. Dieser wertet Daten aus und soll diese in den DB52 des FB52 schreiben. Es handelt sich dabei um ein 20Byte array.

    Wie mache ich das am besten.
    Meine Vorstellung wäre, ich übergebe die Startadresse des Arrays dem FB15. Dieser schreibt dann über das Array die Daten in meinem DB52.

    Kann mir da vielleicht jemand weiter helfen???

    schönes Wochenende und Danke!
    Zitieren Zitieren SCL Daten von FB in beliebigen DB schreiben  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Hallo,
    ich habe es nicht so richtig gecheckt ...
    - Der FB52 mit dem DB52 ruft den FB15 auf.
    - Der FB15 "befruchtet" in seiner Instanz ein Array auf das du im FB52 dann zugreifen willst ?
    Ist das so korrekt ?
    Wenn ja, dann brauchst du den FB15 nur zur einer Teilnehmer der Instanz des FB52 machen. Das geht, in dem du ihn im STAT-Bereich des FB52 als Typ deklarierst. Nun kann der FB15 alles an den FB52 "vererben" ...

    Gruß
    Larry

  3. #3
    ChrissT ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    23.07.2013
    Beiträge
    16
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hey,

    vielen Dank für die Antwort. Ich musste jetzt erstmal genau definieren was ich will. Wie gesagt, ich komme nicht aus der SCL Welt.
    Ich versuche es nochmal genauer zu erklären.

    Ich habe einen globalen DB 52 mit Listen (um genau zu sein habe ich davon mehrere)
    L1 : Array [0 .. 8] of Byte;
    L2 : Array [0 .. 8] of Byte;

    Dann habe ich einen Baustein FB15 der mir Daten via Mailboxfunktion holt.
    Jetzt suche ich nach einer Möglichkeit, den FB15 über einen FB52 aufzurufen und dem FB15 mitzuteilen, dass die Daten in die Liste L1 des DB52 legen soll oder in den DB53 oder in den DB54.....

    Was vielleicht noch zu erwähnen ist, ist das die Antwort der Mailboxfunktion 12 Byte sind und ich nur die Daten ohne Offset benötige. Ich habe es schon geschafft, wenn dem FB15 indiziert das bytearray übergebe. db52.L1. So will ich das aber nicht.
    Was ich damit sagen möchte ist, ich übergebe dem FB15 bspw. die Adresse und die Länge der des Arrays L1 in einem beliegen DB.

    Gibt es vielleicht eine Möglichkeit, wenn ich den FB15 aufrufe, ihm mittzuteilen, benutze jetzt den DB5x und schreibe den Inhalt in L1????

    Kann mir jemand helfen?
    Grüße
    Geändert von ChrissT (02.08.2013 um 15:05 Uhr)

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Na ... das ist doch prima ...
    Da solltest du dich (mal losgelößt von SCL) zum Einen mit dem SFC Blockmove (ich meine das ist SFC20 - bin mir da aber gerade nicht sicher) und zum Anderen mit dem Stichwort "ANY-Pointer" (hierzu auch gerne die Foren-Suche bemühen) beschäftigen. Damit läßt sich das lösen ...
    Wenn du dazu speziellere Fragen hast : gerne posten ...

    Gruß
    Larry

  5. #5
    ChrissT ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    23.07.2013
    Beiträge
    16
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Larry,

    vielen Dank ich habe vermutet, dass es darauf hinaus läuft.
    Ich habe jetzt also angefangen mich mit den ANY Pointern zu befassen. Ich habe auch folgendes Beispielprojekt gefunden:

    Code:
    FUNCTION_Block FB598  
      
    VAR  
    	Test1: STRUCT  //ANY Struktur 1 anlegen              
    		ANY_id: BYTE;  //Define ANY structure 1  
    		Source_DataType: BYTE;  
    		Source_Lenght: WORD;  
    		Source_DB_Nummer: WORD;  
    		Source_Byte_Pointer: DWORD;  
    		END_STRUCT;  
    	Test2: STRUCT  //ANY Struktur 2 anlegen  
    		ANY_id: BYTE;  //Define ANY structure 2  
    		Destin_DataType: BYTE;  
    		Destin_Lenght: WORD;  
    		Destin_DB_Nummer: WORD;  
    		Destin_Byte_Pointer: DWORD;  
    		END_STRUCT;  
    	//Deklaration ANY Pointer für Quell-DB  
    	//Declaring ANY pointer of source DB  
    	pAny_source AT Test1: ANY;    
    	//Deklaration ANY Pointer für Ziel-DB  
    	//Declaring ANY pointer of target DB  
    	pAny_destin AT Test2: ANY;    
    	erg: INT;  //Rückgabewert / Return value  
    END_VAR  
      
    BEGIN  
    Test1.ANY_id:= 16#10;  //Vorbelegen der Quell-ANY-Pointer Variablen  
    Test1.Source_DataType:= 16#2;  //Assign values for source pointer  
    Test1.Source_Lenght:= 16#0a;  
    Test1.Source_DB_Nummer:= 16#06;  
    Test1.Source_Byte_Pointer:= dw#16#84000000;  
      
    Test2.ANY_id:= 16#10;  //Vorbelegen der Ziel-ANY-Pointer Variablen  
    Test2.Destin_DataType:= 16#2;  //Assign values for destination pointer  
    Test2.Destin_Lenght:= 16#0a;  
    Test2.Destin_DB_Nummer:= 16#07;  
    Test2.Destin_Byte_Pointer:= dw#16#84000000;  
    //Aufruf SFC20 und Parametrierung der ANY-Pointer-Variablen  
    //Calling SFC20 and programming of ANY pointer variables  
    erg:= SFC20(srcblk:= pAny_source, dstblk:= pAny_destin);  
    END_FUNCTION_BLOCK
    Habe das ganze in TIA V12 über externe Quellen geladen und einen Baustein generiet. Leider habe ich immer bei

    pAny_source "AT construct"

    das der Datentyp an dieser Stelle nicht erlaubt ist. Ich habe dazu auch was gefunden, aber auch wenn ich es den TEMP Bereich verschiebe ändert sich daran nicht.
    Hast du eine Idee???

    Danke!

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Hallo,
    im Moment nicht - es gibt da aber auch ein kleines Problem :
    - ich arbeite nicht mit TIA V12 - ich weiß nicht, ob es daran liegt ...

    Bei der Deklaration mache ich es gewöhnlich anders herum : ich lege mit die ANY-Variable an und bilde darauf die AT-Sicht. Das sollte aber eigentlich keine Rolle spielen.
    Der ANY und die AT-Sicht müssen im gleichen Deklarationsbereich stehen (hier TEMP).

    Gruß
    Larry

  7. #7
    Registriert seit
    12.08.2013
    Beiträge
    1
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,
    SCL in TIA V12 funktioniert am besten mit Symbolischer Adressierung. Wenn du Daten in einem Globalen DB Schreiben/ Lesen möchtest geht das von jedem OB, FB, FC.
    z.B. daten in den DB Schreibe "Daten".Array[index] := 1;
    z.B. Daten aus dem DB lesen "Merker" := "Daten".Array[index];

    MfG
    loefflfab

  8. #8
    ChrissT ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    23.07.2013
    Beiträge
    16
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich bin leider immer noch kein Stück weiter ;(

    Ich versuche nocheinmal die Funktion genauer zu beschreiben.

    FB1 -> prüft welcher Teilnehmer felerhaft ist ruft dann FB2
    FB2 -> hier wird vorgegeben welche Diagnosen geholt werden sollen. -> FB3
    FB3 -> holt über kommandoschnittstelle die unterschiedlichen Diagnosen

    1. Es gibt die Möglichkeit den fehlerhaften Teilnehmer bis zum FB3 zu kommunizieren so das dieser weiss in welchen globalen DB (jeder Teilnehmer hat einen eigenen DB für die Diagnosen) er die Daten packen soll. Hier könnte ich das dann auch einfach so machen: "Daten".Array[index] := 1;
    Meiner Meinung nach völlig unschön!!!

    In TIA V12 komme ich überhaupt nicht mit den Zeigern und den AT Sichten zurecht. Ich weiss zwar mittlerweile wie man einen anlegt, aber nicht wie ich Daten bzw. Array weiter reiche.

    Wünschen würde ich mir folgendes:
    FB1 erkennt fehler und teilt FB2 den dazugehörigen globalen DB mit. Also zb. DB1
    FB2 holt die Diagnose über FB3 und gibt den globalen DB1 weiter und sagt dazu aber noch in welchem Array die Daten stehen sollen. Also sowas wie "Daten".Array[index] := 1;

    Hat irgendjemand ne Lösung mit TIA V12.............

  9. #9
    Registriert seit
    01.10.2012
    Beiträge
    203
    Danke
    12
    Erhielt 56 Danke für 36 Beiträge

    Standard

    Hallo,

    also dein FB1 wird im OB1 aufgerufen und prüft die Teilnehmer, die Teilnehmer haben einer Variable, sagen wir 1 oder 2 oder 3 usw. beim Ausfall wird im FB1 der FB2 aufgerufen und die Variable als Input übergeben.
    Nun versteh ich das nicht ganz, FB2 prüft den Teilnehmer und wertet den Fehler aus oder? FB3 nimmt dann die Auswertung und soll dann das entprechende Array kopieren?
    Sagen wir nun Teilnehmer 2 fällt aus und es liegt Fehler 2 an. Fehler 2 liegt in Array Fehler2 des DB2 und du willst das in das Array "Fehler" des DB3 haben, sagen wir das sind 10 Bytes, dann würde das in etwa so aussehen.
    Ich hab mit TIA noch nix weiter gemacht, aber so mach ichs in SCL. Die Symbolik muß da entsprechend angepaßt werden...

    Code:
     If Fehler = 2 then
                   For i := 0 to 9 by1 Do 
                   DB3.Fehler[i] := DB2.Fehler2[i];
                   End_For; 
                End_if;


    Das geht sicher hübscher und eleganter, aber ich denke mal es sollte erstmal weiterhelfen.

  10. #10
    Registriert seit
    29.03.2004
    Beiträge
    5.797
    Danke
    144
    Erhielt 1.707 Danke für 1.239 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Wenn du schreibst du bist C-Programmierer: Wie würdest du das denn in C machen?
    Das Konzept ist doch sehr ähnlich, außer dass es in SCL keine richtigen Pointer gibt bzw. die Weitergabe von Daten als Referenz durch mehrere Bausteine umständlich wird, da soetwas direkt nicht geht.

    Wenn nur der FB1 weiß zu welchem Datensatz die Diagnosedaten gehören, kann er die unterlagerten FBs mit einem anonymen Datensatz aufrufen, und kopiert die nach Fertigstellung dann wieder an die entsprechende Stelle im Global-DB.

Ähnliche Themen

  1. TIA Daten von Sentron PAC 3200 in DB schreiben
    Von 4nD1 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 09.07.2013, 13:25
  2. Wie Daten von SMA OPC in S7-300 schreiben?
    Von Klärmolch im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 08.06.2012, 15:52
  3. Status 8F62 beim Schreiben von FTP - Daten
    Von CrazyCat im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 10.05.2010, 18:39
  4. Antworten: 2
    Letzter Beitrag: 10.04.2009, 14:10
  5. Daten von TP170B Color auf CF-Card schreiben
    Von elektro_hirs im Forum HMI
    Antworten: 0
    Letzter Beitrag: 04.04.2006, 09:51

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •