Die Übersetzung der Reaktionen kann in jedem Knoten für jedes Submodul einzeln konfiguriert werden. Die Konfiguration wird in der Aktion Init_Reactions vorgenommen. Hier ein Ausschnitt des Standardquellcodes dieser Aktion.
Ausschnitt des Standardcodes Init_Reactions
(* System generated code, only to be changed by experienced programmers *)
TPL.FC_InitReactionTranslationMode(i_udiNumberOfSubModules := c_udiNumberOfSubModules,
i_petReactionTranslationMode := ADR(aetReactionTranslationMode),
q_etDiag => etDiag,
q_etDiagExt => etDiagExtTPL);
TPL.FC_InitReactionTranslationTable(i_udiNumberOfSubModules := c_udiNumberOfSubModules,
i_pstReactionTranslationTable := ADR(aastReactionTranslationTable),
q_etDiag => etDiag,
q_etDiagExt => etDiagExtTPL);
TPL.FC_InitReactionTranslationJobs(i_udiNumberOfSubModules := c_udiNumberOfSubModules,
i_pstReactionTranslationJobs := ADR(astReactionTranslationJobs),
q_etDiag => etDiag,
q_etDiagExt => etDiagExtTPL);
(* End of system generated code, only to be changed by experienced programmers *)
Nutzung von ET_ReactionTranslationMode.None
Um den Modus ET_ReactionTranslationMode.None zu nutzen, muss nichts umgeschaltet werden. Er ist der Standardmodus und wird von der Funktion FC_InitReactionTranslationMode gesetzt.
Da in diesem Modus lediglich die am Knoten anstehende Reaktion an das Submodul weitergegeben wird, ist keine weitere Konfiguration nötig.
Nutzung von ET_ReactionTranslationMode.Table
Um den Modus ET_ReactionTranslationMode.Table zu nutzen, muss für das gewünschte Submodul dieser Modus gesetzt werden.
(* switch to the reaction translation mode "Table" for module Slave1 *)
aetReactionTranslationMode[c_udiSlave1] := TPL.ET_ReactionTranslationMode.Table;
Durch die Funktion FC_InitReactionTranslationTable wurde die Tabelle für die Reaktionsübersetzung bereits vorinitialisiert. Durch die Funktion wurde eine Diagonale in die Tabelle jedes Submoduls eingetragen. Die Funktion entspricht in diesem Zustand der des Modus ET_ReactionTranslationMode.None, nur die benötigte Rechenzeit ist aufgrund der komplexeren Verarbeitung wesentlich höher. Sollte keine Übersetzung nötig sein, empfiehlt es sich, den Modus ET_ReactionTranslationMode.None zu verwenden.
Wenn eine Übersetzung nötig ist, kann sie folgendermaßen konfiguriert werden.
Wenn ET_Reaction.SyncStopEL aussteht, sollte das Modul Slave1 die Reaktion ET_Reaction.SyncStopEH erhalten.
aastReactionTranslationTable[c_udiSlave1,TPL.ET_Reaction.SyncStopEL].axReaction[TPL.ET_Reaction.SyncStopEL]:= FALSE;
aastReactionTranslationTable[c_udiSlave1,TPL.ET_Reaction.SyncStopEL].axReaction[TPL.ET_Reaction.SyncStopEH]:= TRUE;
Wie man sieht, muss immer zuerst die durch die Funktion FC_InitReactionTranslationTable gesetzte Standardreaktion weggenommen werden.
Die Module Slave1 und Slave3 sollen bei der kundenspezifischen Fehlerreaktion 19 die Reaktion ET_Reaction.SyncStopEL erhalten.
aastReactionTranslationTable[c_udiSlave1,19].axReaction[19]:= FALSE;
aastReactionTranslationTable[c_udiSlave1,19].axReaction[TPL.ET_Reaction.SyncStopEL]:= TRUE;
aastReactionTranslationTable[c_udiSlave3,19].axReaction[19]:= FALSE;
aastReactionTranslationTable[c_udiSlave3,19].axReaction[TPL.ET_Reaction.SyncStopEL]:= TRUE;
Die Nutzung dieses Modus wird auch im Projektierungshandbuch im Kapitel Reaktionsübersetzung im Detail behandelt.
Nutzung von ET_ReactionTranslationMode.Jobs
Um den Modus ET_ReactionTranslationMode.Jobs zu nutzen, muss für das gewünschte Submodul dieser Modus gesetzt werden.
(* switch to the reaction translation mode "Jobs" for module Slave2 *)
aetReactionTranslationMode[c_udiSlave2] := TPL.ET_ReactionTranslationMode.Jobs;
|
PER DEFAULT KEINE WEITERGABE VON REAKTIONEN |
Ohne weitere Konfiguration führt die Umstellung auf den Modus ET_ReactionTranslationMode.Jobs dazu, dass keinerlei Reaktionen an das Submodul weitergegeben werden. |
Die Nichtbeachtung dieser Anweisungen kann Verletzungen oder Sachschäden zur Folge haben. |
Im Anschluss an die Umstellung des Modus muss konfiguriert werden, welche Reaktionen wie weitergegeben werden sollen. Hierzu können bis zu Gc_udiMaxNumberOfTranslationJobs Aufträge mit der Funktion FC_AddReactionTranslationJob konfiguriert werden.
Im Folgenden wird das schon für ET_ReactionTranslationMode.Table verwendete Beispiel umgesetzt.
Wenn ET_Reaction.SyncStopEL aussteht, sollte das Modul Slave1 die Reaktion ET_Reaction.SyncStopEH erhalten.
Die Module Slave1 und Slave3 sollen bei der kundenspezifischen Fehlerreaktion 19 die Reaktion ET_Reaction.SyncStopEL erhalten. (Die Reaktion 19 darf dennoch an das Modul weitergegeben werden.)
Das Modul Slave2 soll alle Reaktionen unübersetzt erhalten.
Oben wurde nicht erwähnt, dass alle anderen Reaktionen unübersetzt durchgereicht werden sollen. Dies muss hier, falls nötig, explizit als Auftrag abgesetzt werden. Für das Modul Slave1 sind dies die Reaktionen 1 und 3 bis Gc_udiMaxNumberOfReactions. Für das Modul Slave3 sind dies die Reaktionen 1 bis Gc_udiMaxNumberOfReactions.
(* Module Slave1 *)
aetReactionTranslationMode[c_udiSlave1] := TPL.ET_ReactionTranslationMode.Jobs;
(* forward reaction 1 without translation *)
TPL.FC_AddReactionTranslationJob(
i_udiSourceStart := 1,
i_udiNumReactions := 1,
i_udiTargetStart := 1,
iq_stReactionTranslationJobs := astReactionTranslationJobs[c_udiSlave1]);
(* translate reaction 2 as 3 *)
TPL.FC_AddReactionTranslationJob(
i_udiSourceStart := 2,
i_udiNumReactions := 1,
i_udiTargetStart := 3,
iq_stReactionTranslationJobs := astReactionTranslationJobs[c_udiSlave1]);
(* forwared reaction 3 to TPL.Gc_udiMaxNumberOfReactions without translation *)
TPL.FC_AddReactionTranslationJob(
i_udiSourceStart := 3,
i_udiNumReactions := TPL.Gc_udiMaxNumberOfReactions - 2,
i_udiTargetStart := 3,
iq_stReactionTranslationJobs := astReactionTranslationJobs[c_udiSlave1]);
(* translate reaction 19 as 2 *)
TPL.FC_AddReactionTranslationJob(
i_udiSourceStart := 19,
i_udiNumReactions := 1,
i_udiTargetStart := 2,
iq_stReactionTranslationJobs := astReactionTranslationJobs[c_udiSlave1]);
(* Module Slave2 *)
aetReactionTranslationMode[c_udiSlave2] := TPL.ET_ReactionTranslationMode.None;
(* Module Slave3 *)
aetReactionTranslationMode[c_udiSlave3] := TPL.ET_ReactionTranslationMode.Jobs;
(* forward reaction 1 to TPL.Gc_udiMaxNumberOfReactions without translation *)
TPL.FC_AddReactionTranslationJob(
i_udiSourceStart := 1,
i_udiNumReactions := TPL.Gc_udiMaxNumberOfReactions,
i_udiTargetStart := 1,
iq_stReactionTranslationJobs := astReactionTranslationJobs[c_udiSlave3]);
(* translate reaction 19 as 2 *)
TPL.FC_AddReactionTranslationJob(
i_udiSourceStart := 19,
i_udiNumReactions := 1,
i_udiTargetStart := 2,
iq_stReactionTranslationJobs := astReactionTranslationJobs[c_udiSlave3]);