Anwender-Abgleich in der PLC

Sie können die Korrekturberechnung auch in der PLC durchführen anstatt in der Box. Das hat den Vorteil, dass Sie die Messwert-Auflösung beliebig einstellen können: Wenn die Korrekturberechnung in der Box durchgeführt wird, ist die Messwert-Auflösung auf 1 mg/LSB begrenzt.

Beckhoff empfiehlt, auch bei der Korrekturberechnung in der PLC die Abgleichkoeffizienten aus den dafür vorgesehenen CoE-Parametern zu lesen. So muss bei einem Austausch der Box nicht das PLC-Programm angepasst werden.

Beispielprogramm für die x-Achse

Vorbereitung:

PROGRAM MAIN

VAR
    nAmsNetIdArr AT %I*: T_AmsNetIdArr;
    nSlaveAddress AT %I*: WORD;
    nAxis_Value AT %I*: DINT;
    eState: (IDLE, INIT_READ_OFFSET, READING_OFFSET, INIT_READ_GAIN, READING_GAIN,
             NOMINAL_OPERATION, ERROR);
    fbSdoRead: FB_EcCoESdoRead;
    sAmsNetId: T_AmsNetId;
    nOffset: INT;
    nGainRaw: INT;
    fGain: REAL;
    fAxCalibrated: REAL;
    bExecute: BOOL;
END_VAR
CASE eState OF
    IDLE:
        fbSdoRead(bExecute := FALSE);
        sAmsNetId := F_CreateAmsNetId(nAmsNetIdArr);
        IF bExecute THEN
            eState := INIT_READ_OFFSET;
        END_IF

    INIT_READ_OFFSET:
        fbSdoRead(
            sNetId := sAmsNetId,
            nSlaveAddr := nSlaveAddress,
            nSubIndex := 16#17,
            nIndex := 16#8000,
            pDstBuf := ADR(nOffset),
            cbBufLen := SIZEOF(nOffset),
            bExecute := TRUE
            );
        eState := READING_OFFSET;

    READING_OFFSET:
        fbSdoRead();
        IF NOT fbSdoRead.bBusy THEN
            IF fbSdoRead.bError THEN
                eState := Error;
            ELSE
                fbSdoRead(bExecute := FALSE);
                eState := INIT_READ_GAIN;
            END_IF
        END_IF

    INIT_READ_GAIN:
        fbSdoRead(
            sNetId := sAmsNetId,
            nSlaveAddr := nSlaveAddress,
            nSubIndex := 16#18,
            nIndex := 16#8000,
            pDstBuf := ADR(nGainRaw),
            cbBufLen := SIZEOF(nGainRaw),
            bExecute := TRUE
            );
        eState := READING_GAIN;

    READING_GAIN:
        fbSdoRead();
        IF NOT fbSdoRead.bBusy THEN
            IF fbSdoRead.bError THEN
                eState := ERROR;
            ELSE
                fbSdoRead(bExecute := FALSE);
                fGain := INT_TO_REAL(nGainRaw) / 16384;
                eState := NOMINAL_OPERATION;
            END_IF
        END_IF

    NOMINAL_OPERATION:
        fAxCalibrated := fGain * DINT_TO_REAL(nAxis_Value - nOffset);

    ERROR:
        ;

END_CASE