short RobSetDiStartMove ( short idx, short SlotNumber, long PortNumber, long Logic );
0が返却されます。
idx:ロボットを指定するインデックス。
SlotNumber:設定番号(スロット)を指定します。値の有効範囲は1~16です。
PortNumber:入出力ポート番号を指定します。ロボットI/Oのバンク1の入出力ポートで、値の有効範囲は2049~2176です。
Logic:移動動作を開始するポートのレベルを指定します。
0…ポートの値が0のとき(OFFのとき)に移動動作を開始。
1…ポートの値が1のとき(ONのとき)に移動動作を開始。
指定ポートの値の変化に連動し、本関数以降に記述された指定ロボットの移動関数の動作を、即時に始動する機能(ポート連動移動始動機能)を有効にします。
指定ロボットにて、本関数以降に記述されたPTP動作移動関数、補間動作移動関数(以下、対象移動関数、とします)に対して、PortNumberで指定した入力ポートにLogicで指定したレベルを検出すると、即座にそのロボットの移動を開始します。本関数のidxで指定したロボットインデックスと同じロボットインデックスを指定した移動関数が対象になります。
1つのSlotNumberにつき1つのidx、1つのPortNumberを設定でき、指定のポートが指定のLogic値に変化した時に1回だけ、指定ロボットの対象移動関数による移動を開始します。1つのSlotNumberには複数のPortNumberを設定することはできませんが、異なるSlotNumberには同じPortNumberを設定することは可能です。SlotNumberには1~16を指定できるので、ポート変化による移動開始条件を16パターン設定することができます。
対象のポートはロボットI/Oの2049~2176の範囲の入出力ポートです。
本関数を記述する箇所には注意が必要です。本関数で指定したロボットに関して、以降の対象移動関数による移動動作は、指定したポートの値に支配されます。すなわち、本関数を記述した以降の指定ロボットの対象移動関数による移動動作は、ポートの値が指定の値に変化しない限り実行されません。従って、ポート変化のイベント発生前に指定ロボットの位置をプログラムに従って任意の位置に移動したい場合は、本関数を記述する前に行ってください。
本関数が実行された時、本関数で指定したポートの値がすでに指定の値であった場合は、以降の対象移動関数は直ちに実行されます。
本関数以降に記述されている複数の対象移動関数は、本関数で指定したポートが指定の値に変化した場合に順次実行されますが、対象となる移動実行中にポートの値が指定の値の反転値に変化した場合は、現在実行されている移動完了後、以降の対象移動関数の実行は保留状態になります。再度ポートの値が指定の値に変化すると、保留されている対象移動関数の実行が再開されます。このような「指定ポートの値による対象移動関数の保留および実行の制御」の影響が及ぶのは、RobResetDiStartMove関数が記述されるまでの範囲です。
本関数を用いると、使用例に示すような、ポートを介した複数のモーションのリアルタイムな連動が実現できます。
ポートに関してはデジタル入出力ポートリソースを参照してください。
〇PCベースコントローラ
〇InterMotion
rob1がPicUpの位置へ向かう30%の進捗度の時点でポート2113番の値が1に変化します。
同時にrob2がUp位置への移動を開始します。その後rob2はDwn位置へ移動します。
rob2の2つの移動動作はポート2113の1への変化イベント後に開始することにご注意ください。
void main() {
double Up2[MaxRobAxes], Dwn2[MaxRobAxes], PicUp1[MaxRobAxes];
double Org[MaxRobAxes];
short rob1, rob2;
・・・・
rob1 = 1;
rob2 = 2;
//エラーリセット
MwResetSystemError();
RobResetError(rob1);
RobResetError(rob2);
//サーボON、原点復帰
RobSetManipServoPower(rob1, 1);
RobSetManipServoPower(rob2, 1);
RobReturnHome(rob1);
RobReturnHome(rob2);
//初期設定
RobSetPtpSpeed(rob1, 40);
RobSetPtpSpeed(rob2, 30);
RobSetPtpAccelerations(rob1, 0.1, 0.1, 100, 100);
RobSetPtpAccelerations(rob2, 0.1, 0.1, 100, 100);
Org[0] = 0.0;
PicUp1[0] = 300.0;
Up2[0] = 200.0;
Dwn2[0] = -100.0;
//繰り返し移動
while(1) {
RobResetMoveProgressDo(rob1, 0); // ポート制御を無効化
RobResetDiStartMove(rob2, 0); // ポート制御を無効化
RobPtpMove(rob1, Org, 1); // rob1を開始位置へ移動
RobPtpMove(rob2, Org, 1); // rob2を開始位置へ移動
WritePort(2113, 0); // ポート2113の出力値を0に初期化
RobSetDiStartMove(rob2, 1, 2113, 1); // ポート2113=1によりrob2を移動開始するよう設定
RobPtpMove(rob2, Up2, 3); // Up位置へ移動 この移動はポート2113=1により実行されます
RobResetDiStartMove(rob2, 1); // ポート状態による動作開始を解除
RobPtpMove(rob2, Dwn2, 3); // Dwn位置へ移動 この移動はUpへの移動完了後に実行されます
RobSetMoveProgressDo(rob1, 1, 30, 2113, 1); // rob1がPicUpの位置へ向かう30%の進捗度にてポート2113=1となるよう設定
RobPtpMove(rob1, PicUp1, 3); // 本移動の進捗度30%にてポート2113の出力値が1になります
// ポート2113=1になると同時にrob2が動作開始します
RobWaitForMoveDone(rob1, 0); // rob1が動作終了するのを待つ
RobWaitForMoveDone(rob2, 0); // rob2が動作終了するのを待つ
・・・・
}
}