DUCO プログラムでのスクリプト使用方法

スクリプトを使用することでより複雑な動作や外部デバイスとの連携が可能

スクリプトはプログラム作成ページでScriptブロックを配置することで使用できる。条件の分岐が複雑な場合やログの記述、独自の指令(関数)を作成したい場合には役に立つ。

スクリプトを記述する言語はLua(バージョン5.3)で、DUCOが用意している専用の関数群を使用してスクリプトを記述する。Luaの文法に沿ったwhile、ifなどの条件分岐やfunctionによる自作の関数定義も可能である。

スクリプトを記述する方法は、一行のスクリプトを記述するライン選択、複数行のスクリプトを記述するスクリプト作成、ファイルからスクリプトを読み込むファイル選択がある。

3種類のスクリプト作成方法

ライン選択

一行のみのスクリプト記述をする場合に使用。変数への値の代入や自作した関数の実行などでは本機能は使いやすい。

ライン選択によるスクリプト入力

スクリプト入力

複数行のコードによりスクリプトを作成できるモードで、サブウィンドウで関数一覧を見ながら入力できる。慣れたユーザーならすべての動作を一つのスクリプトにまとめることも可能。

スクリプト入力画面
関数一覧から選択可能

ファイル選択

’.script’拡張子のテキスト形式のファイルをUSBに保存しておき、本機能でファイルを読み込むことでスクリプトをプログラムに組み込むことができる。
そのほかコードの手入力など、上記のスクリプト入力でできる機能はほぼできるので、コードの再利用をしたい人はファイル選択を選んだ方が良いかもしれない。
ファイルの新規作成はできないので空データでも良いので事前にファイルを作成しておくこと。

ファイルの読み込みはUSBからコントローラーへ取り込む操作と取り込んだファイルをスクリプトブロックで選択する操作が必要である。
USBの取り込みは、プログラムファイルの取り込み操作と同じ輸入(EN:import)ボタンをクリックするとファイル選択ウィンドウが表示されるため、該当ファイルを選択する。

USBからのファイル取り込み
スクリプトファイルの選択

キー入力でコードを記述しようとすると、”Cannot edit in read-only editor“の表示が出て入力できないことがある。その場合は右上の”編集“アイコンをクリックすると編集モードに入り記述が可能になる。

編集モードで記述可能になる

スクリプト作成の使い方

キーボードとマウスの使用

制御盤内のコントローラーのUSBポートにキーボードを接続すればキーボードの使用が可能。
ただしキーボード配列は英語配列で認識される。

変数の種類

以下の3種類の変数を使用。

  1. システム変数 … 全プログラム内で使用可能な変数。プログラム設定ページのシステム変数タグを選択し、ページ内で変数を作成。接頭辞としてg_がつく。
  2. グローバル変数 … 単一のプログラムで使用可能で宣言をしたプログラム内で使用可能。同一プログラム内であればスクリプトを記述するブロックが別であっても機能する(変更が反映される)。
    自作関数内での変更も反映される。
    宣言は何もつけずにval = 1 とすればよい。
  3. ローカル変数 … 関数内でのみ使用可能な関数で、同一名のグローバル変数が関数外で宣言されていても、変更は反映されない。
    宣言はlocalをつけて、local val = 1と宣言する。
g_counter = 1
counter = 2
l_counter = 3

function change_variables()
    
    g_counter = -1
    counter = -2
    local l_counter = -3

end

change_variables()

# 実行で ログにコメントアウト部の文字が表示
log("システム変数", g_counter) -- > システム変数: -1.000000
log("グローバル変数", counter2) -- > グローバル変数: -2.000000
log("ローカル変数", l_counter) -- > ローカル変数: 3:000000

配列の使用用法

Luaの文法ではtable型のデータを使用する。
data = {true, -8, 1.1, "comment"}のように”{}”で囲まれ”,”で区切られたデータで初期化する。
table型データをインデックスで抽出する場合は1から始まる(1-based)ことに注意。

下記のスクリプトの実行では、コメントアウト部がログに表示される。

data = {true, -8, 1.1 ,"comment"}
log("data[1] = ", data[1]) -- > data[1] = true
log("data[2] = ", data[2]) -- > data[2] = -8.000000
log("data[3] = ", data[3]) -- > data[3] = 1.100000
log("data[4] = ", data[4]) -- > data[4] = "comment"

自作関数の作成

function 関数()~ endで関数を定義できる。戻り値はreturn で記述。下記は一例。

function vision_start()
    socket_open("192.168.1.5", 6000)
    local res = socket_write ("VisionStart")
    if res == false then
        log("err:", "画像検査測定開始の送信に失敗しました。")
        return {false, 0, 0}
    end
    res = socket_read_string (20)
    res_table = str_split(res, ",")
    
    socket_close()

    if res == "" then
        log("err:", "画像検査測定開始に失敗しました。")
        return {false, 0, 0}
    end

    local msg = str_cat("補正量 x=", res_table[2])
    msg = str_cat(msg, ", y=")
    msg = str_cat(msg, res_table[3])
    log("info:", msg)
    return {true, res_table[2], res_table[3]}
end

座標変換の方法

DUCO標準の関数 pose_trans(pose1, pose2)を使用すれば任意の座標について、回転及び平行移動した座標値を演算可能。pose1は変換を行う為のデータpose1={x, y, z, rx, ry, rz}、x,y,zは平行移動成分でm単位表示、rx,ry,rzは回転移動成分でrad単位表示。
pose2は変換元の座標データ(デカルト座標)で単位はm、rad単位。

-- 基準位置のデカルト座標
position = {-0.2, 0.3, 0.25, 3.14159, 0, 0}

-- ベース座標系を中心にRzを基準軸に30°回転させるためのデータ(配列)
trans_data = {0.0, 0, 0, 0, 0, deg2rad(30) }

-- pose_trans関数での座標の変換
position2 = pose_trans(trans_data, position)

-- ログに変換後の座標が表示
log("position2 = ", position2) -- > possition2 = {-0.323205, 0.159808, 0.250000, 3.141590, 0.000000, 0.523599}

参考資料