Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched.
Close
In diesem Thread möchten wir Beispiele und Rezepte sammeln, wie man komplexere Vorgänge in der CoDeSys Scriptsprache implementieren kann.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2011-04-04
Originally created by: M.Schaber
Dieses Beispiel ist eine Weiterentwicklung des Beispiel 1 aus der Dokumentation.
Der Einsatzzweck: Aus einem externen Programm oder einer Batchdatei heraus wird eine Variable aus einer Steuerung ausgelesen, und auf der Standardausgabe ausgegeben, damit sie vom Aufrufer ausgewertet werden kann, zum Beispiel:
\# coding=utf-8
\# Da wir in den Kommentaren Umlaute verwenden, müssen wir das Encoding des Quelltextes
\# angeben.
\# Wir nutzen die Python 3 Variante von printfrom__future__importprint_function Â
\# Unsere Projektdatei liegt im Data-Unterverzeichnis aus dem Verzeichnis,
\# in dem das Skript liegt, wir hangeln uns also relativ den Pfad entlang.importosscriptdir=os.path.dirname(__file__)# Da liegt unser Skript.datadir=os.path.join(scriptdir,"Data")# ins Unterverzeichnis rein.projectpath=os.path.join(datadir,"Ampel.project")# Und den Projektnamen dran.
\# jetzt können wir unser Projekt öffnen.proj=projects.open(projectpath)
\# Wir holen die aktive Applikation (aus dem Ampel-Projekt)app=proj.active_application
\# Und die entsprechende online-Applikation dazu.onlineapp=online.create_online_application(app)
\# Wir loggen uns aufs Gerät ein.onlineapp.login(OnlineChangeOption.Try,True)
\# Falls die Applikation noch nicht läuft, starten wir sie.ifnotonlineapp.application_state==ApplicationState.run:  onlineapp.start()
\# Wir geben der Applikation etwas Zeit zum Arbeiten.system.delay(1000)
\# Und lesen den Vert der gewünschten Variable ausvalue=onlineapp.read_value("PLC_PRG.iVar1")
\# Wir geben den Wert auf der Standardausgabe aus, damit unser Aufrufer
\# den Wert weiterbearbeiten kann.print(value)
\# Und räumen am Ende auch schön auf.onlineapp.logout()proj.close()
Das ganze sieht von einem CMD-Fenster aus dann wie folgt aus:
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2011-04-04
Originally created by: M.Schaber
Gerade wenn man Scripte über die Kommandozeile heraus aufruft, wäre es manchmal nützlich, wenn man Parameter an die Skripte übergeben könnte.
Als Workaround für diese Funktionalität kann man mit Environment-Variablen arbeiten:
from__future__importprint_functionimportosprint("project to open: ",os.environ["PROJECT"])
\# Wir gehen hier davon aus, dass die App auf dem Device bereits am laufen ist:proj=projects.open(os.environ["PROJECT"])onlineapp=online.create_online_application(proj.active_application)onlineapp.login(OnlineChangeOption.Try,True)print("variables to read:")forvarinos.environ["VARIABLES"].split(","):Â Â print("Â Â ",var," = ",onlineapp.read_value(var))
Das kann man dann z. B. aus einer Batch-Datei wie folgt aufrufen:
C:\ProgramFiles\3SCoDeSysV3.4SP3\CoDeSys\Common>d:\TestScripts\Forum_Environment.batprojecttoopen: D:\TestScripts\Data\OnlineTest.project------Buildstarted: Application: CoDeSys_Control_Win_V3.Application-------TheapplicationisuptodateBuild: Information: Sizeofgeneratedcode: 6453bytesBuild: Information: Sizeofglobaldata: 2606bytesBuild: Information: Totalallocatedmemorysizeforcodeanddata: 12505bytesBuild: Information: Memoryarea0contains Data, Input, Output, MemoryandCode: highestusedaddress: 1048576, largestcontiguousmemorygap: 1036071(98%)Compilecomplete--0errors, 0warningsvariablestoread:
   POU.testint = INT#1
   POU.testoutput = INT#3C:\ProgramFiles\3SCoDeSysV3.4SP3\CoDeSys\Common>
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2011-04-04
Originally created by: M.Schaber
Im Moment kann man Geräte per Skript nur anhand der Device ID hinzufügen. Wenn man die Device ID eines Gerätes nicht weiß, kann folgendes Skript dabei helfen. Man fügt das Gerät ins aktuelle Projekt ein, und startet das Skript:
\# Prints out all devices and other objects in the currently open project.
\# We enable the new python 3 print syntaxfrom__future__importprint_function
\# define the printing functiondefprinttree(treeobj,depth=0):Â Â name=treeobj.get_name(False)Â Â Â Â iftreeobj.is_device:Â Â Â Â deviceid=treeobj.get_device_identification()Â Â Â Â print("{0} - {1} {2}".format("Â Â "*depth,name,deviceid))Â Â Â Â forchildintreeobj.get_children(False):Â Â Â Â printtree(child,depth+1)forobjinprojects.primary.get_children():Â Â printtree(obj)print("--- Script finished. ---")
Die Ausgabe sieht dann so aus:
-CoDeSys_Control_Win_V3DeviceID(type=4096,Id='0000 0001',Version='3.4.2.0')Â Â -CANbusDeviceID(type=15,Id='181015',Version='3.4.2.0')Â Â Â -CANopen_ManagerDeviceID(type=16,Id='181016',Version='3.4.2.0')--- Script finished. ---
Und schon kennt man die Device ID des gesuchten Gerätes.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2011-04-04
Originally created by: M.Schaber
Einige Anwender möchten sich die Ausgangsbasis für ihre Projekte gerne aus einem Subversion-Repository holen.
Das folgende Beispiel (das auch dem Beispiel 4 in der Dokumentation entspricht) erzeugt ein neues Projekt, und fügt darin via PLCOpenXML ein Gerät ein:
\#ImportsaDeviceinPLCOpenXMLfromSubversionviacommandlinesvnclient.\#Weenablethenewpython3printsyntaxfrom__future__importprint_functionimportsys,os\#somevariabledefinitions:SVNEXE=r"C:\ProgramFiles\Subversion\bin\svn.exe"XMLURL = "file:///D:/testrepo/testfolder/TestExport.xml"PROJECT = r"D:\test.project"\#cleanupanyopenproject:ifprojects.primary:
  projects.primary.close()\#Fetchtheplcopenxmldatafromsubversion.\#The'with'constructautomaticallyclosestheopenpipeforus.withos.popen('"'+SVNEXE+'" cat '+XMLURL,'r')aspipe:
  xmldata=pipe.read()\#createanewproject:proj=projects.create(PROJECT)\#createtheimportreporterclassReporter(ImportReporter):
  deferror(self,message):
    system.write_message(Severity.Error,message)
  defwarning(self,message):
    system.write_message(Severity.Warning,message)
 Â
  defresolve_conflict(self,obj):
    returnConflictResolve.Copy
 Â
  defadded(self,obj):
    print("added: ",obj)
  defreplaced(self,obj):
    print("replaced: ",obj)
  defskipped(self,obj):
    print("skipped: ",obj)
   Â
  @property
  defaborting(self):
    returnFalse\#createtheimporterinstance.reporter=Reporter()   Â
