es ist glaube ich die richtige Zeit, der Community mal etwas zurück zu geben. Der nachfolgende Code ist schon seit gut einem halben Jahr fertig und funktioniert für meine Zwecke sehr gut. Bisher bin ich nur leider nicht dazu gekommen alles in Textform zu gießen und die Kommentare zu bereinigen. Also los...
Es geht um die DMX-Ansteuerung via TWS. Leider gilt das nachfolgende derzeit nur für die REG Modelle, weil diese die RS-485 Schnittstellt darin physisch bereits verbaut haben. Das Thema wurde gerade aktuell an andere Stelle wieder aufgegriffen und soll hier nicht zur Diskussion stehen! Sobald die Lightning Engine oder etwas ähnlich ausgerollt wird, ist dieser Beitrag ebenfalls hinfällig! Bis dahin hilft er vielleicht dem einen oder anderen.
Ich hatte eigentlich auch vor, ein paar Worte zur Theorie zu verlieren, wie das Stefan auch immer so didaktisch wertvoll in seinen Beiträgen und Videos macht (vielen Dank an der Stelle @StefanW für den persönlichen Einsatz und die Mühe die du dir damit gibst! Das gilt natürlich auch für dein Team!). Leider ist das doch ziemlich aufwendig (wenn man nicht so tief in der Materie steckt) und so muss hier ein einfacher Verweis herhalten:
zum Wikipedia-Eintrag
und
zu den Jungs und Mädels von DMX4ALL
Vielleicht noch ein paar Hinweise vorab: Ich hab versucht den Code so gut wie möglich zu kommentieren und ganz unten wird auch ein kleines Quellenverzeichnis sein, wo ich meine Infos aus anderen Threads her habe. Dort kann man entsprechend auch nachlesen. Ich selbst betreibe auf meinem Testbrett ein 4-Kanal Decoder vom Typ D4-L von Skydance. Im Haus kommen dann ebenfalls von Skydance mehrere 24-Kanal Decoder vom Typ D24 zum Einsatz. Mit dem D4-L habe ich getestet und kam soweit hin. Auf dem D24 sollte es einfach übertragen werden können. Sollte jemand Erfahrung mit anderen Decodern haben, darf er/sie diese hier gern teilen.
Zu den Voraussetzungen steht auch einiges in den einleitenden Worten im Kommentar zu Beginn des Bausteins, also bitte mit lesen, das ist relativ wichtig. Ergänzend dazu noch zu einigen ausgewählten Punkten, zu denen ich mir Feed-Back aus der Community oder den Entwicklern erhoffe:
- 8-bit-Unterstüzung: DMX als Protokoll überträgt pro Kanal exakt 8-bit. Nun gibt es aber Decoder die auch 16-bit verarbeiten. Nach meinem Verständnis benötigen diese Geräte entsprechend zwei DMX-Kanäle pro "Decoder-Kanal". Das wäre soweit auch mit den aktuellen
Mitteln kein Problem, solange man weiß wie sich die beiden Kanäle zueinander verhalten ("Grob/Fein-Steuerung" vs. "0...49%&50...100%", Reihenfolge,...) und man nur den statischen Wert benötigt. Wenn es aber ans Faden geht, ist es vorbei. Da müssten für einen Übergang ja beide Kanäle in der korrekten Weise und auch Reihenfolge verändert werden, damit der Übergang auch sauber fadet und nicht blinkernd von Zustand zu Zustand läuft. Ich persönlich komme mit den 8 Bit super zurecht, habe aber auch nur recht einfache Anforderungen mit meiner Raumbeleuchtung. Für LED-Laufbänder, Pixelansteurungen und greift man aber vielleicht auch zu anderen Mitteln als zum TWS. - max. 16-Kanäle: Diese Aussage [1],[2] kommt von Stefan @S. Kolbinger selbst und er hat den DMX_Test-Modul [meine ich gelesen zu haben] bei Elabnet geschrieben. Wird also stimmen. Wer mehr als 16 Kanäle benötigt (z.B. für einen 24CH-Decoder) muss zwei Bausteine mit entsprechend angepasster Startadresse anlegen. Ich habe allerdings nicht getestet, ob man in einem Baustein einfach zwei DMX_Test-Module mit den entsprechende angepassten Startadressen aufrufen kann. Sollte aber gehen. In diesem Fall geht der Baustein bis 1024 Kanälen in zwei Universen. Über die Sinnhaftigkeit lässt sich aber streiten, zumal man physisch auch an die 32-Slave-Begrenzung denken muss, wenn man keine Splitter oder Verstärker einsetzt (ich hätte doch mit Theorie beginnen sollen ).
Ich habe in meinem Fall immer Funktionsgruppen (DTW, RGB oder RGBW einer Leuchtgruppe) in einem Baustein zusammengefasst. Bei den einkanaligen Leuchtengruppen muss ich mit dir das noch überdenken. Eine Zusammenfassung im Baustein bedingt aber, dass die entsprechenden Kanäle am Decoder im Block nebeneinander liegen (durch die Startadresse und die darauffolgenden Adressen entsprechend der Kanalanzahl). Ob das so sinnvoll bei mir aufgeht wird sich zeigen, aber mehr als 4 Einkanalige hab ich eh nicht Pro Etage... - Gammakorrektur: mathematisch geht jede Zahl größer 0, praktisch sinnvoll ist das natürlich nicht. zwischen 1 und 2 sollte man einen akzeptabel Lösung finden. Interessant wird es aber, wenn man tatsächlich korrigierend eingreift.
Beispiel: der 24CH-Decoder BN-624-DIN von BINCOLOR kann die 8-Bit nur mit logarithmischer Ausgangscharakteristik (16 Bit wären dann linear...). Kennt man den Decoder-Gammakorrektur-Faktor, kann man den mit dem TS Server entsprechend kompensieren und dann seine eigenen Charakteristik darüber legen um z.B. Decoder verschiedener Hersteller zu harmonisieren. Wenn dazu nähere Infos benötigt würden, könnte ich das in einem separatem Post ggf. gleich mit Code vertiefen.
So sieht es aus:
Und das ist der eigentliche Code:
Code: Alles auswählen
/**
* DMX-Logik zur Ansteuerung von DMX-Kanälen
* Input: Übergangszeit (Fadetime); Gammakorrktur-Wert; Sollwert je Kanal
* Output: TWS-interene Weitergabe und Verarbeitung, daher kein Output benötigt, aber für Visu oder Kontrollzwecke ggf. ergänzbar
*
* Dieses Codebespiel ist für vier DMX-Kanäle umgesetzt, kann aber einfach erweitert werden. Das DMX_Test-Modul erlaubt derzeit nicht mehr als 16 zusammenhängende Kanäle. Bitte nicht mit der Startadresse verwechseln! Auch jehnseits von Kanal 16 funktioniert der Baustein, nur benötigt man dann diesen eben ein zweites mal, dann mit der Startadresse 17.
*
* Voraussetzung am DMX-Decoder: Lineare Ausgangscharakteristik (mit Gamma = 1 am TWS, ist auch eine logaritmische Chrakteristik des Decoders nutzbar); Helligkeitssteuerung mit 8-bit ("256-Graustufen")
* Systemvoraussetzung: Hardware: 950Q oder 960Q; Softwarestandab >v2.0 IP4 (Calc-Modul)
*
*
* Ausgangscharakterisik:
* Gamma = 1: lineare Dimmkurve
* Gamme > 1: logartthmische Dimmkurve (1,4..1,6 funktionernen am Skydance D4-L zufriedenstellend)
*
* Die DMX-Startadresse ist um "1" zu reduzieren. Im Modul "DMX-Test" wird dann aufsteigen eine weitere Adresse angesteuert. Sie wird als letzter Parameter im DMX-Test-Modul eingetragen, darf aber selbst keine Variable sein.
* DMX-Universum 1 - Kanal 1...512: Startadresse 0...511
* DMX-Universum 2 - Kanal 1...512: Startadresse 512...1023
*
* Beispiel: 4CH-DMX-Decoder mit Startadresse 42 -->
* ["DMX_Test",["$CH1_DMX_value","$CH2_DMX_value","$CH3_DMX_value"], "$Fade", 41]
* CH1=DMX-Adresse 41, CH2=DMX-Adresse 42, CH2=DMX-Adresse 43, CH4=DMX-Adresse 44
*
* Hinweise: Die Kanalsbezeichnungs ist ggf. sinnhaft anzupassen
*
* Version V1.0
* Autor: Tobias Lessing
* Veröffentlichung: 25.12.2021
* Bekannte Bugs: Die Wertbegrenzung für die Input habe ich bewusst nicht aufgenommen, um den Code übersichtlich zu halte. Ich vertraue auf eure Geistige Anwesenheit beim Parametrieren. Wer an sich selbst zweifelt, kann selbst Limitter-Module hinzufügen
*/
{
"_Meta": {
"Description": "Ansteurungslogik für mehrkanalige DMX-Aufbauten",
"Version": "1.00",
"Icon": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9Ijc1bW0iCiAgIGhlaWdodD0iNzVtbSIKICAgdmlld0JveD0iMCAwIDc1IDc1IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmc4IgogICBpbmtzY2FwZTp2ZXJzaW9uPSIxLjAuMi0yIChlODZjODcwODc5LCAyMDIxLTAxLTE1KSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iUkJHLUljb24uc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMiIgLz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMC45ODk5NDk0OSIKICAgICBpbmtzY2FwZTpjeD0iMTEwLjM0NTM5IgogICAgIGlua3NjYXBlOmN5PSIxMzUuNTkzMTIiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9Im1tIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC1yb3RhdGlvbj0iMCIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6cGFnZWNoZWNrZXJib2FyZD0idHJ1ZSIKICAgICBpbmtzY2FwZTpsb2NrZ3VpZGVzPSJmYWxzZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTEzNyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iRWJlbmUgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPGNpcmNsZQogICAgICAgc3R5bGU9Im9wYWNpdHk6MC45OTU7bWl4LWJsZW5kLW1vZGU6ZGlmZmVyZW5jZTtmaWxsOiNmZjAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLXdpZHRoOjAuNTM4NTI0O2ltYWdlLXJlbmRlcmluZzphdXRvIgogICAgICAgaWQ9IktyZWlzX1IiCiAgICAgICBjeD0iMzcuNSIKICAgICAgIGN5PSIyNSIKICAgICAgIHI9IjI1IiAvPgogICAgPGNpcmNsZQogICAgICAgc3R5bGU9Im1peC1ibGVuZC1tb2RlOmRpZmZlcmVuY2U7ZmlsbDojMDAwMGZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDowLjQ1NDQxIgogICAgICAgaWQ9IktyZWlzX0IiCiAgICAgICBjeD0iMjUiCiAgICAgICBjeT0iNTAiCiAgICAgICByPSIyNSIgLz4KICAgIDxjaXJjbGUKICAgICAgIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpkaWZmZXJlbmNlO2ZpbGw6IzAwZmYwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6MC41MjEwNTQiCiAgICAgICBpZD0iS3JlaXNfRyIKICAgICAgIGN4PSI1MCIKICAgICAgIGN5PSI1MCIKICAgICAgIHI9IjI1IiAvPgogIDwvZz4KPC9zdmc+Cg=="
},
"Input": [
["Fadetime", "Zeit für Lichtübergang [0,0s .. 1,0s]", "$Fade", "u"], //für alle Kanäle einheitlich
["Gamma","Wert für die Gamma-Korrektur[1...3]","$Gamma","u"], //zur Berechung der Gammakorrektur (siehe BEschreibung oben zur Ausgangscharakteristik)
["Helligkeit-R","Helligkeitswert für Kanal 1 [0...100]","$CH1_brightness","c"], //linearer Eingangswert der Helligkeit des jeweiligen Kanals in %
["Helligkeit-G","Helligkeitswert für Kanal 2 [0...100]","$CH2_brightness","c"], //s.o.
["Helligkeit-B","Helligkeitswert für Kanal 3 [0...100]","$CH3_brightness","c"], //s.o.
["Helligkeit-W","Helligkeitswert für Kanal 4 [0...100]","$CH4_brightness","c"] //s.o.
//["Helligkeit-CHx","Helligkeitswert für Kanal x [0...100]","$CHx_brightness","c"] //für jeden weiteren Kanal ergänzen (Zeilenabschluss-Kommas beachten!).
],
"Output": [ //das egebeniss wird intern vom direkt an den Co-Prozessor gegebn und benötigt keine Ausgabe. Zu Kontrolle/Visualisierung könnten hier ggf. Parameter ergänzt werden
],
"Level": [
["$Fade","float",1.0], //Übergangszeit
["$Gamma","float",1.6], //Korrekturwert der Ausgangscharakteristik ("Gammakorrektur")
["$Formula","string","255*(0.01*X1)^X2"], //Korrekturformel für 8-bit Decoder & einen prozentualen Eingangswert
["$CH1_brightness","float",0.0], //siehe Input
["$CH2_brightness","float",0.0], //s.o.
["$CH3_brightness","float",0.0], //s.o.
["$CH4_brightness","float",0.0], //s.o.
//["$CHx_brightness","float",0.0], für jeden der weiteren Kanale ergänzen
["$CH1_DMX_value","float",0.0], //interen Berechnungsvariable
["$CH2_DMX_value","float",0.0], //s.o.
["$CH3_DMX_value","float",0.0], //s.o.
["$CH4_DMX_value","float",0.0] //s.o.
//["$CHx_DMX_value","float",0.0] für jeden der x-weiteren Kanäle ergänzen (Zeilenabschluss-Kommas beachten!).
],
"Module": [
["CalcFormula",["$CH1_brightness","$Gamma"], "$CH1_DMX_value", "$Formula"], //Verrechnung des Helligkeits-Sollwertes für Kanal 1
["CalcFormula",["$CH2_brightness","$Gamma"], "$CH2_DMX_value", "$Formula"], //[...] Kanal 2
["CalcFormula",["$CH3_brightness","$Gamma"], "$CH3_DMX_value", "$Formula"], //[...] Kanal 3
["CalcFormula",["$CH4_brightness","$Gamma"], "$CH4_DMX_value", "$Formula"], //[...] Kanal 3
//["CalcFormula",["$CHx_brightness","$Gamma"], "$CHx_DMX_value", "$Formula"], für x weitere (max. 16) Kanäle kopieren
["DMX_Test",["$CH1_DMX_value","$CH2_DMX_value","$CH3_DMX_value","$CH4_DMX_value"], "$Fade", 0] //DMX-Ansteuerung für vier unabhängige Kanäle mit Startadresse "1" (siehe auch oben); das Array für jeden zusätzlichen Kanal mit "$CHx_DMX_value" erweitern
]
}
/**Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter https://wrgt.news/TOLL zum Download zur Verfügung steht. */
Wenn ich Zeit finde (bevor die Lighting-Enging das Licht der Welt erblickt) versuche ich mich auch weiter an einem Baustein mit erweiterbaren Eingängen (["$VAR<$brightness_CH!>"]). Bisher bin ich aber gescheitert.
Viel Erfolg und Spaß damit!
VG aus Sachsen
Tobias
Quellenverzeichnis:
[1] von S. Kolbinger zum DMX_Test-Modul mit den Startadressen
[2] Falls die Berechtigung zum vorherigen Post fehlt
[3] zum Softdimmer
[4] zur Fadetime
[5] Zur Beschaltung des Gerätes