コンテンツにスキップ

OEEコネクタ

**OEE(総合設備効率)**コネクタは、入力ストリームに到着する累積生産カウンタから、正準的なSEMI E10製造KPIを計算します。ゲージ、チャートとしてレンダリングしたり、時系列データベースに格納したりできるように、ブロックごとのOEEに加えて3つの構成メトリック(可用性、性能、品質)を発行します。

コネクタタイプ:

  • OEE - スライディングウィンドウまたはシフトごとにOEEを計算するステートフルプロセッサ

OEEは次のように計算されます:

OEE = 可用性 × 性能 × 品質

ここで:

  • 可用性 = runTime / plannedProductionTime
  • 性能 = (idealCycleTime × totalCount) / runTime
  • 品質 = goodCount / totalCount

3つすべてが[0, 1]にクランプされます。

  • ✅ 2つのウィンドウモード:スライディング(時間ベース)とシフト(HH:MM括弧)
  • RunTime / PlannedProductionTimeがデバイスから提供されない場合の自動累積
  • runningをブール風のステータスフィールドとして受け入れ(true/false、1/0、on/off、yes/noなど)
  • ✅ ゲージスタイリングのための設定可能なしきい値(redyellow)とtarget
  • ✅ ウィンドウに十分なデータがない場合にN/Aペイロード(oee.*省略)を発行
  • ✅ 複数のOEEインスタンスが同じペイロードに書き込めるようにするブロックごとのID名前空間
  • ✅ 寛容な数値パース — 文字列は自動的にfloatとしてパースされます

デバイスレポートカウンタを持つスライディングウィンドウ

Section titled “デバイスレポートカウンタを持つスライディングウィンドウ”
{
"type": "OEE",
"config": {
"fields": {
"plannedProductionTime": "planned_time_s",
"runTime": "run_time_s",
"idealCycleTime": "ideal_cycle_s",
"totalCount": "parts_total",
"goodCount": "parts_good"
},
"windowMode": "sliding",
"windowSeconds": 3600,
"thresholds": {
"red": 0.6,
"yellow": 0.8
},
"target": 0.85
}
}

ステータスフラグとリテラルサイクル時間を持つシフトウィンドウ

Section titled “ステータスフラグとリテラルサイクル時間を持つシフトウィンドウ”
{
"type": "OEE",
"config": {
"fields": {
"running": "machine_running",
"totalCount": "parts_total",
"goodCount": "parts_good"
},
"idealCycleTimeSeconds": 4.5,
"windowMode": "shift",
"shiftStart": "06:00",
"shiftEnd": "14:00",
"timezone": "Europe/Rome",
"thresholds": {
"red": 0.6,
"yellow": 0.8
},
"target": 0.85
}
}

fieldsオブジェクトは、コネクタが各受信サンプルから読み取るペイロードキーに名前を付けます。

{
"fields": {
"plannedProductionTime": "planned_time_s",
"runTime": "run_time_s",
"running": "machine_running",
"idealCycleTime": "ideal_cycle_s",
"totalCount": "parts_total",
"goodCount": "parts_good"
}
}
フィールド必須?注意
plannedProductionTimeオプション累積秒数。省略した場合、コネクタは最初のサンプル以降のウォールクロック秒数を累積します
runTimerunTime / runningの1つが必須マシンが稼働していた累積秒数
runningrunTime / runningの1つが必須ブール風のステータス。内部的に積分される
idealCycleTimeidealCycleTime / idealCycleTimeSecondsの1つが必須理想速度でのパーツあたりの秒数
totalCount必須試行されたパーツの累積数
goodCount必須良品パーツの累積数

デバイスが理想サイクル時間をパブリッシュしない場合、定数として宣言できます:

{
"idealCycleTimeSeconds": 4.5
}

これはfields.idealCycleTimeと相互排他的です。

{
"windowMode": "sliding"
}
  • sliding - 長さwindowSecondsのローリング時間ウィンドウでデルタを計算
  • shift - shiftStartshiftEnd、およびオプションのtimezoneで定義された現在のシフトの開始からデルタを計算

Window Seconds(スライディングモード)

Section titled “Window Seconds(スライディングモード)”
{
"windowSeconds": 3600
}

windowMode: slidingに必須。> 0である必要があります。

推奨値:

  • リアルタイムゲージ: 300-900(5-15分)
  • 時間ごとのトレンド: 3600(1時間)
  • 長期平滑化: 28800(8時間)

windowMode: shiftに必須:

{
"shiftStart": "06:00",
"shiftEnd": "14:00",
"timezone": "Europe/Rome"
}
  • shiftStart / shiftEnd - HH:MM 24時間形式
  • timezone - IANAタイムゾーン識別子(例:Europe/RomeAmerica/New_YorkAsia/Tokyo)。省略した場合はUTCがデフォルト
  • 夜間シフトがサポートされる(例:22:0006:00

ダッシュボードがゲージを一貫して色付けできるように、OEE値と一緒に発行されるスタイリングヒント:

{
"thresholds": {
"red": 0.6,
"yellow": 0.8
},
"target": 0.85
}

制約:

  • red < yellow(厳密に)
  • 0 ≤ red, yellow ≤ 1
  • 0 ≤ target ≤ 1

各出力はOEEコネクタインスタンスのブロックIDによって名前空間化されます(Meddleが自動的に注入):

{
"oee.<blockId>": 0.78,
"availability.<blockId>": 0.92,
"performance.<blockId>": 0.95,
"quality.<blockId>": 0.89,
"red.<blockId>": 0.6,
"yellow.<blockId>": 0.8,
"target.<blockId>": 0.85
}

ウィンドウにまだ十分なデータがない場合(例:スライディングモードで2スナップショット未満、またはシフトが始まったばかり)、oee/availability/performance/qualityキーは省略され、ゲージスタイリングキーのみが発行されます。これはN/Aペイロードです。

DataPayload(累積カウンタ) → OEE → DataPayload(oee.<blockId>など)

例(スライディングウィンドウ、60秒):

入力ストリーム:

{ "planned_time_s": 0, "run_time_s": 0, "parts_total": 0, "parts_good": 0 }
{ "planned_time_s": 60, "run_time_s": 55, "parts_total": 12, "parts_good": 11 }
{ "planned_time_s": 120, "run_time_s": 110, "parts_total": 24, "parts_good": 22 }

idealCycleTimeSeconds: 4.5windowSeconds: 60の場合:

3番目のサンプルの後:

  • ΔPlanned = 60秒、ΔRun = 55秒、ΔTotal = 12、ΔGood = 11
  • A = 55/60 = 0.917
  • P = (4.5 × 12) / 55 = 0.982
  • Q = 11/12 = 0.917
  • OEE = 0.917 × 0.982 × 0.917 = 0.826

出力:

{
"oee.<blockId>": 0.826,
"availability.<blockId>": 0.917,
"performance.<blockId>": 0.982,
"quality.<blockId>": 0.917,
"red.<blockId>": 0.6,
"yellow.<blockId>": 0.8,
"target.<blockId>": 0.85
}

ゲージが最近のアクティビティに応答するライブオペレーターダッシュボードに最適:

{
"type": "OEE",
"config": {
"fields": {
"running": "is_running",
"totalCount": "cumulative_parts",
"goodCount": "cumulative_good"
},
"idealCycleTimeSeconds": 6.0,
"windowMode": "sliding",
"windowSeconds": 900,
"thresholds": { "red": 0.55, "yellow": 0.75 },
"target": 0.85
}
}

2. レポート用のシフトごとのOEE

Section titled “2. レポート用のシフトごとのOEE”
{
"type": "OEE",
"config": {
"fields": {
"plannedProductionTime": "shift_planned_s",
"runTime": "shift_run_s",
"idealCycleTime": "ideal_cycle_s",
"totalCount": "shift_parts_total",
"goodCount": "shift_parts_good"
},
"windowMode": "shift",
"shiftStart": "06:00",
"shiftEnd": "14:00",
"timezone": "Europe/Rome",
"thresholds": { "red": 0.6, "yellow": 0.8 },
"target": 0.85
}
}
{
"type": "OEE",
"config": {
"fields": {
"running": "running_flag",
"totalCount": "ct_total",
"goodCount": "ct_good"
},
"idealCycleTimeSeconds": 3.2,
"windowMode": "shift",
"shiftStart": "22:00",
"shiftEnd": "06:00",
"timezone": "America/New_York",
"thresholds": { "red": 0.5, "yellow": 0.75 },
"target": 0.8
}
}

出力にゲージスタイリングフィールドのみがある(oee.*なし)

Section titled “出力にゲージスタイリングフィールドのみがある(oee.*なし)”

問題: N/Aペイロードが発行されている

解決策:

  1. スライディングモード: ウィンドウに少なくとも2つのスナップショットが必要。2番目のサンプルを待つ
  2. シフトモード: 現在の時刻が[shiftStart, shiftEnd]の外側の場合、N/Aを返す
  3. シフトモード起動: シフト内の最初のサンプルがベースラインを確立。OEEは2番目のサンプル以降に表示されます

問題: デルタが0または負として報告されるエラー

解決策:

  1. カウンタは単調増加である必要があります。デバイスがそれらをリセットする場合(例:シフト変更時)、入力をTransformでラップして最初にデルタに変換するか、シフトごとにOEEインスタンスを分割します
  2. フィールド名が非ゼロ値にマップされていることを確認
  3. ウィンドウが非常に短く(windowSeconds: 10)、ラインがアイドルの場合、デルタは正確にゼロになり得ます。ウィンドウを広げてください

問題: invalid value for "..."エラー

解決策:

  1. 値は非負の有限数値である必要があります。NaN、無限大、負数は拒否されます
  2. 文字列は非負の有限floatとしてパースされる場合のみ許容されます
  3. ソースが”running”のためにブールを発行する場合、runTimeではなくrunningフィールドが設定されていることを確認

問題: 怪しいほど完璧なOEE

解決策:

  1. idealCycleTimeが現実的であることを確認。あまりにも遅い理想は性能を≥ 1にし、1にクランプされます
  2. runTimeplannedProductionTimeより小さいことを確認。同一の場合、可用性は1.0です

シフト境界の間違ったタイムゾーン

Section titled “シフト境界の間違ったタイムゾーン”

問題: シフトの開始/終了がN時間ずれている

解決策:

  1. timezoneを常に有効なIANA名に設定
  2. +02:00のようなオフセット表記は使用しないでください — 拒否されます

1. 利用可能な場合はデバイスレポートカウンタを優先

Section titled “1. 利用可能な場合はデバイスレポートカウンタを優先”

PLCがrunTimeplannedProductionTimeを累積秒数としてパブリッシュする場合、それらを直接使用します。内部アキュムレータは、runningフラグのみをパブリッシュするデバイスのためのフォールバックです。

2. ウィンドウをオーディエンスに合わせる

Section titled “2. ウィンドウをオーディエンスに合わせる”
  • オペレーター: 5-15分のスライディングウィンドウ
  • スーパーバイザー: シフトごとのウィンドウ
  • 役員: 日ごとまたは週ごとの集約(ダウンストリーム)

3. idealCycleTimeを正直にキャリブレーション

Section titled “3. idealCycleTimeを正直にキャリブレーション”

ISO定義は「持続可能な最速サイクル時間」であり、「マーケティングパンフレット」ではありません。楽観的な値は性能を低下させ、実際のOEEを過小評価します。

4. 上流のFilterまたはTransformと組み合わせる

Section titled “4. 上流のFilterまたはTransformと組み合わせる”

生のストリームに無関係なペイロードが含まれる場合、OEEブロックの前にFilterを使用してカウンタ更新のみを保持します。

5. マシンごとに別々のOEEブロックを使用

Section titled “5. マシンごとに別々のOEEブロックを使用”

各OEEコネクタインスタンスはblockIdで名前空間化されるため、マルチマシンダッシュボードは単一のMeddleフロー内で共存できます。

完全な生産ダッシュボードパイプライン

Section titled “完全な生産ダッシュボードパイプライン”
ModbusReader(マシン1) ──┐
ModbusReader(マシン2) ──┼─→ Merge → Reshape → OEE → Chart(ゲージ)
ModbusReader(マシン3) ──┘ └→ InfluxDb2Writer
  1. ModbusReader(×N): 各マシンからカウンタを取得
  2. Merge: マシンIDでキー付けされたペイロードを結合
  3. Reshape: フィールド名をOEE設定に合わせて正規化
  4. OEE: マシンインスタンスごとにOEEを計算
  5. Chart: redyellowtargetスタイリングでゲージをレンダリング
  6. InfluxDb2Writer: 歴史的トレンドのためにOEEを永続化
OpcuaReader → OEE → Isa182(OEE < 0.5でアラーム) → Alert(メール)

持続的なOEEが50%を下回った時に通知をトリガーします — 慢性的なパフォーマンス低下の検出に役立ちます。

  • Chart - OEE出力からゲージをレンダリング
  • ISA-18.2 - 低OEE時にアラームをトリガー
  • Reshape - カウンタフィールド名を正規化
  • InfluxDB v2 - トレンド分析のためにOEEを永続化
  • Transform - 非単調カウンタからデルタを計算