Achsen Parameter in TwinCat System Manager einbinden und überschreiben

Benni

Level-1
Beiträge
73
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,
ich habe ein Problem beim ansteuern einer Achse.
Und zwar geht es darum, dass ich am entwickeln eines Achsenprüfstands bin, hierbei wäre es toll, wenn ich diverse Parameter der Achse direkt über TwinCat System-Manager und damit über die SPS (PLC Control) ansteuern und überschreiben bzw. lesen könnte. Ich habe die Achse bereits in den SystemManager geladen und kann diese soweit auch verfahren und ansteuern. Lediglich das beschreiben gewisser Parameter bekomme ich nicht hin. Kann es sein, dass nur ein Teil der verfügbaren Parameter beschreibbar sind? Ich kann z.B. den Momentanen Stromwert (P-0-0043) einlesen, dies habe ich hinbekommen. Allerdings den Parameter Motor Spitzenstrom (S-0-0109) lässt sich nicht in den SystemManager einbetten. Hier wird mir dann immer ein Fehler beim Konfig übernehmen geworfen (d.h. ich komme nicht von Phase2 auf Phase3)...

Falls jemand eine Idee hat, wie ich den beschrieben Parameter doch als Variable in den SystemManager geladen bekomme, wäre ich sehr dankbar, dies würde den Prüfstand um einiges vereinfachen und automatisierbarer machen.

Grüße Benni
 
Bitte mehr Infos!
Welcher Servoverstärker? AX5000?

Wie beschreibst du die Parameter denn?
Über das Prozessabbild der Achse, über SoE-Bausteine mit der PLC, oder über die Konfigurationsoberfläche des Servoverstärkers im System Manager?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
also wir benutzen einen Regler von Bosch Rexroth, genauer gesagt den "IndraDrive C".

Also ich habe vor, die Paraeter dann über Funktionen, Bausteine oder direkte aufrufe im PLC zu beschreiben. Falls noch weitere Fragen bestehen, dann stellt sie bitte ruhig, damit die Sache klarer wird.

Gruß Benni
 
Mit Beckhoff-Antrieben wär die Sache sehr einfach ;)

Dann könnte man einfach mit den FBs der EtherCAT.lib arbeiten und damit alle denkbaren Parameter per SoE-Read/Write lesen und schreiben.
Ist dein Regler über Ethercat oder Sercos angeschlossen ? (Klingt mir fast nach Sercos.)
 
Hallo trinitaucher,

ja die Achse ist über Sercos angeschlossen.

Zur Zeit versuche ich es bereits mit den FBs SoE_Read zu realisieren. Ich habe diese Bausteine genau so deklariert wie es im InfoSYS von Beckhoff beschrieben ist. Jedoch ist das Ergebnis nur annähernd befriedigend. Zum einen kann ich die Variable in der mein Wert geschrieben werden soll nicht vom TYP UINT setzen, da ich eine 4 Byte lange Variable habe. Aber egal, ich habe da einfach den Typ LREAL genommen. Hier bekomme ich auch einen Wert angezeigt, welcher immer etwas variiert, ähnlich wie mein Strom im Stillstand eben. Von dem her bin ich mir auch ziemlich sicher, dass es sich um den Richtigen Parameter und auch Wert handelt. Mein Problem ist nur, dass irgendwas vom Format her nicht stimmen kann, denn die Zahl die es mir anzeigt, ist viel viel zu klein. Hier wird nämlich ungefähr die Zahl 2,156814514...*E-233 wiedergegeben.
Was mache ich hier also Falsch? Oder ne Idee woran das liegen könnte?

Gruß Benni
 
Dass dein Wert so merkwürdig aussieht, wird wohl daran liegen, dass es eigentlich ein UINT ist, du es aber als LREAL interpretierst. Da wird das UINT-Bitmuster wohl einem LREAL mit nem ziemlich kleinen Wert entsprechen.

Die EtherCAT-Antriebe verwenden doch quasi auch Sercos, nur eben eingebettet in EtherCAT. Es kann also durchaus sein, dass die FB's dennoch funktionieren. Das kannst du allerdings einfach testen, indem du dir mal nen Parameter schnappst, dessen Wert du ganz genau kennst und diesen ausliest ;-) Da sollte dann was sinnvolles bei rumkommen.

Wenn du einen Parameter nicht verwenden kannst: Schau in die Dokumentation ob du den lesen/schreiben darfst und unter welchen Bedingungen. Der Motorspitzenstrom ist doch ein für die Antriebsregelung notwendiger Grenzwert, es ist also unwahrscheinlich, dass du da im Betrieb drauf zugreifen darfst.
 
Hallo Leute,
erstmal Danke für eure nützlichen Beiträge, ich habe es heute Morgen durch ettliches ausprobieren endlich hinbekommen.

Das Problem lag ganz einfach im Aufruf der Funktion FB_SoERead.
Ich durfte den Eingang dDstBufLen nicht auf die Variable beziehen, in welche ich einlesen möchte. Also nicht so machen wie es im InfoSYS beschrieben ist. Ich habe nun also meine Variable als INT deklariert, welche vollkommen ausreichend ist um mA zu lesen. Und meine Bufferlänge habe ich auf 8 gesetzt. Ich kann mir zwar leider nicht erklären warum dies so ist, aber es geht auf jeden Fall.
Somit kann ich nun Parameter aus dem Regler auslesen und durch setzen von diversen Kommandos mithilfe von Bausteinen, kann ich die Regelung in den Parametriermodus schalten, Parameter nach Lust und Laune beschreiben und anschließend wieder in den normalen Run-Modus wechseln.

Aber damit ich das auch richtig verstehe, kann mir noch jemand erklären, woran es liegt, dass ich den SIZEOF()-Eingang nicht wie den ADR()-Eingang auf die zu beschreibende Variable beziehen darf?

Ich hoffe es ist alles verständlich.
Danke euch nochmal

Gruß Benni
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst und darfst das tun, jedoch muss die Zielvariable in ihrer Länge mit dem Parameter übereinstimmen. Näheres zur Länge der jeweiligen Parameter findest du in der Dokumentation des Antriebs. Wenn du da auf ein INT mit Sizeof verweist, der Parameter aber meinetwegen 4 Byte lang ist, dann passt das nicht.

Was du jetzt machst ist jedenfalls...problematisch. Wenn du in ein INT speicherst, aber angibst, dass du 8 Byte Platz hast, dann schreibst du in Speicherbereiche außerhalb deiner INT-Variablen. Wenn du jetzt nicht viel Glück hast wirst du dich im Betrieb über ziemlich seltsame und schwer zu findende Fehler wundern....
 
Ja das Problem ist nur, ich lese beispielsweise einen 4 Byte Parameter aus, und ich verweise bei beiden Difinitionen auf ein und dieselbe Variable, welche ich so gewählt habe, dass diese auch 4 Byte platz hat (z.B. Real) dann wird mir ein Fehler gebracht. Das ist eben mein Problem. Mir wäre es natürlich auch um einiges lieber, wenn ich eine andere Lösung hätte.
Aber prinzipiell kann ich doch auch einfach ein Variablen Typ nehmen, welcher immer größer ist als die benötigte Anzahl, kostet zwar Speicherplatz aber wäre doch rein theoretisch machbar oder? Oder ich muss eben meine zu Speichernde Variable vorher genau definieren und schauen was da für Datengrößen möglich sind.
Ich versteh eben einfach nicht, warum es nicht mit Bezug auf die eine zu beschreibende Variable geht, obwohl ich darau achte, dass die Datentypgröße passt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, hier ist mein Code:
Ich habe dies in ein kleines Unterprogramm gepackt, in welchem der Baustein FB_SoERead enthalten ist (FFP):

PROGRAM Parameter_lesen
VAR
FB_SoERead: FB_SoERead;
END_VAR

VAR_INPUT
NetId : T_AmsNetId := '';
Idn : WORD;
pDstBuf : DWORD;
BufLen : UDINT;
Execute : BOOL;
Element :BYTE;
Timeout :TIME := DEFAULT_ADS_TIMEOUT;
END_VAR

