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:
- Die PLC-Bibliothek „Tc2_EtherCAT“ einbinden. (enthält FB_EcCoESdoRead)
- Device „EtherCAT“ > InfoData > AmsNetId mit
sAmsNetIdArr
verknüpfen. - EP3751-0160 > AI Acc X Inputs > Value mit
nAx
verknüpfen. - EP3751-0160 > InfoData > AdsAddr > port mit
nSlaveAdress
verknüpfen.
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