# Referenz von NC Achse killen Beckhoff



## Anaconda55 (4 Februar 2009)

Hallo. Benutze folgenden Baustein.
Wie kann ich die Referenz zurücksetzen/killen?
So das ich isRef = False bekomme.


```
FUNCTION_BLOCK McAxisKernel
(*
Servo Achse

Der Funktionsbaustein erlaubt die Ansteuerung einer NC-Achse als
- Einzelachse
*)

VAR_INPUT
    startMode    :E_STARTMODE;    (*Beschreibung: Siehe 'Datentypen'*)
                                (*Refer to: 'Data types'*)
    zero            :BOOL;        (*Vor dem nächsten Positionierstart die relative Istposition = 0 setzen*)
    refCam            :BOOL;        (*Referenznocke*)
    start            :BOOL;        (*Start Positionierung / Abbruch wenn Signal zurückgesetzt wird
                                Fahrprofil mit Geschwindigkeit, Beschleunigung und Ruck*)
    stop            :BOOL;        (*Unterbrechung / Fortsetzung Positionierung*)
    jogPos            :BOOL;        (*Tippen endlos plus mit Tippgeschwindigkeit*)
    jogNeg            :BOOL;        (*Tippen endlos minus mit Tippgeschwindigkeit*)
    jogPosInc        :BOOL;        (*Tippen inkrementell plus mit Tippgeschwindigkeit*)
    jogNegInc        :BOOL;        (*Tippen inkrementell minus mit Tippgeschwindigkeit*)
    couple            :BOOL;        (*Kopplung ein / aus*)
    extSetpoint        :BOOL;        (*Externe Sollwertvorgabe ein / aus*)
    initPos            :BOOL;        (*Istposition setzen, Referenznocke*)
    setTarg            :BOOL;        (*Neue Zielposition während der Bewegung vorgeben*)
    fastStop        :BOOL;        (*Stop einer Bewegung mit max. Rampe (Achs-Parameter)*)
    reset            :BOOL;        (*Fehler quittieren*)
    parInit            :BOOL;        (*Achs-Parameter auslesen*)

(*Vorbedingungen zum Verfahren der Achse*)
    enAxis             :BOOL;        (*Achse Freigabe*)
    enPlus            :BOOL;        (*Achse Fahrfreigabe plus Richtung*)
    enMinus            :BOOL;        (*Achse Fahrfreigabe minus Richtung*)

(*Fahrdaten der Achse*)
    targPos            :LREAL;        (*Achse Zielposition [EINH]*)
    velo            :REAL;        (*Achse Geschwindigkeit [EINH/s]*)
    acc                :REAL;        (*Achse Beschleunigungsrampe [EINH/s²] / Default (-1)*)
    dec                :REAL;        (*Achse Bremsrampe [EINH/s²] / Default (-1)*)
    jerk            :REAL;        (*Achse Ruckbegrenzung [EINH/s³] / Default (-1)*)
    jogIncTargPos    :LREAL;        (*Tippen inkrementell Schrittweite [EINH]*)
    jogVelo            :REAL;        (*Tippen Geschwindigkeit [EINH/s]*)
    over            :REAL:=100;    (*Achse Geschwindigkeitsoverride [%]*)
    ratioNum        :INT:=1;    (*Achse Getriebekopplung Faktor Zähler*)
    ratioDenum        :INT:=1;    (*Achse Getriebekopplung Faktor Nenner*)
END_VAR

VAR_IN_OUT
    axisRefIn        :NCTOPLC_AXLESTRUCT;    (*Achse NC->PLC zyklische Kopplung*)
    axisRefOut        :PLCTONC_AXLESTRUCT;    (*Achse PLC->NC zyklische Kopplung*)
    masterAxisRefIn    :NCTOPLC_AXLESTRUCT;    (*Leitachse NC->PLC zyklische Kopplung*)
END_VAR

VAR_OUTPUT
    stopped        :BOOL;        (*Achse Stillstand*)
    isZero        :BOOL;        (*Achse in Nullposiiton (= ZeroPos)*)
    isRef        :BOOL;        (*Achse ist referenziert*)
    isCoupled    :BOOL;        (*Achse ist gekoppelt*)
    isSync        :BOOL;        (*Achse ist tabellengekoppelt*)
    isExtSetpoint    :BOOL;    (*Externe Sollwertvorgabe aktiv*)
    ncEnabled    :BOOL;        (*Achse betriebsbereit und freigegeben*)
    relPos        :LREAL;        (*Istposition relativ [EINH]*)
    actPos        :LREAL;        (*Istposition absolut [EINH]*)
    busy        :BOOL;        (*Achsbaustein aktiv*)
    done        :BOOL;        (*Im Ziel, Bewegung beendet, rechnerisch*)
    inPos        :BOOL;        (*Im Zielfenster, physikalisch*)
    constVelo    :BOOL;        (*Fahren mit konstanter Geschwindigkeit*)
    movePos        :BOOL;        (*Fahren in Richtung plus*)
    moveNeg        :BOOL;        (*Fahren in Richtung minus*)
    ncError        :BOOL;        (*Achse Fehler*)
    ncErrId        :UDINT;        (*Achse Fehler-Nummer: Die Beschreibung zur Fehlernummer
                                kann dem TwinCat Information System entnommen werden.
                                Suchen -> <errorId>*)
    parValid    :BOOL;        (*Achs-Parameter sind gültig ausgelesen*)
    maxNcVelo    :LREAL;        (*Parametrierte Maximalgeschwind. [EINH/s]*)
    maxNcAcc    :LREAL;        (*Parametrierte Beschleunigung [EINH/s²]*)
    maxNcDec    :LREAL;        (*Parametrierte Verzoegerung [EINH/s²]*)
    maxNcJerk    :LREAL;        (*Parametrierter Ruck [EINH/s³]*)
    limitNeg    :LREAL;        (*SW Limit negativ [EINH]*)
    limitPos    :LREAL;        (*SW Limit positiv [EINH]*)
END_VAR

VAR
    state            :STRUCT_MC_STATE;            (*Zustand: Achsbaustein*)
    logState        :ARRAY[-4..0] OF STRUCT_MC_STATE;            (*Zustand: Achsbaustein*)
    stateMotion        :INT;                        (*Zustand Motion*)
    stateMcFb        :INT;                        (*Zustand MC FB*)
    stateInitParams    :INT;                        (*Zustand: ActInitParams*)
    xReadParVelo    :MC_ReadParameter;            (*Achs-Parameter Geschwindigkeit lesen *)
    xReadParAcc        :MC_ReadParameter;            (*Achs-Parameter Beschleunigung lesen *)
    xReadParDec        :MC_ReadParameter;            (*Achs-Parameter Verzögerung lesen *)
    xReadParJerk    :MC_ReadParameter;            (*Achs-Parameter Ruck lesen *)
    xReadParLimPos    :MC_ReadParameter;            (*Achs-Parameter Limit positiv lesen *)
    xReadParLimNeg    :MC_ReadParameter;            (*Achs-Parameter Limit negativ lesen *)
    xPower            :MC_Power;                    (*MC Achse einschalten*)
    xReadStatus        :MC_ReadStatus;                (*MC Bewegungszustand lesen*)
    xReset            :MC_Reset;                    (*MC Achse Reset*)
    xReadAxisError    :MC_ReadAxisError;            (*MC Achsfehler lesen*)
    xReadActualPosition    :MC_ReadActualPosition;    (*MC Istposition lesen*)
    xMoveAbsolute    :MC_MoveAbsolute;            (*MC Positionieren absolut*)
    xMoveAbsoluteOrRestart    :MC_MoveAbsoluteOrRestart;    (*Positionieren absolut mit neuer Zielposition*)
    xMoveRelative    :MC_MoveRelative;            (*MC Positionieren relativ*)
    xMoveVelocity    :MC_MoveVelocity;            (*MC Fahren mit konstanter Geschwindigkeit*)
    xNewPosAndVelo    :MC_NewPosAndVelo;            (*MC Geschwindigkeit und Position bei Dauerlauf ändern*)
    xHome            :MC_Home;                    (*MC Referenzfahrt*)
    xSetActualPosition    :MC_SetActualPosition;    (*MC Isposition setzen*)
    xChangeDynParam    :MC_ChangeDynParam;            (*MC Beschleunigungsparameter ändern*)
    xStop            :MC_Stop;                    (*MC Stop*)
    xGearIn            :MC_GearIn;                    (*MC Getriebekopplung statisch einschalten*)
(*    xGearInPos        :MC_GearInPos;        *)        (*MC Getriebekopplung dynamisch einschalten*)
(*    xGearOut        :MC_GearOut;*)                (*MC Getriebekopplung ausschalten*)
    xGearOutExt        :MC_GearOutExt;                (*MC Getriebekopplung ausschalten, neue Zielgeschwindigkeit*)
(*    xCamIn            :MC_CamIn;            *)        (*MC Tabellenkopplung einschalten*)
(*    xCamOut            :MC_CamOut;            *)        (*MC Tabellenkopplung ausschalten*)
    xExtSetPointGenEnable    :MC_ExtSetPointGenEnable;    (*MC Externe Sollwertvorgabe einschalten*)
    xExtSetPointGenDisable    :MC_ExtSetPointGenDisable;    (*MC Externe Sollwertvorgabe ausschalten*)
    startPos        :LREAL;                        (*Absolutposition gespeichert beim Start [EINH]*)
    parInitTrig        :R_TRIG;                    (*Impuls Parameter initialisieren*)
    veloAtStart        :REAL;                        (*Geschwindigkeit bei Bewegungsstart [EINH/s]*)
    accAtStart        :REAL;                        (*Beschleunigung bei Bewegungsstart [EINH]/s*)
    decAtStart        :REAL;                        (*Verzoegerung bei Bewegungsstart [EINH/s²]*)
    jerkAtStart        :REAL;                        (*Ruckwert bei Bewegungsstart [EINH/s³]*)
    tNcEnableOn        :TP;                        (*Achse zuschalten Togglesignal ON*)
    tNcEnableOff    :TP;                        (*Achse zuschalten Togglesignal OFF*)
    tNcEnableOnTime    :TIME := T#2s;                (*Zeit Achse zuschalten ON*)
    tNcEnableOffTime:TIME := T#1s;                (*Zeit Achse zuschalten OFF*)
    veloChange        :BOOL;                        (*Fahrgeschwindigkeit wurde geändert*)
    dynamicChange    :BOOL;                        (*Dynamik (acc,dec,jerk) wurde geändert*)
END_VAR

VAR CONSTANT
    ZERO_POS        :LREAL:=0;                    (*Achse Nullposition [EINH]*)
    MODULO_RANGE    :LREAL:=360;                (*Modulobereich [EINH]*)
END_VAR
(*
Die Achskommandos sind als Zustandsautomat der Motion Control Bausteine programmiert.

Bibliotheken:    
TwinCat        TcMc.lib
            TcMath.lib

Bausteine:
            AxisModuloTargPos


Achsparameter, die beim Start der Steuerung ausgelesen werden

maxNcVelo        Einlesen beim ersten Aufruf: Parametrierte Maximalgeschwind. [EINH/s]
maxNcAcc        Einlesen beim ersten Aufruf: Parametrierte Beschleunigung [EINH/S²]
maxNcDec        Einlesen beim ersten Aufruf: Parametrierte Verzoegerung [EINH/S²]
maxNcJerk        Einlesen beim ersten Aufruf: Parametrierter Ruck [EINH/S³]
limitNeg        SW Limit negativ [EINH]
limitPos        SW LIMIT positiv [EINH]
```


