int RobSetDiPositionCapture ( short idx, short SlotNumber, short PortNumber, long Value );
0が返却されます。
idx:ロボットを指定するインデックス。
SlotNumber:設定番号(スロット)を指定します。値の有効範囲は1~16です。
PortNumber:入力ポート番号を指定します。ロボットI/Oのバンク1で、値の有効範囲は2049~2112です。
Edge:キャプチャを実行するポートのエッジを指定します。
0…ポート値の立下りエッジでキャプチャ。
1…ポート値の立上りエッジでキャプチャ。
本関数以降に記述された指定ロボットの移動動作中に入力ポートの値に変化があったとき、即座にそのロボットの現在位置をキャプチャする機能(ポート連動現在位置キャプチャ機能)を有効にします。
指定ロボットにて、本関数以降に記述されたPTP動作移動関数、補間動作移動関数による移動動作中に、PortNumberで指定したポートにEdgeで指定したエッジが入力されると、即時にそのロボットの現在位置をキャプチャします。本関数のidxで指定したロボットインデックスと同じロボットインデックスを指定した移動関数が対象になります。
キャプチャした現在位置はRobGetDiPositionCaptureCartePos、RobGetDiPositionCaptureJointPos、RobGetDiPositionCapturePulsePosの各関数で、同じロボット番号とスロット番号を指定することにより取得することができます。
キャプチャステータスはRobGetDiPositionCaptureStatus関数で、同じロボット番号とスロット番号を指定することにより取得することができます。この関数の戻り値が0の状態で移動関数を実行し、指定ポートが指定のエッジを検出したとき、指定のスロットへのキャプチャを実行します。この関数の戻り値が1の状態ではそのスロットへのキャプチャを行うことができませんので、RobResetDiPositionCaptureStatus関数でキャプチャステータスを0にリセットしてください。
1つのSlotNumberには複数のValueを設定することはできませんが、異なるSlotNumberには同じPortNumber、同じValueを設定することは可能です。SlotNumberには1~16を指定できますので、移動動作中に最大16パターンのキャプチャ条件を設定することができます。
対象のポートはロボットI/Oの入力ポート(2049~2112の範囲)です。
本関数は、ポート連動位置キャプチャの対象となる移動関数を発行する前に設定されていなければなりません。移動途中で設定しても所望のキャプチャを行うことができません。
本関数を用いると、入力ポート値の変化時の現在位置をリアルタイムに取得することが可能です。例えばフォトセンサの出力をポートに接続し、ステージを移動させながらセンサに入光があった位置を正確に知ることができます。
ポートに関してはデジタル入出力ポートリソースを参照してください。
〇PCベースコントローラ
〇InterMotion
1)次のように同じSlotNumberに複数のPortNumberやValueを設定すると、後から設定した方が有効になります。
void main() {
int rc;
・・・・
rc = RobSetDiPositionCapture(1, 1, 2055, 1); // これは無視される
rc = RobSetDiPositionCapture(1, 1, 2049, 0); // これも無視される
rc = RobSetDiPositionCapture(1, 1, 2049, 1); // これが有効な設定になる
・・・・
}
2)次のように異なるSlotNumberに同じPortNumberやValueを設定することは可能です。異なるSlotNumberであれば同じPortNumberに異なるValueを設定することも可能です。
void main() {
int rc;
・・・・
rc = RobSetDiPositionCapture(1, 1, 2049, 1); // これは有効な設定
rc = RobSetDiPositionCapture(1, 2, 2049, 0); // これも有効な設定
rc = RobSetDiPositionCapture(1, 3, 2049, 1); // これも有効な設定
・・・・
}
3)次のようにプログラムすると、Robot1の移動中にポート2049の立下りエッジおよび立上りエッジを検出してそれぞれのエッジでの現在位置をキャプチャします。
void main() {
int rc, j;
double pos[MaxRobAxes], CartePos[MaxRobAxes];
・・・・
RobSetDiPositionCapture(1, 1, 2049, 0);
RobSetDiPositionCapture(1, 2, 2049, 1);
RobResetDiPositionCaptureStatus(1, 0);
・・・・
pos[0] = 50;
RobPtpMove(1, pos, 3/*絶対非同期*/);
RobWaitForMoveDone(1, 0);
rc = RobGetDiPositionCaptureStatus(1, 1); //Slot1キャプチャ終了?
if(rc == 1) {
RobResetDiPositionCaptureStatus(1, 1); //キャプチャ終了フラグをリセット
RobGetDiPositionCaptureCartePos(1, 1, CartePos); //キャプチャ値をリード
Printf0("\n - Slot1_CaptureCartePos= ");
for(j = 0; j < 8; j = j + 1) {
Printf2("(%d)%f, ", j, CartePos[j]);
}
}
rc = RobGetDiPositionCaptureStatus(1, 2); //Slot2キャプチャ終了?
if(rc == 1) {
RobResetDiPositionCaptureStatus(1, 2); //キャプチャ終了フラグをリセット
RobGetDiPositionCaptureCartePos(1, 2, CartePos); //キャプチャ値をリード
Printf0("\n - Slot2_CaptureCartePos= ");
for(j = 0; j < 8; j = j + 1) {
Printf2("(%d)%f, ", j, CartePos[j]);
}
}
・・・・
}