Indirekt per Zeiger in DB schreiben

Binatone

Level-1
Beiträge
39
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen...
Ich möchte mithilfe einer Index-Variable indirekt in einen DB schreiben.
Das Ganze soll in SCL stattfinden, es sei denn, es gibt fertige Funktionen in FUP ?!

Hintergrund:
Ich hab 72 INT Werte in einem DB, die ich von einer CPU zur anderen schicken muss.
Beide CPUs (314 ifm) liegen im MPI Netzwerk.
Ursprünglich wollte ich die einfach per GD verknüpfen, aber leider sprenge ich hier den Rahmen der Ressourcen.
Also möchte ich die Daten nacheinander schicken, denn eigentlich hat die Übertragung, sprich Aktualisierung der zweiten CPU, einen ganzen Tag lang Zeit :D
Allein aus dieser Sicht, wäre die permanente zyklische Übertragung Wahnsinn ^^
Sicherlich kann ich das auch per PUT und GET erledigen, aber dann muss ich trotzdem noch die Daten in den DB schiessen...



Es soll in etwa so aussehen:
Zeigervariable X

Eingang:
DB 101 als DB_Block (72 INT Werte)

Sekundentakt oder ähnliches als Startsignal

Bei pos Flanke vom Sekundentakt:

x ablegen in DB100.DBW0
DB101.x ablegen in DB100.DBW1

x:=x+1

if (x>72) then
x:=0;

(wobei ich ja immer den zweifachen Wert haben muss um den Wert zu lesen, ich weis, ich weis... Der Erste Wert liegt auf DB101.DBW2, also 2,4,6...)


DB100 liegt komplett in der Globale Daten Tabelle



Bei der Empfänger CPU:

a:= DB100.DBW0
b:=DB100.DBW1

if (a<> 0) then

DB101.a := b

End_if;


Naja, ich weis, die Syntax ist mal ordentlich daneben, aber ich wollte nur versuchen zu verdeutlichen, was ich eigentlich vorhab.
Mein Problem ist, ich komme aus dem Bereich der Hochsprachen, und bei AWL versteh ich nur noch Stuttgart21 oder so ähnlich. *g*

Hat wer ein paar Schlüsselworte, wonach ich suchen kann ?
Danke Euch !

Binatone
 
Zuletzt bearbeitet:
Wenn du aus den Hochsprachen kommst, dann ist SCL für dich ja genau das Richtige.
Im DB solltest du ein Array anlegen (z.Bsp. Array[1..100] of Int, hat je zwei Byte), dann kannst du in SCL einfach per Indexvariablen auf das Array zugreifen, wie das auch in C, Basic oder Delphi gemacht wird.

kleiner Hinweis zu deinem Text: Wenn du das mit den geraden Adressen weißt, solltest du es auch beachten :ROFLMAO:

Vorteil des Array, du adressierst symbolisch und braucht dich nicht um die tatsächliche Ausrichtung der Daten im DB zu kümmern.
Damit das geht mußt du aber auch dem DB selbst schon ein Symbol zuweisen und dann in deinem SCL-Baustein über das Symbol gehen.

Bsp:

X := 2;
MyInt := "MyDB".MxArray[X];
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ralle
Danke für die schnelle Antwort!

Das Problem ist, ich möchte und kann die Struktur des DB nicht verändern, weil dann müsste ich das ganze Pogramm umstricken, welches auf den DB in der Empfangs CPU zugreift.
Ich muss also jeden INT Wert irgendwie in den bestehenden DB schieben.
Gibts denn da keine Möglichkeit, nichtmal in SCL ?

Beim Lesen ist das ja alles noch kein Problem, das Senden geht auch per put und get.
Aber um dann in der Empfangs CPU die Daten in den DB zu kriegen muss es doch auch ne Möglichkeit geben :(

Gruß
Binatone
 
Hallo,
der Vorschlag von Ralle mit dem Array in dem DB ist der eleganteste Weg.
Du kannst natürlich auch alles so lassen (würde ich aber hier nicht denn du müßtest ja nur die Deklaration des ohnehin schon vorhandenen Datenbereichs in dem DB ändern).
SCL (und das würde ich hier benutzen und nicht AWL) kann es so oder so - bei einem Array hast du nur halt weniger Arbeit ...

Gruß
Larry
 
Ja, es geht auch absolut, aus dem Kopf in etwa so:

WORD_TO_BLOCK_DB(DB_Merken).DW[Wort_Index] := 1000;

Dann mußt du aber natürlich wieder selbst aufpassen, wo genau du im DB hingreifst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Ralle:
so ungefähr richtig.
Man muß hier nur beachten, dass bei dieser Form des Zugriffs immer Bit, Byte, Word bzw. in diesem Fall DWord bearbeitet wird. Möchte man mit Real's (z.B.) arbeiten dann muß man auch noch casten (DWORD_to_REAL(WORD_TO_BLOCK_DB(DB_Merken).DW[Wort_Index]) := 123.456 ;

Gruß
Larry
 
Danke für die Antworten !

@Larry Laffer:

Ich bin mir nicht sicher, ob ich mit nem Array weniger Arbeit hab.
Denn wenn ich die Deklaration im Datenbereich des DB ändere, hat dann nicht jeder andere Baustein ein Problem damit z.B. auf "DB101.DBW12" Zugriff zu bekommen ?
Und wenn dem so ist, muss ich dann nicht all diese Bausteine erstmal anpassen, bevor überhaupt wieder was geht ?

Da erscheint mir Ralles "WORD_TO_BLOCK_DB(DB_Merken).DW[Wort_Index] := 1000;" schon einfacher...

Ich hab ja durchweg die INT Werte und dementsprechend eine sehr einfache Adressvergabe.
DB101.DBW2 (4,6,8,10...)

Ich werd das ma probieren, ob da was hüstelt oder nicht :)

Danke Euch !

Binatone
 
Wenn deine anderen Bausteine mit DB101.DBW12 arbeiten dann ändern sich für die gar nichts.
In deinem SCL-Script könntest du aber mit dem Array-Index arbeiten und müßtest dir nicht die Word-Adresse errechnen. Das ist für die Übersictlichkeit schon zuträglicher.
Aber es ist dein Programm und du hast die Arbeit damit - du mußt es selber wissen und entscheiden ... ;)

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok Larry, ich befolge Deinen Tip :)

Dann sag mir mal eben, worauf ich achten muss, damit das funzt.
Kein komplettes Script, aber so, das ich es verstehe.

Arrays kenn ich selbstverständlich.
Aber Array und DB zusammen spielen lassen, da komm ich nicht mit, glaub ich :D
 
OK ...
Für SCL ist es bei dieser Form des Zugriffs notwendig, dass der DB symbolisch ansprechbar ist - er muß also einen symbolischen Namen haben - das machst du im Step7-Symbolik-Editor.
Nehmen wir einmal an, dass dein DB101 den symbolisch Namen "Daten" von dir bekommen hat. In ihm gibt es eine Variable Messung als Array [1..100] of INT (z.B.).
Dann könntest du nun in SCL so auf die Elemente darin zugreifen :
Code:
meineVariable := "Daten".Messung[7] ;

oder 

"Daten".Messung[12] := 1234 ;

oder in einer FOR-TO-Schleife ...
oder ...

Gruß
Larry
 
Zurück
Oben