Exposez et consommez des services web RESTful
API REST Ignition : Créez des services web pour vos données SCADA
Créez des API REST puissantes pour exposer vos données Ignition SCADA aux systèmes externes. Utilisez le module WebDev pour créer des endpoints GET et POST personnalisés avec le scripting Python, permettant une intégration transparente avec ERP, MES, applications mobiles et tableaux de bord personnalisés.
Présentation
L'API REST Ignition permet une communication bidirectionnelle entre votre système SCADA et toute application compatible HTTP. Grâce au module WebDev, vous pouvez exposer les valeurs de tags, les données historiques et les états d'alarmes via des endpoints RESTful standards que tout système moderne peut consommer.
Combiné avec le scripting Python et la fonction system.net.httpClient d'Ignition, vous pouvez également consommer des API REST externes pour récupérer des données depuis des systèmes ERP, des services météo ou toute plateforme tierce directement dans votre environnement SCADA.
Avantages clés
- Exposez les données SCADA via des endpoints HTTP standards
- Support complet des requêtes/réponses JSON et XML
- Scripting Python pour la logique métier personnalisée
- Endpoints sécurisés avec authentification OAuth et par jeton
- Échange de données bidirectionnel avec les systèmes d'entreprise
Architecture de l'API REST
Le module WebDev se situe sur la Gateway Ignition, exposant des endpoints RESTful que les systèmes externes consomment via HTTP/HTTPS. Les requêtes entrantes sont acheminées par des scripts Python qui interagissent avec le système de tags et la base de données.
┌─────────────────────────────────────┐
│ External Systems │
│ ┌─────┐ ┌─────┐ ┌────────────┐ │
│ │ ERP │ │ MES │ │ Mobile App │ │
│ └──┬──┘ └──┬──┘ └─────┬──────┘ │
│ │ │ │ │
└─────┼────────┼────────────┼─────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────┐
│ REST API (WebDev Module) │
│ GET /api/tags POST /api/write │
│ GET /api/history POST /api/cmd │
│ ┌──────────────────────┐ │
│ │ Python Handlers │ │
│ │ Authentication │ │
│ │ CORS / Rate Limit │ │
│ └──────────┬───────────┘ │
└────────────────┼────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Ignition Gateway │
│ ┌──────────┐ ┌─────────────────┐ │
│ │ Tag │ │ Database │ │
│ │ Provider │ │ Connections │ │
│ └──────────┘ └─────────────────┘ │
└─────────────────────────────────────┘
Étapes de configuration
Étape 1 : Installer le module WebDev
Téléchargez et installez le module WebDev depuis la Gateway Ignition. Accédez à Config > Modules, téléversez le fichier .modl et redémarrez la gateway. Le module WebDev vous permet de créer des endpoints HTTP personnalisés directement sur votre Gateway Ignition.
# Verify the WebDev module is installed and running
# Navigate to: https://your-gateway:8088/system/webdev/
#
# The module adds a new "WebDev" section in the Ignition Designer
# where you can create and manage your REST API resources.
#
# Default base URL for your endpoints:
# https://your-gateway:8088/system/webdev/your-project/Étape 2 : Créer un endpoint GET pour lire les tags
Créez une nouvelle ressource WebDev dans le Designer Ignition et implémentez un handler doGet. Ce script Python lit les valeurs des tags et les retourne en réponse JSON, rendant vos données SCADA accessibles via une simple requête HTTP GET.
# WebDev Resource: doGet handler
# Endpoint: GET /system/webdev/my-project/api/tags
#
def doGet(request, session):
"""Read tag values and return as JSON."""
import json
# Read multiple tags at once
tag_paths = [
"[default]Plant/Temperature",
"[default]Plant/Pressure",
"[default]Plant/FlowRate",
"[default]Plant/Status"
]
values = system.tag.readBlocking(tag_paths)
# Build response object
response_data = {}
for path, qv in zip(tag_paths, values):
tag_name = path.split("/")[-1]
response_data[tag_name] = {
"value": qv.value,
"quality": str(qv.quality),
"timestamp": str(qv.timestamp)
}
# Return JSON response
return {
"json": response_data,
"contentType": "application/json"
}Étape 3 : Créer un endpoint POST pour écrire les tags
Implémentez un handler doPost pour recevoir des données depuis les systèmes externes et écrire des valeurs dans les tags Ignition. Le handler analyse le payload JSON entrant, valide les données et effectue les écritures de tags avec une gestion d'erreurs appropriée.
# WebDev Resource: doPost handler
# Endpoint: POST /system/webdev/my-project/api/write
#
def doPost(request, session):
"""Write tag values from an incoming JSON payload."""
import json
# Parse the JSON body
body = request["data"]
payload = json.loads(body)
# Validate required fields
if "writes" not in payload:
return {
"json": {"error": "Missing 'writes' field"},
"code": 400
}
tag_paths = []
tag_values = []
for write in payload["writes"]:
tag_paths.append(write["path"])
tag_values.append(write["value"])
# Execute tag writes
results = system.tag.writeBlocking(tag_paths, tag_values)
# Build response with write results
write_results = []
for path, result in zip(tag_paths, results):
write_results.append({
"path": path,
"success": result.isGood()
})
return {
"json": {
"status": "completed",
"results": write_results
},
"contentType": "application/json"
}Étape 4 : Ajouter l'authentification et le CORS
Sécurisez votre API REST Ignition en ajoutant une authentification par jeton et des en-têtes CORS. Validez les clés API ou jetons Bearer dans un script utilitaire partagé, et configurez le CORS pour n'autoriser que les requêtes provenant d'origines de confiance.
# Shared script: project.auth.validateRequest
#
def validateRequest(request):
"""Validate API key from request headers."""
auth_header = request.get("headers", {}).get("Authorization", "")
if not auth_header.startswith("Bearer "):
return False, {
"json": {"error": "Missing or invalid Authorization header"},
"code": 401
}
token = auth_header[7:] # Remove "Bearer " prefix
valid_tokens = system.tag.readBlocking(
["[default]Config/API/ValidTokens"]
)[0].value
if token not in valid_tokens.split(","):
return False, {
"json": {"error": "Invalid API token"},
"code": 403
}
return True, None
# Updated doGet with auth and CORS
def doGet(request, session):
"""Secured GET endpoint with CORS support."""
import json
# CORS headers for cross-origin requests
cors_headers = {
"Access-Control-Allow-Origin": "https://your-app.com",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Headers": "Authorization, Content-Type"
}
# Handle preflight OPTIONS request
if request.get("method") == "OPTIONS":
return {"code": 204, "headers": cors_headers}
# Validate authentication
is_valid, error_response = project.auth.validateRequest(request)
if not is_valid:
error_response["headers"] = cors_headers
return error_response
# Proceed with tag reading
tag_paths = ["[default]Plant/Temperature"]
values = system.tag.readBlocking(tag_paths)
return {
"json": {"Temperature": values[0].value},
"headers": cors_headers,
"contentType": "application/json"
}Fonctionnalités clés
Endpoints du module WebDev
Créez des endpoints REST entièrement personnalisables directement sur la Gateway Ignition. Support des méthodes GET, POST, PUT, DELETE et OPTIONS avec analyse des paramètres d'URL et gestion du corps de la requête.
Support JSON et XML
Analysez et générez des payloads JSON et XML nativement. Sérialisez les valeurs de tags, les données historiques et les événements d'alarme dans des formats structurés que toute application cliente peut consommer.
Moteur de scripting Python
Exploitez le scripting Jython pour implémenter une logique métier personnalisée, des transformations de données et des workflows complexes dans vos handlers d'API REST. Accédez à l'ensemble de l'API de scripting Ignition, y compris les tags, les bases de données et les alarmes.
Authentification OAuth et par jeton
Sécurisez votre API REST Ignition avec la validation de jetons Bearer, la gestion des clés API et l'intégration OAuth 2.0. Implémentez un contrôle d'accès basé sur les rôles pour restreindre l'accès aux endpoints par utilisateur ou application.
Cas d'utilisation
Intégration d'applications mobiles
Exposez les données SCADA en temps réel aux applications mobiles via une API REST Ignition sécurisée. Les techniciens de terrain peuvent consulter les valeurs de tags en direct, acquitter les alarmes et mettre à jour les consignes depuis leurs smartphones et tablettes sans session Perspective complète.
Échange de données ERP et MES
Activez le flux de données bidirectionnel entre Ignition et les systèmes de planification des ressources de l'entreprise. Envoyez les compteurs de production, les métriques qualité et l'état des équipements vers SAP ou Oracle, et récupérez les ordres de fabrication et les recettes dans la couche SCADA via des appels API REST.
Tableaux de bord et reporting personnalisés
Alimentez des tableaux de bord web personnalisés, des outils de business intelligence ou des plateformes de reporting avec des données SCADA en temps réel et historiques. Utilisez l'API REST Ignition pour fournir à Grafana, Power BI ou des applications React sur mesure des données de production en temps réel.
Technologies
WebDev Module
Module Ignition permettant de créer des endpoints d'API REST personnalisés avec des handlers Python pour les opérations GET, POST, PUT et DELETE sur la Gateway.
Python Scripting
Moteur de scripting basé sur Jython pour implémenter la logique des endpoints, les transformations de données, la validation et l'intégration avec les systèmes de tags, d'alarmes et de bases de données d'Ignition.
JSON
Format léger d'échange de données utilisé pour les payloads de requêtes et réponses. Supporté nativement dans l'environnement de scripting Ignition via le module json.
system.net.httpClient
Fonction de scripting Ignition pour consommer des API REST externes. Supporte les méthodes GET, POST, PUT, DELETE avec en-têtes personnalisés, timeouts et configuration SSL/TLS.
system.tag API
API principale d'Ignition pour lire et écrire les valeurs des tags, parcourir l'arborescence des tags et accéder à l'historique. Utilisée dans les handlers REST pour relier les requêtes HTTP au système de tags.
Questions fréquentes
Retrouvez les réponses aux questions courantes sur cette intégration.
Prêt à démarrer ?
Contactez notre équipe pour discuter de vos besoins et obtenir une solution sur mesure.