ControlDesk 5.1 Python-Script

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
SamuelBerger
User
Beiträge: 1
Registriert: Donnerstag 16. Juni 2016, 17:49

Grirzi! :)

Ich arbeite zurzeit mit ControlDesk 5.1 einer dSPACE Echtzeitsimulation.
In Controldesk ist es möglich ein Python-Script auszuführen... Die Anwendungsmöglichkeiten scheinen nahezu unendlich zu sein.
Mein Ziel ist es eine Variable, welche auf Simulink erstellt wurde, über ein Script in ControlDesk einen bestimmten Wert zu zuweisen und eine andere auszulesen.
Das Script soll alle 5 Sekunden den Wert der Variablen erneut auf 1 setzen und eine Sekunde später wieder auf 0 (Flankensteuerung).
Das funktioniert auch schon.
Nun besteht die Schwierigkeit die Variable in Controldesk aufzurufen und ihr die Werte zuzuordnen bzw. die andere auszulesen.
Hat von euch einer Erfahrung mit dieser Problematik?

Wie definiere ich den Pfad korrekt so, dass auf meine Variable geschrieben wird?

Der Variablen-Pfad laut ConrolDesk:
'ds1006()://Model Root/Testsystem/Rechnen/Lastmoment1/M8_alpha/Rotation/Value'


Das dazugehörige Programm: (anscheinend funktioniert der 'Tab' hier nicht; alles unterhalb der while-Schleife ist eingerückt)
('x' soll zu späterem zeitpunkt mal der Variablenpfad/die Variable sein.)

Code: Alles auswählen

if __name__=="__main__":	
	from time import *							# sekundenzähler importieren 
	x = 1										# 'x' für Variablenpfad aus Controldesk Status_Verschiebung  [Out1] (read) 
												#		On-Button schaltet ein; Off-Button schaltet aus
	start_time = int(time ())
	counter = 1	 # durchlaufzähler
	
	while x == 1:								# solange der AutoStart an ist ... [Status_Verschiebung [Out1]]
		    timer = int(time())								# Zeit in Sekunden
												
		    value = 1									# wert auf 1 setzen; 'value' als Variablenpfad der zu schreibenden Variablen 
													#		Status_Verschienung_ [Value]	(write)			
		
		    counter = counter+1							# durchläufe um 1 hochzählen
	
		    sleep(1)									# 1 sec nach wert = 1 setzen 
		    value = 0									#  wert auf 0 setzen; 'value' als Variablenpfad der zu schreibenden Variablen 
													#		Status_Verschienung_ [Value]	(write)
		    sleep (4) 									# sobald die sekundenanzahl sich ohne rest durch 30 teilen lässt (alle 30 sec; 1+29)
Zuletzt geändert von Anonymous am Donnerstag 16. Juni 2016, 19:53, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@SamuelBerger: Wie man oben sieht ist es keine gute Idee zu lange Zeilen zu haben das ist in den unterschiedlichsten Umgebungen (hier, Terminalfenster, E-Mails, Textdokumente, …) schnell durch diesem Kammeffekt sehr schlecht zu lesen. Daraus folgt, das Kommentare am Zeilenende keine gute Idee sind, solange sie nicht kurz sind beziehungsweise zusammen mit dem Code nicht zu lang werden.

Kommentare sollten ferner inhaltlich stimmen und nicht das offensichtliche was im Code schon steht wiederholen. Faustregel: Ein Kommentar sollte nicht sagen *was* getan wird, das macht der Code schon, sondern *warum* es so gemacht wird wie es dort im Code steht.

Der erste Kommentar ist schon irreführend, weil Da kein Sekundenzähler importiert wird, sondern alle 17 Namen aus dem `time`-Modul. Von denen dann nur *zwei* tatsächlich verwendet werden. Sternchen-Importe sollte man vermeiden. Das macht das Programm unübersichtlich, weil man nicht mehr so leicht sieht was wo definiert wurde, und die Gefahr von Namenskollisionen besteht.

Importe stehen üblicherweise am Anfang des Moduls, damit man leicht sieht wovon ein Modul abhängt.

Auf Modulebene sollten nur Konstanten, Funktionen, und Klassen definiert werden. Das Hauptprogramm steht üblicherweise in einer Funktion mit dem Namen `main()`.

Zum eigentlichen Problem: Da muss es ja irgendeine API geben; ist die nicht dokumentiert? Python kennt ControlDesk ja nicht, also solange diese Anwendung Python nicht einbettet und/oder irgeneine API anbietet, kann man da nichts machen. Gegen einbetten spricht IMHO das ``if __name__ …``, denn das sieht so aus als wenn das Modul eigenständig als Programm laufen soll.
Antworten