----------



## Zickenbändiger (5 Februar 2009)

Hallo 

die Referenz von Achsen lässt sich über ADS Befehle löschen.


----------



## Anaconda55 (10 Februar 2009)

Was wird denn bei Sizeof und ADR angegeben?


----------



## Cerberus (10 Februar 2009)

So wie es aussieht den Wert den du schreiben möchtest. Wenns um einen Reset geht, dann würde ich mal behaupten, dass es funktioniert, wenn du eine Variable "Wert" anlegst und diese mit "0" initialisierst. Diese Variable würde ich dann wie im Bild oben verwenden.


----------



## Zickenbändiger (10 Februar 2009)

Hallo 

war nicht schnell genung aber der Kolllege Cerberus hat damit vollkommen Recht.


----------



## Cerberus (10 Februar 2009)

Freut mich, dass ich trotz keiner Ahnung von NC-Achsen weiterhelfen konnte!


----------



## Anaconda55 (18 Februar 2009)

Könnt ihr mir hierzu mal bitte ein Beispiel in ST geben?


----------



## Cerberus (18 Februar 2009)

Als erstes bindest du die Lib "TcBase.lib" ein. Dann kannst du folgenden Code verwenden:

```
VAR
   FB_ADSWrite: FW_ADSWRITE;
   AchseID: UDINT;
   Wert: INT := 0;
END_VAR
 
 
FB_ADSWrite(sNetId:= '',
            nPort:= 500,
            nIdxGrp:= AchseID + 16#4200,
            nIdxOffs:= 16#1B,
            cbWriteLen:= SIZEOF(Wert),
            pWriteBuff:= ADR(Wert),
            bExecute:= TRUE,
            tTimeout:= t#2s,
            bBusy=> ,
            bError=> ,
            nErrId=> );
 
IF NOT FB_ADSWrite.bBusy THEN
     FB_ADSWrite(bExecute:= FALSE);
END_IF
```
 
PS:
Ich habe einfach das Bitmap von Zickenbändiger in ST umgesetzt.


----------



## Anaconda55 (18 Februar 2009)

Okay. Hab ich auch so umgesetzt.

Aber es funktioniert nicht. Erhalte den Fehlerint 6
Muss eine sNetId vergeben werden?


----------



## Cerberus (18 Februar 2009)

Könnte auch am Port liegen.
Mal ne Frage: Hast du unter deinen E/A-Geräten irgendwo ein Reiter "ADS" und wenn ja, was steht da für ein Port und eine NetId drin? Mit denen würde ich es jetzt so aus dem Stehgreif auch mal probieren.


----------



## Anaconda55 (18 Februar 2009)

Ich denke es leigt hier an einer Verknüpfung. Wie muss ADS verknüpft werden um mit T_AMSNETID die NetID auszulesen?


----------



## merje (26 Februar 2009)

Teste doch mal die TcMC2.lib


```
FUNCTION_BLOCK MC_Home
(*
 Function block defined by PLCopen Part 1 - Function blocks for motion control
 This Function Block commands the axis to perform the «search home» sequence.
 The details of this sequence can be set by the axis’ parameters. 
 The 'Position' input is used to set the absolute position when reference signal 
 is detected. This Function Bock completes at 'StandStill'.
*)
VAR_IN_OUT
 [COLOR=red]Axis    : AXIS_REF; (* B *)[/COLOR]
END_VAR
VAR_INPUT
 Execute   : BOOL; (* B *)
 Position   : LREAL (* B *) := DEFAULT_HOME_POSITION;
 [COLOR=red]HomingMode  :  MC_HomingMode; (* E *)[/COLOR]
 BufferMode  : MC_BufferMode;  (* E *)
 Options   :  ST_HomingOptions; (* V *) (* Beckhoff proprietary input *)
 bCalibrationCam  :  BOOL; (* V *) (* Beckhoff proprietary input *)
END_VAR
VAR_OUTPUT
 Done   : BOOL; (* B *)
 Busy   :  BOOL; (* E *)
 Active   :  BOOL; (* E *)
 CommandAborted : BOOL; (* E *)
 Error   : BOOL; (* B *)
 ErrorID   : UDINT; (* E *)
END_VAR
VAR
 LastExecutionResult:  _ST_FunctionBlockResults;
 ADSbusy  :  BOOL;
 iState   :  _E_TcMC_STATES := STATE_INITIALIZATION;
 iSubState  :  INT;
 fbAdsWriteCmd :  ADSWRITE;
 fbAdsWriteRefPos:  ADSWRITE;
 ReferenceFlagValue: UDINT;
END_VAR
```
 

HomingMode bestimmt, auf welche Weise die Kalibrierung durchgeführt wird. 

MC_DefaultHoming
Führt die Standard-Referenzfahrt aus.
MC_ForceCalibration 
Erzwingt den Zustand "Achse ist kalibriert". Es wird keine Bewegung ausgeführt und die Position bleibt unverändert.
MC_ResetCalibration 
Setzt den Kalibrierungszustand der Achse zurück. Es wird keine Bewegung ausgeführt und die Position bleibt unverändert.


----------

