Protokolle für den Datenaustausch
Zusätzlich zum Konfigurieren der Hilscher card muss auch sichergestellt werden, dass die speicherprogrammierbare Steuerung (SPS) ordnungsgemäß konfiguriert ist. Sie muss zum Senden und Empfangen von Daten in einer vordefinierten Struktur eingerichtet sein, die von MERLIC gefordert und erwartet wird. Werden die Daten nicht in der erforderlichen Struktur übertragen, kann MERLIC oder die SPS die Daten nicht ordnungsgemäß verarbeiten. Die erforderliche Struktur für den Datenaustausch ist in den folgenden Protokollen definiert:
- FromMerlicProtocol
- FromPLCProtocol
Sie definieren die übertragenen Informationen zusammen mit den jeweiligen Datentypen.
Um eine Kommunikation zwischen MERLIC und der Hilscher card einzurichten, müssen auch die verfügbaren internen Zustände von MERLIC im Prozessintegrationsmodus und die verfügbaren Befehle, z. B. zum Starten einer Einzelausführung, berücksichtigt werden. Diese Informationen sind erforderlich, um den Kommunikationsprozess für die Prozessintegration ordnungsgemäß zu konfigurieren. Weitere Informationen finden Sie unter MERLIC-Zustände und Befehle (Hilscher).
Werden Daten als ganzes Speicher-Array ausgetauscht, z. B. durch Definieren von Datenstrukturdeklarationen, werden bei einigen SPS standardmäßig Füllbytes zwischen den Elementen der Strukturdeklarationen hinzugefügt.
FromPLCProtocol
Dieses Protokoll definiert die erwartete Struktur der Daten, die von der SPS an MERLIC gesendet werden. Der folgende Codeblock veranschaulicht, in welcher Reihenfolge und als welche Datentypen die Daten von der SPS erwartet und von MERLIC interpretiert werden.
TYPE FromPLCProtocol :
STRUCT
Preamble : BYTE;
CommandCode : WORD;
Selector : DINT;
END_STRUCT
END_TYPE
Die folgende Tabelle beschreibt die jeweiligen Elemente, die in diesem Protokoll erforderlich sind.
|
Element |
Beschreibung |
Offset |
Größe in Byte |
|---|---|---|---|
|
Preamble |
Präambel, die definiert, wo die Daten des eigentlichen Protokolls beginnen. MERLIC erwartet den Wert 17. |
0 |
1 |
|
CommandCode |
Code des Befehls, dessen Ausführung die SPS von MERLIC anfordert. Weitere Informationen zu Befehlen finden Sie unter Befehle (Hilscher). |
1 |
2 |
|
Selector |
Möglicher Parameter für einen Befehl. Er wird derzeit zusammen mit den Befehlen „PrepareRecipe“ und „GetResult“ verwendet, um eine Rezept-ID bzw. eine Ergebnis-ID zu übergeben. |
3 |
4 |
FromMerlicProtocol
Dieses Protokoll definiert die Struktur der Daten, die von MERLIC an die SPS gesendet werden. Der folgende Codeblock veranschaulicht, in welcher Reihenfolge und als welche Datentypen die Daten von MERLIC gesendet werden.
TYPE FromMerlicProtocol :
STRUCT
Preamble : BYTE;
VersionMajor : USINT;
VersionMinor : USINT;
RecipeId : INT;
CommandCode : WORD;
ActionResponse : WORD;
CurrentState : WORD;
LastResultId : UDINT;
LastStartedJobId : UDINT;
Reserved : ARRAY[1..5] OF BYTE;
ResultState : BYTE;
BoolCount : USINT;
ByteCount : USINT;
WordCount : USINT;
DWordCount : USINT;
LWordCount : USINT;
SIntCount : USINT;
USIntCount : USINT;
IntCount : 0USINT;
UIntCount : USINT;
DIntCount : USINT;
UDIntCount : USINT;
LIntCount : USINT;
ULIntCount : USINT;
RealCount : USINT;
LRealCount : USINT;
TimeCount : USINT;
TimeOfDayCount : USINT;
LTimeCount : USINT;
DateCount : USINT;
DateAndTimeCount : USINT;
Str80Count: USINT;
TotalResultCount : UINT;
// For each transmitted result, the data integrity
// and value is returned.
// They are assigned by their index i.
DataIntegrity{i} : BYTE;
Result{i} : VALUE_TYPE;
DataIntegrity{i+1} : BYTE;
Result{i+1} : VALUE_TYPE;
...
END_STRUCT
END_TYPE
Die folgende Tabelle beschreibt die jeweiligen Elemente, die in diesem Protokoll erforderlich sind.
|
Member |
Beschreibung |
Offset |
Größe in Byte |
|---|---|---|---|
|
Preamble |
Präambel, die definiert, wo die Daten des eigentlichen Protokolls beginnen. Der Standardwert wird von MERLIC auf 17 eingestellt. |
0 |
1 |
|
VersionMajor |
Hauptversionsnummer des Protokolls. |
1 |
1 |
|
VersionMinor |
Nebenversionsnummer des Protokolls. |
2 |
1 |
|
RecipeId |
ID des geladenen Rezepts. |
3 |
2 |
|
CommandCode |
Befehlscode, der von MERLIC an die SPS zurückgegeben wird, um zu bestätigen, dass ein Befehl gelesen wurde. |
5 |
2 |
|
ActionResponse |
Antwort auf den angeforderten Befehl. Weitere Informationen zu den möglichen Werten finden Sie im Abschnitt ActionResponse. |
7 |
2 |
|
CurrentState |
Der aktuelle Zustand von MERLIC. Weitere Informationen zum unterstützten Zustand finden Sie unter MERLIC-Zustände. |
9 |
2 |
|
LastResultId |
ID des vollständigen Ergebnissatzes, der in der letzten Iteration einer MVApp berechnet wurde. Die ID beginnt bei 0 und wird für jedes Ergebnis erhöht. |
11 |
4 |
|
LastStartedJobId |
ID des letzten gestarteten Jobs im Typ UDINT. |
15 |
4 |
|
Reserved |
Für die zukünftige Verwendung reserviert. |
19 |
5 |
|
ResultState |
Status der abgefragten Ergebnisdaten. Dieser wird bei jeder Ergebnisabfrage festgelegt. Die folgenden Werte für „ResultState“ sind möglich:
|
24 |
1 |
|
BoolCount |
Anzahl der booleschen Ergebnisse, die an die SPS übertragen werden. |
25 |
1 |
|
ByteCount |
Anzahl der BYTE-Ergebnisse, die an die SPS übertragen werden. |
26 |
1 |
|
WordCount |
Anzahl der WORD-Ergebnisse, die an die SPS übertragen werden. |
27 |
1 |
|
DWordCount |
Anzahl der DWORD-Ergebnisse, die an die SPS übertragen werden. |
28 |
1 |
|
LWordCount |
Anzahl der LWORD-Ergebnisse, die an die SPS übertragen werden. |
29 |
1 |
|
SIntCount |
Anzahl der SINT-Ergebnisse, die an die SPS übertragen werden. |
30 |
1 |
|
USIntCount |
Anzahl der USINT-Ergebnisse, die an die SPS übertragen werden. |
31 |
1 |
|
IntCount |
Anzahl der INT-Ergebnisse, die an die SPS übertragen werden. |
32 |
1 |
|
UIntCount |
Anzahl der UINT-Ergebnisse, die an die SPS übertragen werden. |
33 |
1 |
|
DIntCount |
Anzahl der DINT-Ergebnisse, die an die SPS übertragen werden. |
34 |
1 |
|
UDIntCount |
Anzahl der UDINT-Ergebnisse, die an die SPS übertragen werden. |
35 |
1 |
|
LIntCount |
Anzahl der LINT-Ergebnisse, die an die SPS übertragen werden. |
36 |
1 |
|
ULIntCount |
Anzahl der ULINT-Ergebnisse, die an die SPS übertragen werden. |
37 |
1 |
|
RealCount |
Anzahl der REAL-Ergebnisse, die an die SPS übertragen werden. |
38 |
1 |
|
LRealCount |
Anzahl der LREAL-Ergebnisse, die an die SPS übertragen werden. |
39 |
1 |
|
TimeCount |
Anzahl der TIME-Ergebnisse, die an die SPS übertragen werden. |
40 |
1 |
|
TimeOfDayCount |
Anzahl der TIME_OF_DAY-Ergebnisse, die an die SPS übertragen werden. |
41 |
1 |
|
LTimeCount |
Anzahl der LTIME-Ergebnisse, die an die SPS übertragen werden. |
42 |
1 |
|
DateCount |
Anzahl der DATE-Ergebnisse, die an die SPS übertragen werden. |
43 |
1 |
|
DateAndTimeCount |
Anzahl der DATE_AND_TIME-Ergebnisse, die an die SPS übertragen werden. |
44 |
1 |
|
Str80Count |
Anzahl der STRING_80-Ergebnisse, die an die SPS übertragen werden. |
45 |
1 |
|
TotalResultCount |
Anzahl aller Ergebnisse, die an die SPS übertragen werden. |
46 |
2 |
|
DataIntegrity{i} |
Informationen zur Gültigkeit und zu möglichen Konvertierungsfehlern des Ergebnisses mit dem Index i. Der Index i beginnt bei 0 und bezieht sich auf den Ergebniswert des i-ten MVApp-Ergebnisses, das für die angeforderte „LastResultId“ ausgegeben wurde. Die Ergebnisse werden in der oben beschriebenen Reihenfolge in das Protokoll übertragen. Beispielsweise werden zuerst alle Ergebnisse des Typs Boolean ausgegeben, dann alle BYTE-Ergebnisse usw. Weitere Informationen zur Bedeutung der einzelnen Bits finden Sie im Abschnitt Byteinformationen für DataIntegrity. |
48 |
1 |
|
Result{i} |
Wert des übertragenen Ergebnisses mit dem Index i. Der Index i beginnt bei 0 und bezieht sich auf das i-te MVApp-Ergebnis, das für die angeforderte „LastResultId“ ausgegeben wurde. Die Ergebnisse werden in der oben beschriebenen Reihenfolge in das Protokoll übertragen. Beispielsweise werden zuerst alle Ergebnisse des Typs Boolean ausgegeben, dann alle BYTE-Ergebnisse usw. |
|
|
ActionResponse
In der folgenden Tabelle sind alle möglichen Werte für das ActionResponse-Element aufgelistet.
|
Wert |
ActionResponse |
Beschreibung |
|---|---|---|
|
0x0000 |
Unknown |
Die Antwort ist unbekannt, z. B. wenn noch kein Befehl ausgeführt wurde. |
|
0x0001 |
Success |
Der Befehl wurde erfolgreich verarbeitet. |
|
0x1110 |
InternalError |
Es ist ein schwerwiegender Fehler aufgetreten, der zu einem inkonsistenten internen Zustand des Erkennungssystems geführt hat. Das Erkennungssystem muss neu gestartet werden. |
|
0x1134 |
RecipeUnpreparationFailed |
Die Anwendung konnte nicht entladen werden; das System konnte den Initialisierungszustand nicht wiederherstellen. |
|
0x2113 |
NotImplemented |
Der Befehl wird nicht unterstützt. |
|
0x2116 |
AcquisitionDeviceLost |
Das Bildeinzugsgerät, d. h. die Kamera oder das Bilddateiverzeichnis, ist nicht vorhanden. |
|
0x2130 |
UserAccessDenied |
Der angeforderte Befehl konnte nicht ausgeführt werden, weil der Aufrufer derzeit nicht dazu berechtigt ist. |
|
0x2133 |
RecipePreparationFailed |
Die in der Rezeptdatei angegebene Anwendung konnte nicht geladen werden. |
|
0x2135 |
ResponsePromiseBroken |
Der Status des angeforderten Befehls ist unbekannt und wird zukünftig nicht festgelegt. |
|
0x2138 |
AcquisitionConflictingTimeout |
Das Zeitlimit für den Bildeinzug wurde teilweise überschritten. In einer Einrichtung mit mehreren Kameras wurde der Bildeinzug von einigen Kameras mit Hardwaretrigger erfolgreich durchgeführt, während beim Bildeinzug von anderen Kameras ein Timeout aufgetreten ist, sodass nicht gewährleistet ist, dass die Bildpuffer aller Kameras einen konsistenten Zustand aufweisen. |
|
0x2139 |
AcquisitionError |
Der Bildeinzug ist fehlgeschlagen. |
|
0x2175 |
UnknownRecipeId |
Die angegebene Rezept-ID ist unbekannt. |
|
0x2236 |
DataflowError |
Der in der angeforderten Rezeptdatei angegebene Datenfluss der Anwendung weist Blockierungen oder laufzeitbedingte Konflikte auf. |
|
0x2801 |
MessageTooSmall |
Es ist nicht genügend Speicherplatz für die Übertragung der Nachricht verfügbar. |
|
0x4131 |
ActionRejected |
Die angeforderte Aktion ist im aktuellen Zustand des Erkennungssystems nicht zulässig. |
|
0x4132 |
ActionSuperseded |
Die angeforderte Aktion wird nicht wie erwartet beendet, da sie durch eine andere Aktion ersetzt wurde, die Vorrang hat. |
|
0x4137 |
AcquisitionTimeout |
Das Zeitlimit für den Bildeinzug wurde überschritten. Dies kann beispielsweise vorkommen, wenn eine Kamera mit Hardwaretrigger das Triggersignal nicht im angegebenen grab_timeout-Intervall empfangen hat oder die Verbindung zu einer Kamera während des Einzugs unterbrochen wurde. |
|
0x4176 |
UnknownResultId |
Die angegebene Ergebnis-ID ist unbekannt. Das entsprechende Ergebnis wurde möglicherweise aus dem Ringpuffer des Ergebnisspeichers gelöscht und ist nicht mehr verfügbar. |
|
0x4296 |
IncompatibleParameters |
Das angegebene Jobparametertupel passt nicht zur Rezeptschnittstelle, weil die Anzahl der Tupelelemente beispielsweise nicht mit der Anzahl der Rezeptwerte übereinstimmt oder die Konvertierung der Tupelelemente in den Datentyp des jeweiligen Rezeptwerts verlustbehaftet ist. |
Byteinformationen für DataIntegrity
Das Byte, das für das Element DataIntegrity übertragen wird, enthält verschiedene Informationen zum Wert eines bestimmten Ergebnisses. Die ersten beiden Bits geben an, ob der Wert gültig und ob überhaupt ein Wert enthalten ist.
|
Bit |
Name |
Beschreibung |
|---|---|---|
|
0 |
Gültigkeit |
Dieses Bit ist auf 1 gesetzt, wenn der Wert gültig ist, andernfalls auf 0. |
|
1 |
Wert der letzten Iteration |
Dieses Bit ist auf 1 gesetzt, wenn der Wert in der letzten Iteration der MVApp ermittelt wurde. Wenn der Wert nicht in der letzten Iteration berechnet wurde (Parameter z. B. in einem inaktiven Zweig), ist dieses Bit auf 0 gesetzt. |
Die folgenden Bits enthalten Informationen zu möglichen Konvertierungsfehlern.
|
Bit |
Name |
Beschreibung |
|---|---|---|
|
2 |
Leerer Wert |
Dieses Bit ist auf 1 gesetzt, wenn der Wert leer ist, andernfalls auf 0. |
|
3 |
Verlustbehaftete Konvertierung |
Dieses Bit ist auf 1 gesetzt, wenn bei der Konvertierung des Werts Informationen verloren gegangen sind, andernfalls auf 0. |
|
4 |
Mehrere Werte |
Dieses Bit ist auf 1 gesetzt, wenn das Ergebnis mehrere Werte enthält, andernfalls auf 0. Dieses Bit ist reserviert, da mehrere Werte derzeit nicht unterstützt werden. |
|
5 |
Konvertierbarkeit |
Dieses Bit ist auf 1 gesetzt, wenn der Typ des Ergebniswerts nicht in den Datentyp konvertiert werden kann, der für das jeweilige MVApp-Ergebnis ausgewählt wurde, andernfalls auf 0. |
|
6 |
Außerhalb des Bereichs |
Dieses Bit ist auf 1 gesetzt, wenn der Wert nicht im zulässigen Bereich liegt, der für das jeweilige MVApp-Ergebnis ausgewählt wurde, andernfalls auf 0. |
|
7 |
Zeichenfolge zu lang |
Dieses Bit ist auf 1 gesetzt, wenn der Wert eine Zeichenfolge darstellt, die zu lang ist, andernfalls auf 0. |