VAR_IN_OUT
Axis : AXIS_REF;
END_VAR

VAR_OUTPUT
Busy : BOOL;
Error : BOOL;
AdsErrId : UINT;
SercosErrId : UINT;
Attribute : DWORD;
END_VAR

Hier wird im Fup der Baustein FB_SoERead der Bibliothek TcMcDrive2 ausgeführt.
Dieser ist am Eingang mit den Variablen ( NetId, Idn, Element, BufLen, Execute, DEFAULT_ADS_TIMEOUT, Axis) belegt. Die Ausgänge sind die die in den Variablen VAR_OUTPUT deklariert sind.




Aufgerufen wird das ganze dann aus dem Main:

Hier sind die Variablen so deklariert:
VAR
para_lesen : BOOL;
Axis : AXIS_REF;
Idn : WORD;
ReadValue : UDINT;
END_VAR



IF para_lesen=TRUE THEN
Idn := S_0_IDN + 109;
Parameter_lesen(
Axis := Axis,
Idn := Idn,
Element := 16#40,
pDstBuf := ADR(ReadValue),
BufLen := SIZEOF(ReadValue),
Execute := TRUE,
Timeout := DEFAULT_ADS_TIMEOUT,
);

IF NOT Parameter_lesen.Busy THEN
Parameter_lesen(Axis := Axis, Execute := FALSE);
para_lesen := FALSE;
END_IF
END_IF




Wenn ich das so mache, dann wirft mir der Baustein FB_SoERead den Fehler „1795“
 
1795 ist Invalid Index Offset. Also liegt es wohl eher nicht an der Parametergröße. Ich kann dir aber sagen, woran das liegen wird: Du schreibst in deinem Programm auf eine VAR_INPUT.

Deklarier den pDstBuf mal als VAR_IN_OUT, das könnte dein Problem beheben.

Übrigens würde ich persönlich nicht beides (Länge und Adresse der Zielvariable) als Parameter an das Programm übergeben, frag mich nämlich, weswegen du dann ein Programm drumherum baust ;-) Übergib einfach deine Zielvariable als DWORD an das Programm, und dort machst du beim Aufruf des FB_SoERead dann ADR(Variable) und SIZEOF(Variable). Ist aber eher ne Schönheitskorrektur.
 
Leider nicht, wenn ich die Variable als VAR_IN_OUT deklariere, dann bekomme ich ein Fehler-Pop-up angezeigt, welches den Inhalt 'PLCTask: Access violation (Page Fault)'...
Aber was genau bedeutet denn der Fehler 1795 "Invalid Index Offset"? Ich kann mit dem Fehler schon nichts anfangen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Index Group und Index Offset sind die beiden Größen, die bei der ADS-Kommunikation für Lese- und Schreibzugriffe notwendig sind. Wenn ein Zugriff auf einen ungültigen oder nicht mehr aktuellen Index Offset erfolgt, bekommst du diese Fehlermeldung. Du könntest, just for fun, mal einach das Projekt bereinigen und neu übersetzen. Fakt ist aber dennoch, dass du nicht einfach auf ne VAR_INPUT schreibend zugreifen kannst. Selbst wenn der Compiler das nicht anmeckert ist es zumindest sehr unsauberer Programmierstil.

Warum du bei Verwendung von VAR_IN_OUT eine Access-Violation bekommst, ist mir noch etwas unklar. Greifst du aus einer Task auf eine andere Task zu, ohne über globale Variablen zu gehen oder sowas? Deklarier die Zielvariable mal lokal in deinem Parameter-Lese-Programm und schau, ob du dann noch immer ne Zugriffsverletzung erhälst....

Beim FUP-Aufruf des FB_SoERead: Hast du da nochmal ADR und/oder SIZEOF verwendet?
 
Also ich habe die Variable schon in das Leseprogramm gezogen, da du es oben bereits vorgeschlagen hast. Und im Main habe ich dann natürlich die Aufrufe ADR und SIZEOF gestrichen, leider ging das nicht, dies war bereits der Stand den ich bei meinem letzten Post gehabt habe.
 
Zurück
Oben