SECS - Beispiel
Dieses Kapitel beschreibt die beispielhafte Einrichtung eines SECS-Treibers.
Treiber- und Verbindungskonfiguration
Als Erstes wird ein neuer SECS-Treiber mit einer entsprechenden Treibernummer hinzugefügt.
Starten Sie dann das Projekt und gehen Sie zu
und erstellen Sie eine neue Verbindung. Konfigurieren Sie die Verbindung entsprechend Ihren Netzwerkanforderungen und übernehmen Sie die Einstellungen.
Adresskonfiguration - Collection Event
Konfigurieren Sie das "_address"-config für das Ereignis auf einem String-DPE mit der Richtung „Input“.

Verwenden Sie das CEID-Referenzpräfix und setzen Sie die Referenznummer 1 auf eine Ereignis-ID Ihres Gerätes. Stellen Sie sicher, dass die Transformation auf String gesetzt ist, die Richtung auf „Input“ und der Empfangsmodus auf „Spontaneous“ eingestellt ist.

Alarme
Konfigurieren Sie eine Alarmadresse für ein String-DPE mit der Richtung „Input“ und dem Empfangsmodus „Spontaneous“. Stellen Sie sicher, dass die Transformation auf String gesetzt ist, das Referenzpräfix auf ALID und die Referenznummer 1 auf eine Alarm-ID von Ihrem Gerät gesetzt ist.

Konfigurieren Sie außerdem eine Multi-Instance-Alarmkonfiguration auf einem Integer-DPE mit einer _alert_class, die nicht quittierbar ist.

Konfigurieren Sie anschließend eine Adresskonfiguration mit einem „ALID_A“-Referenzpräfix. Verwenden Sie dieselbe ALID in Referenznummer 1 wie im String-Alarm-DPE. Mit dieser Konfiguration wird die Alarmbenachrichtigung vom Gerät mit der gewählten ALID an das String-DPE geschrieben und gleichzeitig einer WinCC OA-Alarmmeldung zugeordnet, die im „Alarmscreen“ sichtbar ist, wenn der Alarm aktiv ist.

Host-Anfrage
Konfigurieren Sie nun die Adresse für zwei String-DPEs, die verwendet werden, um Statusvariablenwerte anzufordern (Richtung „Output“) und zu empfangen (Richtung „Input“, Empfangsmodus „Spontaneous“). Das Adressreferenzpräfix muss auf „HREQ“ gesetzt werden. Die Referenznummer 1 kann vom Benutzer gewählt werden, es wird jedoch empfohlen, die Stream- und Funktionsnummer zu verwenden.


Geräteanfrage
Konfigurieren Sie auch eine Adresse für eine Anfrage, die vom Gerät mit dem Adressreferenzpräfix „EREQ“, der Referenznummer 1 für die Stream-Nummer und der Referenznummer 2 für die Funktionsnummer der Anfrage, die Sie auf diesem DPE empfangen möchten, eingeht. In diesem Beispiel verwenden wir die S7F3 (Process Program Send)-Anfrage, die an den Host (WinCC OA) gesendet wird und mit einer S7F4-Acknowledge-Antwort beantwortet werden muss. Da dies keine Ereignis-, Alarm- oder Trace-Nachricht ist, muss sie manuell beantwortet werden, z. B. durch ein CTRL-Skript. Das Beispiel-CTRL-Skript wird später in diesem Kapitel gezeigt. Es ist wichtig, dass die S7F4 (Richtung „Output“)-Adresskonfiguration dieselbe Verbindung, Referenz und Treiber-Nummer wie die S7F3 (Richtung „Input“, Empfangsmodus „Spontaneous“)-Adresskonfiguration hat.


Gerätekonstanten
Konfigurieren Sie auch eine Adresse auf einem DPE, die verwendet werden soll, um Gerätekonstantendaten zu empfangen und/oder zu setzen. Verwenden Sie die Gerätekonstanten-ID, die Sie empfangen und/oder setzen möchten, in der Referenznummer 1 und setzen Sie das Referenzpräfix auf „ECID“. Stellen Sie sicher, dass der Transformationstyp mit dem Datentyp im Gerät übereinstimmt. Konfigurieren Sie die Richtung auf „In/Out“ und den Empfangsmodus auf „Single query“.

