Loading article…
PetriScript は、Alexandre Hamez と Xavier Renault によって設計されたペトリネットのモデリング言語です。[ 1 ] CPN -AMIプラットフォームは、検証ツールやモデル検査ツールなど、ペトリネットを扱うための多くのツールを提供します。[ 2 ]
当初、単純なペトリネットはグラフィックデザインによって作成されていましたが、LIP6の内部で行われた研究により、そのようなタスクを自動化する必要があることが明らかになりました。[ 3 ] PetriScript は、CPN-AMI プラットフォーム内で場所遷移ペトリネットと色付きペトリネットをモデル化するための機能を提供するように設計されました。Petriscript の主な目的は、ノードのマージ、作成、接続によってペトリネットのモデリング操作を自動化することです。マクロ、ループ制御、リスト、文字列、算術式など、必要なほぼすべての機能をサポートし、ユーザーの介入を可能な限りブロックします。構文はAda に似ています。
以下のスクリプトは、3つのセクションを持つFIFOを生成します。
define ( FIFO_SIZE , 3 ) define ( FIFO_BASE_X , 100 ) define ( FIFO_BASE_Y , 100 ) define ( FIFO_STEP , 120 ) int $ wave := 0 ; for $ wave in 1. . FIFO_SIZE loop create place "Slot_" & ' $ wave ' ( x FIFO_BASE_X + FIFO_STEP * $ wave , y FIFO_BASE_Y ); create place "Empty_" & ' $ wave ' ( x FIFO_BASE_X + FIFO_STEP * $ wave , y FIFO_BASE_Y + 100 , marking "1" ); end loop ; for $ wave in 1. . FIFO_SIZE + 1ループ遷移"t" & ' $ wave - 1 ' & "_to_ " & ' $ wave ' ( x FIFO_BASE_X + FIFO_STEP * $ wave - FIFO_STEP / 2 、y FIFO_BASE_Y + 50 ); if $ wave < FIFO_SIZE + 1 then connect "1" transition "t" & ' $ wave - 1 ' & "_to_" & ' $ wave ' to place "Slot_" & ' $ wave '; connect "1" place "Empty_" & ' $ wave ' to transition "t" & ' $ wave - 1 ' & "_to_"& ' $ wave '; end if ; if $ wave > 1 then connect "1" transition "t" & ' $ wave - 1 ' & "_to_" & ' $ wave ' to place "Empty_" & ' $ wave - 1 '; connect "1" place "Slot_" & ' $ wave - 1 ' to transition "t" & ' $ wave - 1 ' & "_to_" & ' $ wave '; end if ; end loop ; set transition "t0_to_1" to ( name "FIFO_Start" ); set transition "t" & ' FIFO_SIZE ' & "_to_" & ' FIFO_SIZE + 1 ' to ( name "FIFO_End" );これにより、以下のグラフが生成されます。 ![]()
PetriScriptの威力を示すもう一つの例を以下に示します。
define ( X , 250 ) define ( Y , 350 ) define ( radius , 50 ) define ( R , 150 )define ( SECTIONS , 15 )define ( INNER_ANGLE , 360 / SECTIONS ) define ( OUTER_ANGLE , 360 / ( 2 * SECTIONS ))int $ i := 0 ; int $ j := 0 ;for $ i in 1. . SECTIONS loop create place "F" & ' $ i ' ( x X , y Y , r radius , t $ i * INNER_ANGLE ); create place "Section_" & ' $ i ' ( x X , y Y , r R , t $ i * INNER_ANGLE ); create transition "t" & ' $ i ' & "_to_" & ' $ i mod SECTIONS + 1 ' ( x X , y Y , r R , t $ i * INNER_ANGLE + OUTER_ANGLE ); end loop ;for $ i in 1. . SECTIONS loop connect place "Section_" & ' $ i ' to transition "t" & ' $ i ' & "_to_" & ' $ i mod SECTIONS + 1 ';遷移"t" & ' $ i ' & "_to_" & ' $ i mod SECTIONS + 1 'を接続して、 "Section_" & ' $ i mod SECTIONS + 1 ' を配置します。if $ i /= 1 then connect place "F" & ' $ i ' to transition "t" & ' $ i - 1 ' & "_to_" & ' $ i '; else connect place "F1" to transition "t" & ' SECTIONS ' & "_to_" & ' 1 '; end if ;接続遷移"t" & ' $ i mod SECTIONS + 1 ' & "_to_" & '( $ i + 1 ) mod SECTIONS + 1 'を"F" & ' $ i 'に配置する;ループ終了;for $ i in 1. . SECTIONS loop if $ i mod 3 = 0 then set place "Section_" & ' $ i ' to marking "1" ; else set place "F" & ' $ i ' to marking "1" ; end if ; end loop ;これにより、以下のグラフが生成されます。 ![]()
詳細な資料はこちらから入手できます。