今回の記事ではPCでIgnitionをインストールし、さらに中にSECS/GEMモジュールをインストールします。次はPhoenix ContactのAXCF2152でPythonとsecsgemライブラリを使用し
SECS/GEM通信を行います(HOSTとEquipment両方とも)。
さ、FAを楽しもう。
Reference Link
SECS/GEM?
SECS/GEM(SEMI Equipment Communication Standard/Generic Equipment Model)は、半導体製造において、製造装置(エッチング装置、露光装置、計測装置など)と製造オペレーションを管理するホストコンピューターシステム間のデータ交換や装置制御を容易にするために使用される通信規格です。この規格はSEMI(Semiconductor Equipment and Materials International)によって定義され、半導体業界で広く使用されている。
SECS-I (SEMI Equipment Communication Standard 1, SEMI E4):
装置とホストシステム間のシリアル通信用プロトコル。データ伝送にRS-232またはRS-422を使用し、高速データ交換が重要でない環境に適している。
HSMS(High-Speed SECS Message Services、SEMI E37):
TCP/IPネットワーク上での高速通信用に設計されたプロトコル。このプロトコルは、迅速で信頼性の高いデータ交換が不可欠な最新の製造現場でよく使用される。
GEM (Generic Equipment Model)
GEMは、機器の通信と制御のための一連の標準機能を定義することによって、SECSを補完する。GEMは、以下の標準化されたインターフェイスを提供する:
Equipment State Management
機器の稼動状態(初期化、準備完了、稼動中、エラーなど)を監視・管理します。
Terminal Services
機器のリモートコマンド実行を可能になります。
Data Collection
トレースデータやイベントレポートなど、機器やプロセスに関するデータを収集し、報告するためのメカニズムを定義します。
Alarm Management
機器がアラームを報告する方法と、ホストによるこれらの管理方法を標準化します。
Recipe Management:
レシピ(工程指示書)のダウンロードとアップロードを標準化します。
Remote Control
ホストが機器の動作を開始、停止、変更できるようにします。
Implementation1‐Install Ignition
最初は自分のPCでIgnitionをインストールします。このソフト自体は実際運用する場合は有償ですが、DEMOモードはずっと2時間稼働することができます。
Ignitionが立ち上げてから2時間立つと一旦Runtimeが止まり、Reset Trialのボタンをクリックする必要があります。
そうすると、Ignitionまた2時間Full稼働モードに戻ります。
Download the installation File
下記のLinkからIgnitionのインストールFileをDownloadします。
https://inductiveautomation.com/downloads/
”Download Ignition”をクリックします。
Download for Windowsをクリックします。
簡単な個人情報を入力すれば、Installation FileをDownloadできます。
Done!
Install Ignition
先ほどDownloadしたIgnitionセットアップFileを起動し、Ignitionをインストールしましょう。
Nextで進みます。
少々お待ち下さい…
Done!
Ignitionが起動中なので、少々お待ち下さい…
Start Ignition!
Done!Browserが自動的に起動され、Ignitionのインストールバージョンを選択します。
今回の記事ではIgnitionを使用します。
ライセンスに同意し、Nextで進みます。
User アカウントを作成し、Nextで進みます。
少々お待ち下さい…
Done!
Download SECS/GEM Module
今回の記事はSECS/GEMのProtocolを試したいんですが、自分はもちろん半導体の製造装置をもっていません。ですが、IgnitionのSECS/GEMモジュールを使用することにより、SECS/GEMの装置シミュレーターなどを機能を活用できます。
下記のLinkからSECS/GEMのモジュールをDownloadしてください。
https://inductiveautomation.com/downloads/ignition/8.1.42
Done!
Install Module
先ほどDownloadしたSECS/GEMモジュールをインストールするため、Config>Modulesをクリックします。
Install or Upgrade a Moduleをクリックします。
Browseで先程DownloadしたSECS/GEMモジュールを選択し、Installをクリックします。
ライセンスを同意してください。
SECS/GEMモジュールをインストールしましょう。
Done!
SECS/GEMモジュールがIgnitionにインストールされました。
Configure Database Connection
Ignitionのデータベースを設定するため、CONNECTIONS>Databasesをクリックします。
こちらはIgnitionのデータベース接続画面になります。
Configurationボタンをクリックしデータベース接続設定を行います。
Create new Database Connectionをクリックします。
接続のDB種類はSQLITEにし、Connection URLはDBが保存したいPathになります。
Implementation2‐Start up a Host in PLCNEXT
IgnitionのSECS/GEMモジュールをセットアップ完了したら、次はPLCNEXT側でSECS/GEMのPythonライブラリをインストールします。ですが、その前、もう少しSECS/GEMのことを話したいと思います。
SECS/GEM (SEMI Equipment Communications Standard/Generic Equipment Model) モジュールは、Ignition プロジェクトとサードパーティアプリケーションが半導体製造装置と通信できるようにします。このモジュールは、GEM標準(SEMI E30-0307)、SECS-II標準(SEMI E5-0712)、HSMS標準(SEMI E37-0308)の実装です。
タイトル通り、Implementation2ではPLCNEXT上でSECS/GEM Hostを立ち上げます。機器との通信は、SECS-II規格で定義されたメッセージ形式で行われ、SECSメッセージまたは単にメッセージと呼ばれる。簡単な定義ファイルを使用することで、あらゆるSECSメッセージ(カスタムも含む)に対応することができます。
モジュールがインストールされると、ゲートウェイウェブページのConfigセクションに新しいヘッダーが用意され、機器への接続を設定したり、テストに使用するシミュレーターを設定したりすることができます。
SECS/GEMモジュールには、機器シミュレータを作成・設定する機能があります。シミュレータはGEM標準の完全な実装ではありません。機器コネクションはシミュレータに接続することができ、様々なメッセージを交換することができます。シミュレータは様々なSECSメッセージをサポートしています。この機能は、SECS/GEMモジュールの使用開始やアプリケーションのテストのために存在します。
Ignition Side
Ignition側でSECS/GEMシミュレーター(Equipment)を作成するため、Search BarからSimulatorを選択していきましょう。
こちらはシミュレーターの作成画面になります。
”Create new Simulator”をクリックし、新しいシミュレーターを作成しましょう。
アプリケーションに合わせてシミュレーターを設定しましょう。のちほどPython Scriptと一緒に設定項目を説明します。
Done!シミュレーターが作成されました。
PLCNEXT Side
今回記事で使用するのはAXCF2152なので、少々の下準備が必要です。
Firmware Update
PLCNEXTのFirmwareアップデートは下記の記事を参考にしてください。
Install pip
今回はPythonのライブラリを使用しますので、下記の記事でpipをAXCF2152にインストールしてください。
Install Library
今回使用するのはsecsgemというライブラリで、下記のLinkはそのライブラリのGithubです。
https://github.com/bparzella/secsgem
こちらのコマンドでsecsgemをインストールしてください。
$ pip install secsgem |
Script
こちらはプログラムです。
def s01f13_handler(connection, packet): print(“S1F13 got..”) def on_connect(event): print(“Connected..”) s01f01 = secsgem.SecsS01F01() data=client.send_and_waitfor_response(s01f01) print(data.data) s01f03 = secsgem.SecsS01F03() #Clock SVID=1 s01f03.append(secsgem.secs.variables.SecsVarU4(1)) #ControlState SVID=2 s01f03.append(secsgem.secs.variables.SecsVarU4(2)) data=client.send_and_waitfor_response(s01f03) print(data.data) import secsgem import time IPADDRESS=”192.168.13.72″ PORT=5002 client = secsgem.SecsHandler(“192.168.13.72”, 5002, True, 0, “test”) client.register_stream_function(1, 13, s01f13_handler) client.events.hsms_connected += on_connect client.enable() print(client.enable) time.sleep(5) client.disable() |
IPADDRESS/PORT
先ほどSimulatorでPassive IPアドレスはLocalhostで設定しましたので、ScriptのIPアドレスはIgnitionにインストールされているPCのIPアドレスに合わせて設定しましょう。
また、PORTもPassive Portの設定に合わせていきましょう。
IPADDRESS=”192.168.13.72″ PORT=5002 |
SecsHandler
こちらでSecsHandlerを作成し、SimulatorのIPアドレス・Portに合わせてパラメータを設定しましょう。
client = secsgem.SecsHandler(“192.168.13.72”, 5002, True, 0, “test”) |
また、3番目のTrue/FalseパラメータではActive接続かPassive接続かを設定します。
- True=Active
- False=Passive
になります。
Simulator側ではPassiveモードに設定しましたので、AXCF2152 Python Script側はもちろんActiveモードに合わせる必要があります。
register_stream_function
こちらはS01F13から新しい情報が受信したとき実行する関数を登録します。下記のサンプルコードではs01f13_handlerという関数に登録しました。
client.register_stream_function(1, 13, s01f13_handler) |
そのs01f13_handler関数はScriptの先頭に定義され、今回の記事では簡単な文字列をPrintするだけですが、実際のアプリケーションではLoggingしたり、ほかのシステムと連携したりします。
def s01f13_handler(connection, packet): print(“S1F13 got..”) |
hsms_connected
こちらはHOSTとEquipmentを接続成功したときのイベントを拾い、on_connectの関数を実行します。
client.events.hsms_connected += on_connect |
そのon_connect関数はScriptの先頭に定義され、中にS01F01とS01F03を実行します。
def on_connect(event): print(“Connected..”) s01f01 = secsgem.SecsS01F01() data=client.send_and_waitfor_response(s01f01) print(data.data) s01f03 = secsgem.SecsS01F03() #Clock SVID=1 s01f03.append(secsgem.secs.variables.SecsVarU4(1)) #ControlState SVID=2 s01f03.append(secsgem.secs.variables.SecsVarU4(2)) data=client.send_and_waitfor_response(s01f03) print(data.data) |
client.enable()
こちらのScriptでEquirmentと接続します。
print(client.enable) |
client.disable()
こちらのScriptでEquirmentと切断します。
client.disable() |
Result
Done!AXCF2152のPythonから立ち上げたHostとIgnitionで作成したSimulatorが通信できました。
Default Messages
また、IgnitionのSimulatorではこちらのMessageに対応できます。
- S1F1 – Are You Online
- S1F3 – Selected Equipment Status Request
- S1F11 – Status Variable Namelist Request
- S1F13 – Establish Communications Request
- S1F15 – Request OFF-LINE
- S1F17 – Request ON-LINE
- S2F13 – Equipment Constant Request
- S2F15 – New Equipment Constant Send
- S2F17 – Data and Time Request
- S2F23 – Trace Initialize Send
- S2F29 – Equipment Constant Namelist Request
- S2F31 – Date and Time Set Request
- S2F33 – Define Report
Implementation3‐Start up a Equipment in PLCNEXT
Implementation2ではPLCNEXT上でSECS/GEM のEquirmentを立ち上げ、Ignition側から接続します。
その接続は、イグニッションが半導体工場内の専用機器と通信するためのものです。装置接続はゲートウェイWebページの設定セクションで設定します。接続は、TCP/IP(HSMSプロトコル)を使用したイーサネット、またはRS-232ケーブルを使用した直接シリアル接続(SECS-Iプロトコル)で行うことができます。
このデータベースは、監査目的で送受信されたメッセー ジを保存し、いくつかの設定データを保持する。各機器接続は、1つのツールと1つのデータベースに接続し、ゲートウェイとツール間でSECSメッセージを転送します。ライセンスが許す限り、ゲートウェイにはいくつでも機器接続を設定することができ、異なる機器接続が同じデータベース接続を使用するように設定することも、異なるデータベース接続を使用するように設定することもできます。
SECS/GEMホストモジュールは、ゲートウェイ内に設定された機器接続を介して、1つ以上のツールと会話できるホストとして実装されています。初期セットアップを支援するシミュレーション機能を内蔵していますが、モジュールはホストとしてのみ機能し、機器であるかのように応答することはできません。
Ignition Side
Ignition側でHOSTを立ち上げるためには、SECS/GEM>Equipmentをクリックします。
こちらはIgnitionのSECS/GEM Equipment設定画面です。
”Create new Equipment Connection”で新しいのEquipmentを追加します。
アプリケーションに合わせて接続するEquipmentを設定しましょう。のちほどPython Scriptと一緒に設定項目を説明します。
Database Connectionは先程作成したConnectionを設定してください。
Save Changesで設定を保存しましょう。
PLCNEXT Side
Script
こちらはプログラムです。
import secsgem.gem import code class SampleEquipment(secsgem.gem.GemEquipmentHandler): def __init__(self, address, port, active, session_id, name, custom_connection_handler=None): secsgem.gem.GemEquipmentHandler.__init__(self, address, port, active, session_id, name, custom_connection_handl> self.MDLN = “gemhost” self.SOFTREV = “1.0.1” self.sv1 = 123 self.sv2 = “sample sv” h = SampleEquipment(“127.0.0.1”, 5002, False, 0, “plcnext2152”) h.enable() code.interact(“equipment object is available as variable ‘h’, press ctrl-d to stop”, local=locals()) h.disable() |
class SampleEquipment
こちらはGemEquipmentHandlerからExtendするSampleEquipmentを作成します。
class SampleEquipment(secsgem.gem.GemEquipmentHandler): def __init__(self, address, port, active, session_id, name, custom_connection_handler=None): secsgem.gem.GemEquipmentHandler.__init__(self, address, port, ™active, session_id, name, custom_connection_handl> self.MDLN = “gemhost” self.SOFTREV = “1.0.1” self.sv1 = 123 self.sv2 = “sample sv” |
Setup Connection
Equipment Objectを呼び出します。IPアドレスはPLCNEXT Localhostのままで、PortをIgnitionに合わせて設定しましょう。Falseパラメータを渡すにはAXCF2152側ではEquirmentとして設定したので、PASSIVEとして使用します。
h = SampleEquipment(“127.0.0.1”, 5002, False, 0, “plcnext2152”) |
Ignition側でActive IP Addressの設定はAXCF2152のIPアドレスになります。
そしてConnection ModeはACTIVEです。
h.enable()
こちらのプログラムを使ってEquipment Connectionを立ち上げます。
h.enable() |
Result
Done!IgnitionからAXCF2152に接続できました。DB Browserを使用し、SQLiteのDBを開くと、S1F13・S1F14の通信も記録されました。
SECS-II規格より:
「SECS-IIは、機器とホスト間の情報伝達方法をメッセージの形で定義している。これらのメッセージは、ストリームと呼ばれる活動のカテゴリーに編成され、ファンクションと呼ばれる特定のメッセージを含んでいる。
各SECSメッセージは、ストリームとファンクションを指定する。特定のSECSメッセージは、しばしば次のような形式で参照される: S(番号)F(番号)。例えば、S1F13は、SECSメッセージのストリーム1、ファンクション13を指す。
また、メッセージには2種類ある:
リクエスト:プライマリメッセージと呼ばれることもある。これはホストから発信され、Ignitionの文脈ではIgnition Gatewayのことである。リクエストはS1F1のような奇数番号の関数である。
レスポンス:セカンダリーメッセージとして知られることもある。これらは機器から発信される。応答は、S1F2のような偶数番号のファンクションである。 したがって、ホストはS1F1リクエストを送信することができる。その場合、機器はS1F2レスポンスで応答し、機器がオンラインであることを示す。各リクエストは、1つの応答メッセージのみを持つことができる。このRequest-and-Responseパターンは、モジュールと規格の基本である。