Statusvariablen
Die letzte Konfiguration besteht darin, eine Statusvariable konsistent abzufragen. Konfigurieren Sie ein DPE mit der Richtung „Input“ und dem Empfangsmodus „Polling“. Setzen Sie das Adressreferenzpräfix auf „SVID“ und die Referenznummer 1 auf eine SVID vom Gerät. Konfigurieren Sie eine Poll-Gruppe und den entsprechenden Transformationstyp für den Datentyp der Statusvariable.

Verbindung aktivieren
Aktivieren Sie abschließend die Verbindung zum Gerät. Stellen Sie sicher, dass das Gerät „Online Control“ aktiviert hat.

Alarme und Ereignisse auslösen
Ein ausgelöster SECS-II-Alarm auf dem Gerät wird als WinCC OA-Alarm im Alarmscreen angezeigt.

Außerdem sollte das konfigurierte Alarm-String-DPE die vom Gerät empfangene Alarmnachricht enthalten. Die Nachricht sollte die folgende JSON-Alarmnachricht-Struktur haben.
{
"header": {
"function": 1,
"stream": 5,
"reply": true,
"sessionId": 0,
"systemBytes": 32
},
"body": [
{
"format": "B",
"value": 128
},
{
"format": "U4",
"value": 1000
},
{
"format": "A",
"value": "Software test alarm 1000"
}
]
}
Lösen Sie als Nächstes ein Ereignis auf dem Gerät mit der konfigurierten CEID in der Ereignisadresskonfiguration aus. Sie sollten einen JSON-String auf dem DPE erhalten, der wie folgt aussieht:
{
"header": {
"function": 13,
"stream": 6,
"reply": true,
"sessionId": 0,
"systemBytes": 41
},
"body": [
{
"format": "U4",
"value": 4001
},
{
"format": "U4",
"value": 4001
},
[]
]
}
Das leere Array im Body kann Inhalte enthalten, wenn ein Bericht definiert ist, der mit dem ausgelösten Ereignis verknüpft ist.
Gerätekonstanten abrufen und setzen
Mit dem DPE, bei dem die „ECID.<ECID>“-Adressreferenz definiert ist, kann der Benutzer die Gerätekonstante über "_original_value" setzen. Nach dem Setzen des Wertes überprüfen Sie, ob der Wert im Gerät korrekt gesetzt wurde. Aufgrund des Empfangsmodus „Single query“ können Sie zum internen _DriverCommon-DPE mit der entsprechenden Nummer des laufenden SECS-Treibers gehen und das "_Driver<drvNum>.SQ _original..value" mit dem DPE-Namen setzen, bei dem die Gerätekonstantenadresse definiert ist. Überprüfen Sie anschließend, ob der Wert in das "_original..value" des Gerätekonstanten-DPE geschrieben wurde.
Statusvariablenwerte abrufen
Bei dem DPE, bei dem die „SVID.<SVID>“-Adressreferenz definiert ist, sollte das Polling bereits aktiv sein und Wertänderungen der Statusvariable sollten je nach Poll-Gruppenkonfiguration im _original_value sichtbar sein.
Beispiel-CTRL-Skripte
Das folgende CTRL-Skript ist ein Beispiel, um eingehende Daten vom Gerät mit einer Bestätigungsnachricht zu beantworten:
void main()
{
dpConnect("acknowledgeCB", false, "Demo_Secs.S7F3");
}
acknowledgeCB(string sDp, string sJson)
{
const mapping mReceivedJson = jsonDecode(sJson);
const int iStream = mReceivedJson["header"]["stream"];
const int iFunction = mReceivedJson["header"]["function"] + 1; // +1 because SxF1 is answered by SxF2 and so on
mapping mAcknowledge = makeMapping(
"header", makeMapping(
"stream", iStream,
"function", iFunction,
"reply", false,
"sessionId", mReceivedJson["header"]["sessionId"],
"systemBytes", mReceivedJson["header"]["systemBytes"]
),
"body", makeMapping(
"format", "B",
"value", 0 // OK acknowledge
)
);
// check received body
if(mReceivedJson["body"][1]["value"] != "banana")
{
mAcknowledge["body"]["value"] = 1; // NOK acknowledge
}
dpSet("Demo_Secs.S" + iStream + "F" + iFunction, jsonEncode(mAcknowledge));
}