「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
「ソフテックだより」では、みなさまのご意見・ご感想を募集しています。ぜひみなさまの声をお聞かせください。
私は主にWindowsアプリケーションの開発を担当しています。先日、製造装置管理システム開発において、SECS-Iという比較的古い通信プロトコルを扱う機会がありました。
SECS通信は、製造装置とホストシステムを接続するうえで重要な技術ですが、実際に開発に携わるまでは、その仕組みや関連規格について体系的に理解できているとは言えませんでした。 また、レガシーな通信方式であるがゆえに、実装や動作確認の面で独特の難しさもありました。
本レポートでは、SECS通信に関する知識をあらためて整理するとともに、実際の開発を進める中で意識した点や難しかった点について紹介します。
SECS(SEMI Equipment Communications Standard)とは、半導体業界の国際標準であるSEMIスタンダードの中で、製造装置とホスト間のメッセージ交換に関する通信インタフェースを定義している複数規格のまとまりです。
SECS通信はSECS/GEMとして装置の通信規格として言及されることが多いですが、実際には複数のSEMIスタンダードが階層構造で構成されたものです。階層は図1のように表現されます。

図1. SECS/GEMプロトコル階層
比較的古い通信方式で、RS-232C などのシリアル通信を前提としてメッセージをやり取りするための通信インタフェース定義です。 ホストと装置間のメッセージ交換に必要な、コネクタ、信号レベル、データレート、プロトコルを規定しています。 つまり、通信路の上でどうやって相手に電文を届けるかを扱っています。現在の製造装置で主流ではありませんが、既存設備では今でも見かけることがあります。
SECS-Iでシリアル通信を前提としていた部分をTCP/IPベースに置き換えた通信インタフェースです。
SECS-Iと比較してメッセージをより高速かつ柔軟に送受信することができます。
実装上でどのように柔軟になるのかという部分についても後ほど触れます。
装置とホストが交換するメッセージの内容、構造、データ表現を定義する規格です。
S1F1、S1F2、S6F11のようなストリーム/ファンクションの番号体系、LIST、ASCII、BINARY、BOOLEAN、I4、U4、F8などのデータ型を定義します。
単なる「電文フォーマット」という意味合いだけではなく、どの種別のメッセージがあり、それぞれにどのような構造のデータ項目が載るのかまで定義しています。
プロトコルではなく、SECS-II を用いて装置とホストの間の通信・制御をどう標準化するかを定める包括モデルのことを指します。 SECS-IIのメッセージ定義を利用しながら、それらを装置側の機能としてどう使うかという振る舞いを規定しています。
なぜこのような階層の理解が必要になるかというと、「SECS通信を行っている」という事は必ずしも「GEM対応である」という事を示さないからです。特にSECS-Iで通信しているような旧世代型の装置についてはこの傾向が強く見られます。
そのため、システム開発にあたっては装置の通信仕様をしっかり確認することと、実際にどのメッセージを使用しているかを現場のログを見て確認するということが重要です。
今回の開発において特に意識する必要があったSECS-IとHSMSの相違点について説明します。
表1. SECS-IとHSMSの違い
| 特徴 | SECS-I | HSMS |
|---|---|---|
| ベースとなる通信プロトコル | RS-232C | TCP/IP |
| 通信速度 | 通常1000バイト/秒 | イーサネット規格に依存 (一般的な1000BASE-Tなら最大1Gbps) |
| 接続 | 接続1つごとに1本の物理ケーブル | 1本のケーブルで 複数の接続をサポート |
| ハンドシェイクの実装 | 必要 | 不要 |
| チェックサムの実装 | 必要 | 不要 |
| 256バイトを超える メッセージの扱い |
マルチブロックに分割する | 分割しない |
SECS-Iはシリアル通信を前提とした規格であり、通信速度や接続形態の面で制約があります。 たとえば、一般的な9600ボーレートのSECS-I通信では、1000文字のASCIIデータを送るだけでも1秒かかります。 したがって1000文字以上のメッセージを1秒以内に受信し続ける状況であれば、受信バッファにデータが蓄積し、最終的にバッファオーバーフローを引き起こします。
アプリケーション実装上における違いとして、HSMSではメッセージ送受信におけるハンドシェイク・チェックサムの実装は必要ありませんが、SECS-Iでは必要です。 また、256バイトを超えるメッセージはSECSではマルチブロックと呼ばれる複数のブロックメッセージに分割して送信する必要があります。
この表には含めていませんが、メッセージヘッダ構造の違い、タイムアウトの種類などにも違いがあります。ただし、本レポートでは詳述しません。
SECS-IIは、製造装置とホストシステムの間でやり取りされるメッセージの内容を定義する規格です。その中でも中心となるのが、ストリーム/ファンクションによるメッセージの分類です。
SECS-IIのメッセージは、一般に S1F1 や S2F14 のような形式で表されます。ここで、S はストリーム(Stream)、F はファンクション(Function)を表します。
ストリームは、メッセージの機能的な分類を示す番号です。たとえば、装置状態に関するやり取り、制御に関するやり取り、イベント通知に関するやり取りなど、同種の目的を持つメッセージがストリーム単位で整理されています。すべては紹介しませんが、よく使用するものとしては以下のようなストリームがあります。
ストリーム1(S1):装置の状態
ストリーム2(S2):装置の制御と診断
ストリーム5(S5):エラーとアラーム報告
ストリーム6(S6):データ収集
一方、ファンクションは、そのストリームの中で個々のメッセージを識別する番号です。
ストリームが大分類、ファンクションがその中の個別メッセージを表す小分類と考えると分かりやすくなります。
SECS-IIのストリーム/ファンクションでは、一般に奇数のファンクション番号がリクエスト、偶数のファンクション番号がそのレスポンスとして対応します。たとえば、S1F1 がある情報を問い合わせる要求メッセージであれば、それに対応する応答は S1F2 となります。このように、ファンクション番号の奇数・偶数の関係を見ることで、そのメッセージが要求なのか応答なのかを把握しやすくなっています。

図2. ストリーム/ファンクションを用いたトランザクションの例
この奇数のリクエストを送信し、偶数のレスポンスが返ってくるまでの一連の送受信をトランザクションと呼びます。
今回取り上げる開発事例は図3のような構成です。

図3. システム構成
私は、サーバー内で稼働するソフトウェアの実装を担当しました。サーバーは製造装置に対するホストシステムとして動作します。
今回の要求仕様では、装置が通常運転中に行っている常時通信とは別に、操作端末から特定の操作が行われた際、操作用のストリーム/ファンクションを装置に送信するという内容がありました。つまり、通常運転用の通信が流れている最中に、必要に応じて別用途のメッセージを割り込ませて装置へ送る必要があるということです。
この要件自体は一見すると単純に見えますが、SECS-Iではハンドシェイク・マルチブロックの制約から、メッセージを割り込ませて良いタイミングをアプリケーション側が強く意識する必要があったため、実装上の難しさにつながりました。
ここからは上記のシステムをSECS-Iで実装する際に最も苦労した、HSMSとSECS-Iでの割り込みタイミングの制御方法の違いについて踏み込んで解説します。
SECS-Iでは1つのメッセージを送信する際に図4のハンドシェイクを行います。

図4. SECS-Iハンドシェイク
ここでハンドシェイクのことを考慮せずに任意のタイミングで新規メッセージ用のハンドシェイクを始めてしまうと、図5のようにメッセージ解釈エラーが発生してしまいます。

図5. ハンドシェイク中の割り込み
では、このハンドシェイク完了後であれば割り込んでいいのかというと、必ずしもそうではありません。問題となるのがマルチブロックです。
SECS-Iではヘッダ・チェックサム含め256バイト以上のSECS-IIメッセージを送信する場合は、マルチブロックと呼ばれる複数のブロックに分割して送信しなくてはならないという仕様があります。そして、マルチブロック転送中は、1ブロック送信するごとに図4のハンドシェイクが発生します。
つまり、あるブロックのハンドシェイクが正常終了したとしても、それが1つのストリーム/ファンクションメッセージの完了を意味するとは限りません。マルチブロック転送の途中で別メッセージを割り込ませると、本来ひとまとまりであるべきメッセージ内容が崩れることになります。したがって、実際にメッセージを割り込んでいいタイミングというのは図6のようになります。

図6. マルチブロック転送中の割り込み可能タイミング
実際に割り込み送信を行ってよいタイミングは、単に1回のハンドシェイクが終わった瞬間ではなく、現在進行中の一連のマルチブロック送受信が完全に終了していることを確認できた時点に限られます。
さらに、S1F1を送った後、S1F2を受信するまでは割り込めないというようにトランザクション中に割り込めない仕様の装置があります。HSMS通信ではトランザクションの並行処理が可能な場合がほとんどですが、旧世代のSECS-Iだと並行処理に対応していないことが多いです。その場合は図7のように割り込みタイミングの制御が一つ追加されることになります。

図7. トランザクション中の割り込み可能タイミング
まとめると、SECS-I通信における通信開発では次の3段階の条件を意識した割り込み制御を行う必要があります。
今回の実装では「通信としての区切り」と「SECS-IIメッセージとしての区切り」を意識しながら、常時通信の途中で別用途のメッセージを差し込まないよう注意深く制御する必要があり、大変苦労しました。
ここまで述べてきたように、ひとくちにSECS通信と言っても、SECS-IとHSMSでは前提となる通信方式や実装内容が大きく異なります。 実際の現場でも、SECS通信といってもSECS-Iで通信されている装置、HSMSで通信していてもGEMには準拠していない装置など、構成や仕様はさまざまです。 したがって、製造装置に関するシステム開発では個別の装置ごとの仕様を理解することが欠かせません。
比較的新しい装置であれば、既存のパッケージで対応できる場合も多くあります。 しかし実際の現場では、装置ごとの独自仕様や既存システムとの接続要件、運用上の制約などにより、スクラッチでの設計・開発が必要になる場面も少なくありません。
ソフテックでは、SECS通信に限らず、各社PLCやリモートI/Oユニットなど、多様なインタフェースを用いて製造装置とシステムを接続してきた実績があります。 また、社内にはこうした分野に精通した先輩社員も多く、技術的なナレッジが蓄積されています。
私自身、レガシーな通信プロトコルを扱うシステム開発に携わることに当初は不安もありました。 しかし、上司・チームメンバーの支援を受けながら開発を進めることで、着実に理解を深めながら業務に取り組むことができました。今回の開発を通じて、既存技術を正しく理解し、現場に合わせて実装していく力の重要性を強く実感しています。
記事が、SECS通信や製造装置をつなぐシステムの開発に携わる方にとって、その概要の一端を知るきっかけになれば幸いです。
(K.N.)
関連ページへのリンク
関連するソフテックだより
「ソフテックだより」では、みなさまのご意見・ご感想を募集しています。ぜひみなさまの声をお聞かせください。