CNC の例 10: 動的 CNC パスのプログラミング
を参照してください CNC10_DynamicPath.project のインストールディレクトリにあるサンプルプロジェクト CODESYS 下 ..\CODESYS SoftMotion\Examples.
この例では、CNC プログラム オブジェクトまたはファイルから G コードを入力せずに、実行時にアプリケーションで CNC パスを直接作成する方法を示します。この種の従来の CNC プログラムをコンパイルすると、パス データは SMC_CNC_Data データ構造タイプ。この内部データは、コンパイル モードに応じて特定のグローバル データ構造にコンパイルされます (SMC_CNC_REF また SMC_OutQueue)。
コンパイルモードの場合 SMC_CNC_REF、データはの配列に格納されます SMC_GEOINFO 要素。アプリケーションコードの配列は通常、関数ブロックインスタンスに渡されます SMC_NCDecoder。実行時に、データはそこでデコードされ、タイプのグローバルデータ構造に格納されます SMC_OUTQUEUE。次に、パス前処理機能ブロックを呼び出すことができます。
コンパイルモードの場合 SMC_OutQueue、グローバルデータ構造(SMC_OUTQUEUE)が生成されます 直接。アプリケーションコード内のこのデータ構造は、補間器に渡されます(SMC_Interpolator FBインスタンス)。機能ブロック SMC_NCDecoder は呼び出されません。
コンパイルモードの場合 ファイル、データはファイルに保存されます。データは、タイプの要素の配列として格納されます SMC_GEOINFO コンパイルモードで生成されたデータに対応します SMC_CNC_REF。
CNCパスをプログラミングする代わりに、タイプのデータ構造をインスタンス化するアプリケーションコードをプログラミングできます。 SMC_OUTQUEUE 実行時に、その値を割り当てます。実行時に動的に生成されるCNCパスをプログラムします。データ構造を他の汎用ブロックインスタンス(たとえば、パス前処理汎用ブロックまたは汎用ブロック)に渡すことができます。 SMC_Interpolator)。
プログラミング
ヒント
The CNCDynamicPath サンプルプロジェクトは、のインストールディレクトリにあります。 CODESYS。サンプルプロジェクトは、 CNConline 事業。それは含まれています Path グラフィカルにプログラムされた代わりにプログラム Example 道。タイプのデータ構造 SMC_OUTQUEUE 動的に生成されます。
タイプのデータ構造を宣言します
SMC_OUTQUEUE。データ構造にはCNCパスデータが含まれており、動的に入力されます。例:
QUEUE必要な量のパスにメモリを割り当てます。
SMC_GEOINFO要素。例:
BUFタイプの変数を宣言します
SMC_GEOINFO最初のステップで。例:
GEO
データ型の配列要素
SMC_GEOINFOCNCコードのパス要素に対応します。要素をに追加するには、要素ごとに次の手順を実行する必要があります。SMC_OUTQUEUE:すべての配列要素には、前の配列要素の終了位置に対応する開始位置があります。
例:
GEO.piStartPos.dX := 0;またGEO.piStartPos := GEO.piDestPos;各配列要素の移動タイプを決定します。
例:
GEO.iMoveType := CCLW;またGEO.iMoveType := LIN;移動タイプのパラメータを設定します。これは、すべての移動タイプに必要なわけではありません。
例:円弧(移動タイプ:CCLW)の場合、次の位置を設定する必要があります。
geoinfo_A[i].dP1 := 200; geoinfo_A[i].dP2 := 100; geoinfo_A[i].dP3 := 50; geoinfo_A[i].dT1 := 0; geoinfo_A[i].dT2 := 90;終了位置の計算を挿入します。
SMC_CalcEndPnt(ADR(GEO));オブジェクトの長さの計算を挿入します。
SMC_CalcLengthGeo(ADR(GEO));オブジェクトをに保存します
QUEUE:SMC_AppendObj(POQ:=ADR(QUEUE), PGI:=ADR(GEO));
パスが完全に作成されたら、終了マーカーを設定する必要があります。 QUEUE-bEndOfList = TRUE;
ヒント
次に、パス前処理機能ブロックが呼び出されると、の開始ビットまたは終了ビットを設定する必要があります。 InternMark。
2つのパス要素を持つCNCパス
この例では、配列はX / Y位置で定義されていません。説明したようにこれが2つのパス要素を持つ例である場合、これらの配列にはそれぞれ2つの要素が必要です。
たとえば、サンプルプロジェクトから派生したもの:
xp:ARRAY[1..2] OF REAL:= [100,50]; yp:ARRAY[1..2] OF REAL:= [0,100];
PROGRAM Path
VAR
iState : INT;
QUEUE : SMC_OUTQUEUE;
BUF : ARRAY[0..49] OF SMC_GEOINFO;
// Memory allocation
GEO : SMC_GEOINFO:=(dT1:=0, dT2:=1, dToolRadius:=0, dVel:=100, dVel_End:=100, dAccel:=200, dDecel:=500, iObj_Nr:=0);
// Initial path element
n : INT := 0;
QUEUE.nSize := SIZEOF(BUF);
END_VAR
CASE iState OF
0:
QUEUE.pbyBuffer := ADR(BUF[0]);
// Initialize QUEUE
SMC_SetQueueCapacity(ADR(QUEUE), SIZEOF(BUF));
iState := iState + 1;
1:
// Fill QUEUE
WHILE NOT QUEUE.bFull DO
// When QUEUE is full, wait until it has been processed by the following FBs
n := n + 1;
GEO.iSourceLine_No := n;
GEO.piStartPos := GEO.piDestPos;
// Copying last destination
GEO.iMoveType := LIN;
// Generating linear movement
GEO.iObjNo := GEO.iObjNo + 1;
// Calculating number
GEO.piDestPos.dX := xp[n];
// Generatint position
GEO.piDestPos.dY := yp[n];
SMC_CalcLengthGeo(pg := ADR(GEO));
// Calculating length of object with the help of the standard function
SMC_AppendObj(poq:=ADR(QUEUE), pgi:=ADR(GEO));
// Appending object to QUEUE
IF n = SIZEOF(xp)/SIZEOF(xp[1]) THEN
// All target positions processed
QUEUE.bEndOfList := TRUE;
n := 0;
iState := 2;
EXIT;
END_IF
END_WHILE
2:
//Done
;
END_CASE
CheckVel(bExecute:=TRUE , poqDataIn:=ADR(queue)); // Preprocessing重要
の場合 SMC_OUTQUEUE データ構造には次のデータが入力されます SMC_GEOINFO データとデータ構造要素がに設定されました bFULL = TRUE、その後の割り当てはお勧めしません SMC_GEOINFO データ。この場合、パスの作成は、実行時に、の最初の要素まで中断されます。 SMC_OUTQUEUE データ構造は補間器で処理されます。その場合にのみ、別の要素が挿入されます。
十分なメモリを割り当てることにより、この中断を回避してください。変数を参照してください BUF。
重要
データ構造の場合 SMC_OUTQUEUE 最初の実行後に補充され、次に補間器とすべての前処理機能ブロックが補充されます(例: SMC_CheckVelocities)で立ち上がりエッジで再起動する必要があります Execute。