Ankündigung

Einklappen
Keine Ankündigung bisher.

ByteCode Logikbaustein (opt. Lizenzprüfung)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MatthiasS
    antwortet
    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.

    Einen Kommentar schreiben:


  • MarcNaroska
    antwortet
    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:


  • NilsS
    antwortet
    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.

    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..
    ......
    ......
    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)

    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

    Code:
    if EN[1]=1:
       mach was
    if EN[1]=1:
       mach was anderes
    if EN[1]=1:
       mach noch was anderes
    länger braucht als
    Code:
    if EN[1]=1:
       mach was
       mach was anderes
       mach noch was anderes
    das Ergebnis ist jedoch das selbe.

    Wenn jemand darüber diskutieren möchte, bitte.... gerne auch per PN

    Einen Kommentar schreiben:


  • MarcNaroska
    antwortet
    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:


  • Michel
    antwortet
    [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:


  • NilsS
    antwortet
    [QUOTE=MarcNaroska;74481]Die Auswertung "EA!=EN" bedeutet also, dass bei Änderung eines beliebigen Eingangs was getan wird, oder?
    Ja

    Zitat von MarcNaroska Beitrag anzeigen
    Hier kann ich aber auch (wie gewohnt) die Indizes setzen "EA[2]!=EN[2]", oder?
    Ja, aber auch EC[2] wie gewohnt
    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 ...)

    Zitat von MarcNaroska Beitrag anzeigen
    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"?
    Ja mehrere Codezeilen gehen auch
    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

    Zitat von MarcNaroska Beitrag anzeigen
    Den Timer in deinem "Logikbaustein-Generator" würde ich dann dafür nutzen, um den Baustein zyklisch aufzurufen, oder?
    Ich würd die eine Formelzeile per Timer immer wieder aufrufen.
    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

    Zitat von MarcNaroska Beitrag anzeigen
    Gibt es eigentlich eine Längenbeschränkung für den compilierten Code?
    k.A.

    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:


  • MarcNaroska
    antwortet
    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:


  • NilsS
    antwortet
    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:


  • Michel
    antwortet
    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:


  • EPIX
    antwortet
    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:


  • MatthiasS
    antwortet
    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:


  • Michel
    antwortet
    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:


  • ChristianB
    antwortet
    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:


  • NilsS
    antwortet
    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:


  • NilsS
    hat eine Umfrage erstellt HS/FS ByteCode Logikbaustein (opt. Lizenzprüfung).

    ByteCode Logikbaustein (opt. Lizenzprüfung)

    44
    ja, warum erst jetzt
    52,27%
    23
    ja, vielleicht
    15,91%
    7
    Nein
    13,64%
    6
    ich mag kein Closed Source
    31,82%
    14
    So, 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 Anhang
    Angehängte Dateien
Lädt...
X