Step 7 Variabel Datenbereiche übertragen

rise66

Level-1
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,

ich habe bei folgender Aufgabe ein Problem.
Ich habe Daten für xx Farhzeuge in der gleichen Menge gleich aufgebauter DBs.
Diese Daten möchte ich nach Vorgabe eines INT Wertes der die Fahrzeug Nummer und gleichzeitig DB Nummer ist
übertragen. Das ganze Wollte ich über einen BLKMOV machen. Das Fahrzeug das ich in meinen Anzeige DB (Bearbeitungs-DB) übertragen
will gebe ich als INT Wert in meiner Visualisierung vor. Mit dem BlKMov übertrage ich immer die selbe Anzahl an Bytes (100)
von der selbe Stelle in den unterschiedlichen DBs. Wie ist es mir möglich den DB Variabel vorzugeben und dann immer den BLKMov mit der richtigen
DB nummer zu beschreiben die Anfangsadresse der zu übertragenden Daten in den unterschiedlichen DBs bleibt immer gleich.
z.B. P#DBxxx.DBX100.0 Byte 100
Hintergrund ist der ich möchte über eine Visualisierung die Fahrzeugdaten Editieren, dazu lade ich Sie mittels Visu-Button (read) der BLKMOV auslöst in einen Bearbeitungs DB
die entsprechende Nummer wird in der Visu vorgegeben.
In der Visu werden dann die vorhanden Daten angezeigt, sie werden im Bearbeitungs DB von der Visu editiert mit einem Button (write) klick wird ein weiterer
BLK MOV ausgelöst der Sie wieder in den "echten" DB überträgt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich glaube dass der Beitrag oben drüber nutzlos ist... Und ich glaube dass es dir helfen würde einen ANY-Pointer dynamisch zusammenzubauen und diesen am SFC20 anzuparametrieren.

André
 
Was mir vorschwebt ist folgendes :
Ein FB ist von aussen zu belegen mit Aktualparameter (die sind nicht nicht in dem gewollten Sinne Variabel) , könnte man nicht die Aktualparameter mit Formalparameter (die sind Variabel) ersetzen wenn die FB in einem andern FB aufruft ...VERSCHACHTELUNG ...eben !

:confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Findet hier jemand den Fehler?
Funktioniert leider in Verbindung mit BLKMOV nicht.

L B#16#10 //10h für s7
T LB 0
L B#16#2 //Typ Byte
T LB 1
L 100 //Anzahl (Wiederholungsfaktor)
T LW 2
L #FTF_DB_NR //Datenbaustein
T LW 4
L 100 //Anfangsadresse
SLD 3 //Pointer bauen
T LD 6
L B#16#84 //Speicherbereich (hier DB)
T LB 6
 
So verwalte ich Typdaten auch am liebsten, bin kein Rezepturfreund...

Deine Blockmove-Parameter sind so schon ok, was bringt der SFC20 denn für einen Fehler? Hier mal die üblichen Verdächtigen:
- Datenbausteine vorhanden + groß genug?
- Quell- und Zielfeld dürfen nicht überlappen

für LD6 (Speicherbereich) sieht auch der Pointer P#DBX100.0 hübsch aus, oder eben die Addition aus Deiner Startadresse und dem Speicherbereichsanfang
Code:
L  100  //Startadresse
SLD 3
L P#DBX0.0
+D
T LD 6

Gruß StGo
 
und natürlich musst Du 2 ANY zusammenbauen, einen für Quelle und einen für das Ziel,
z.B. 10 Byte ab L 0 (Quelle) und 10 Byte ab L10 (Ziel)

Die Parameter der beiden Any sollten sich bei Dir ja scheinbar nur in der DB-Nr. unterscheiden.

Gruß StGo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier een FC mit variabele Quelle (Bron) und Ziel (Doel)

Code:
FUNCTION FC 110 : INT
TITLE =Block copy met var. bron en var. doel.
//Kopieren van variable met een variable bron en een variabel doel.
//Bron en doel mogen elkaar niet overlappen
//Onderliggend bouwsteen SFC 20.
AUTHOR : JB
FAMILY : Kopie
NAME : Blk_mov
VERSION : 0.0


VAR_INPUT
  DB_NR_BRON : INT ;    //0 =MERKER BEREIK ANDERS DB NR VAN BRON
  BYTE_1_BRON : INT ;    //NR VAN EERSTE BYTE VAN BRON
  BYTE_WORD : BOOL ;    //BYTE=0 WORD=1
  LENGTE : INT ;    //AANTAL TE COPIEREN BYTES OF WOORDEN
  DB_NR_DOEL : INT ;    //0 =MERKER BEREIK ANDERS DB NR VAN DOEL
  BYTE_1_DOEL : INT ;    //NR VAN EERSTE BYTE VAN DOEL
