In Visual Basic gibt es den schönen Befehl "doevents".
Ich denke, der hs_main macht solche doevents (also quasisimultanes Abarbeiten mehrerer Tasks), kommt aber nicht mehr dazwischen, wenn das alles in einer Zeile steht.
Ankündigung
Einklappen
Keine Ankündigung bisher.
ByteCode Logikbaustein (opt. Lizenzprüfung)
Einklappen
X
-
Hey Nils!
Ich denke, dass der Unterschied folgender ist:
während bei der Struktur
if ...
mach
if ...
mach 2
if ...
mach 3
...
zwischen jedem if auch noch andere Dinge abgearbeitet werden
wie Telegrammversand, Abarbeitung anderer Bausteine, etc., wird bei
if ...
mach
mach 2
mach 3
zwischendurch nichts anderes gemacht...
Das ist aber i.O., solange man dass bei der Programmierung im Hinterkopf behält. Unbenommen davon ist jedoch, dass durch deine Arbeit in Zukunft deutlich mehr Möglichkeiten der Bausteinprogrammierung zur Verfügung stehen...
Einen Kommentar schreiben:
-
Ja Michel ich geb dir Recht das man das nicht unsachgemäß verwenden sollte, dies hat sich aber gegenüber der "normalen" Bausteine keineswegs geändert.
Wir kennen alle die loops die schon mehrere HS lahmgelegt haben
Also kurze Erklärung wie der HS die Logik IMHO abarbeitet.
Das was ich jetzt mit dem eval mit compiliertem oder auch nicht compiliertem code (was bei Ausführungszeit ehh egal ist da dann alles ein codeobject ist (bytecode)Code:MAIN LOGIK LOPP LOGIKBAUSTEIN1 5012erZeile "EN[1]==2 or EI...."|"__import__('irgendwas').function.. das EN[1]==2.... wird zu mit compile(...) zu einem codeobject wir nennen es mal wenn ; if eval(wenn): der code __import__ irgendwas wir auch zu einem codeobjet (mach) eval(mach) LOGIKBAUSTEIN2 5012erZeile "EN[1]==2 or EI...."|"__import__('irgendwas').function.. ......... ........ LOGIKBAUSTEIN3 5012erZeile "EN[1]==2 or EI...."|"__import__('irgendwas').function.. ...... ......
Die jetzt möglichen Schleifen können also dazu führen das die nachfolgenden Formelzeilen, als auch nachfolgenden Logikbausteine nicht abgearbeitet werden.
Das kann ich aber auch so ohne eval/exec mit z.B.
ACHTUNG NICHT NACHMACHEN
Code:5012|0|"OC[1] or EI"|"__import__('time').sleep(10)"|"1"|0|1|0|0
Die Gefahr ist aus meiner Sicht immer die gleiche, jedoch ergibt sich daraus
das nicht jede Formelzeile erneut mit einem if überprüft werden muss sogar noch eine Beschleunigung der Abarbeitung.
Ich werd die nächsten Tage vielleicht mal ein Benchmarkbaustein bauen.
ist doch klar das ein
länger braucht alsCode:if EN[1]=1: mach was if EN[1]=1: mach was anderes if EN[1]=1: mach noch was anderes
das Ergebnis ist jedoch das selbe.Code:if EN[1]=1: mach was mach was anderes mach noch was anderes
Wenn jemand darüber diskutieren möchte, bitte.... gerne auch per PN
Einen Kommentar schreiben:
-
Tja, damit ist mein Weihnachtsurlaub ja "gerettet"...
Hoffentlich "klaut" sich GIRA ja ein wenig von deinem Logik-Generator (besonders vom letzten "Streich").
Einen Kommentar schreiben:
-
[WARNUNG]Die Nutzung dieser Möglichkeit kann bei unsachgemäßer Anwendung euren HS/FS komplett lahmlegen!
Ich rate dringend davon ab, das auf produktiven HS/FS einzusetzen und/oder zeitkritische bzw. umfangreiche Aktionen in den Code zu packen!
Die Behandlung dieses Codes weicht vom HS-internen Standard erheblich ab!
[/WARNUNG]
Einen Kommentar schreiben:
-
[QUOTE=MarcNaroska;74481]Die Auswertung "EA!=EN" bedeutet also, dass bei Änderung eines beliebigen Eingangs was getan wird, oder?
Ja
Ja, aber auch EC[2] wie gewohntZitat von MarcNaroska Beitrag anzeigenHier kann ich aber auch (wie gewohnt) die Indizes setzen "EA[2]!=EN[2]", oder?
du kannst aber auch dann im code
if EC[2]:
machen und die dadurf aufgerufenen Zeilen mit einem Tab einrücken (siehe python doku if/for/while ...)
Ja mehrere Codezeilen gehen auchZitat von MarcNaroska Beitrag anzeigenDieses wiederum heißt doch auch, dass ich mehrere compilierte Codes in einen Baustein einbinden kann (um ggf. unterschiedliche Timer zu starten ;-) ). Oder kann man auch Timer innerhalb des compilierten Codes starten und "verwalten"?
Hab ich noch nicht getestet daher mein umweg, aber eigentlich müsste es gehen. versuch mal ON[x] auf einen Floatwert in Sekunden zu setzen
Ich würd die eine Formelzeile per Timer immer wieder aufrufen.Zitat von MarcNaroska Beitrag anzeigenDen Timer in deinem "Logikbaustein-Generator" würde ich dann dafür nutzen, um den Baustein zyklisch aufzurufen, oder?
also OC[1] or EI und dann in die Zeitformel 1 (oder weniger)
du kannst ja eine variable dann mit einem timestamp erstellen und damit vergleichen
k.A.Zitat von MarcNaroska Beitrag anzeigenGibt es eigentlich eine Längenbeschränkung für den compilierten Code?
Damit ihr noch ein bisschen mehr Spaß damit habt, hab ich mal ein Debug eingebaut
aufruf:
python.exe LogikGeneratorMeineLogik.py --debug --en1=12 --en2="TEST"
dürft euch selber denken was das macht
Angehängte Dateien
Einen Kommentar schreiben:
-
Super Sache !!!
Hallo Nils!
Damit kommst du jetzt an, wo doch mein Rolladenbaustein relativ "fertig" ist...
Jetzt muss ich ja die Ferien opfern, um den Baustein zu "migrieren" und die restlichen Funktionen, die mir vorschweben, aber nicht mit der HS-Baustein-Logik zu erschlagen waren, zu "coden"...
Das Paket klingt auf den ersten Blick (ohne es getestet zu haben) schon seeeeehr vielversprechend...
Ich habe aber noch ein paar Fragen:
Die Auswertung "EA!=EN" bedeutet also, dass bei Änderung eines beliebigen Eingangs was getan wird, oder? Hier kann ich aber auch (wie gewohnt) die Indizes setzen "EA[2]!=EN[2]", oder?
Dieses wiederum heißt doch auch, dass ich mehrere compilierte Codes in einen Baustein einbinden kann (um ggf. unterschiedliche Timer zu starten ;-) ). Oder kann man auch Timer innerhalb des compilierten Codes starten und "verwalten"?
Den Timer in deinem "Logikbaustein-Generator" würde ich dann dafür nutzen, um den Baustein zyklisch aufzurufen, oder?
Gibt es eigentlich eine Längenbeschränkung für den compilierten Code?
So, für den Anfang waren das glaube ich genug Fragen.
Aber keine Angst, wenn ich erstmal anfange, damit zu arbeiten, kommen bestimmt noch mehr ;-)
Einen Kommentar schreiben:
-
Logik Generator Template
So ich hab mal ein neues Template zum erstellen eigener Logiken gebaut.
Im oberern Teil können Name,Logik-ID... konfiguriert werden.
Es wird die xxxxx_Logikname.hsl mit der passenden logxxxx.html automatisch generiert und auch die md5 summen der dazugehörigen Datein werden in die xxxxx_Logikname.md5 Datei geschrieben.
Wünsche,Kritik,Verbesserungen erbeten !
Einen Kommentar schreiben:
-
Zum Zeigen habe ich jetzt noch nichts; ich arbeite daran
Aber jetzt stehen viele Möglichkeiten zur Verfügung, die zuvor unmöglich waren.
Mein z.Zt. persönlicher Favorit: in Logikbausteine bereits integrierte Webabfragen
Denk mal weiter....
Einen Kommentar schreiben:
-
Vielleicht wäre in bischen mehr "Input" hilfreich:
Wenn man sich die Anwendungen besser vorstellen könnte....
Wie wäre ein konkreter ANwendungsfall zum testen?
Einen Kommentar schreiben:
-
Das Abstimmungsergebnis bisher ist schon "witzig":
Offenbar fällt es nicht leicht, die Tragweite von NilsS' Erfindung zu erkennen. Ich habe bereits Logikbausteine vorliegen, die den HS in einer Dimension funktional erweitern, von der man bisher nur geträumt hat.
Insofern hat Christian recht mit dem Weihnachtsgeschenk, ich würde sogar sagen, Weihnachten und Ostern zusammen!
Einen Kommentar schreiben:
-
Oh, da habe ich schon einiges halbfertiges auf der Platte, was bisher wegen der Einzeilenbeschränkung nicht ging und ich auch über diverse Umwege nicht hinbekommen habe.
Good Job Nils!
Einen Kommentar schreiben:
-
Schönes Weihnachtsgeschenk !!!!!!
Danke Nils!
Das ist ja ein schönes (Vor-) Weihnachstgeschenk - da haben wir über die Tage ne Menge zum Testen und Basteln
Ich bin mal gespannt, was noch alles daraus so entsteht............
Einen Kommentar schreiben:
-
Das binär compilieren hat nicht nur Gründe des Closed Source
wo ich gerade sehen das der ein oder andere das gleich klickt.
Ich hab schon diverse Ideen die einfach nicht uncompiliert laufen.
z.B.
Fehler mit try: except abfangen
for/while Schleifen
python functionen die nicht eine Variable zurückgeben sondern z.B.
wert1, wert2, wert 3 = blubbb(EN[1])
.....
...
Einen Kommentar schreiben:
-
ByteCode Logikbaustein (opt. Lizenzprüfung)
44ja, warum erst jetzt52,27%23ja, vielleicht15,91%7Nein13,64%6ich mag kein Closed Source31,82%14So, bastel da jetzt schon ein bißchen dran rum, aber macht ja bekanntlich mehr Spaß, wenn mehr mitspielen
Benötigt wird, um den ByteCode zu erstellen, ein Python gleicher Version wie der HS, also Python 2.2.3
Gedacht ist das ganze
A) um mehrzeiligen Pythoncode zu verwenden und
B) um Logiken zu schützen und sie evtl. an privat kostenlos zu verteilen, die man sonst gar nicht teilen würde
Bitte nicht den Code aus den Textblöcken nehmen, da fehlen die TABS die bei Python sehr wichtig sind,
im Anhang sind alle benötigten Dateien
Dieser Teil ist zum Erstellen der 5012er Logikzeile nötig
ohne Lizenz / oder eigene Lizenzprüfung
[HIGHLIGHT=python]
import base64
import marshal
import re
import md5
code = """
## Eigener CODE ##
## Geht alle Ausgänge durch und guckt ob AC[x] gesetzt werden muss
for i in range(1,len(AN)+1):
if AN[i]!=AA[i]:
AC[i]=1
"""
print code
data=compile(code,"<string>","exec")
data=marshal.dumps(data)
#print data
formel = "5012|0|\"(EA!=EN) or EI\"|\"eval(__import__('marshal').loads(__import__ ('base64').decodestring('"+re.sub("\n","",base64.e ncodestring(data))+"')))\"|\"\"|0|0|0|0"
open('HSLogik.out.hsl','w').write(formel+"\n")
[/HIGHLIGHT]
mit MAC basierter Lizenz
[HIGHLIGHT=python]
import base64
import marshal
import re
import md5
## Mac zum lizensieren
cmac="00:01:02:11:22:33"
## Pro Logik Lizenz
LicSecret="TEST LICENSE"
LicModifier=2122
LSec=md5.new(LicSecret).hexdigest()
code = """
LSec='"""+LSec+"""'
cmac=__import__('os').popen("/sbin/ifconfig").read().split('HWaddr ')[1].split(' \\n')[0]
mac=__import__('md5').new(cmac).hexdigest()
LicKey = ""
## Lizenzcode
for i in range(0,16,2):
LicKey = LicKey + "%X" % (int(mac[i:i+2],16) ^ (int(LSec[i:i+2],16) +"""+str(LicModifier)+"""))
if EN[1]==LicKey:
AN[1]="licensed"
## Eigener Code ##
else:
AN[1]="unlicensed: "+cmac
## Geht alle Ausgänge durch und guckt ob AC[x] gesetzt werden muss
for i in range(1,len(AN)+1):
if AN[i]!=AA[i]:
AC[i]=1
"""
print code
data=compile(code,"<string>","exec")
data=marshal.dumps(data)
#print data
formel = "5012|0|\"(EA!=EN) or EI\"|\"eval(__import__('marshal').loads(__import__ ('base64').decodestring('"+re.sub("\n","",base64.e ncodestring(data))+"')))\"|\"\"|0|0|0|0"
mac=md5.new(cmac).hexdigest()
LicKey=""
for i in range(0,16,2):
LicKey = LicKey + "%X" % (int(mac[i:i+2],16) ^ (int(LSec[i:i+2],16) +LicModifier))
print "Lizenzkey for "+cmac+" : "+LicKey
open('HSLogik.out.hsl','w').write(formel+"\n")
[/HIGHLIGHT]
obige Datei modifizieren und den Code unterhalb von ## Eigener Code ## einfügen. Tabs beachten, die vorher in der hsl in gewohnter Form definierten Ein- und Ausgänge können direkt benutzt werden.
Das heißt, AN[2]=4 sendet eine 4 auf den Ausgang 2....
cmd im Verzeichniss c:\python22 (unter win) öffnen
python.exe makeLogic.py ausführen
hier wird die Formelzeile aus der damit erstellten HSLogik.out.hsl eingetragen
[HIGHLIGHT=python]
## Lizenzkopf nach Bedarf
### Logikkopf nach Bedarf anpassen
## E1 und A1 sind für Lizenzfreigabe belegt.
5000|"xxAPI\Lizensierter Code"|0|1|"E1 Lizenzkey"|2|"A1 Lizenzstatus"|"A2 Irgendwas"
5001|1|2|0|0|1
# EN[x]
5002|1|""|1
# Ausgänge
5004|1|""|0|1|1
5004|2|""|0|1|1
#################################################
### Diese Zeile mit der aus der HSLogik.out.hsl ersetzen (EA!=EN heißt Änderung auf einem beliebigen Baustein)
5012|0|"(EA!=EN) or EI"|"eval(__import__('marshal').loads(__import__(' base64').decodestring('YwAAAAAJAAAAc1wBAAB/AAB/AgBkAABaAAB/AwBlAQBkAQCDAQBpAgBkAgCDAQBpAwCDAABpBABkAwCDAQBkBA AZaQQAZAUAgwEAZAYAGVoFAH8EAGUBAGQHAIMBAGkGAGUFAIMB AGkHAIMAAFoIAH8FAGQIAFoJAH8GAHheAGUKAGQGAGQJAGQKAI MDAER/BgBdRwBaCwB/BwBlCQBkCwBlDABlCABlCwBlCwBkCgAXIWQJAIMCAGUMAGUAAG ULAGULAGQKABchZAkAgwIAZAwAF0EWF1oJAHGBAFd/CABlDQBkBAAZZQkAagIAbxEAAX8JAGQNAGUOAGQEADxuEgABfw 0AZA4AZQUAF2UOAGQEADx/EAB4TQBlCgBkBABlDwBlDgCDAQBkBAAXgwIARH8QAF0vAFoLAH 8RAGUOAGULABllEABlCwAZagMAbxEAAX8SAGQEAGURAGULADxu AQABcSIBV2QPAFMoEAAAAHMgAAAANDYzMTFhYWU3NjhjZjgzZD c5MzUxZDc4NzAxYTY2NzBzAgAAAG9zcw4AAAAvc2Jpbi9pZmNv bmZpZ3MHAAAASFdhZGRyIGkBAAAAcwMAAAAgIAppAAAAAHMDAA AAbWQ1cwAAAABpEAAAAGkCAAAAcwIAAAAlWGk0CgAAcwgAAABs aWNlbnNlZHMMAAAAdW5saWNlbnNlZDogTigSAAAAcwQAAABMU2 VjcwoAAABfX2ltcG9ydF9fcwUAAABwb3BlbnMEAAAAcmVhZHMF AAAAc3BsaXRzBAAAAGNtYWNzAwAAAG5ld3MJAAAAaGV4ZGlnZX N0cwMAAABtYWNzBgAAAExpY0tleXMFAAAAcmFuZ2VzAQAAAGlz AwAAAGludHMCAAAARU5zAgAAAEFOcwMAAABsZW5zAgAAAEFBcw IAAABBQygFAAAAcwQAAABjbWFjcwQAAABMU2VjcwEAAABpcwMA AABtYWNzBgAAAExpY0tleSgAAAAAKAAAAABzCAAAADxzdHJpbm c+cwEAAAA/AgBzGgAAAAwBOAEeAQkBFgAJAUUBFAERBBEDHQAJARgB')))"| ""|0|0|0|0
[/HIGHLIGHT]
EDIT: Anhänge aktualisiert, war ein Fehler und beide Scripts(Mit und ohne Lizenz) jetzt im AnhangAngehängte DateienStichworte: -


Einen Kommentar schreiben: