Skip to content

REST-API ​

Ca. 16 Min. Lesezeit

Mit der REST-API von 2WinScada können Programme von Drittanbietern die aktuellen Zustände von Geräten und Tags lesen und Archivdaten (Logs) abfragen. Diese Seite beschreibt nur die Endpunkte, die für externe Integrationen geeignet sind und auch mit einem API-Schlüssel verwendet werden können.

Die Endpunkte auf dieser Seite lesen nur Daten. Um Daten aus externen Systemen an 2WinScada zu senden, verwenden Sie den Kanal REST-Server; damit 2WinScada periodisch Daten aus einem externen System abruft, verwenden Sie den Kanal REST-Client.

Serveradresse ​

Die API wird unter derselben Adresse und demselben Port wie die Weboberfläche bereitgestellt. Alle Pfade auf dieser Seite werden an die Adresse der Weboberfläche angehängt, zum Beispiel https://<Server>/api/Monitor/Devices.

Setzen Sie für <Server> die Adresse ein, unter der die Benutzer 2WinScada im Browser öffnen (DNS-Name oder IP-Adresse). Wird die Weboberfläche auf einem anderen als dem Standardport bereitgestellt, geben Sie auch den Port an (https://<Server>:<Port>). Verwenden Sie HTTPS, damit Anmeldedaten und API-Schlüssel nicht im Klartext über das Netzwerk übertragen werden. Für eine Änderung der Adresse oder des Ports wenden Sie sich an Ihren Systemintegrator.

Authentifizierung ​

Anfragen werden auf einem von zwei Wegen autorisiert:

  • API-Schlüssel: Empfohlen für die Integration von Maschine zu Maschine. Anmeldung und Token-Aktualisierung sind nicht erforderlich.
  • Benutzeranmeldung (Token): Sie melden sich mit einem im System definierten Benutzer an und senden das zurückgegebene Zugriffstoken mit jeder Anfrage.

Die beiden Verfahren werden nicht in derselben Anfrage zusammen verwendet. Enthält die Anfrage einen Authorization-Header, wird der ApiKey-Header nicht berücksichtigt; ein ungültiges oder abgelaufenes Token führt zur Ablehnung der Anfrage, auch wenn ein gültiger API-Schlüssel vorhanden ist.

Mit API-Schlüssel ​

API-Schlüssel werden auf der Registerkarte API-Schlüssel der Seite Benutzerverwaltung erstellt. Einzelheiten finden Sie auf der Seite API-Schlüssel.

  1. Klicken Sie auf der Registerkarte API-Schlüssel über der Tabelle auf die Schaltfläche zum Hinzufügen. Das Fenster API-Schlüsseldefinition öffnet sich.

  2. Füllen Sie die Felder aus:

    FeldBeschreibungStandardwertBereich
    BenutzernameDer Benutzer, dem der Schlüssel gehört. Der Schlüssel arbeitet mit den Rollen und Prozessgruppenberechtigungen dieses Benutzers. Kann nach dem Speichern nicht geändert werden.
    SchlüsselnameName zur Kennzeichnung des Schlüssels. Zwei Schlüssel desselben Benutzers können nicht denselben Namen haben.Höchstens 100 Zeichen
    ZweckFür die REST-API muss SCADA API ausgewählt werden. Schlüssel mit dem Zweck MCP-Zugriff gelten in der REST-API als ungültig. Kann nach dem Speichern nicht geändert werden.MCP-ZugriffSCADA API, MCP-Zugriff
    Maximale AnfragenHöchstzahl der Anfragen innerhalb von 10 Minuten.3001–30.000.000
  3. Speichern Sie. Im Fenster API-Schlüssel erstellt wird der Schlüssel nur ein einziges Mal angezeigt. Kopieren Sie ihn mit Kopieren, bewahren Sie ihn an einem sicheren Ort auf, und klicken Sie dann auf Gespeichert, schließen. Der Schlüssel kann später nicht erneut angezeigt werden; geht er verloren, wird ein neuer Schlüssel erstellt.

Schlüssel mit dem Zweck SCADA API beginnen mit 2Win-. Einem Benutzer können mehrere Schlüssel zugewiesen werden; so kann jede Integration einen eigenen Schlüssel erhalten, und bei Bedarf wird nur dieser Schlüssel widerrufen.

Der Schlüssel wird bei jeder Anfrage im Header ApiKey gesendet:

http
GET /api/Monitor/Devices HTTP/1.1
Host: <Server>
ApiKey: <API-Schluessel>
bash
curl -H "ApiKey: <API-Schluessel>" "https://<Server>/api/Monitor/Devices"

Regeln für die Verwendung der Schlüssel:

  • Schlüssel haben keine Gültigkeitsdauer. Um einen Schlüssel zu widerrufen, löschen Sie ihn auf der Registerkarte API-Schlüssel; Anfragen mit einem gelöschten Schlüssel werden sofort abgelehnt. Beim Bearbeiten können nur Schlüsselname und Maximale Anfragen geändert werden.
  • Können sich Konten nicht anmelden, weil das Kontolimit der Lizenz überschritten ist, werden auch die Schlüssel dieser Konten abgelehnt (siehe Lizenz).
  • Die Spalten Anfragen und Letzte Anfrage zeigen die Nutzung des Schlüssels. Anfragen werden in festen 10-Minuten-Fenstern gezählt; ein Fenster beginnt mit der ersten Anfrage nach Ablauf des vorherigen Fensters. Ist Maximale Anfragen überschritten, werden Anfragen mit dem Schlüssel bis zum Ablauf des Fensters abgelehnt; im neuen Fenster beginnt der Zähler bei null, und der Client kann wieder Anfragen senden. Wählen Sie die Abfragehäufigkeit und den Wert für Maximale Anfragen entsprechend.
  • Für Archivabfragen mit einem API-Schlüssel gelten engere Grenzen als für eine Benutzersitzung (siehe Abfragegrenzen).

Mit Benutzeranmeldung ​

Um mit einem Token zu arbeiten, melden Sie sich zuerst an:

http
POST /api/User/login HTTP/1.1
Host: <Server>
Content-Type: application/json

{
  "UserName": "<Benutzername>",
  "Password": "<Passwort>"
}

Erfolgreiche Antwort:

json
{
  "Payload": {
    "AccessToken": "<access_token>",
    "RefreshToken": "<refresh_token>",
    "RefreshTokenExpiryTime": "2026-10-22T09:30:00+03:00",
    "PasswordChangeRequired": false
  },
  "Success": true,
  "ErrorMessage": null,
  "ErrorCode": 0
}
FeldBeschreibung
AccessTokenDas Zugriffstoken, das bei den folgenden Anfragen im Header Authorization gesendet wird. Die Standardgültigkeit beträgt 240 Minuten.
RefreshTokenWird zum Erneuern des Zugriffstokens verwendet. Die Standardgültigkeit beträgt 7 Tage.
RefreshTokenExpiryTimeAblaufzeitpunkt des Aktualisierungstokens.
PasswordChangeRequiredIst der Wert true, muss das Passwort des Kontos geändert werden. Ändern Sie das Passwort des Kontos, das für die Integration verwendet wird, zuerst in der Oberfläche.

Sind Benutzername oder Passwort falsch, ist Success gleich false und ErrorCode gleich 2107. Nach zu vielen fehlgeschlagenen Versuchen wird die Anmeldung vorübergehend gesperrt (2110).

Bei den folgenden Anfragen wird das Zugriffstoken im Header Authorization mit dem Präfix Bearer gesendet:

http
GET /api/Monitor/Devices HTTP/1.1
Host: <Server>
Authorization: Bearer <access_token>

Token-Aktualisierung ​

Ist das Zugriffstoken abgelaufen, geben die Endpunkte auf dieser Seite HTTP 403 und "ErrorMessage": "Geçersiz Giriş Token" zurück. In diesem Fall wird mit dem abgelaufenen Zugriffstoken und dem Aktualisierungstoken ein neues Zugriffstoken abgerufen:

http
PUT /api/User/RefreshToken HTTP/1.1
Host: <Server>
Content-Type: application/json

{
  "AccessToken": "<abgelaufenes_access_token>",
  "RefreshToken": "<refresh_token>"
}

Die Antwort hat denselben Aufbau wie die Antwort auf die Anmeldung. Payload.AccessToken enthält das neue Zugriffstoken; das Aktualisierungstoken ändert sich nicht.

Schlägt die Aktualisierung fehl, ist der HTTP-Statuscode trotzdem 200, und Success ist false. Ist ErrorCode gleich 2108, ist das Aktualisierungstoken abgelaufen, bei 2106 ist es ungültig. In beiden Fällen müssen Sie sich erneut anmelden.

Der Server führt pro Konto ein einziges Aktualisierungstoken. Jede Anmeldung mit demselben Konto (auch in der Weboberfläche) erzeugt ein neues Aktualisierungstoken und macht das bisherige ungültig. Verwenden Sie für eine Integration ein eigenes Konto, das nicht in der Weboberfläche verwendet wird, oder einen API-Schlüssel.

Ab 2.11 speichert die Weboberfläche das Aktualisierungstoken ihrer eigenen Sitzung in einem Cookie, das Browser-Skripte nicht lesen können. Diesen Modus schaltet nur die Weboberfläche ein; die Anmelde- und Aktualisierungsaufrufe auf dieser Seite ändern sich nicht, und das Aktualisierungstoken wird weiterhin im Antwort-Body zurückgegeben. Auch der MCP-Server ist nicht betroffen.

Aufbau der Antwort ​

Alle Endpunkte geben denselben JSON-Umschlag zurück. Feldnamen beginnen mit einem Großbuchstaben (PascalCase); bei Feldnamen im Anfragetext wird die Groß-/Kleinschreibung nicht beachtet.

json
{
  "Payload": {},
  "Success": true,
  "ErrorMessage": null,
  "ErrorCode": 0
}
FeldBeschreibung
PayloadDas Ergebnis der Anfrage. Der Aufbau hängt vom Endpunkt ab. Im Fehlerfall kann das Feld leer oder null sein.
Successtrue, wenn der Vorgang erfolgreich war.
ErrorMessageFehlermeldung (auf Türkisch). Bei erfolgreichen Anfragen null.
ErrorCodeFehlercode. Bei erfolgreichen Anfragen 0.

Fehler in der Geschäftslogik (fehlender Parameter, nicht gefundene Log-Definition, Abfragegrenze usw.) werden mit HTTP 200 und Success: false zurückgegeben. Der Client muss bei jeder Antwort das Feld Success prüfen.

Anfragen, die bei der Authentifizierung abgelehnt werden, kommen mit dem Statuscode 401 oder 403 zurück. Diese Antworten enthalten nur die Felder Success und ErrorMessage, kein ErrorCode:

json
{
  "Success": false,
  "ErrorMessage": "Geçersiz API Anahtarı"
}

HTTP-Statuscodes ​

StatusErrorMessageBedeutung
401Lütfen Geçerli Gir API Anahtarı SağlayınDie Anfrage enthält weder einen Authorization- noch einen ApiKey-Header.
401API Anahtarı Doğrulanırken Hata OluştuBei der Prüfung des Schlüssels ist ein Serverfehler aufgetreten; versuchen Sie es nach einiger Zeit erneut.
403Geçersiz API AnahtarıDer Schlüssel wurde nicht gefunden, wurde gelöscht, hat den Zweck MCP-Zugriff, oder das Konto, dem er gehört, kann nicht verwendet werden.
403Maksimum Sorgulama Limiti AşıldıMaximale Anfragen des Schlüssels wurde überschritten. Die Antwort enthält den Header X-RateLimit-RetryAfter.
403Geçersiz Giriş TokenDas Token im Header Authorization ist ungültig oder abgelaufen.
403Bu Kullanıcı Bu Müdahaleye Yetkili DeğilDie Rolle des Benutzers oder des Schlüsselbesitzers reicht für diesen Endpunkt nicht aus.

Häufige Fehlercodes ​

ErrorCodeBedeutung
1101Fehlender oder fehlerhafter Parameter. Bei Archivabfragen beschreibt ErrorMessage das fehlende Feld.
1203Grenze für Archivabfragen überschritten (Anzahl der Log-Definitionen, geschätzte Zellenzahl, gleichzeitige Abfragen oder Zeitüberschreitung der Abfrage).
1208Der angeforderte Datumsbereich überschreitet die zulässige Grenze.
2106Aktualisierungstoken ungültig.
2107Benutzername oder Passwort falsch.
2108Sitzung abgelaufen; erneute Anmeldung erforderlich.
2110Zu viele fehlgeschlagene Anmeldeversuche; warten Sie eine Weile.
3101Tag nicht gefunden.
3501Log-Definition nicht gefunden.
4400Log-Tabelle nicht gefunden.
4401Keine Verbindung zur Log-Datenbank.

Live-Daten ​

Gerätezustände ​

http
GET /api/Monitor/Devices

Listet die im System definierten Geräte mit ihrem Kommunikationszustand und dem letzten Fehler auf. Benutzer ohne die Rolle Editor und die API-Schlüssel dieser Benutzer sehen nur die Geräte in den Prozessgruppen, für die sie berechtigt sind.

json
{
  "Payload": [
    {
      "Id": 3,
      "Active": true,
      "Name": "Kompresor_1",
      "ChannelId": 1,
      "ConnectionType": 2,
      "ConnectionTypeStr": "ModbusTcp",
      "ConnectionQuality": 1,
      "DeviceQualityStr": "Good",
      "TagQuality": 1,
      "TagQualityStr": "Good",
      "ConnectionDescription": "192.168.1.10:502",
      "ErrorString": null,
      "ErrorOccurredTime": "0001-01-01T00:00:00",
      "Parameters": "",
      "AlarmState": -1,
      "ChangedTime": "2026-10-15T10:42:07.123+03:00",
      "IsOutOfDate": false,
      "IsConnected": false,
      "Tags": null
    }
  ],
  "Success": true,
  "ErrorMessage": null,
  "ErrorCode": 0
}
FeldBeschreibung
IdEindeutige ID des Geräts.
Activetrue, wenn die Kommunikation mit dem Gerät aktiviert ist.
NameGerätename.
ChannelIdID des Kanals, zu dem das Gerät gehört.
ConnectionTypeZahl für den Verbindungstyp des Kanals (siehe Tabelle unten).
ConnectionTypeStrTextform des Verbindungstyps.
ConnectionQualityQualität der Verbindung zum Gerät: 0 = Bad, 1 = Good, 2 = Uncertain.
DeviceQualityStrTextform von ConnectionQuality.
TagQualityLesequalität der Tags des Geräts; sie verschlechtert sich, wenn eines der Tags nicht gelesen werden kann. Nimmt dieselben Werte wie ConnectionQuality an.
TagQualityStrTextform von TagQuality.
ConnectionDescriptionKurzbeschreibung der Verbindungsparameter.
ErrorStringLetzte Fehlermeldung der Gerätekommunikation.
ErrorOccurredTimeZeitpunkt des letzten Fehlers.
ParametersText mit den Verbindungsparametern.
AlarmStateZustand der Alarme, die für die Tags des Geräts definiert sind: -1 = kein Alarm, 0 = Alarm beendet, 1 = Alarmbedingung nicht mehr erfüllt, Rücksetzen ausstehend, 2 = Alarm bestätigt, 3 = neuer Alarm.
ChangedTimeZeitpunkt der letzten Aktualisierung eines Tags des Geräts. Hat das Gerät keine Tags, wird 0001-01-01T00:00:00 zurückgegeben.
IsOutOfDatetrue, wenn die Gerätedefinition geändert wurde und das Gerät neu initialisiert werden muss.
IsConnectedWird bei diesem Endpunkt nicht verwendet, immer false.
TagsWird bei diesem Endpunkt nicht verwendet, immer null. Für Tag-Werte verwenden Sie die folgenden Endpunkte.

Werte von ConnectionType:

WertTextWertText
1ModbusSerial8MtConnect
2ModbusTcp9BacNet
3ModbusOverEth10Database
4OpcServer11RestClient
5SiemensTcp13RestServer
6Mqtt14EtherNetIp
7OpcUa999Internal

Werte, die nicht in der Tabelle stehen, gehören zu älteren Verbindungstypen, die in diesem Handbuch nicht beschrieben werden.

Tag-Werte eines Geräts ​

Die aktuellen Werte aller Tags eines Geräts erhalten Sie über drei Endpunkte:

EndpunktBeschreibung
GET /api/Monitor/Devices/TagsByName/{deviceName}Über den Gerätenamen. Beim Namen wird die Groß-/Kleinschreibung beachtet.
GET /api/Monitor/Devices/TagsById/{deviceId}Über die Geräte-ID.
GET /api/Monitor/Devices/Tags/ByDeviceIds?deviceIds=3,5Die Tags mehrerer Geräte in einer Liste. Die IDs können durch Kommas getrennt oder in der Form deviceIds=3&deviceIds=5 wiederholt werden. Ein Wert, der keine Zahl ist, liefert HTTP 400.

Wird das Gerät nicht gefunden, wird kein Fehler zurückgegeben; Payload ist eine leere Liste.

http
GET /api/Monitor/Devices/TagsByName/Kompresor_1
json
{
  "Payload": [
    {
      "Id": 41,
      "DeviceId": 3,
      "DeviceName": "Kompresor_1",
      "Name": "Basinc",
      "Address": "40001",
      "FullName": "Kanal_1.Kompresor_1.Basinc",
      "Value": 6.82,
      "ChangedTime": "2026-10-15T10:42:07.123+03:00",
      "Quality": 1,
      "QualityStr": "Good",
      "IsAlarmDefined": true,
      "IsLogDefined": true,
      "Unit": "bar",
      "Description": "Hat basıncı"
    }
  ],
  "Success": true,
  "ErrorMessage": null,
  "ErrorCode": 0
}
FeldBeschreibung
IdEindeutige ID des Tags.
DeviceIdID des Geräts, zu dem das Tag gehört.
DeviceNameName des Geräts, zu dem das Tag gehört.
NameTag-Name.
AddressAdresse des Tags im Gerät.
FullNameVollständiger Name in der Form Kanal.Gerät.Tag. Im System eindeutig.
ValueZuletzt gelesener Wert des Tags. Je nach Datentyp des Tags eine Zahl, ein boolescher Wert oder ein Text.
ChangedTimeZeitpunkt der letzten Aktualisierung des Werts.
QualityLesequalität: 0 = Bad (kann nicht gelesen werden), 1 = Good (fehlerfrei), 2 = Uncertain (unklar, z. B. noch nicht gelesen).
QualityStrTextform von Quality.
IsAlarmDefinedtrue, wenn für das Tag ein Alarm definiert ist.
IsLogDefinedtrue, wenn für das Tag ein Log (Archiv) definiert ist.
UnitFür das Tag definierte Einheit.
DescriptionBeschreibung des Tags.

Wert eines einzelnen Tags ​

EndpunktBeschreibung
GET /api/Monitor/Tag/{tagFullName}Über den vollständigen Namen (Kanal.Gerät.Tag).
GET /api/Monitor/TagById/{tagId}Über die Tag-ID.

Payload hat denselben Aufbau wie das Tag-Objekt oben. Wird das Tag nicht gefunden, ist Success gleich true und Payload gleich null. Da der vollständige Name in der URL gesendet wird, schreiben Sie Leerzeichen und Sonderzeichen URL-codiert (z. B. %20 für ein Leerzeichen).

Archivdaten ​

Die Archiv-Endpunkte fragen die gespeicherten Daten von Tags ab, für die eine Log-Definition (Archiv) angelegt ist. In den Abfragen wird nicht die Tag-ID, sondern die ID der Log-Definition (Ids) verwendet. Informationen zu Log-Definitionen finden Sie auf der Seite Log-Definitionen (Archiv).

ID der Log-Definition ermitteln ​

http
GET /api/Tags/ByName/{name}/LogInfos

Als {name} muss der vollständige Name des Tags (Kanal.Gerät.Tag) angegeben werden. Auch der reine Tag-Name wird akzeptiert; gibt es jedoch mehrere Tags mit demselben Namen, werden nur die Log-Definitionen des zuerst gefundenen Tags zurückgegeben. Wird das Tag nicht gefunden, ist ErrorCode gleich 3101.

Payload ist die Liste der Log-Definitionen des Tags. Für Abfragen verwendete Felder:

FeldBeschreibung
IdID der Log-Definition. Wird in Archivabfragen im Parameter Ids angegeben.
TagIdID des Tags, zu dem die Log-Definition gehört.
DescBeschreibung der Log-Definition.

Abfragegrenzen ​

Archivabfragen werden zum Schutz des Servers begrenzt: Begrenzt sind die Abfragedauer, die Anzahl der Log-Definitionen in einer Abfrage, die Anzahl der zurückgegebenen Zeilen und der Datumsbereich einer Abfrage der Rohdatensätze. Für Abfragen mit einem API-Schlüssel gelten engere Grenzen.

Senden Sie Archivabfragen mit einem API-Schlüssel nacheinander und nicht gleichzeitig; eine gleichzeitig gesendete Abfrage kann mit dem Code 1203 abgelehnt werden.

Die auf dem Server geltenden Grenzen können Sie über diesen Endpunkt lesen:

http
GET /api/History/QueryLimits
text
{
  "Payload": {
    "Profile": "ApiKey",
    "QueryTimeoutSeconds": <Sekunden>,
    "MaxLogInfoCount": <Zahl>,
    "MaxEstimatedCells": <Zahl>,
    "MaxRows": <Zahl>,
    "MaxRawTagRangeSeconds": <Sekunden>,
    "MaxEventRangeSeconds": <Sekunden>,
    "MaxSnapshotItems": <Zahl>
  },
  "Success": true,
  "ErrorMessage": null,
  "ErrorCode": 0
}

Der Wert von Profile ist bei Anfragen mit einem API-Schlüssel ApiKey, bei einer Benutzersitzung Interactive.

Datumsformat ​

StartDate und EndDate werden im Format ISO 8601 angegeben, zum Beispiel 2026-10-15T08:00:00Z oder 2026-10-15T08:00:00+03:00. In der Abfragezeichenfolge werden auch die Formate yyyy-MM-dd HH:mm und yyyy-MM-dd HH:mm:ss akzeptiert. Ist keine Zeitzone angegeben, wird die lokale Uhrzeit des Servers angenommen. Codieren Sie das Zeichen + in der Abfragezeichenfolge als %2B. Die Archivzeitpunkte in den Antworten werden in UTC (Z) zurückgegeben.

Rohdatensätze des Archivs ​

http
GET /api/History/Tags?Ids=1,2&StartDate=2026-10-15T08:00:00Z&EndDate=2026-10-15T09:00:00Z
POST /api/History/Tags

Gibt alle Datensätze im angegebenen Datumsbereich ohne Abtastung zurück. Bei POST werden dieselben Felder im JSON-Anfragetext gesendet.

ParameterBeschreibung
IdsIDs der Log-Definitionen. In der Abfragezeichenfolge durch Kommas getrennt (Ids=1,2) oder wiederholt (Ids=1&Ids=2).
StartDateStartzeitpunkt. Pflichtangabe.
EndDateEndzeitpunkt. Pflichtangabe; der Datumsbereich darf die Grenze für Rohdatensätze nicht überschreiten.

Die Antwort hat denselben Tabellenaufbau wie die Antwort für das abgetastete Archiv.

Abgetastetes Archiv ​

http
GET /api/History/TagsSampleBy
POST /api/History/TagsSampleBy

Teilt die Datensätze in Intervalle, die durch SampleTime festgelegt werden, und führt für jedes Intervall die mit ValueType gewählte Berechnung aus. Wird die Abtastzeit gleich dem Abstand zwischen den Datensätzen gewählt, kommen die Datensätze nahezu im Rohzustand zurück.

ParameterBeschreibungStandardwertWerte
IdsIDs der Log-Definitionen. Mindestens eine positive ID ist erforderlich.
StartDateStartzeitpunkt. Pflichtangabe.
EndDateEndzeitpunkt. Pflichtangabe; darf nicht vor StartDate liegen.
SampleTimeAbtastintervall in Sekunden.18600Größer als 0
ValueTypeBerechnung, die in jedem Intervall ausgeführt wird.00 = Min, 1 = Max, 2 = Avg (Durchschnitt), 3 = Sum (Summe), 4 = Count (Anzahl der Datensätze)
FillTypeWie Intervalle ohne Datensätze gefüllt werden.00 = NULL (bleibt leer), 1 = PREV (vorheriger Wert), 2 = LINEAR (lineare Interpolation), 3 = X (wird mit FillValue gefüllt)
FillValueGanzzahliger Wert, der bei FillType = 3 verwendet wird.0
AlignToCalendarBei true werden die Intervalle am Kalender ausgerichtet (Beginn von Stunde, Tag und Monat in der Zeitzone IANATimeZone); bei false beginnen die Intervalle mit dem Zeitpunkt des ersten Datensatzes.truetrue, false
CalculateConsumptionBei true wird anstelle von ValueType der Verbrauch jedes Intervalls nach den Verbrauchseinstellungen der Log-Definition berechnet: Momentanwerte werden summiert; bei kumulativen Zählern werden, beginnend mit dem letzten Wert vor dem Intervall, die Zuwächse zwischen aufeinanderfolgenden Werten summiert (bei einem Zählerrücksetzen zählt der Schritt als 0); das Ergebnis wird mit Faktor und Divisor der Log-Definition skaliert.falsetrue, false
IANATimeZoneZeitzone für die Ausrichtung am Kalender, zum Beispiel Europe/Istanbul. Bleibt der Wert leer, wird die Zeitzone des Servers verwendet.

In der Abfragezeichenfolge können ValueType und FillType als Zahl oder als Name (ValueType=Max) angegeben werden; im JSON-Anfragetext müssen sie als Zahl gesendet werden.

Beispielabfrage (größter Wert in Halbstundenintervallen):

http
GET /api/History/TagsSampleBy?Ids=1&ValueType=1&FillType=0&FillValue=0&SampleTime=1800&AlignToCalendar=false&CalculateConsumption=false&StartDate=2026-10-15T08:00:00Z&EndDate=2026-10-15T09:00:00Z HTTP/1.1
Host: <Server>
ApiKey: <API-Schluessel>

Anfragetext, wenn dieselbe Abfrage mit POST gesendet wird:

json
{
  "Ids": [1],
  "ValueType": 1,
  "FillType": 0,
  "FillValue": 0,
  "SampleTime": 1800,
  "AlignToCalendar": false,
  "CalculateConsumption": false,
  "StartDate": "2026-10-15T08:00:00Z",
  "EndDate": "2026-10-15T09:00:00Z"
}

Antwort:

json
{
  "Payload": {
    "query": "",
    "columns": [
      { "name": "ChangedTime", "type": "timestamp" },
      { "name": "1", "type": "DOUBLE" }
    ],
    "dataset": [
      ["2026-10-15T08:00:37Z", 1194.13919413919],
      ["2026-10-15T08:30:37Z", 1175.82417582418]
    ],
    "count": 2
  },
  "Success": true,
  "ErrorMessage": null,
  "ErrorCode": 0
}

Die Feldnamen in Payload werden kleingeschrieben:

FeldBeschreibung
columnsListe der Spalten. Die erste Spalte ist ChangedTime, jede weitere Spalte ist eine Log-Definition; der Spaltenname ist die ID der Log-Definition.
datasetZeilen. Das erste Element jeder Zeile ist der UTC-Zeitpunkt, die weiteren Elemente sind die Werte der Log-Definitionen in der Reihenfolge von columns. Für eine Log-Definition ohne Wert zu diesem Zeitpunkt wird null zurückgegeben.
countAnzahl der Zeilen.
queryWird nicht verwendet, bleibt leer.

Verbrauchsberechnung ​

http
POST /api/History/TagsSampleByForPivotDiffSum

Gibt die Verbrauchswerte der Log-Definitionen in den festgelegten Intervallen zeilenweise zusammen mit Aufgabenzentrum und Prozessgruppe zurück. Der Anfragetext enthält dieselben Felder wie beim abgetasteten Archiv; bei diesem Endpunkt muss CalculateConsumption als true gesendet werden, andernfalls wird der Code 3501 zurückgegeben.

Bei Log-Definitionen mit kumulativen Zählern werden die Differenzen aufeinanderfolgender Datensätze summiert; Rücksprünge wie ein Zählerrücksetzen zählen als 0. Bei den übrigen Log-Definitionen werden die Werte summiert. Das Ergebnis wird mit Faktor und Divisor der Log-Definition skaliert. Um den Gesamtverbrauch des Datumsbereichs als einen einzigen Wert zu erhalten, setzen Sie SampleTime auf die Länge des Bereichs in Sekunden.

bash
curl -X POST "https://<Server>/api/History/TagsSampleByForPivotDiffSum" \
  -H "ApiKey: <API-Schluessel>" \
  -H "Content-Type: application/json" \
  -d '{
    "Ids": [1, 2],
    "ValueType": 1,
    "FillType": 0,
    "FillValue": 0,
    "SampleTime": 3600,
    "AlignToCalendar": false,
    "CalculateConsumption": true,
    "StartDate": "2026-10-15T08:00:00Z",
    "EndDate": "2026-10-15T09:00:00Z"
  }'

Antwort:

json
{
  "Payload": [
    {
      "LogInfoId": 1,
      "Desc": "Hat_1_Buhar [ton]",
      "ChangedTime": "2026-10-15T08:00:37Z",
      "Value": 0.22014652014652,
      "TaskCenter": "Uretim",
      "DataGroup": "Buhar_Tuketimi"
    },
    {
      "LogInfoId": 2,
      "Desc": "Hat_2_Buhar [ton]",
      "ChangedTime": "2026-10-15T08:00:37Z",
      "Value": 0.7927872860635696,
      "TaskCenter": "Uretim",
      "DataGroup": "Buhar_Tuketimi"
    }
  ],
  "Success": true,
  "ErrorMessage": null,
  "ErrorCode": 0
}
FeldBeschreibung
LogInfoIdID der Log-Definition.
DescBeschreibung der Log-Definition und in eckigen Klammern ihre Einheit. Ist in der Log-Definition eine Einheit für den Gesamtwert eingetragen, wird diese verwendet, sonst die Einheit des Tags.
ChangedTimeStartzeitpunkt des Intervalls (UTC).
ValueVerbrauch im Intervall. Gibt es keine Datensätze, wird der Wert entsprechend FillType gefüllt oder null zurückgegeben.
TaskCenterAufgabenzentrum des Geräts, zu dem das Tag gehört.
DataGroupProzessgruppe des Aufgabenzentrums des Geräts; wird keine gefunden, die Tag-Gruppe, zu der das Tag gehört.

