Skalierungsproblem beim Ablesen von Motorparameter - TwinCAT 3 / IndraWorks

maxgutier

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

Ich verwende TwinCAT um die Steuerung eines Antriebes zu realisieren. Ich habe herausgefunden, dass es grundsätzlich zwei Wege gibt, um die Motorparameter in TwinCAT abzulesen und diese mit Hilfe der Scope Funktion darstellen zu lassen.
Wenn ich die erste Variante verwende mit der Funktion "SoE Read by DriveRef" (siehe Code), bekomme ich halt die richtige Motorparameter, aber die Auflösung der Kurven bzw. die Frequenz mit der die Parameter abgelesen werden ist sehr gering.

Code:
PROGRAM Antriebsgeschwindigkeit
VAR
    fbRead        :FB_SoERead_ByDriveRef;
    stDriveRef    :ST_DriveRef;  (*Drive Referenz verwendet in TcDrive.lib*)
    Parameter    :WORD;            (*SoE IDN: e.g. "S_0_IDN+1" bedeutet S-0-0001 oder "P_0_IDN + 23 bedeutet P-0-0023*)
    IstGeschwindigkeit    :DINT;    
    
    rGeschwindigkeit    :REAL;
END_VAR

(*ST_PlcDriveRef in ST_DriveRef Umwandeln*)
    stDriveRef.sNetId        := F_CreateAmsNetId(Data.stPlcDriveRef.aNetId);
    stDriveRef.nSlaveAddr     := Data.stPlcDriveRef.nSlaveAddr;
    stDriveRef.nDriveNo        := Data.stPlcDriveRef.nDriveNo;
    stDriveRef.nDriveType    := Data.stPlcDriveRef.nDriveType;
    

//Geschwindigkeitablesen

Parameter                := S_0_IDN+40; (*Geschwindigkeit-Istwert, S-0-0040*)
fbRead(
        bExecute        := TRUE,
        nIdn            := Parameter,
        nElement        := 16#40,
        pDstBuf            := ADR(Data.IstGeschwindigkeit),
        cbBufLen        := 8,
        tTimeout        := DEFAULT_ADS_TIMEOUT,
        stDriveRef        := stDriveRef,
        );
        
        Data.rGeschwindigkeit:=0.001*0.01667*Data.IstGeschwindigkeit;  // rGeschwindigkeit ist in mm/s
        
        
IF NOT fbRead.bBusy THEN
        fbRead(bExecute := FALSE);
END_IF

Deswegen verwende ich aktuell die zweite Variante, und zwar die Motorparameter direkt bei der I/O Option -> EtherCAT -> IndraDrive C (in Solution Explorer) als Process Data (PDO) zu definieren, und diese in eine Variable zu übertragen und dann über die Scope FUnktion darstellen lassen. Hiermit ist die Auflösung der aufgenommenen Kurven deutlich besser als bei der ersten Varianten. Nicht desto trotz, liegt das Problem darin, dass beim Ablesen der Antriebsgeschwindigkeit und Beschleunigung die Skalierung der Werte überhaupt nicht mit den reellen Werten übereinstimmt, aber die Verläufe der Kurven sind korrekt. Wichtig zu erwähnen ist, dass die Position des Antriebes keinen Skalierungfehler aufweist mit der zweiten Varianten. Die Abbildung 1 zeigt eine gemessene Antriebsfahrt mit beiden Varianten, um meinen Problem zu verdeutlichen.
Abbildung 1.PNG

Weiß vielleicht jemand woran es liegt, dass ich bei der zweiten Variante NUR bei den Geschwindigkeit und Beschleunigung einen Skalierungsproblem habe? Und wie kann ich das lösen?

Im Anhang werde ich auch die Motorparameter speichern.
Anhang anzeigen LDD120-250-250-037-01-1-X-02-IDR-BAS-ENS-EN2-V01.zip

Vielen Dank im Voraus,

Max.
 
Moin
Leg die Parameter doch zyklisch auf. Dann brauchst du kein Read aus zuführen

Jeder Parameter hat ein Attribut.
Schau dir dich mal die Auflösung der Parameter an .

Den Parameter für den Beschleunigsistwert solltest du erstmal durch einen Filter jagen
Der wird typischer weise alle 4ms gebildet und zeigt dir mehr das Geberrauschen an, als die wirkliche Beschleunigung


Auf dem Bild ist deine Geschwindigkeit auch nicht sauber. Sind die Regelkreise abgeglichen?
Ist Lageregelung oder Geschwindigkeitsregelung auf der Steuerung ein gestellt ?
Gesendet von iPhone mit Tapatalk
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo @Knaller

Wie kann ich mit meinem Code die Parametern zyklisch ablesen lassen? Ich dachte die Auflösung wäre nur von dem eingestellten Real-Time in TwinCAT abhängig. (siehe Bild)
Abb 2.PNG

Ja das mit dem Filter für die Beschleunigung habe ich mir auch gedacht. Aber der Skalierungsfehler sollte nach dem Einsatz eines Filters trotzdem vorhanden sein denke ich.

Die Lageregelung liegt bei 500 µs und die Geschwindigkeitsregelung bei 250 µs.
Abb 3.PNG
Auf der Steuerung ist Lageregelung schlepfehlerfrei eingestellt.
 
Ääh:
Laut Screenshot wird die SAF-Task mit 250µsec gerechnet. Dies NC rechnet dir sowohl Geschwindigkeiten als auch Positionen.
Was dann verwendet wird ist abhängig von der Konfiguration (Prozessabbild) bzw. dem Mapping.
Jetzt kenne ich die Indraworks-Seite nicht - aber sinnvoll ist es prinzipiell die Regelschleife im Drive zu schliessen und somit Positionen zu nutzen.
Da macht jetzt deine Einstellung im Indradrive nicht wirklich viel Sinn da ich dort eine Positionsvorgabe für alle 500µs herauslese.

Und wenn du die Lageregelung im Antrieb hast wird dir quasi sicher auch der Schleppabstand im Prozessabbild angeboten. Der ist dann hochinteressant für die Reglereinstellung.

Bzgl. der Skalierung: Was für Einheiten ausgegeben werden ist definiert der Antrieb. Da musst du Doku wälzen. Die Daten im Prozessabbild müssen nicht 1:1 den SoE-Parametern entsprechend die du mit SoE_Read abholst. Im Scope hättest du aber die Möglichkeit diese Werte noch umzuskalieren für die Anzeige.
In der Regel kannst du aber den Antrieb insofern konfiguireren dass du noch zusaetzliche Parameter in zyklische Prozessabbild holst. Vielleicht gibt es ja schon vorgefilterte Geschwindigkeiten oder oder oder...
Scope-Aufzeichnungen für Antriebe mit expliziten Read-Anfragen ist per Definition mehr als suboptimal (im Best-case nur jeden 3 Zyklus einen Wert).

Guga
 
Zurück
Oben