Beispiel26: Ausführungsreihenfolge in einer Task
Dieser Artikel beschreibt die Bestimmung der Taskausführungsreihenfolge, wenn einer Task mehr als ein Modul zugeordnet ist.
Download
Hier erhalten Sie den Quellcode für dieses Beispiel.
- 1. Entpacken Sie die heruntergeladene ZIP-Datei.
- 2. Öffnen Sie mittels eines Visual Studios, in dem TwinCAT installiert ist, das Projekt über Open Project ….
- 3. Konfigurieren Sie das Signieren für dieses Projekt, indem Sie auf der Seite unter Rechtsklick auf dem Projekt->Properties->Tc Sign die TwinCAT Signierung anschalten und Ihr Zertifikat und ggf. Passwort konfigurieren.
Weitere Informationen zur Signierung der C++ Projekte erhalten Sie hier. - 4. Wählen Sie Ihr Zielsystem aus.
- 5. Bauen Sie das Beispiel (z. B. Build->Build Solution).
- 6. Aktivieren Sie die Konfiguration mit einem Klick auf .
- Das Beispiel ist einsatzbereit.
Beschreibung
Das Beispiel enthält das Modul SortOrderModule das zwei Mal instanziiert wird. Die Sortierreihenfolge bestimmt die Ausführungsreihenfolge, die über den TwinCAT Module Instance Configurator konfiguriert werden kann.
Zum Beispiel verfolgt die Methode CycleUpdate den Objekt-Namen und die Objekt-ID zusammen mit der Sortierreihenfolge dieses Moduls. Auf dem Konsolenfenster kann man die Ausführungsreihenfolge sehen:
Im Beispiel ist eine Instanz mit Sort Order 150 und eine mit 170 konfiguriert, während beide Instanzen einer Task zugeordnet sind.
Das Beispiel verstehen
- Ein TcCOM C++ Modul mit zyklischem IO.
- 1. Das Modul benötigt einen kontextbasierten Parameter Sort order of task, der automatisch „PID_Ctx_TaskSortOrder“ als Namen auswählen wird.
Beachten Sie, dass der Parameter ein Alias (Spezifikation) zum Datentyp UDINT sein muss: - 2. Starten Sie den TMC Code Generator, um die Standardimplementierung zu erhalten.
- 3. Da der Code im nächsten Schritt geändert werden wird, deaktivieren Sie die Kodegenerierung für diesen Parameter jetzt.
- 4. Vergewissern Sie sich, dass Sie die Änderungen übernehmen, bevor Sie den TMC Code Generator erneut starten:
Werfen Sie einen Blick auf das CPP Modul (SortOrderModule.cpp im Beispiel). Die Instanz des Smart Pointers des zyklischen Aufrufers beinhaltet Informationsdaten, zu denen ein Feld für die Sortierreihenfolge gehört. In diesem Feld wird der Parameterwert gespeichert.
///////////////////////////////////////////////////////////////////////////////
// Set parameters of CSortOrderModule
BEGIN_SETOBJPARA_MAP(CSortOrderModule)
SETOBJPARA_DATAAREA_MAP()
///<AutoGeneratedContent id="SetObjectParameterMap">
SETOBJPARA_VALUE(PID_TcTraceLevel, m_TraceLevelMax)
SETOBJPARA_ITFPTR(PID_Ctx_TaskOid, m_spCyclicCaller)
///</AutoGeneratedContent>
SETOBJPARA_TYPE_CODE(PID_Ctx_TaskSortOrder, ULONG, m_spCyclicCaller.GetInfo()->sortOrder=*p) //ADDED
//generated code: SETOBJPARA_VALUE(PID_Ctx_TaskSortOrder, m_TaskSortOrderContext1Parameter)
END_SETOBJPARA_MAP()
///////////////////////////////////////////////////////////////////////////////
// Get parameters of CSortOrderModule
BEGIN_GETOBJPARA_MAP(CSortOrderModule)
GETOBJPARA_DATAAREA_MAP()
///<AutoGeneratedContent id="GetObjectParameterMap">
GETOBJPARA_VALUE(PID_TcTraceLevel, m_TraceLevelMax)
GETOBJPARA_ITFPTR(PID_Ctx_TaskOid, m_spCyclicCaller)
///</AutoGeneratedContent>
GETOBJPARA_TYPE_CODE(PID_Ctx_TaskSortOrder, ULONG, *p=m_spCyclicCaller.GetInfo()->sortOrder) //ADDED
//generated code: GETOBJPARA_VALUE(PID_Ctx_TaskSortOrder, m_TaskSortOrderContext1Parameter)
END_GETOBJPARA_MAP()
- 5. In diesem Beispiel werden Objekt-Name, -Id und SortOrder zyklisch verfolgt:
// TODO: Add your cyclic code here
m_counter+=m_Inputs.Value;
m_Outputs.Value=m_counter;
m_Trace.Log(tlAlways, FNAMEA "I am '%s' (0x%08x) w/ SortOrder %d ", this->TcGetObjectName(), this->TcGetObjectId() , m_spCyclicCaller.GetInfo()->sortOrder); //ADDED
- 6. Die Sortierreihenfolge kann auch als 4. Parameter der Methode ITcCyclicCaller::AddModule() übergeben werden, die in CModuleA::AddModuleToCaller() verwendet wird.
- 7. Weisen Sie den Instanzen dieses Moduls eine Task mit langsamen Zyklusintervall (z.B. 1000ms) zu, um die Verfolgungsmeldungen an das TwinCAT Engineering System zu begrenzen.
- 8. Weisen Sie jeder Instanz eine andere Sortierreihenfolge über den TwinCAT Module Instance Configurator zu: