■ 渦巻座標 (KV File: Spiral_Counterx_xxx 

⇒ TO Home Page
内容

  X-Yテーブルで座標を渦巻き状に動かす機会がありましたので、そこで使った「 うず巻カウンター 」をサンプルとして公開致します。
このサンプルはカウンター形式なのでカウント0から順次カウントアップしないと正常に動作しません。
任意のN番目の(x,y)の座標を 求める数式はEXCELファイルで提供します。 下の「●EXCELファイルをダウンロード」からダウンロードしてください。
このサンプルの確認や、PLCに移植して使用する事もできるでしょう。

 今回、カウンターのコードはスクリプトで記述しました。条件分岐が数箇所必要なためIF文を使用しています。
スクリプトを使えば、ラダーでの煩わしい記述から解放されます。

このサンプルは他と 独立したプロジェクト にしました。
下の「●コードをダウンロード」からダウンロードしてください。
検 証用のモニタデバイスは「●登録モニタをダウンロード」からダウンロードしてください。

●PDF を表示   ●コードをダウンロード ●登 録モニ タをダウンロード     ●EXCELファイル をダウンロード
◆ 初期化ルーチン

Jump_Initial
・変数 [Initial] がFの時は未初期化なので、サブルーチン0にジャンプします。
・サブルーチン0を実行すると [Initial] はTとなり次スキャンからは初期化はパスされます。

Subroutine00
・サブルーチン番号0で、変数 [Initial] をTにします。また、サブルーチン番号1を呼出して、各カウンターをクリアします。

Clear Variable
・サブルーチン番号1では各カウンターをクリアしています。サブルーチン0から呼ばれていますが、スキャン内コードからも呼出されます。
・[@FM8] [@FM9] [@FM12] [@FM13] はカウンタコード内では "1ワード符号あり整数" 扱いにしていますが、"1ワード符号なし整数" として0を代入しても差し支えありません。

Subroutine00
・[Reset] をONする事でサブルーチン1を呼出し、カウンタをクリアしています。


◆ 渦巻き座標カウンター

・渦巻きグラフはこのPDFで確認して下さい。
Spiral_Script
・変数 [Trigger] がTになるとカウントアップします。スクリプトの実行条件を制御できる「ボックススクリプト」です。
・スペースの関係でスクリプトの表示は省略します。記述内容はPDFで確認するか、「KV-STUDIO」で確認して下さい。
ボックススクリプトは、いつ、どの タイミングで、KVスクリプトで記述されたプログラムを実行するかをラダーで指定できる、
ラダー実行条件付きスクリプトで す。
ラダーで指定した実行条件が成立し ている間だけボックススクリプトが実行されるので、
演算式の記述などに適しています。

Oneshot_SW
・変数 [Continu] をTにしておくと一度Tにした [Trigger] がリセットされないので、連続してカウントアップさせることができます。
・[Continu] をFにしていると、[Trigger] を毎回ONにする事でカウントアップします。

・次座標への「移動ピッチ」と「移動方向」を算出するため、「A」/「B」 2つのカウンタをつくりました。
・渦巻きが1進む毎に、カウンター「A」と「B」は次の様にインクリメントします。
 A×2 = B  ⇒  「A」をインクリメントし、「B」を1にする。
 A×2 ≠ B  ⇒  「B」をインクリメントする。
・同様に「X」と「Y」の移動量(個々の座標が変化すれば"1"変化なしなら"0")は次の手順で計算します。
 ( B−1 ) ÷ A = 0  ⇒  「X」の移動量は"1"、「Y」の移動量は"0"
 ( B−1 ) ÷ A = 1  ⇒  「X」の移動量は"0"、「Y」の移動量は"1"
・同様に「X」と「Y」の移動方向は次の手順で計算します。
 「A」が奇数  ⇒  正方向
 「A」が偶数  ⇒  負方向
・個々の座標は、以上の「X」と「Y」の値を積算していくだけです。

・次に渦巻きの角からの距離を計算します。上記の「X」と「Y」の値を積算していき、角に到達したら積算値をリセットします。
・角の判定は次の手順で行います。
 B ÷ A の余り = 0  ⇒  角
・角に到達した時点で個々の移動量が0なら各々の距離をリセットします。




◆ 確認
example
上 の画面にある登録モニタウィンドウを用意しています。 ●登 録モニタをダウンロード  からダウンロードしてください。136行目にもモニター用のデバイスを記述しています。
・シミュレートモードでRUN中に「登録モニタ」中の [Trigger] をONして下さい。([Trigger] にカーソルを合わせ、左ダブルクリックまたはスペースキー押下)
・[Trigger] がTになるとカウントアップします。この時 [Continu] がFであればONする度に、Tであれば [Trigger] がTの期間は連続でカウントアップします。

・座標は( X , Y ) = [@FM8] , [@FM9] 。角からの距離は( X , Y ) = [@FM12] , [@FM13] です。現在地が角の場合 [Corner] がTになります。
・[Reset] をONすると、カウンターがクリアします。

・シミュレーションモニタの数値をEXCELで比較確認できます。●EXCELファイル をダウンロード
EXCEL
・EXCELファイルを開いて 【C116】 に任意の数字を入れてください。"I"カラムがX座標、"J"カラムがY座標です。
・【C116】 セル以外は入力禁止にしています。


◆ 他の方式(条件分岐)

・最近とある事情で、今回の渦巻き移動コードを新たに他の方が書き直す事になりました。コードを頂きましたので参考にご覧ください。
 図をクリックするとPDFを開き ます。
BadCode
・アルゴリズムはスクリプトの"SELECT CASE"文を使った、渦巻きカウンターに対応した条件分岐になっています。
・条件分岐なので記述に限界があります。(ここでは100までの様です)渦巻きグラフを作成してそれを"にらめっこ" しながらコーディングする必要があります。
バグの可能性が増えます。
・このコードでは、渦巻きカウンターは"1"から始まっています。
・CASE文の中に物理座標の計算式を書いているので、無駄な記述があります。(まず論理座標を導いて、最後に実ピッチを掛けて物理座標にしましょう。)
・スクリプト文のインデントを揃えた方が良いかも知れません。

・他にはメモリーに結果を書込んでおいて、それを参照するテーブル引もありますが、同様にデータ作成が大変です。



●PDF を表示   ●コードをダウンロード ●登 録モニ タをダウンロード     ●EXCELファイル をダウンロード