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 Beispiel26: Ausführungsreihenfolge in einer Task 1:.
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:

Beispiel26: Ausführungsreihenfolge in einer Task 2:

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:
Beispiel26: Ausführungsreihenfolge in einer Task 3:
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. Beispiel26: Ausführungsreihenfolge in einer Task 4:
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: Beispiel26: Ausführungsreihenfolge in einer Task 5: