トークン修飾子付きの 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
。