メインコンテンツまでスキップ

技術的なトラブルシューティング

よくある症状 / エラーとその解決策。クイック分類 → 詳細な解決フロー。

コンテナモード(2026.05+)診断リソース
  • status.sh — コンテナ + ポート + API + app.properties の主要キーを1行で要約
  • health.sh — exit code ベースの総合ヘルスチェック(cron に適しています)
  • doctor.sh — 診断用一括 tarball(api / docker / systemd / 7コンポーネントのログ / config の機密情報をマスク / host metrics)→ support escalation
  • /api/v1/system/health — 8コンポーネント別 status map + 503 分岐(どのコンポーネントが DOWN かを即座に特定)
  • コンテナモード運用 — 障害対応 + コマンド cheat sheet

症状別インデックス​

症状原因候補
アプリが起動時に停止Cassandra 接続失敗、DDL 適用失敗
/api/v1/edge の応答が started=falseCollector 初期化失敗(ドライバ / キャッシュの問題)
特定の OPC のみ connection_status=DISCONNECTEDPLC ネットワーク / 認証 / アドレス形式
すべての OPC が時々一斉に切断OPC の追加/変更による OPCUAServerManager 全体の再起動
MQTT publish がされないmqtt.enable=false または broker 認証失敗
Sparkplug トピックが未発行sparkplug.enable=false または jar 欠落
画面の表示が遅いopcList() N+1 クエリ + sleep の蓄積
OPC 開始に毎回5秒かかるThread.sleep の影響(Phase A1 対象)

起動 / 初期化​

Cassandra 接続失敗​

Caused by: com.datastax.oss.driver.core.exceptions.NoHostAvailableException
チェック確認方法
Cassandra 稼働nodetool status
ポート到達性telnet <app.db.host> 9042
キースペースの存在cqlsh -u cassandra -p cassandra 後 DESCRIBE KEYSPACE pe;
app.db.* と oltp.cassandra.* の一致app.properties 両方の項目をレビュー

app.sql.path の resouces のタイプミス​

app.properties の app.sql.path = classpath:resouces/sql の resouces はタイプミスですが、ディレクトリも 同じ名前で維持されているため動作します。SQL リソースが見つからないというエラーが出た場合は、WEB-INF/resouces/sql/ のパスの 実在を確認してください。


OPC / ドライバ​

特定の OPC に接続できない​

プロトコル1次確認
OPCUAopc_agent_port 到達性、discovery=true 試行、ユーザー/パスワード
Modbus TCP502 ポート到達性、holding-register:... 形式
MELSECMC プロトコル有効、controller-type=Q_L 一致
S7rack/slot 一致、"PUT/GET" 有効
LSNetUtils.isReachable 失敗なら ICMP 遮断を疑う、ポート 2004
EIPrack/slot、port 44818

各ドライバページの「よくあるエラー + 解決策」表を優先的に参照してください。

LS-PLC Ping failed​

LS ドライバは connect 前に ICMP ping で到達性を確認します。社内ネットワークで ICMP が遮断されていると、正常な PLC でも 失敗と表示されます。

解決策:

  • ファイアウォールで ICMP を許可
  • または LSDriver.connect() の ping チェックをオプションで無効化する後続変更(現時点ではコード変更が必要)

32-bit / 64-bit 値の不整合​

大半は format 未指定 が原因です。

プロトコル誤ったパターン → 正しいパターン
LSD00600 + Integer(16-bit として読み込まれる)→ D00600 + Integer + format=DW
Modbusholding-register:1(16-bit)→ holding-register:1:DINT
S7%DB1.DBW0 + Float → %DB1.DBD0 + format=REAL

32-bit float 値が NaN / 大きな数値​

byte order(エンディアン)の問題。スレーブ / マスターの byte/word swap ポリシーを確認:

  • Modbus → :UDINT_LSWORD_FIRST など PLC4j オプションを使用
  • その他のプロトコルは formula で後処理

転送 (MQTT / Sparkplug)​

MQTT publish がされない​

