Skip to main content

トークン修飾子付きの 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 そして、値を調整するだけです (たとえば、 6000100)。ただし、乗算は変数を使用する場合にも機能するため、より一般的です 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コードのテキストが細分化されます

54.
N50 G36 O$plc_variable$ D'TextTest' X-1 (Comment)

このGコードは次のように分類されます。

テキスト

SMC_TOKENTYPE

SMC_TOKENVALUE

N

identifer

stValue = 'N'

50

number

fValue = 50.0

G

identifer

stValue = 'G'

36

number

fValue = 36.0

O

identifer

stValue = 'O'

$plc_variable$

variable

stValue = 'plc_variable'

D

identifer

stValue = 'D'

'TextTest'

strLiteral

stValue = 'TextTest'

X

identifer

stValue = 'X'

-

operator

stValue = '-'

1

number

fValue = 1.0



以降の処理に必要のない情報 (空白文字、改行、コメントなど) は、トークンのリストに表示されません。

いつ SMC_ITokenModifier インタフェースが実装され、新しいトークンの追加、トークンの削除、トークンの値を変更することで、トークンのリストを調整できます。

. このインターフェースは次の 2 つのメソッドを定義します。
  • Start: ファンクションブロックの初期化。内部状態がリセットされます

  • Call: Gコードの処理中にこのメソッドを呼び出します。トークンは読み込んで、入力キューから削除し、出力キューに追加できます

実装

. PLC_PRGの処理フローは次のとおりです。
  • すべてのトークンが入力キューから出力キューに移動されます。

  • 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

コミッショニング

  1. アプリケーションをビルドし、コントローラーにダウンロードします。

  2. アプリケーションを起動し、ビジュアライゼーションに切り替えて、を押します Start