[EthercatDevice_DmpStepper_Generic]
説明
Register the event callback function for the EtherCAT slave device. Since this callback function is called within update()
内で呼び出されるため、 update()
が割り込みコールバック関数 (循環コールバック、エラーコールバック、イベントコールバックなど), エラー・コールバック(Error Callback), or イベント・コールバック(Event Callback)).
派生クラス:
クラス名 | 製造者ID | 製品コード |
EthercatDevice_QECR11MP3S | 0x00000bc3 | 0x0086d0d6 |
EthercatDevice_QECR00MP3S | 0x00000bc3 | 0x0086d0d9 |
構文
int attachInterrupt(void (*callback)(int));
媒介変数
[in] void (*callback)(int)
The event callback function to be registered has an integer-type parameter that indicates the event type. The supported event types are as follows:
定義 | コード | 説明 |
ECAT_EMERGENCY_STOPPED | 1 | Emergency stop occurred. |
ECAT_MACHINE_X_AXIS_LIMIT_TOUCHED | 2 | The X-axis limit switch has been touched. |
ECAT_MACHINE_Y_AXIS_LIMIT_TOUCHED | 3 | The Y-axis limit switch has been touched. |
ECAT_MACHINE_Z_AXIS_LIMIT_TOUCHED | 4 | The Z-axis limit switch has been touched. |
The remaining event types are determined using the following macros. Since the status of the following events are stored in the process data and this data is not latched, it is recommended to call update()
in the cyclic callback to handle these events and prevent event loss.
定義 | 説明 |
IS_ECAT_ENCODER_1_INDEX_RESET(event) | The Index Reset event of Encoder 1 has been triggered. |
IS_ECAT_ENCODER_2_INDEX_RESET(event) | The Index Reset event of Encoder 2 has been triggered. |
IS_ECAT_ENCODER_3_INDEX_RESET(event) | The Index Reset event of Encoder 3 has been triggered. |
IS_ECAT_ENCODER_X_INDEX_RESET(event) | The Index Reset event of Encoder X has been triggered. |
IS_ECAT_ENCODER_Y_INDEX_RESET(event) | The Index Reset event of Encoder Y has been triggered. |
IS_ECAT_ENCODER_Z_INDEX_RESET(event) | The Index Reset event of Encoder Z has been triggered. |
IS_ECAT_ENCODER_1_OVERFLOW(event) | The Overflow event of Encoder 1 has been triggered. |
IS_ECAT_ENCODER_2_OVERFLOW(event) | The Overflow event of Encoder 2 has been triggered. |
IS_ECAT_ENCODER_3_OVERFLOW(event) | The Overflow event of Encoder 3 has been triggered. |
IS_ECAT_ENCODER_X_OVERFLOW(event) | The Overflow event of Encoder X has been triggered. |
IS_ECAT_ENCODER_Y_OVERFLOW(event) | The Overflow event of Encoder Y has been triggered. |
IS_ECAT_ENCODER_Z_OVERFLOW(event) | The Overflow event of Encoder Z has been triggered. |
IS_ECAT_ENCODER_1_UNDERFLOW(event) | The Underflow event of Encoder 1 has been triggered. |
IS_ECAT_ENCODER_2_UNDERFLOW(event) | The Underflow event of Encoder 2 has been triggered. |
IS_ECAT_ENCODER_3_UNDERFLOW(event) | The Underflow event of Encoder 3 has been triggered. |
IS_ECAT_ENCODER_X_UNDERFLOW(event) | The Underflow event of Encoder X has been triggered. |
IS_ECAT_ENCODER_Y_UNDERFLOW(event) | The Underflow event of Encoder Y has been triggered. |
IS_ECAT_ENCODER_Z_UNDERFLOW(event) | The Underflow event of Encoder Z has been triggered. |
戻り値
error codeを返します。返された値が 0の場合、この関数が正常に完了したことを示します。
備考
この関数は、 EthercatMaster::begin()
が正常に実行された後で呼び出す必要があります。この関数はブロッキングされているため、循環コールバック関数内で呼び出すことができません。
例
#include "Ethercat.h" EthercatMaster master; EthercatDevice_QECR11MP3S slave; int emergency_stopped; int x_limit_touched; int y_limit_touched; int z_limit_touched; int encoder_index_reset[3]; int encoder_overflow[3]; int encoder_underflow[3]; int encoder_xyz_index_reset[3]; int encoder_xyz_overflow[3]; int encoder_xyz_underflow[3]; void Callback(int event) { switch (event) { case ECAT_EMERGENCY_STOPPED: emergency_stopped = 1; return; case ECAT_MACHINE_X_AXIS_LIMIT_TOUCHED: x_limit_touched = 1; return; case ECAT_MACHINE_Y_AXIS_LIMIT_TOUCHED: y_limit_touched = 1; return; case ECAT_MACHINE_Z_AXIS_LIMIT_TOUCHED: z_limit_touched = 1; return; default: break; } if (IS_ECAT_ENCODER_1_INDEX_RESET(event)) encoder_index_reset[0] = 1; else if (IS_ECAT_ENCODER_2_INDEX_RESET(event)) encoder_index_reset[1] = 1; else if (IS_ECAT_ENCODER_3_INDEX_RESET(event)) encoder_index_reset[2] = 1; else if (IS_ECAT_ENCODER_1_OVERFLOW(event)) encoder_overflow[0] = 1; else if (IS_ECAT_ENCODER_2_OVERFLOW(event)) encoder_overflow[1] = 1; else if (IS_ECAT_ENCODER_3_OVERFLOW(event)) encoder_overflow[2] = 1; else if (IS_ECAT_ENCODER_1_UNDERFLOW(event)) encoder_underflow[0] = 1; else if (IS_ECAT_ENCODER_2_UNDERFLOW(event)) encoder_underflow[1] = 1; else if (IS_ECAT_ENCODER_3_UNDERFLOW(event)) encoder_underflow[2] = 1; if (IS_ECAT_ENCODER_X_INDEX_RESET(event)) encoder_xyz_index_reset[0] = 1; else if (IS_ECAT_ENCODER_Y_INDEX_RESET(event)) encoder_xyz_index_reset[1] = 1; else if (IS_ECAT_ENCODER_Z_INDEX_RESET(event)) encoder_xyz_index_reset[2] = 1; else if (IS_ECAT_ENCODER_X_OVERFLOW(event)) encoder_xyz_overflow[0] = 1; else if (IS_ECAT_ENCODER_Y_OVERFLOW(event)) encoder_xyz_overflow[1] = 1; else if (IS_ECAT_ENCODER_Z_OVERFLOW(event)) encoder_xyz_overflow[2] = 1; else if (IS_ECAT_ENCODER_X_UNDERFLOW(event)) encoder_xyz_underflow[0] = 1; else if (IS_ECAT_ENCODER_Y_UNDERFLOW(event)) encoder_xyz_underflow[1] = 1; else if (IS_ECAT_ENCODER_Z_UNDERFLOW(event)) encoder_xyz_underflow[2] = 1; } void CyclicCallback() { slave.update(); } void setup() { Serial.begin(115200); master.begin(); slave.attach(0, master); slave.attachInterrupt(Callback); master.attachCyclicCallback(CyclicCallback); master.start(); } void loop() { if (emergency_stopped) { emergency_stopped = 0; Serial.println("ECAT_EMERGENCY_STOPPED"); } if (x_limit_touched) { x_limit_touched = 0; Serial.println("ECAT_MACHINE_X_AXIS_LIMIT_TOUCHED"); } if (y_limit_touched) { y_limit_touched = 0; Serial.println("ECAT_MACHINE_Y_AXIS_LIMIT_TOUCHED"); } if (z_limit_touched) { z_limit_touched = 0; Serial.println("ECAT_MACHINE_Z_AXIS_LIMIT_TOUCHED"); } if (encoder_index_reset[0]) { encoder_index_reset[0] = 0; Serial.println("IS_ECAT_ENCODER_1_INDEX_RESET"); } if (encoder_index_reset[1]) { encoder_index_reset[1] = 0; Serial.println("IS_ECAT_ENCODER_2_INDEX_RESET"); } if (encoder_index_reset[2]) { encoder_index_reset[2] = 0; Serial.println("IS_ECAT_ENCODER_3_INDEX_RESET"); } if (encoder_overflow[0]) { encoder_overflow[0] = 0; Serial.println("IS_ECAT_ENCODER_1_OVERFLOW"); } if (encoder_overflow[1]) { encoder_overflow[1] = 0; Serial.println("IS_ECAT_ENCODER_2_OVERFLOW"); } if (encoder_overflow[2]) { encoder_overflow[2] = 0; Serial.println("IS_ECAT_ENCODER_3_OVERFLOW"); } if (encoder_underflow[0]) { encoder_underflow[0] = 0; Serial.println("IS_ECAT_ENCODER_1_UNDERFLOW"); } if (encoder_underflow[1]) { encoder_underflow[1] = 0; Serial.println("IS_ECAT_ENCODER_2_UNDERFLOW"); } if (encoder_underflow[2]) { encoder_underflow[2] = 0; Serial.println("IS_ECAT_ENCODER_3_UNDERFLOW"); } if (encoder_xyz_index_reset[0]) { encoder_xyz_index_reset[0] = 0; Serial.println("IS_ECAT_ENCODER_X_INDEX_RESET"); } if (encoder_xyz_index_reset[1]) { encoder_xyz_index_reset[1] = 0; Serial.println("IS_ECAT_ENCODER_Y_INDEX_RESET"); } if (encoder_xyz_index_reset[2]) { encoder_xyz_index_reset[2] = 0; Serial.println("IS_ECAT_ENCODER_Z_INDEX_RESET"); } if (encoder_xyz_overflow[0]) { encoder_xyz_overflow[0] = 0; Serial.println("IS_ECAT_ENCODER_X_OVERFLOW"); } if (encoder_xyz_overflow[1]) { encoder_xyz_overflow[1] = 0; Serial.println("IS_ECAT_ENCODER_Y_OVERFLOW"); } if (encoder_xyz_overflow[2]) { encoder_xyz_overflow[2] = 0; Serial.println("IS_ECAT_ENCODER_Z_OVERFLOW"); } if (encoder_xyz_underflow[0]) { encoder_xyz_underflow[0] = 0; Serial.println("IS_ECAT_ENCODER_X_UNDERFLOW"); } if (encoder_xyz_underflow[1]) { encoder_xyz_underflow[1] = 0; Serial.println("IS_ECAT_ENCODER_Y_UNDERFLOW"); } if (encoder_xyz_underflow[2]) { encoder_xyz_underflow[2] = 0; Serial.println("IS_ECAT_ENCODER_Z_UNDERFLOW"); } // ... }
Please see EthercatDevice_DmpStepper_Generic Class for more QEC Stepper Drivers instructions and API usage.