Daten in DB schreiben /aus DB lesen/ kopieren

Heizerfraktion

Level-1
Beiträge
44
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute,

habe gerade ein dickes Brett vor dem Kopf. Folgendes Problem:
Werte (INT) von mehreren Meßstellen aus DB lesen und in anderen DB schrieben (kopieren). Hane diesen DB als Array angelegt

DB150.dbw14 Wert 1 -> DB60.dbw0
DB150.dbw28 Wert 2 -> DB60.dbw2
DB150 dbw42 Wert 3 -> DB60.dbw4

Über die Visu möchte ich einen Sollwert (INT) vorgeben, der für alle Meßstellen gültig ist.

DB70.dbw0 -> DB80.dbw14
-> DB80.dbw28
-> DB80.dbw42
.......

Könnt ihr mir bitte dabei kurzfristig helfen?
Danke schon mal vorab

Gruß Heizer
 
Da die Werte nicht am Stück vorliegen, ist kein Blockmove möglich. Es bleibt somit Zugriff mit Pointern oder das Ganze auszuprogrammieren.
Code:
L DB150.dbw14
T DB60.dbw0
L DB150.dbw28
T DB60.dbw2
L DB150.dbw42
T DB60.dbw4
Beim Sollwert ist es ja nur ein mehrfaches Transferieren
Code:
L DB70.dbw0 
T DB150.dbw14
T DB150.dbw28
T DB150.dbw42
Oder habe ich jetzt die Frage nicht richtig verstanden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da die Werte nicht am Stück vorliegen, ist kein Blockmove möglich. Es bleibt somit Zugriff mit Pointern oder das Ganze auszuprogrammieren.
Code:
L DB150.dbw14
T DB60.dbw0
L DB150.dbw28
T DB60.dbw2
L DB150.dbw42
T DB60.dbw4
Beim Sollwert ist es ja nur ein mehrfaches Transferieren
Code:
L DB70.dbw0 
T DB150.dbw14
T DB150.dbw28
T DB150.dbw42
Oder habe ich jetzt die Frage nicht richtig verstanden?
Hallo Herr Hönle,

danke für die Info, dass der Blockmove nicht funktioniert ist mir auch klar.
Die Frage haben Sie richtig verstanden, allerdings muss ich mehrere Daten (ca 150 Messwerte und das Ganze ca 30 x) kopieren/transferieren. Wenn ich das nach der klassichen Methode L DB150.dbw0 T DB160dbw14 mache ist das sehr unkomfortabel.
Habe an indirekte Adressierung gedacht.
Geht das eigentlich komfortabel in SCL? Habe mich allerdings damit noch nicht beschäftigt.
 
Hallo Zusammen,

um Missverständnisse zu vermeiden:
1. Der Offset von 14 Worten ist immer gleich, lediglich die Startadresse variiert
2. Ich hatte an zwei Bausteine gedacht, einen für das Schreiben der Daten und einen zum Lesen

@ vierlagig: Daran hatte ich auch gedacht, allerdings ist mir die Funktinsweise von DI nicht mehr ganz geläufig

Ich versuch das Gnze noch mal genauer zu beschreiben:

30 Daten lesen aus DB150,(Werte haben einen Offset von 14 Worten) schreiben in ein Array [1-30] nach DB 160

Startadresse z.B. DB150. DBW14 Wert 1 -> DB156.DBW40
DB150. DBW28 Wert 2 -> DB156.DBW42
... ......................................
DB150. DBW420 Wert 1 -> DB156.DBW74

Nun möchte ich umgekehrt mit einem anderen Baustein die Werte aus dem Array [1-30] im DB160 in einen anderen DB170 schreiben

Ich hoffe, dass e jetzt besser verständlich ist

Gruß Heizer
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
  AUF   "Quelle" DB 160
      AUF   DI    156
      L     P#14.0    //  die startadresse kann man auch variabel 
      T     MD    20 //   gestalten
      L     P#40.0
      T     MD    30
      L     30
next: T     #count
      L     DBW [MD 20]
      T     DIW [MD 30]
      L     MD    20
      L     P#14.0
      +D    
      T     MD    20
      L     P#2.0
      L     MD    30
      +D    
      T     MD    30
      L     #count
      LOOP  next

das ist eine sehr einfache möglichkeit ohne AR1 und AR2 um die Daten von einem in den anderen DB zu schreiben
 
@ vierlagig: Daran hatte ich auch gedacht, allerdings ist mir die Funktinsweise von DI nicht mehr ganz geläufig

die steuerung hat zwei adressregister
du kannst mit AUF DI (eigentlich instanz-DB) auch einen globalen DB aufmachen und benutzt diesen dann automatisch mit dem AR2 (im gegensatz dazu: AR1 "benutzt" den DB der mit AUF DB geöffnet wird)

VORSICHT! in FBs, denn da wird das AR2 für die interne adressierung automatisch benutzt, dass heißt, du solltest sowal AR2 also auch den letzten offenen DI speichern und nach deiner kopierfunktion wieder herstellen (würde ich übrigens grundsätzlich machen...

mittlerweile hat gerhard schon geantwortet ... ja, ohne AR gehts auch, aber ich finds schöner mit ^^ vorallem wegen so tollen möglichkeiten wie

Code:
*
     +AR1    P#2.0

das verkürzt das konstrukt ...

zum variablen laden der adressen das erste byte nummerieren und drei nach links schieben (SLD 3) ... hängt mit dem pointeraufbau zusammen ... xxxx xyyy .... x byte-, y bitadresse
 
Zuletzt bearbeitet:
@Dalbi sorry, ich hab auf die schnelle Deinen Baustein rauskopiert und geändert.

@Heizer, bei dem Baustein übergibst du die Quelle und das Ziel einfach als Anyzeiger. (Quelle_1 := DB150.DBW14 / Quelle_2 := DB156.DBW40)
Anzahl wären Deine 30 Worte
Und wenn Du das Bit schreiben auf True setzt werden die Daten von DB156 in den DB150 zurück geschrieben.
Ist allerdings jetzt nicht getestet.

Den Danke Button kannst Du dann beim Dalbi drücken, der Link bringt Dich zum Orginalbaustein (Schaut aber ein bisschen anders aus):
http://sps-forum.de/showpost.php?p=251550&postcount=116

Code:
FUNCTION "FC10" : VOID
TITLE : Daten kopieren
VERSION : 0.1
 
 
VAR_INPUT
  Quelle_1 : ANY ;    
  Quelle_2 : ANY ;   
  Anzahl  : INT ; 
  Schreiben : Bool; // True =schreiben / Fales = lesen
END_VAR
VAR_TEMP
  tDBNr_Q1 : WORD ;    
  tDBNr_Q2 : WORD ;    
  tZaehler : INT ;    
  tSaveAr1 : DWORD ;    
  tSaveAr2 : DWORD ;    
END_VAR
BEGIN
NETWORK
TITLE =Adressregister sichern
 
      TAR1  #tSaveAr1; 
      TAR2  #tSaveAr2; 
 
NETWORK
TITLE =Zeiger zusammenstellen
      U #Schreiben
      L     P##Quelle_2;
      SPB S1;
      L     P##Quelle_1; 
S1:   LAR1; 
      L     W [AR1,P#4.0]; //DB-Nummer o. =0
      T     #tDBNr_Q1; 
      L     D [AR1,P#6.0]; //Speicherbereich
      LAR1  ; //AR1 auf Erste Adresse
 
      U #Schreiben;
      L     P##Quelle_1;
      SPB S2;
      L     P##Quelle_2; 
S2:   LAR2 ; 
      L     W [AR2,P#4.0]; //DB-Nummer o. =0
      T     #tDBNr_Q2; 
      L     D [AR2,P#6.0]; //Speicherbereich
      LAR2  ; //AR2 auf Erste Adresse
 
NETWORK
TITLE =Daten kopieren
 
      L #Anzahl; 
next: T     #tZaehler; 
 
      AUF   DB [#tDBNr_Q1]; //Quelle Datenbaustein öffnen
      L     DBW [AR1,P#0.0]; //Quelle laden
      AUF   DB [#tDBNr_Q2]; //Ziel Datenbaustein öffnen
      T     DBW [AR2,P#0.0]; //Ziel transferieren
 
      U #Schreiben;
      SPB S3;
      +AR1  P#14.0; //Adresse AR1 um 14 Byte erhöhen
      +AR2  P#2.0; //Adresse AR2 um 2 Byte erhöhen
      SPA ENDE;
S3:   +AR1  P#2.0; //Adresse AR1 um 2 Byte erhöhen
      +AR2  P#14.0; //Adresse AR2 um 14 Byte erhöhen
ENDE:  NOP 0;
      L     #tZaehler; //Noch mal?
      LOOP  next; 
 
NETWORK
TITLE =Adressregister AR1&2 wiederherstellen
 
      LAR1  #tSaveAr1; 
      LAR2  #tSaveAr2; 
 
END_FUNCTION
 
hier noch eine lösung mit auf DB und auf DI , AR1 und AR2

Code:
      TAR1  #ar1sichern
      TAR2  #ar2sichern
 
      AUF   DB   156
      AUF   DI   150
 
      L     #startlesen
      SLD   3
      LAR1  
 
      L     #startschreiben
      SLD   3
      LAR2  
 
      L     30
next: T     #count
      L     DBW [AR1,P#0.0]
      T     DIW [AR2,P#0.0]
 
      +AR1  P#14.0
      +AR2  P#2.0
 
      L     #count
      LOOP  next
 
      LAR1  #ar1sichern
      LAR2  #ar2sichern

ist jetzt der code für eine FC. für einen FB muß man noch was hinzuzählen(siehe Beitrag von vl)
 
Zuletzt bearbeitet:
Hallo Leute,

danke erst mal für die Kurzfristige Unterstützung. War gestern so genervt, da war klar denken nicht mehr möglich.
Generell mal: Was bevorzugt ihr bei solchen Anwendungen-> FB oder FC? Ich persönlich bin mehr der Freund von FC's.
Habe die Vorschläge umgesetzt, werde mich jetzt ans testen machen.
Habt ihr Erfahrungen mit Zykluszeiten bei häufiger Verwendung von solchen Bausteinen? Wie siehts mit der Abarbeitungim Programm aus -> innerhalb eines Zykluses oder über mehrere verteilt? Gibt es eventuell Konflikte mit dem OB35 bei 20ms Aufruf?

@ vierlagig:
Das mit dem DI war mir neu, dachte das würde nur mir FB's gehen. Also wieder was gelernt. Muss mich mal wieder intensiver die Theorie beschäftigen.

Schon mal an allle eine schönes WE
Gruß Heizer
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Generell mal: Was bevorzugt ihr bei solchen Anwendungen-> FB oder FC? Ich persönlich bin mehr der Freund von FC's.
Habe die Vorschläge umgesetzt, werde mich jetzt ans testen machen.
Habt ihr Erfahrungen mit Zykluszeiten bei häufiger Verwendung von solchen Bausteinen? Wie siehts mit der Abarbeitungim Programm aus -> innerhalb eines Zykluses oder über mehrere verteilt? Gibt es eventuell Konflikte mit dem OB35 bei 20ms Aufruf?
Hallo Heizer,
ich nehme für so etwas auch gerne eine FC.
Da in dem Baustein ja nichts gemerkt werden muss. Die Daten werden ja in einem Zyklus kopiert.
Und selbst wenn der Baustein durch einen Alarm OB unterbrochen wird, macht das dem Temporären Zeiger nichts aus, da ja jeder OB seinen eigenen Lokaldaten Stack besitzt.

Betreff Zykluszeit:
Ob Du jetzt jedes Datenwort mit "L" und "T" übergibst oder das in einer Schleife machst ist fast egal.
Und 30 Variablen sind jetzt nicht wirklich viel.

Ob das Konflikte mit dem OB35 macht kann man so pauschal nicht sagen.
Deine Zykluszeit sollte halt immer kleiner sein als die Aufrufzeit des Weckalarms.
 
Zurück
Oben