トークン修飾子付きの NCFile2 の読み取り
ザル CNC12_TokenModifier.project サンプルプロジェクトは、のインストールディレクトリにあります。 CODESYS 下に ..\CODESYS SoftMotion\Examples。
この例では、インポート時にGコードを変更して、経路速度 (Fワード) の単位をmm/minからmm/sに変換する方法を示します。これは、Gコードを挿入することによって行われます。 1/60.0 * FワードのGコードを読み込んでいる間、ベロシティ値の前。 F6000 すると、次のようになります。 F 1/60.0 * 6000、これは後でによって処理されます。 SMC_NCInterpreter へのファンクションブロック F100。単純なケースでは、以下のように掛け算を省略できます 1/60 そして、値を調整するだけです (たとえば、 6000 に 100)。ただし、乗算は変数を使用する場合にも機能するため、より一般的です F $SPEED$ になります F 1/60.0 * $SPEED$。
アプリケーションの構造
CNC アプリケーションではよくあることですが、このアプリケーションにはパス処理が含まれます (CNC_PreparePath プログラム) と補間 ()CNC プログラム)。補間は他の例と変わらないので、ここではこれ以上説明しません
パス処理は、低優先度では 20 ミリ秒ごとに周期的に呼び出されます。 PathTask。高優先度では、補間は 4 ミリ秒ごとに周期的に呼び出されます MotionTask。バックグラウンドタスク VISU_TASK ビジュアライゼーション用に定義されています。
ビジュアライゼーションで G コードの処理を開始できます。G コードと機械の動き (3D ガントリー) がビジュアライゼーションの右側に表示されます
Gコード
CNC_PathSpeed
N10 G01 X1000 F6000 N20 Y1000
このGコードでは、ブロック単位の経路速度 N10 と設定されています。 F6000 6000 ミリメートル/分までただし、CNC ファンクションブロックでは mm/s 単位の経路速度を想定しているため、まず 2 つの直線運動が指示されます。 X=1000 そしてそれから X=1000, Y=1000。
トークン処理
ザル SMC_ReadNCFile2 そして SMC_ReadNCFromStream ファンクションブロックを使用すると、G コードの読み取り時に独自の変換を実行できます。ここでは、と一緒に使用しています SMC_ITokenModifier インターフェイスを介して渡されます。 aTokenModifier 入力。
このインターフェースは「トークン」で動作します。これらはGコードの基本部分で、処理が開始されるとGコードのテキストが細分化されます
N50 G36 O$plc_variable$ D'TextTest' X-1 (Comment)
このGコードは次のように分類されます。
テキスト | SMC_TOKENTYPE | SMC_TOKENVALUE |
|---|---|---|
| identifer | stValue = 'N' |
| number | fValue = 50.0 |
| identifer | stValue = 'G' |
| number | fValue = 36.0 |
| identifer | stValue = 'O' |
| variable | stValue = 'plc_variable' |
| identifer | stValue = 'D' |
| strLiteral | stValue = 'TextTest' |
| identifer | stValue = 'X' |
| operator | stValue = '-' |
| number | fValue = 1.0 |
以降の処理に必要のない情報 (空白文字、改行、コメントなど) は、トークンのリストに表示されません。
いつ SMC_ITokenModifier インタフェースが実装され、新しいトークンの追加、トークンの削除、トークンの値を変更することで、トークンのリストを調整できます。
Start: ファンクションブロックの初期化。内部状態がリセットされますCall: Gコードの処理中にこのメソッドを呼び出します。トークンは読み込んで、入力キューから削除し、出力キューに追加できます
実装
すべてのトークンが入力キューから出力キューに移動されます。
F ワードが検出されると、2 つの新しいトークンが、
1/60そして*、は「F」のトークンの後に、速度値のトークンの前に追加されます。
ザル Call メソッドにはトークンを処理するロジックが含まれています。まず、入力キューからトークンを移動すると便利です (tokensIn() を一時キューへ ()m_tmpQueue)、そこで処理し、出力キューに移動する (tokensOut)。テンポラリキューはパス速度を調整するために絶対に必要なわけではありませんが、複雑なケースではプログラム構造を簡略化できます
方法:コール
最初は、システムが待機します STATE_RUNNING 処理が開始されるまでの状態 (入力キューにトークンがあり、出力キューにまだ空きがある場合)。
IF NOT SMC_NC_CanProcessTokens(tokensIn, tokensOut) THEN // Wait until processing can proceed RETURN; END_IF
その後、トークンは入力キューから一時キューに移動されます。
IF m_tmpQueue.IsEmpty() THEN // Move the next token from the in-queue to the tmp-queue. pt := tokensIn.GetFromStart(0); m_tmpQueue.Append(pt^); tokensIn.RemoveFirst(); END_IF
実際の処理は ConvertSpeed メソッド。
IF NOT m_tmpQueue.IsEmpty() THEN // The actual processing is done here ConvertSpeed(); END_IF
メソッドの最後に、トークンは一時キューから出力キューに移動されます。
方法:変換速度
テンポラリキューの最初のトークンがチェックされます。
値を持つ識別子の場合 F が見つかると、さらに 2 つのトークン (数値) が追加されます。 1/60.0 そしてオペレーター *。
(テンポラリキューのサイズは、入力キューの 1 つのトークンに加えて、さらに 2 つのトークンがキューに収まるように選択されます)。
tk := m_tmpQueue.GetFromStart(0)^;
IF tk.tokenType = SMC_TokenType.identifier THEN
tk.GetString(pbyString => pby, iSize => iSize);
// 70 = ASCII code for F (path velocity)
IF iSize = 1 AND pby^ = 70 THEN
// Insert the number 1/60
SMC_Token_InitNumber(
tk:= tkNumber,
value:= 1/60.0,
srcPos:= tk.srcPos);
m_tmpQueue.Append(tkNumber);
// Insert operator '*' for multiplication
SMC_Token_InitOperator(
tk:= tkOperator,
value:= '*',
srcPos:= tk.srcPos);
m_tmpQueue.Append(tkOperator);
END_IF
END_IFコミッショニング
アプリケーションをビルドし、コントローラーにダウンロードします。
アプリケーションを起動し、ビジュアライゼーションに切り替えて、を押します
Start。