# Dali 753-647 mehrere Gruppen Schalten



## matchef (9 Januar 2017)

Hallo zusammen,

Ich habe momentan ein Projekt bei dem ich 120 Dali Lampen habe. Diese habe ich auf 3 753-647 aufgeteilt. Diese 120 Lampen habe ich in 30 Gruppen eingeteilt.

Jetzt möchte ich über Schalter diverse Gruppen zusammen schalten. So ca. 5-15 Gruppen gleichzeitig)
Ich benutze dafür den Baustein "FbDaliSwitchOnOff". Nun ist es leider so das nicht immer alle Gruppen ein bzw. ausschalten. Was natürlich sehr unschön ist.

Kann es sein mit Dali und Wago nicht soviele einzelen Gruppe gleichzeitig geschalten werden können? 

Hat da vielleicht jemand auch solche Erfahrung gemacht damit?

Gruss

matchef


----------



## Sagas (9 Januar 2017)

Hallo,

das von dir beschriebene Verhalten kann ich so nicht bestätigen, ich schalte z.B. über ein Zeitprogramm weit mehr Gruppen auf 6 Dali-Karten verteilt und konnte noch keinen Ausfall bemerken.

Als Abhilfe könnte ich mir vorstellen das du die jeweiligen Gruppen pro Dali-Klemme nochmals zu einer weiteren Gruppe zusammenfasst, sprich nicht Gruppe 1-15 einzeln schalten sondern Gruppe 31 welche alle Leuchtmittel der anderen Gruppen vereint - natürlich kenn ich deinen Anwendungsfall nicht genau. 

Gruß
Sagas


----------



## matchef (9 Januar 2017)

Servus,

Was für eine Zykluszeit hast bei deinem Programm?
Der Wago Support meint evtl. lieg es noch an dem...ich habe die Zykluszeit auf 40ms gestellt, effektiv ist er ca. bei 10-30ms...

Gruss


----------



## Sagas (9 Januar 2017)

Servus,

bei mir läuft der Task frei, die genaue Zykluszeit kann ich gerade nicht auslesen, meine aber das die auch immer so um die 40-50ms war. 
Zumal die Karte ja intern die Befehle speichern sollte und diese nach und nach abarbeiten. 

Ich nehme an du nutzt den FbMaster753_647, hast du irgendeinen Wert in "bFeedback"?

Gruß


----------



## KingHelmer (9 Januar 2017)

Hi Matchef,

hast du mal geschaut was der "Peak" an Zykluszeit ist?
klar ohne Befehle bleiben die Zyklen auf einer kleinen Zeit und treiben so den "Schnitt" runter.

Habe meine DALI-Anwendung immer auf zwischen 50-80ms laufen, je nach Größe.
Kann Wunder bewirken, das ein wenig hochzusetzen.

Gruß, 
Flo


----------



## matchef (9 Januar 2017)

Ja ich benutze den FbMaster753_647, Feedback habe ich zum teil "101" was ja soviel wie "Globaler Reset oder „Watchdog“ ist ausgelöst worden"....aber das ist auch nicht immer anstehend...

Der Wago Support meinte die Zykluszeit müsse so tief wie möglich sein..."Peak" muss ich nachschauen wie der genau ist...


----------



## egro (9 Januar 2017)

Ich habe es wie "Sagas" gelöst.
Eine Gruppe mit den Gruppen... Alle Adressen, die benötigt werden in einer separaten Gruppe (Pro DALI-Linie).
So muss die SPS nur auf jeder Karte einmal den Gruppenbefehl senden.


----------



## matchef (10 Januar 2017)

Okay, dsa mit der zusätzlichen Gruppe könnte ich noch ausprobieren...jetzt habe ich es einfach mit einer kleinen überwachung mal gemacht, ich werte die rActualvalue aus und wenn "soll" und "ist"  nicht passen dann schicke ich den Einschaltbefehl nochmals...

Meine Max. Zykluszeit ist 35ms...sollte nicht aus dem Rahmen fallen oder? Habt ihr eure Dali-Karten alle im gleichen oder in einem separaten Tasks?


----------



## Sagas (10 Januar 2017)

Guten Morgen,

bei mir laufen alle Dali-Karten plus Jalousiesteuerung plus EnOcean plus ... alles im gleichen Task, das sollte kein Problem sein. 
Aber wie KingHelmer schon schrieb solltest du evtl. die Taskzeiten nach oben korrigieren und schauen ob sich das Verhalten ändert. 

