TwinCAT 2: automatisieren von Projektdownload?

LowLevelMahn

Level-2
Beiträge
767
Reaktionspunkte
90
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich soll für einen Test ein Programmdownload wie in TwinCAT PLC Control/Online/Download automatisieren - oder auch nur ein Programmupdate der SPS

das Projekt liegt fertig vor und muss nur in die SPS übertragen werden

Programmiersprache ist egal - mittels C/C++,C#,VB,ActiveX/COM - also was auch immer

geht das mit TwinCAT 2?

hat jemand ein Beispiel, Links?
 
Zuletzt bearbeitet:
Hallo LowLevelMahn,
ich war mal bei der ABB für die Testautomatisierung der AC500 verantwortlich deren Entwicklungsumgebung (Automation Builder) damals genau wie TwinCAT 2 auf Codesys 2 basiert. Codesys 2 lässt sich sehr gut über Kommandozeilenbefehle steuern. Ich hatte damals ein C#-Programm geschrieben das dem Automation Builder beim Aufruf entsprechende Optionen übergeben hatte und dann via Netzwerk mit der Steuerung kommuniziert hatte. Später hatte ABB eine Zwitterlösung eingeführt, die Hardware wurde unter Codesys 3 konfiguriert, das Programm jedoch noch unter TC2. Das machte die Sache etwas komplizierter und ich nutzte zusätzlich noch AutoIt um den Codesys 3 Teil fernzusteuern.
Ich habe mal kurz im Infosys nachgeschaut, es gibt auch bei TC2 die Möglichkeit über die Kommandozeile zu arbeiten, allerdings konnte ich auf die Schnelle nicht herausfinden, wie umfangreich diese Möglichkeiten sind.
 
Danke für eure Hilfe - hab mir jetzt ein C# Programm gebaut und das funktioniert auch recht gut

Offene Fragen: Es scheint so als wenn Beckhoff keinerlei Feedback-Features in die API eingebaut hat und wenn ich zu schnell Anforderungen stellen kommt es z.B. mit dem SystemManager uzu COM-Exceptions
Gibt es eine Möglichkeit um auf die Thread.Sleeps(mit empirischen Zeiten) zu verzichten - also eine Statusabfrage ob Funktion vollständig ausgeführt ist oder sowas?

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;


using TCatSysManagerLib;
using System.Reflection;
using System.IO;


namespace download_test
{
  class Program
  {
    private static void PlcControlLoginDownload(string TCatPlcCtrl_exe_path, string project_file_path, string command_file_path)
    {
      Process process = new Process();
      process.StartInfo.FileName = TCatPlcCtrl_exe_path;
      process.StartInfo.Arguments = string.Format("{0} /cmd {1}", project_file_path, command_file_path);
      process.Start();
      bool ok = process.WaitForExit(5000);
      Debug.Assert(ok);
    }


    private static void SystemManagerActivateConfiguration(string _tsmPath)
    {
      try
      {
        ITcSysManager _sysManager = new TcSysManager();
        _sysManager.OpenConfiguration(_tsmPath);
        System.Threading.Thread.Sleep(2000); // nicht zu schnell sonst wird der SystemManager nicht fertig (COM-Exception)
        _sysManager.ActivateConfiguration();
        _sysManager.StartRestartTwinCAT();
        System.Threading.Thread.Sleep(10000); // nicht zu schnell sonst wird der SystemManager nicht fertig
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex.ToString());
        Debug.Assert(false);
      }
    }


    private static void TestRun(string tsmPath, string TCatPlcCtrl_exe_path, string project_file_path, int rounds)
    {
      string command_file_path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + @"\commands.txt";


      string[] lines = { "query off ok", "online login", "online run", "file quit" };
      string content = string.Join("\r\n", lines) + "\r\n";
      File.WriteAllText(command_file_path, content);


      for (int i = 0; i < rounds; ++i)
      {
        SystemManagerActivateConfiguration(tsmPath);


        PlcControlLoginDownload(TCatPlcCtrl_exe_path, project_file_path, command_file_path);
      }
    }


    static void Main(string[] args)
    {
      string tsmPath = @"D:\projects\beckhoff\testprojekt\hw.tsm";


      string TCatPlcCtrl_exe_path = @"C:\TwinCAT\Plc\TCatPlcCtrl.exe";
      string project_file_path = @"D:\projects\beckhoff\testprojekt\sw.pro";


      TestRun(tsmPath, TCatPlcCtrl_exe_path, project_file_path, 10);
    }
  }
}
 
eigentlich ist es genau umgedreht. Die Batch-Schnittstelle vom PLC Control gibt keine bzw. nicht viele Rückmeldung. Das SystemManager-Inferface schon!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
eigentlich ist es genau umgedreht. Die Batch-Schnittstelle vom PLC Control gibt keine bzw. nicht viele Rückmeldung. Das SystemManager-Inferface schon!


Es geht mir nicht um Rückgaben - nebenbei gesagt sind alle Funktionen die ich vom SystemManager nutze void - also gar keine Rückgaben
sondern darum wann die Funktionen wirklich abgeschlossen sind - PlcControl blockiert sauber bis alles durch ist
aber die SystemManager-Funktionen scheinen teilweise nur asynchrone Operationen anzustoßen (sind also nicht 100% blockierend) - wenn ich die Funktionen in einer Schleife aufrufe und keine Sleeps drinn habe kommen z.B. Exceptions
wenn ich zu schnell ActivateConfigruation nach OpenConfiguration aufrufe und wenn ich StartRestartTwinCAT aufrufe ist nach dem Funktionsende die SPS noch nicht hochgefahren - sehr unschön - besondern wenn ich kleine und grosse Projekte im Test habe die verschieden lange brauchen - und ich eben schnell durchtesten will und nicht überall zur Absicherung Minuten warten will - und es dann trotzdem nicht wirklich sicher/sauber ist
 
Zuletzt bearbeitet:
die Funktionen liefern nur COM-Fehler - und dieses kommen unter .Net als Execptions - daher keine Rückgabewerte

die Exceptions sind aber nicht mein Problem - sondern nur das Ergebnis weil ich zu schnell weiter mache - weil die Funktion nicht wirklich bis zum Abschluss blockieren

ich finde keine Routine mit der ich das wirkliche Ende von der durch OpenConfiguration() angestossenen Operation abwarten kann

oder wie kann ich darauf Warten das die SPS nach
StartRestartTwinCAT() wieder komplett da ist? damit ich dann mein Programm mit PLC Control übertragen kann und die SPS auf RUN Stellen?

Ich mag kein Sleep im Code um das zurecht zu biegen

 
Zuviel Werbung?
-> Hier kostenlos registrieren
die Funktionen liefern nur COM-Fehler - und dieses kommen unter .Net als Execptions - daher keine Rückgabewerte

Auszug aus der Doku:
"ITcSysManager::StartRestartTwinCATThe StartRestartTwinCAT() method starts or restarts the TwinCAT System. If TwinCAT is already started, the function performs a restart, if TwinCAT is stopped it performs a start.
HRESULT StartRestartTwinCAT();
Return Values

S_OK function returns successfully.
E_FAIL TwinCAT could not be started."


Für mich sieht das nach einem Rückgabewert aus und nicht nach COM-Fehlern, aber gut.
 
Was habt ihr nur mit dem Return-Wert? in .Net werden alle COM-Fehler von Microsoft auf Exceptions gemappt - das kann man gar nicht verhindern - und es kommt keine Exception

d.h. die Routinen liefern S_OK - solange ich zwischen OpenConfiguration() und ActivateConfigruation() ein Sleep einbauen

aber weil ein S_OK von
OpenConfiguration() eben leider nicht bedeutet 100% fertig - sondern höchst wahrscheinlich nur das die Operation angestoßen wurde schlägt dann manchmal das darauf folgende ActivateConfigruation() fehlt (E_FAIL also .Net-Exception)

und ich finde keine Möglichkeit auf das vollständige
OpenConfiguration() zu warten - außer mit Sleep

bei der
StartRestartTwinCAT() genau das gleiche - die SPS fängt sofort an neu zu starten - aber ist noch lange nicht fertig wenn die StartRestartTwinCAT() schon mit S_OK (keine Exception) nach 7ms zurückgekommen ist

 
Zuletzt bearbeitet:
Hallo LowLevelMahn,
bitte akzeptiere, dass wir nicht mal eben nebenbei ein C# Programm erstellt haben, sorry. Sowohl KGU als auch ich haben lediglich ins Infosys geschaut und diese Rückgabewerte gesehen. Für uns (zumindest für mich), sah es so aus, dass diese Werte gemeldet werden, wenn die Funktion erfolgreich beendet wurde.
 
Zurück
Oben