bulk-engineering について
設備リストとテンプレートから設定を生成する、オートメーションエンジニア向けの DCS/PLC 一括エンジニアリング資料です。ABB Freelance、Siemens TIA Portal、Emerson DeltaV の手法を扱います。
主な機能
- 01表計算からデータベースへの工程
- 02テンプレートによる制御器と画面の生成
- 03ABB Freelance の PRT・DMF テンプレート化
- 04Siemens TIA Openness と SiVArc の手法
- 05Emerson DeltaV のクラスと FHX 生成
活用シーン
- 01モーター、バルブ、計器の設定を一括生成
- 02HMI 画面とアラーム設定の作成
- 03プロジェクト成果物間のタグ参照の検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ claude-dev-suite/ claude-dev-suite --skill bulk-engineeringインストール後、Claude Code で/bulk-engineeringを入力して読み込まれたか確認します。
詳細
DCS/PLC オートメーション向け一括エンジニアリング
問題
一般的な中規模プラントでは、モーターが200~500台、バルブが100~300個、アナログループが500~2000個、ディスクリートI/Oが200~1000点あります。手作業で設定すると1インスタンスあたり15~60分かかります。一括エンジニアリングにより、数カ月かかる作業を数日に短縮できます。
一般的なパイプライン
[Instrument Index / Motor List / Valve List] (Excel/CSV input)
|
v
[Engineering Database] (SQLite / structured data)
|
v
[Template Library] + [Configuration Rules]
|
v
[Code Generator] (Python + Jinja2 / string replacement)
|
v
[DCS/PLC Project Files] (PRT, XML, FHX, etc.)
|
v
[Validation] (cross-reference check, naming, completeness)
|
v
[Import to DCS Engineering Tool]
入力ドキュメント
| ドキュメント | 含まれる内容 | 用途 |
|---|---|---|
| 計器インデックス(I/Oリスト) | すべてのタグ、タイプ、レンジ、単位、アラーム、P&ID参照 | タグの作成、スケーリング、アラーム |
| モーターリスト | モーターの出力、スタータータイプ、保護、インターロック | モーターブロックの生成 |
| バルブリスト | バルブのタイプ、故障時の位置、アクチュエーター | バルブブロックの生成 |
| 制御ナラティブ | ユニットごとの制御ロジックの説明 | ロジックの実装 |
| 原因・結果マトリクス | 表形式の安全ロジック/インターロックロジック | インターロックロジックの生成 |
出力アーティファクト
- コントローラープログラム(ファンクションブロックのインスタンス+ロジック+パラメーター)
- I/O割り当て(チャネルとタグの対応付け)
- HMI/オペレーター画面(グラフィック、フェースプレート、ナビゲーション)
- アラーム設定(優先度、限界値、不感帯)
- ヒストリアンタグ(トレンド定義、保存レート)
- OPC サーバー設定
ABB Freelance の一括エンジニアリング(主な対象)
方法 1:PRT ファイルのテンプレート化(推奨)
- タイプごと(モーター、バルブ、アナログなど)に「ゴールデン」テンプレートの PRT を作成します
.prtファイルとしてエクスポートします- 新しいインスタンスごとに、プログラムで次の処理を行います。
- UTF-16 エンコーディングでテンプレートを読み込みます
- すべての識別子(ノード名、MSR 名、EAM 信号、説明)を置換します
- パラメーターを更新します
- チェックサムを
0000000000に設定します - 出力用の
.prtファイルを書き込みます
- 各
.prtを Freelance Engineering Workplace のターゲットプロジェクトにインポートします
テンプレート置換マップ(モーター)
| 要素 | テンプレート | 置換後 |
|---|---|---|
| ノード名 | 11301CLWW1A1 | {area}{equip}{num} |
| MSR プライマリ | 11301.CLWW.1A1 | {area}.{prefix}.{num} |
| MSR ショート | 11301.CW.1A1 | {area}.{short}.{num} |
| グラフ参照 | g11301CLWW1A1 | g{area}{equip}{num} |
| 説明 | PHO RCK EXTR CNVR-1 | {description} |
| EAM 信号 | XA1/XA2/XB1/XL/XS1/XS2 + ノード | 同じプレフィックス + 新しいノード |
方法 2:CSV によるプロジェクト全体の操作
プロジェクト全体の CSV を解析し、新しいセクションを追加して再インポートします。より強力ですが、リスクも高くなります。
方法 3:DMF 画面のテンプレート化
- DigiVis で画面テンプレートを作成します
.DMFとしてエクスポートします- 新しい画面ごとに、次の処理を行います。
- TXL テキストエントリー(タグ名、説明、単位)を置換します
- ODB 変数バインディング(DIGI アドレス)を置換します
- 画面のナビゲーション参照を更新します
主な課題
- UTF-16 エンコーディング:正しく読み書きする必要があります
- 内部相互参照:EAM、MSR、LAD:PARA_REF の整合性を保つ必要があります
- チェックサム:0 に設定すると、Freelance が再計算します
- 一意の名前付け:重複は許可されません
- エリアマッピング:タグを正しいエリアコードに対応付ける必要があります
Siemens TIA Portal の一括エンジニアリング
TIA Openness API(.NET)
using Siemens.Engineering;
using Siemens.Engineering.SW;
TiaPortal tia = new TiaPortal(TiaPortalMode.WithUserInterface);
Project project = tia.Projects.Open(new FileInfo(@"Project.ap17"));
PlcSoftware sw = device.GetService<PlcSoftware>();
sw.BlockGroup.Blocks.Import(new FileInfo(@"MotorFB.xml"), ImportOptions.Override);
PlcTagTable table = sw.TagTableGroup.TagTables.Create("Motors");
SiVArc(HMI の自動生成)
ルールベースで、「すべての MotL FB に対してフェースプレートを作成する」といったルールを定義します。PLC 構造を読み取り、WinCC 画面を自動生成します。
Emerson DeltaV の一括エンジニアリング
クラスベースの設定(最も強力)
モジュールテンプレート(クラス)を定義し、多数のインスタンスを作成します。テンプレートの変更はすべてのインスタンスに反映されます。
FHX ファイルの生成
MODULE TEMPLATE "MT_MOTOR_1SPD" /
MODULE_CLASS = DEVICE /
{
FUNCTION_BLOCK "DC-1" / DEFINITION = "DC" /
{ ATTRIBUTE MODE_BLK.TARGET = AUTO ; ... }
}
テキストベースで解析可能であり、Python で生成できます。
推奨テクノロジースタック
| コンポーネント | テクノロジー | 目的 |
|---|---|---|
| 言語 | Python 3.10+ | 自動化の中核 |
| Excel I/O | openpyxl, pandas | 入力スプレッドシートの読み込み |
| テンプレート | Jinja2 / string.Template | 出力ファイルの生成 |
| データベース | SQLite | エンジニアリングデータベース |
| ファイル I/O | codecs (UTF-16) | Freelance ファイルの読み書き |
| XML | lxml | PLCopen XML、SimaticML |
| 検証 | pydantic | データ検証 |
| GUI(任意) | Streamlit / PyQt6 | ユーザーインターフェース |
| VCS | Git | バージョン管理 |
Python のテンプレート方式
import codecs
import re
import pandas as pd
# Read motor list
motors = pd.read_excel('motor_list.xlsx')
# Read template
with codecs.open('MOT_template.prt', 'r', 'utf-16') as f:
template = f.read()
# Generate for each motor
for _, motor in motors.iterrows():
output = template
output = output.replace('11301CLWW1A1', motor['node_name'])
output = output.replace('11301.CLWW.1A1', motor['msr_name'])
output = output.replace('PHO RCK EXTR CNVR-1', motor['description'])
# ... more replacements
# Reset checksum
output = re.sub(r'\[CHECKSUM\];.*', '[CHECKSUM];0000000000', output)
with codecs.open(f"{motor['node_name']}.prt", 'w', 'utf-16-le') as f:
f.write('\ufeff' + output)
NAMUR NE 148 の要件
オートメーションエンジニアリングツールに関する NAMUR 規格では、次の項目が定められています。
- 単一のデータソース - 1つの計装機器を一度だけ定義し、あらゆる場所で使用する
- テンプレートベースのエンジニアリング - 一度定義し、何度でもインスタンス化する
- 一括操作 - 大量の作成・変更・削除を行う
- 整合性チェック - 相互参照を検証する
- インポート/エクスポート - Excel や P&ID ツールとの連携
- バージョン管理 - 変更を追跡する
- マルチユーザー対応 - 複数人で同時にエンジニアリングを行う
- ターゲット非依存性 - 複数の DCS ターゲット向けに生成する
サードパーティ製ツール
| ツール | ベンダー | 説明 |
|---|---|---|
| SmartPlant Instrumentation | AVEVA | 一元管理された計装機器データベース。すべてのベンダー向けに DCS 設定を生成 |
| COMOS | Siemens | P&ID から PLC コードを生成し、TIA Portal と連携 |
| Engineering Base | AUCOTEC | オブジェクト指向で、複数の DCS 向けに出力 |
| Unity App Generator | Schneider | Excel ベースで Modicon PLC を生成 |
| Ignition | Inductive Automation | データベース駆動型の SCADA/HMI。Python スクリプトに対応 |
アセット中心と信号中心
信号中心(従来型): I/O 信号から開始します。AI_Card1_Ch3 -> タグを作成 -> 設定。ハードウェアには合致しますが、設備とのつながりはありません。
アセット中心(現代型): 物理的な設備から開始します。ポンプ P-101A には、モーター、流量、圧力、振動、保護が含まれます。テンプレート化が容易です。ISA-88/95 に準拠しています。
| アプローチ | ABB Freelance | Siemens PCS 7 | Emerson DeltaV |
|---|---|---|---|
| 対応状況 | 中程度(MSR 階層) | 中程度(プラント階層) | 強力(クラスベース) |