Was mir noch einfällt: Du hast pro Dali-Gruppe je eine Instanz von "FbDaliSwitchOnOff"? Hatte schon Kollegen die mit einem FB in einer Schleife alle Adressen abarbeiten wollten u.ä.

Grüße


----------



## matchef (10 Januar 2017)

Ich hab nun m die taskzeit auf 100ms gestellt...hat sich leider nix geändert...
Ja ich habe  pro Gruppe einen "FbDaliSwitchOnOff"....in dem Fall Probiere ich das mit den Gruppen...


----------



## EsPEs (12 Januar 2017)

Hallo Zusammen,

habe bisher nur in CFC DALI-Projekte erstellt (erfolgreich). Ist aber bei vielen Gruppen irgendwann total unübersichtlich.

Wie sieht das mit ST aus? Könnte man damit nicht die Gruppennummer per Schleife o.ä. durchrattern und an alle Gruppen einen Befehl absetzen? Oder geht das zu schnell, so dass der DALI dem nicht folgen kann?!
Hat da mal jemand vielleicht ein Beispiel?

Für ein paar Hinweise bin ich dankbar...

Grüße


----------



## Sagas (12 Januar 2017)

Hallo,

und ja, das geht. Zu schnell ist im dem Sinne nichts für die Dali Schnittstelle da du ja pro Gruppe/Schaltbefehl eine eigene Instanz nutzt. Du wirst ja auch keine 200 Schaltbefehle pro Zyklus auf 62 Gruppen verteilen? 

Man kann sich so einen FB bauen der den Dali Master und eine Schleife für alle möglichen Adressen abarbeitet - persönlich nutze ich dafür noch eine 2D-Array aus Ein-/Ausbefehlals Schnittstelle. So kann man mit einem FB pro Dali-Linie quasi alle Gruppen ansprechen. ggf. wäre auch Dimmwert etc. zu ergänzen. 

"ArDALIGroupOnOff[2,13,1]:=TRUE;"  für_   2_   Dali-Linie,  _13_  Gruppe, auf _EIN_(1) - usw.   

Gruß
Sagas


----------



## EsPEs (13 Januar 2017)

...verwendest du das xReady Signal dabei, um sicher zu gehen das die Übertragung erfolgt ist?

Gruß


----------



## Sagas (13 Januar 2017)

Hallo nochmal,

nein den Status werte ich an der Stelle allgemein nicht aus - war noch nie nötig. Nur das "bFeedback" von "FbMaster753_647" führe ich weiter zur übergeordneten Leitwarte. 

Gruß


----------



## EsPEs (13 Januar 2017)

@Sagas

komme da nicht weiter. Kannst du mir zu dem Schleifenkonstrukt und dem einen FB pro Dali-Linie mal etwas zuschicken?

Vielen Dank

Gruß


----------



## Sagas (13 Januar 2017)

Grüß dich,

bin heut etwas in Eile aber ich denke morgen sollte das kein Problem sein.


----------



## Sagas (16 Januar 2017)

So mit etwas Verspätung, vielleicht hilft es ja weiter:

Deklaration:

```
PROGRAM Dali
VAR
    xQuitDali: BOOL;
    bFeedBackDali: ARRAY[0..5] OF BYTE;
    DaliGroups: ARRAY[0..5] OF FB_DaliGroups;
    Dali_Master753_647:  ARRAY[0..5] OF FbMaster753_647;
    (*DALI Linie 1*)
    ArInputBytes_Dali1 AT %IB48: ARRAY[0..23] OF BYTE;
    ArOutputBytes_Dali1 AT %QB48: ARRAY[0..23] OF BYTE;
```

Aufruf:

```
PrgDALIConfig();

IF b_CountDaliMaster>0 THEN
(*Dali Master*)
    Dali_Master753_647[0](
    bModule_753_647:=1 ,
    abIn_753_647:= ArInputBytes_Dali1 ,
    xQuit:=xQuitDali OR DwModbusControlCommen.0,
    abOut_753_647=>ArOutputBytes_Dali1  ,
    bFeedback=> bFeedBackDali[0] );
(*Dali Groups*)
    DaliGroups[0](bModule:=1 , PtArByteStatusDaliShortAddress:=ADR(ArByteStatusDaliShortAddress) ,PtArXModBusControlDaliShortAddress:=ADR(ArXModBusControlDaliShortAddress) , xCentralOn:= GxLightOn, xCentralOff:= GxLightOff, typConfigDimmer:=typConfigDimmer );
END_IF

IF b_CountDaliMaster>1 THEN
(*Dali Master*)
    Dali_Master753_647[1](
 .....usw
```