# broker 도달 확인
MQTT_USER="${MQTT_USER:-edge}"
MQTT_PASSWORD="$(tr -d '\r\n' < /run/secrets/mqtt-password)"
mosquitto_pub -h <mqtt.server.host> -p 1883 -u "$MQTT_USER" -P "$MQTT_PASSWORD" -t /edge/point -m '{"test":1}'

チェックリスト:

  • mqtt.enable=true
  • mqtt.server.host/port/user/password が正確
  • broker が client からの publish を許可する ACL かどうか
  • catalina.out に MQTT connected または reconnection ログがあるか

Sparkplug トピックが見えない​

チェック方法
sparkplug.enable=true かどうかproperties 確認 + 再起動が必要
jar が lib にあるかls WebContent/WEB-INF/lib/tahu-core*.jar
同じ broker かmqtt.server.* と SPB が同一
broker の SPB トピック ACLspBv1.0/# 発行権限

NDEATH が2回発行されているように見える​

正常動作です。正常終了時に明示的に発行 + (will も登録されているため)接続終了を broker が will-bypass と認識できない場合、will も追加発行される可能性があります。この場合、ホスト側で同じ bdSeq の NDEATH は 一度だけ処理するよう実装されている必要があります。


性能 / 応答性​

OPC start/stop 応答が5秒​

ConnectService の意図的な Thread.sleep によるものです(collector のウォームアップを保証)。

  • 一時回避: 画面 reload で polling 応答を確認
  • 恒久解決: REFACTORING_PLAN.md Phase A1(Thread.sleep 削除 / CountDownLatch)適用の後続 PR

画面の初回ロードが遅い​

opcList() N+1 クエリ + LastValueMap lookup 分散により 1〜2 秒程度の追加遅延が発生する可能性があります。

  • Phase B1(IN 一括 select)と B2(単一 facade)適用時に改善予定

1つの OPC 変更時に他の OPC も一時停止​

OPCUAServerManager.restart() が全体再起動のためです(Phase A2 — partial reload 対象)。

緊急回避: 営業時間外に OPC 変更を実施してください。


データ / Cassandra​

tombstone 累積警告​

運用で OPC を複数削除した際、一時的に nodetool cfstats pe.app_tag の tombstone メトリクスが spike する可能性が あります。

  • 本ゲートウェイの OPC/Tag 数は通常 ≤ 1000 のため、深刻ではありません
  • 時系列(TM_TAG_POINT)は本ゲートウェイではなく plantpulse-timeseries-engine の責任範囲です

tag not found: <id>​

PUT /api/v1/tag/{tagId} または read 時に頻繁に発生。

原因:

  • tag_id のタイプミス
  • APP_TAG.xml R03 の ALLOW FILTERING クエリのため partition key 未指定。tag_id が正確である必要があります。

確認:

cqlsh -u cassandra -p cassandra -k pe -e "SELECT tag_id FROM app_tag;"

値書き込み時に tag write not supported for opc_type=...​

HTTP 以外のプロトコルは現在 write 未対応です。

  • HTTPDriver.bind() のみ実装
  • その他のプロトコルの write は Sparkplug Phase 3(NCMD/DCMD)と合わせて SPI 拡張が必要

セキュリティ / 運用​

/api/* が認証なしで露出​

設計上、社内ネットワーク前提(SecurityFilter check-pattern に /api/* 含まず)。外部露出時はリバースプロキシ 前面に mTLS / API Key / Basic auth を設置してください。

CSRF​

*_.do パターンのみ CSRF 適用。v1 mutation エンドポイントは適用外。外部露出時は併せて検討。


ログ収集ガイド​

問題報告時、以下を添付すると分析が迅速になります。

# 환경
curl -s http://localhost:8080/api/v1/edge

# OPC 상태
curl -s http://localhost:8080/api/v1/opc

# 시스템 메트릭
curl -s http://localhost:8080/api/v1/monitoring

# 최근 로그
tail -n 500 $CATALINA_HOME/logs/catalina.out

app.properties のパスワードはマスキング後に添付してください。