END_VAR
VAR_TEMP
  T_AR1 : DWORD ;    
  T_ANY_BRON : ANY ;    
  T_ANY_DOEL : ANY ;    
END_VAR
BEGIN
NETWORK
TITLE =Opslaan inhoud van het Adresregister AR1

      TAR1  #T_AR1; 

NETWORK
TITLE =Samenstellen van DOEL adres in ANY formaat

      LAR1  P##T_ANY_BRON; //Beginadres ANY pointer in AR1 laden
      L     B#16#10; //Syntax-ID in de Any pointer zetten
      T     LB [AR1,P#0.0]; 
      L     B#16#2; //Bereichstyp BYTE laden
      UN    #BYTE_WORD; 
      SPB   Tran; 
      L     B#16#4; //Bereichstyp WORD laden
Tran: T     LB [AR1,P#1.0]; //BYTE of WORD in ANY pointer zetten
      L     #LENGTE; //Aantal BYTE'S of WORD'S
      T     LW [AR1,P#2.0]; //In ANY pointer zetten
      L     #DB_NR_BRON; //DB nr 
      T     LW [AR1,P#4.0]; //In ANY pointer zetten
      L     0; 
      ==I   ; 
      SPB   Merk; //Als DB nr = 0 dan naar merkers
      L     P#DBX 0.0; //Adres voor DBX 0.0
      SPA   Offs; 
Merk: L     P#M 0.0; //Adres voor M 0.0
Offs: L     #BYTE_1_BRON; //Nummer van eerste BYTE
      SLD   3; //Nummer op juiste plaats zetten
      +D    ; //Adres van 1ste BYTE of WORD
      T     LD [AR1,P#6.0]; //In ANY pointer zetten
NETWORK
TITLE =Samenstellen van BRON adres in ANY formaat

      LAR1  P##T_ANY_DOEL; //Beginadres ANY pointer in AR1 laden
      L     B#16#10; //Syntax-ID in de Any pointer zetten
      T     LB [AR1,P#0.0]; 
      L     B#16#2; //Bereichstyp BYTE laden
      UN    #BYTE_WORD; 
      SPB   Tra1; 
      L     B#16#4; 
Tra1: T     LB [AR1,P#1.0]; 
      L     #LENGTE; 
      T     LW [AR1,P#2.0]; 
      L     #DB_NR_DOEL; 
      T     LW [AR1,P#4.0]; 
      L     0; 
      ==I   ; 
      SPB   Mer1; 
      L     P#DBX 0.0; 
      SPA   Off1; 
Mer1: L     P#M 0.0; 
Off1: L     #BYTE_1_DOEL; 
      SLD   3; 
      +D    ; 
      T     LD [AR1,P#6.0]; 
NETWORK
TITLE =Oproep van SFC 20  (BLKMOV)

      CALL SFC   20 (
           SRCBLK                   := #T_ANY_BRON,//Adres waar data vandaan moet komen
           RET_VAL                  := #RET_VAL,//Foutmelding
           DSTBLK                   := #T_ANY_DOEL);//Adres waar data naartoe moet
NETWORK
TITLE =Inhoud adresregister AR1 terugzetten

      LAR1  #T_AR1; 

END_FUNCTION

Wenn Sie WinCC Flex als Visu braucht konte Sie in Flex auch die DB von der variabele multiplexen.
Z.b.

DNnr int MW100
var_1_Fahrzeug int DB [DBnr] DBW 0
var_2_Fahrzeug int DB [DBnr] DBW 2
u.z.w.

Hiermit wurde die variable direct auf der visu bearbeid.

Joop
 
Hier mal ein Screenshot :

In dem ersten Netzwerk wird die Vorgabe IN1 die von der Visu kommt, mit dem offset (Real DB Adressen addiert)
Datenbaustein ist groß genug und vorhanden, wenn ich die Adresse der Quelle direkt am BLKMOV angebe funktioniert,
das ganze auch es muss also ein Fehler beim Zeiger bilden sein. Ich simuliere das ganze zum Test mit PLC Sim, reale SPS ist eine 416-F

1.jpg2.jpg3.jpg
 
@joop

vielen Dank für Ihren Baustein.
Ich habe auch bereits einen fertigen FC den ich nutzen kann, wollte es jedoch selbst probieren,
der Lerneffekt dabei ist größer...
Ich verwende hier leider Graph Pic ...
 
Zurück
Oben