und der Gruppenaufruf:

```
FUNCTION_BLOCK FB_DaliGroups
VAR_INPUT
    bModule: BYTE:=1;        (*Nummer des 753_647 Moduls*)
    PtArByteStatusDaliShortAddress: POINTER TO ARRAY[1..cMaxDaliLines,0..63] OF BYTE;
    xCentralOn:BOOL;
    xCentralOff:BOOL;
END_VAR
```


```
(*Master Zentral Ein/Aus*)
DaliSwitchOnOffMaster(
    bAddress:= 255,
    xGroup:= ,
    xOn:=xCentralOn ,
    xOff:=xCentralOff ,
    rDimmLevelForOff:= ,
    bModule_753_647:=bModule,
    xReady=> ,
    bFeedback=> ,
    rActualLevel=> );

(*Dali Groups*)
FOR bLoopDaliGroupSwitch:=0 TO cMaxDaliNumbers BY 1 DO
DaliGroupSwitch[bLoopDaliGroupSwitch](
    bAddress:= bLoopDaliGroupSwitch,
    bModule:= bModule,
    xOn:=ArDALIGroupOnOff[bModule,bLoopDaliGroupSwitch,1] ,
    xOff:= ArDALIGroupOnOff[bModule,bLoopDaliGroupSwitch,0],
    rActualLevel=> );
END_FOR

(*Status Groups *)
FOR bLoopStatus:=0 TO cMaxDaliNumbers BY 1 DO
    IF DaliGroupSwitch[ bLoopStatus].rActualLevel=0 THEN
        ArDALIGroupStatus[bModule, bLoopStatus]:=FALSE;
    ELSE
        ArDALIGroupStatus[bModule, bLoopStatus]:=TRUE;
    END_IF
END_FOR
```


Gekürzt, vereinfacht und ohne Garantie versteht sich  ;-)


----------



## EsPEs (17 Januar 2017)

```
(*Master Zentral Ein/Aus*)
[B]DaliSwitchOnOffMaster[/B](
    bAddress:= 255,
    xGroup:= ,
    xOn:=xCentralOn ,
    xOff:=xCentralOff ,
    rDimmLevelForOff:= ,
    bModule_753_647:=bModule,
    xReady=> ,
    bFeedback=> ,
    rActualLevel=> );

(*Dali Groups*)
FOR bLoopDaliGroupSwitch:=0 TO cMaxDaliNumbers BY 1 DO
DaliGroupSwitch[bLoopDaliGroupSwitch](
    bAddress:= bLoopDaliGroupSwitch,
    bModule:= bModule,
    xOn:=ArDALIGroupOnOff[bModule,bLoopDaliGroupSwitch,1] ,
    xOff:= ArDALIGroupOnOff[bModule,bLoopDaliGroupSwitch,0],
    rActualLevel=> );
END_FOR


Danke für den Code, das Prinzip habe ich (denke ich) verstanden. Nur an der Umsetzung hapert es noch etwas.
Auf welchen Funktionsblock bezieht sich "[B]DaliSwitchOnOffMaster[/B]"? Ich vermutete FbDaliSwitchOnOff, aber er meckert beim übersetzen (bAdress kein Eingangsparameter vom Funktionsblock).

Gruß und danke
```


----------



## Sagas (17 Januar 2017)

Hallo,

Ja das ist einfach der FbDaliSwitchOnOff, nur als Broadcast für Zenral-Ein/-Aus.

Aber bAddress ist ein Parameter dieses FB?




Gruß


----------



## EsPEs (17 Januar 2017)

ja schon, aber der wird doch über typBallast (z.B."typBallastGRUPPE1.bAddress") angesteuert, oder? Direkt bAddress ist kein Eingangsparameter.


----------



## EsPEs (17 Januar 2017)

Ok, hab eine neuere Bibliothek! 
Der Baustein FbDaliSwitchOnOff hat mittlerweile die Version 2.0 von 14.04.2014. 
Hab ich auch erst eben entdeckt.


----------

