B&R Datenobjekte

Sera

Level-1
Beiträge
131
Reaktionspunkte
13
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich versuche mich gerade in die Datenobjekte bei B&R einzuarbeiten. Leider will das so wirklich nicht gelingen. Kennt jemand eine online verfügbare Anleitung? Oder kann mir das Trainingsmodul, TM250 - Speichermanagement und Datenhaltung, zukommen lassen?
Wie ich ein Datenobjekt manuell erstelle ist kein Problem. Für mich stellt der lesende und schreibende Zugriff ein Problem da.
Hab schon festgestellt das das wohl nicht so simpel wird wie bei ner s7.

Vielleicht hat auch jemand ein einfaches Progrämmchen umfahren, bei der ich mir das mal abschauen kann.

Vielen Dank für die Hilfe

Edit:
Hab die Funktion DatObjWrite bzw Write bereits gefunden. DatObjWrite (enable, ident, Offset, adr(Source), len, status) ist die syntax. enable ist klar (=1), ident soll ne Nummer des Objekts sein aus der Objektverwaltung ( Da weiß ich nicht woher ich die bekomme), Offset ( kann bei mir erstmal =0 sein, adr(Source) habe ich ein Udint-Array für erstellt, len sind 10 UDint werte im erstellten Array, wobei mir es es erst mal reichen würde wenn einer der werte übertragen wird, Status ist ausgang (fehlermeldung)
 
Zuletzt bearbeitet:
Hallo,

ich versuche mich gerade in die Datenobjekte bei B&R einzuarbeiten. Leider will das so wirklich nicht gelingen. Kennt jemand eine online verfügbare Anleitung? Oder kann mir das Trainingsmodul, TM250 - Speichermanagement und Datenhaltung, zukommen lassen?
Wie ich ein Datenobjekt manuell erstelle ist kein Problem. Für mich stellt der lesende und schreibende Zugriff ein Problem da.
Hab schon festgestellt das das wohl nicht so simpel wird wie bei ner s7.

Vielleicht hat auch jemand ein einfaches Progrämmchen umfahren, bei der ich mir das mal abschauen kann.

Vielen Dank für die Hilfe

Edit:
Hab die Funktion DatObjWrite bzw Write bereits gefunden. DatObjWrite (enable, ident, Offset, adr(Source), len, status) ist die syntax. enable ist klar (=1), ident soll ne Nummer des Objekts sein aus der Objektverwaltung ( Da weiß ich nicht woher ich die bekomme), Offset ( kann bei mir erstmal =0 sein, adr(Source) habe ich ein Udint-Array für erstellt, len sind 10 UDint werte im erstellten Array, wobei mir es es erst mal reichen würde wenn einer der werte übertragen wird, Status ist ausgang (fehlermeldung)

Ich weiß zwar nicht wofür Du Datenobjekte brauchst ...

An den Ident kommt der Ident des DatObjCreate dran

in Basic:

DatObjWrite.ident = DatObjCreate.ident

Das muss so sein, weil die Funktion DatObjWrite sonst nicht weiß wo es die Daten hinschreiben soll.

Steht aber auch alles in der Hilfe, solltest Du mal lesen

Die ist wirklich gut.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich will DO dazu nutzen um einen Baustein mit unterschiedlichen vorkonfektionierter Datensätzen zu füttern, und je nach Inhalt des Datensatzes unterschiedliche Funktionen im Baustein aufzurufen. Dabei sollen die Eingangsdaten vom Nutzer später an eine bestimmte Stelle im DO geschrieben werden und die Ausgangsdaten vom Baustein ebenfalls an bestimmte Stellen geschrieben werden.
Sprich das DO soll später als Interface der Daten dienen. Diese kann ich nicht als feste Ein und Ausgangsdaten des Bausteins festlegen, da die je nach Datensatz unterschiedlich sind.

Ja das der Ident da dran kommt weiß ich schon. Wenn ich das aber richtig verstanden habe kann ich den so jedoch nur herausbekommen wenn ich ein DO im Programm erzeuge. Ich möchte jedoch vorgefertigte DO nutzen. Wie ich von diesem DO den Ident bekomme ist die Frage.

So sieht es im om aus als test:

write_data[0]:=1;
write_data[1]:=2;
write_data[2]:=3;
write_data[3]:=4;
write_data[4]:=5;
write_data[5]:=6;
write_data[6]:=7;
write_data[7]:=8;
write_data[8]:=9;
write_data[9]:=10;
daten.enable:=1;
daten.pName:=ADR('daten');
dwident:=daten.ident;
DatObjWrite_0(enable:=1, ident:=dwident, Offset:=0, pSource:=write_data[4], len:=10);

Woebei: write_data als UDint[10] , daten als DatObjInfo und dwident als UDint definiert sind.
Kompeliert wird es fehlerlos, aber im onlinemod ändert sich nichts im DO mit Namen daten der so aussieht:

0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
 
Zuletzt bearbeitet:
Ich will DO dazu nutzen um einen Baustein mit unterschiedlichen vorkonfektionierter Datensätzen zu füttern, und je nach Inhalt des Datensatzes unterschiedliche Funktionen im Baustein aufzurufen. Dabei sollen die Eingangsdaten vom Nutzer später an eine bestimmte Stelle im DO geschrieben werden und die Ausgangsdaten vom Baustein ebenfalls an bestimmte Stellen geschrieben werden.
Sprich das DO soll später als Interface der Daten dienen. Diese kann ich nicht als feste Ein und Ausgangsdaten des Bausteins festlegen, da die je nach Datensatz unterschiedlich sind.

Ja das der Ident da dran kommt weiß ich schon. Wenn ich das aber richtig verstanden habe kann ich den so jedoch nur herausbekommen wenn ich ein DO im Programm erzeuge. Ich möchte jedoch vorgefertigte DO nutzen. Wie ich von diesem DO den Ident bekomme ist die Frage.

So sieht es im om aus als test:

write_data[0]:=1;
write_data[1]:=2;
write_data[2]:=3;
write_data[3]:=4;
write_data[4]:=5;
write_data[5]:=6;
write_data[6]:=7;
write_data[7]:=8;
write_data[8]:=9;
write_data[9]:=10;
daten.enable:=1;
daten.pName:=ADR('daten');
dwident:=daten.ident;
DatObjWrite_0(enable:=1, ident:=dwident, Offset:=0, pSource:=write_data[4], len:=10);

Woebei: write_data als UDint[10] , daten als DatObjInfo und dwident als UDint definiert sind.
Kompeliert wird es fehlerlos, aber im onlinemod ändert sich nichts im DO mit Namen daten der so aussieht:

0;
0;
0;
0;
0;
0;
0;
0;
0;
0;
Sorry das ich so spät antworte, ich bin nicht so oft hier ...

Ich kann es jetzt leider nicht ausprobieren, sitze nicht am AS.
daten müsste meiner Meinung nach vom Typ DatObjCreate sein.

Beispiel aus der Hilfe:

IF (bCreate) THEN (* Initialize create structure *)
DOCreate.enable = 1
DOCreate.grp = 0
DOCreate.pName = ADR(strName)
DOCreate.len = 100
DOCreate.MemType = doUSRRAM
DOCreate.Option = 0
DOCreate.pCpyData = 0
(* Call FUB *)
DOCreate FUB DatObjCreate()

(* Get FUB output information *)

wStatus = DOCreate.status

dwIdent = DOCreate.ident
dwData = DOCreate.pDatObjMem

(* Verify status *)
IF (wStatus = 0) THEN
bCreate = 0 bWrite = 1
ELSE IF (wStatus <> $FFFF) THEN
bCreate = 0 byErrorLevel = 1
(* Set error level for DatObjCreate *)
ENDIF
ENDIF

IF (bWrite) THEN
bWrite = 0
(* Initialize write structure *)
DOWrite.enable = 1
DOWrite.ident = dwIdent ; Das ist der Ident von DoCreate
DOWrite.Offset = 0
DOWrite.pSource = ADR(byWriteData[0])
DOWrite.len = SIZEOF(byWriteData)
(* Call FUB *)
DOWrite FUB DatObjWrite()
(* Get status *)
wStatus = DOWrite.status
(* Verify status *)
IF (wStatus = 0) THEN
bRead = 1
ELSE byErrorLevel = 2
(* Set error level for DatObjWrite *)

ENDIF
ENDIF

Deine Daten wären dann "byWriteData".
Ich würde an Deiner Stelle bei DOWrite.len immer die Sizeof Variante wählen, so brauchst Du nur Dein Array vergrößern wenn Du mehr Daten verarbeiten willst.
 
Danke für die Antwort
Hab es mitlerweile hinbekommen:

Datinfo.enable:=1;
Datinfo.pName:=ADR('daten');
Datinfo();

Datinfo.status;
ident:=Datinfo.ident;

IF Datinfo.status=0
THEN
write:=1;
END_IF;

write_data[0]:=1;
write_data[1]:=2;
write_data[2]:=3;
write_data[3]:=4;
write_data[4]:=5;
write_data[5]:=6;
write_data[6]:=7;
write_data[7]:=8;
write_data[8]:=9;
write_data[9]:=10;

read_data[0]:=0;
read_data[1]:=0;
read_data[2]:=0;
read_data[3]:=0;
read_data[4]:=0;
read_data[5]:=0;
read_data[6]:=0;
read_data[7]:=0;
read_data[8]:=0;
read_data[9]:=0;

IF write AND NOT done
THEN
Datwrite.enable:=1;
Datwrite.ident:=ident;
Datwrite.Offset:=0;
Datwrite.pSource:=ADR(write_data[0]);
Datwrite.len:=SIZEOF(write_data);

Datwrite();
done:=1;
END_IF
Datwrite.status;

IF Datwrite.status=0
THEN
Datread.enable:=1;
Datread.ident:=ident;
Datread.Offset:=0;
Datread.pDestination:=ADR(read_data[0]);
Datread.len:=SIZEOF(write_data);
Datread();
END_IF

Datread.status;
read_data[0];
read_data[1];
read_data[2];
read_data[3];
read_data[4];
read_data[5];
read_data[6];
read_data[7];
read_data[8];
read_data[9];

write_data, read_data : INT
Datread : DatObjread
Datwrite : DatObjwrite
Datinfo : DatObjinfo
done, write : bool
ident : UDInt

Inhalt des DO bei Erstellung:

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

Wenn ich bereits bei der Erstellung des Programms ein Datenobjekt habe kann ich dies mit Datobjinfo den ident auslesen, diesen kann ich dann beim schreib bzw. beim leseauftrag verwenden.

Hast mich auf den richtigen Weg gebracht dank dir ;)
 
Für mich ist meine Frage beantwortet, kann geclosed werden (außer hat noch nen anderer Frage zu)
 
Danke für die Antwort
Hab es mitlerweile hinbekommen:

[...]
Wenn ich bereits bei der Erstellung des Programms ein Datenobjekt habe kann ich dies mit Datobjinfo den ident auslesen, diesen kann ich dann beim schreib bzw. beim leseauftrag verwenden.

Hast mich auf den richtigen Weg gebracht dank dir ;)
Kein Problem ...
Freut mich das ich helfen konnte.

Bis zum nächsten Mal
 
Zurück
Oben