\#importthedataintotheproject.proj.import_xml(reporter,xmldata)\#andfinallysave.:-)proj.save()print("--- Script finished. ---")
Den dazu notwendigen Kommandozeilen-Client für Subversion gibt es von verschiedenen Anbietern frei herunterzuladen. Die Subversion Download-Seite enthält Links zu einigen davon, im Cygwin-Projekt ist ein weiterer enthalten.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Originally created by: M.Schaber
In diesem Thread möchten wir Beispiele und Rezepte sammeln, wie man komplexere Vorgänge in der CoDeSys Scriptsprache implementieren kann.
Originally created by: M.Schaber
Dieses Beispiel ist eine Weiterentwicklung des Beispiel 1 aus der Dokumentation.
Der Einsatzzweck: Aus einem externen Programm oder einer Batchdatei heraus wird eine Variable aus einer Steuerung ausgelesen, und auf der Standardausgabe ausgegeben, damit sie vom Aufrufer ausgewertet werden kann, zum Beispiel:
Und hier das eigentliche Programm:
Das ganze sieht von einem CMD-Fenster aus dann wie folgt aus:
Originally created by: M.Schaber
Gerade wenn man Scripte über die Kommandozeile heraus aufruft, wäre es manchmal nützlich, wenn man Parameter an die Skripte übergeben könnte.
Als Workaround für diese Funktionalität kann man mit Environment-Variablen arbeiten:
Das kann man dann z. B. aus einer Batch-Datei wie folgt aufrufen:
Das Ergebnis sieht dann so aus:
Originally created by: M.Schaber
Im Moment kann man Geräte per Skript nur anhand der Device ID hinzufügen. Wenn man die Device ID eines Gerätes nicht weiß, kann folgendes Skript dabei helfen. Man fügt das Gerät ins aktuelle Projekt ein, und startet das Skript:
Die Ausgabe sieht dann so aus:
Und schon kennt man die Device ID des gesuchten Gerätes.
Originally created by: M.Schaber
Einige Anwender möchten sich die Ausgangsbasis für ihre Projekte gerne aus einem Subversion-Repository holen.
Das folgende Beispiel (das auch dem Beispiel 4 in der Dokumentation entspricht) erzeugt ein neues Projekt, und fügt darin via PLCOpenXML ein Gerät ein:
Den dazu notwendigen Kommandozeilen-Client für Subversion gibt es von verschiedenen Anbietern frei herunterzuladen. Die Subversion Download-Seite enthält Links zu einigen davon, im Cygwin-Projekt ist ein weiterer enthalten.