Swagger ​

Ist auf dem Server die API-Dokumentation aktiviert, können alle Endpunkte und ihre Schemas in der Swagger-Oberfläche angesehen und ausprobiert werden. Die API-Dokumentation ist standardmäßig deaktiviert; für die Aktivierung und die Zugriffsadresse wenden Sie sich an Ihren Systemintegrator. In Swagger können Sie über Authorize einen Wert für ApiKey oder Authorization eingeben und Anfragen senden.

Fehlerbehebung ​

SymptomPrüfung
401, Lütfen Geçerli Gir API Anahtarı SağlayınPrüfen Sie, ob die Anfrage einen ApiKey- oder Authorization-Header enthält und der Header-Name richtig geschrieben ist.
403, Geçersiz API AnahtarıPrüfen Sie, ob der Schlüssel vollständig kopiert und nicht gelöscht wurde und ob Zweck den Wert SCADA API hat. Schlüssel mit MCP-Zugriff funktionieren in der REST-API nicht.
Trotz gesendetem API-Schlüssel wird Geçersiz Giriş Token zurückgegebenDie Anfrage enthält zusätzlich einen Authorization-Header. Entfernen Sie diesen Header.
403, Maksimum Sorgulama Limiti AşıldıVersuchen Sie es nach Ablauf des 10-Minuten-Fensters erneut. Verringern Sie die Abfragehäufigkeit, oder erhöhen Sie den Wert für Maximale Anfragen.
Bei der Arbeit mit einem Token nach einigen Stunden 403, Geçersiz Giriş TokenDas Zugriffstoken ist abgelaufen. Führen Sie eine Token-Aktualisierung durch; gibt die Aktualisierung 2106 oder 2108 zurück, melden Sie sich erneut an.
/api/Monitor/Devices liefert einige Geräte nichtPrüfen Sie, ob der Benutzer bzw. der Besitzer des Schlüssels in der betreffenden Prozessgruppe berechtigt ist.
Die Abfrage über den Gerätenamen liefert eine leere ListePrüfen Sie, ob der Gerätename einschließlich Groß-/Kleinschreibung exakt geschrieben ist, und prüfen Sie die URL-Codierung.
Die Archivabfrage liefert 1203Verringern Sie die Anzahl der Log-Definitionen, den Datumsbereich oder die Abtasthäufigkeit; senden Sie Archivabfragen mit einem API-Schlüssel nacheinander und nicht gleichzeitig. Prüfen Sie die Grenzen mit GET /api/History/QueryLimits.
Die Archivabfrage liefert 1208Verkleinern Sie den Datumsbereich der Abfrage der Rohdatensätze, oder verwenden Sie den Endpunkt für das abgetastete Archiv.
Die Archivabfrage liefert 3501Prüfen Sie, ob die Werte in Ids IDs von Log-Definitionen und nicht von Tags sind. Prüfen Sie bei der Verbrauchsberechnung, ob CalculateConsumption den Wert true hat.
Die Archivabfrage liefert 4401Prüfen Sie, ob der Dienst der Log-Datenbank läuft.
Archivzeitpunkte sind um einige Stunden verschobenDie Zeitpunkte in den Antworten sind UTC. Geben Sie die Zeitzone in der Anfrage ausdrücklich an (Z oder +03:00).
Die HTTPS-Anfrage meldet einen ZertifikatsfehlerPrüfen Sie, ob das Serverzertifikat auf der Clientseite als vertrauenswürdig gilt.

2WinScada 2.10