TAM Tama – Echtzeit-Programmierung in C#

Tama

Die Triamec Servo-Drives, I/O-Controller und Adapter sind für kundenspezifische Anwendungen frei programmierbar. Dazu stehen zwei Tasks zur Verfügung:

  • Isochroner Task im 10kHz Takt
  • Asynchroner Task
Tama Programmierung auf Triamec Produkten - auf dem Host-PC können auch Echtzeit-Umgebungen statt des .NET-Frameworks eingesetzt werden.
Tama Programmierung auf Triamec Produkten - auf dem Host-PC können auch Echtzeit-Umgebungen statt des .NET-Frameworks eingesetzt werden.

Entwickelt wird mit C# in Microsoft Visual Studio, das den Code in die Zwischensprache CIL übersetzt. Auf den Triamec Geräten ist eine Virtuelle Maschine (TamaVM) installiert, die diese genormte Sprache interpretiert und in Echtzeit ausführt.

Ein Tama-Programm kann zur Laufzeit in die Geräte geladen und danach zur Ausführung gebracht werden. Für eigenständige Applikationen ohne PC-Verbin­dung können Tama-Programme auch in den Geräten persistent gespeichert werden. Tama-Programme haben Zugriff auf alle Register des ausführenden Gerätes sowie auf zyklisch übermittelte Koppeldaten anderer Geräte.

Eigenschaften von Tama Programmen

  • Robuste Laufzeitumgebung: Virtuelle Maschine im Gerät ("Absturzsicher")
  • Zwei Tasks: Ein 10kHz Echtzeit- und ein asynchroner Task
  • Harte Echtzeit im 10kHz-Takt
  • Strenge Typ-Sicherheit
  • Datentypen: int, float, bool, enum, struct, object, array
  • Zugriff auf Geräte-Register mit IntelliSense-Funktion von Visual Studio
  • Mathematische Funktionen
  • Interaktion mit PC-Anwendung oder Tama-Programmen auf anderen Geräten
  • Neue Programme können zur Laufzeit geladen und ausgeführt werden
  • Persistenz erlaubt autonomen Betrieb ohne PC

Typische Anwendungen

  • Homing Sequenzen, Anschlag-Erkennung
  • Achskopplungen (z.B. Portale)
  • Kinematik-Berechnungen (z.B. Parallel-Kinematik eines Delta-Roboters)
  • Ablaufsteuerungen für einfache Stand-alone Anwendungen (z.B. Kraftgeführte Presse)
  • Dual Loop Regelungen (auch zusammen mit anderen Servo-Drives)
  • Parameter-Adaption (für die Regelung, Gain-Scheduling)
  • Überwachungsfunktionen und andere Echtzeit­reaktionen der Maschine

Tama Programm Entwicklung

Tama Programm Entwicklung in VisualStudio
Tama Programm Entwicklung in VisualStudio

Tama Programme können in jeder Microsoft® .NET Sprache (Visual C#, C++ und Visual Basic) mit Microsoft Visual Studio® entwickelt werden. Tama Programme lassen sich auf allen Triamec Servo-Drives ausführen.

Microsoft® stellt das Visual Studio® mit verschiedenen Sprachen in den Express-Editionen gratis zur Verfügung.

Das Tama Benutzerhandbuch finden sie in den Manuals.

Tama Beispielprogramme

Ein Template für die Erstellung eines neuen Tama Programms sowie etliche Beispiele finden sich auf unserem GitHub Auftritt. Solche Repositories sind mit dem Tama Program Schildchen Schildchen versehen.

In der nachfolgenden Sektion wird ein Tama Beispielprogramm gezeigt um einen Einblick in die Tama-Programmierung zu erhalten. Das Beispiel zeigt ein einfaches Programm im isochronen Task mit den Grundprinzipien der Tama Programmierung und dem Zugriff auf Drive-Register.

Beispielprogramm für den Zugriff auf Register

using Triamec.Tama.Rlid19; // required for register access using Triamec.Tama.Vmid5; // required for interpretation of Tama task attributes [Tama] // attribute to indicate the starting point for the Tama compiler static class D1_MinimalTama // name of the tama program { /***************************************************************** * members *****************************************************************/ static float actualPosition; /***************************************************************** * isochronous main task *****************************************************************/ [TamaTask(Task.IsochronousMain)] // attribute to indicate the entry point and the task type static void Main() // main function, name is not relevant { // your code actualPosition = (float)Register.Axes_0.Signals.PositionController.MasterPosition; // type of position is doup Register.Application.Variables.Floats[0] = actualPosition; // use a generic register to display the position Register.Application.Variables.Booleans[1] = Register.Application.Variables.Booleans[0]; // reflect boolean 0 to boolean 1 } }