Commutazione a Gruppi/Totale per Strutture Ricettive, Uffici ecc..

Forum dedicato in modo specifico al controllo accessi
Lettori e centrali RFID, Tastiere KeyDigit, PhonePass, Lettori UHF,
Controllo Accessi con Telecomandi Wireless
Admin_HPLC
Site Admin
Messaggi: 300
Iscritto il: gio 14 gen 2021, 18:56

Commutazione a Gruppi/Totale per Strutture Ricettive, Uffici ecc..

Messaggio da Admin_HPLC »

La seguente procedura è quella in uso per la commutazione di particolari funzioni (esp: Riscaldamento/Raffrescamento) a gruppi o totale in uffici, Alberghi ecc...

Molte funzioni del protocollo XComm possono essere inviate in Brodcast mettendo uno zero al posto dell'indirizzo,
purtroppo però il Brodcast non da sicurezza ne conferma dell'avvenuta modifica, quindi normalmente si invia più volte, ma anche questo per vari motivi legati alla comunicazione in loco spesso non garantisce un risultato.

Per ovviare a questo è possibile utilizzare il codice qui proposto o nel modulo USER PROCESS che può lavorare in parallelo al sistema oppure direttamente nella supervisione.
Chiaramente le funzioni che devono sempre essere eseguite vanno solo nei moduli USER PROCESS (XCDR025.exe).

Procedure per creare un USER PROCESS:

a) Questa funzione evita che applicazioni possano essere eseguite più di una volta,
all'avvio della seconda applicazione se App.PrevInstance = True
l'applicazione in avvio verrà arrestata.

Codice: Seleziona tutto


Private Sub Form_Load()

If App.PrevInstance = True Then    ' Evita l'avvio duplicato dell'applicazione
   End 
end if

End Sub

b) La seconda procedura standard dei moduli USER PROCESS sta nel poter arrestare il modulo quando viene
arrestato il Server di sistema.

Utilizzando la libreria XComm Full (ABS 15 XComm Full Library) o l'equivalente XC_CLASS per VS .NET si dispone dell'evento EventData
l'evento permette di ricevere moltissimi dati di sistema, i vari dati sono indicizzati da un numero univoco (Index)
L'indice 101 è quello che viene scatenato all'arresto del Server ABS, il dato trasmesso è "End_XCDR025"

Codice: Seleziona tutto


Private Sub XComm1_EventData(ByVal index As Long, Data As String)
       
        If index = 101 And Data = "End_XCDR025" Then   ' Termina L'applicazione alla chiusura del Server
            End
       end if
       
End Sub


Il codice di controllo di un USER PROCESS è questo non serve altro.
Passiamo adesso a vedere che codice utilizzare in questo processo logico di controllo per effettuare
la commutazione Riscaldamento/Raffrescamento.
Admin_HPLC
Site Admin
Messaggi: 300
Iscritto il: gio 14 gen 2021, 18:56

Re: Commutazione a Gruppi/Totale per Strutture Ricettive, Uffici ecc..

Messaggio da Admin_HPLC »

Processo - Commutazione Riscaldamento/Raffrescamento a Gruppi o totale della struttura/Abitazione.
Il codice è utilizzabile sia in Supervisione che nei moduli USER PROCESS, normalmente si preferisce usare i moduli User Process, sia per facilitare la manutenzione sia per facilitare il trasporto su altre installazioni, ma soprattutto per quelle funzioni che devono operare anche se la supervisione viene chiusa.

1) Nel Modulo USER PROCESS va inserito un Timer, si può usare anche l'oggetto Timer di sistema.

2) Se la commutazione si esegue su tutte le Room è sufficiente creare un loop dal primo indirizzo Room fino all'indirizzo più elevato.
Esp: se le Room sono numerate da 1 a 100 il nostro loop deve essere tipo questo:

Codice: Seleziona tutto


Dim IX as integer

For IX = 1 to 100 
     ' Codice di controllo...
Next

Questa situazione spesso non è utilizzabile dato che i Termoregolatori o le Room hanno indirizzi di piano,
esp:
101 to 130
201 to 240
301 to 320
ecc..
Idem i termo delle zone comuni, in questo caso si può creare un array di indirizzi validi oppure può semplicemente creare un indice che permetta di gestire le singole Room e/o i Termoreg. delle zone comuni.

Nota: I termoregolatori delle zone comuni spesso sono concentrati su un HomePLC, quindi nell'esempio verrà mostrato anche il relativo codice di controllo.

Creiamo adesso l'indice di un Gruppo di Termoregolatori di camera o delle zone Comuni per un Albergo

Codice: Seleziona tutto


 ' Utilizzando Static al posto di DIM
 ' la variabile rimane inalterata anche nei cicli successivi del Timer
 
 
' Ogni ciclo del Timer EI_RID ha il valore successivo della selezione, quindi diventa 3 poi 5, poi 6 e cosi via...
' Chiaramente i vari numeri possono essere adattati a piacere cosi come il Select può essere ampliato e il codice modificato 
' in base alle esigenze.
 
 Static EI_RID As Integer
 
Select Case EI_RID
Case 3
   EI_RID = 5
Case 5
   EI_RID = 6
Case 6
   EI_RID = 8
Case 8
   EI_RID = 10
Case 10
   EI_RID = 11
Case 11
   EI_RID = 15
Case 15
   EI_RID = 17
Case 17
   EI_RID = 18
   
Case 18
   EI_RID = 30
Case 30
   EI_RID = 31
Case 31
   EI_RID = 32
Case 32
   EI_RID = 33
Case 33
   EI_RID = 3
   
Case Else
   EI_RID = 3
End Select

Admin_HPLC
Site Admin
Messaggi: 300
Iscritto il: gio 14 gen 2021, 18:56

Re: Commutazione a Gruppi/Totale per Strutture Ricettive, Uffici ecc..

Messaggio da Admin_HPLC »

Adesso per svolgere la commutazione serve sapere se i singoli Termoregolatori sono in Raffrescamento o in Riscaldamento ,
mentre nel caso siano già commutati nessun comando deve essere inviato.

Questo si realizza tramite gli eventi del sistema (anche per questo è meglio usare un USER PROCESS) senno ad ogni avvio della Supervisione di avrebbero commutazioni non desiderate dovute al mancato allineamento degli eventi, mentre il processo Utente rimane sempre attivo in Background e quindi allineato.

Per evitare false commutazioni si può anche inserire nel codice un controllo che permette di eseguire la funzione solo dopo che sia giunto un evento dal termoregolatore, per fare questo utilizzeremo un array di variabili booleane,

Dim EventoOK(MaxTermo) As Boolean

Dove Max Termo è il numero massimo di CPU ADDRESS da gestire con questo codice.

Un secondo stato che serve per il codice è quello del termoregolatore,

Dim StatoFunzionamento(MaxTermo)

Queste due variabili indicizzare vanno poste negli eventi dei Termoregolatori.

Per i termoregolatori delle zone comuni (no HPLC) e per i Termo A delle Camere:

Codice: Seleziona tutto


Private Sub XComm1_StatusTermoreg(ByVal TempActual As Single, LocalSet As Integer, WithClient As Integer, WithoutClient As Integer, AntiFreeze As Integer, TempMax As Integer, TempMin As Variant, FanFunction As Integer, Flag As Integer, SpeedFan As Integer, Output As Integer, V_Address As Integer, Ind As Integer, Srv As Integer)
   
   EventoOK_Ridolfi(Ind) = True
   StatoFunzionamento(Ind) = FanFunction And 1             ' Rileva Estate/Inverno (Inverno = True)


End Sub

Per i Termoregolatori dei Bagni (Termo B)

Codice: Seleziona tutto


Private Sub XComm1_StatusTermoregB(ByVal TempActual As Single, LocalSet As Integer, WithClient As Integer, WithoutClient As Integer, AntiFreeze As Integer, TempMax As Integer, TempMin As Variant, FanFunction As Integer, Flag As Integer, SpeedFan As Integer, Output As Integer, V_Address As Integer, Ind As Integer, Srv As Integer)
 On Error Resume Next
 
   
   EventoOK_B(Ind) = True
   StatoFunzionamento(Ind) = FanFunction And 1       '  Rileva Estate/Inverno  (Inverno = True)
 
 
 End If

Per i Termoregolatori sotto HomePLC (Zone Comuni) oppure per i Termo 30-31 in Camera è possibile filtrare solo quelli che ci interessano,

Codice: Seleziona tutto


Private Sub XComm1_StatusTermoHP(ByVal Master As Long, Node As Long, TempActual As Single, LocalSet As Integer, WithClient As Integer, WithoutClient As Integer, AntiFreeze As Integer, TempMax As Integer, TempMin As Variant, FanFunction As Integer, Flag As Integer, SpeedFan As Integer, Output As Integer, V_Address As Integer, Ind As Integer, Srv As Integer)


If Ind = 1 And Master = 1 Then

   If Node = 30 Or Node = 31 Or Node = 32 Or Node = 33 Then
         
        EventoOK(Node) = True
        StatoFunzionamento(Node) = FanFunction And 1 ' Rileva Estate/Inverno (Inverno = True)
  

   End If

End If

è bene ricordare che i termoregolatori oltre gli indirizzi 3 e 8 utilizzano le stesse procedure e eventi in modalità HomePLC, anche se installati sotto una Room.
Admin_HPLC
Site Admin
Messaggi: 300
Iscritto il: gio 14 gen 2021, 18:56

Re: Commutazione a Gruppi/Totale per Strutture Ricettive, Uffici ecc..

Messaggio da Admin_HPLC »

Commutazione in Riscaldamento tramite selettore a Video o commutatore fisico sull'impianto!

Codice: Seleziona tutto


If  ESTATE = False Then    ' La variabile Estate può derivare da un selettore a Video oppure da un ingresso sull'impianto ecc..          
  
     If EventoOK(EI_RID) = True Then   ' Esegue solo dopo il primo aggiornamento
         
        
          If StatoFunzionamento(EI_RID) = True Then  (True = Riscaldamento)
        
             '  Nota: Se è già in inverno non esegue
          
          Else ' oppure se è in Raffrescamento Communta in Riscaldamento
                                 
                                 
                     XComm1.WriteEnabledCnfRegA "1", EI_RID, 1, "pippo"      ' Abilitazione
                     XComm1.SetEstInv 1, EI_RID, 1, "pippo"  
       
          End If
    End If


Nel caso si debba comandare un termoregolatore su HomePLC il codice sarà questo:

Codice: Seleziona tutto


If EventoOK(EI_RID) = True Then ' Esegue solo dopo il primo aggiornamento
          ' Inverno = True
          If StatoFunzionamentoRidolfi(EI_RID) = True Then ' Room
                  ' NOP
          Else ' Communta in Riscaldamento
                                 
              Call XComm1.HP_EnabledReg(1, EI_RID, 1, 1, 1, "pippo")
               XComm1.HP_SetEstInv 1, EI_RID, 1, 1, 1, "pippo" ' Termo 30-33
         
          End If
     
    End If

Admin_HPLC
Site Admin
Messaggi: 300
Iscritto il: gio 14 gen 2021, 18:56

Re: Commutazione a Gruppi/Totale per Strutture Ricettive, Uffici ecc..

Messaggio da Admin_HPLC »

Commutazione in Raffrescamento,
la commutazione è la solita ma con parametri diversi.

Codice: Seleziona tutto


If STATE = True Then  
 
       If EventoOK(EI_RID) = True Then ' Esegue solo dopo il primo aggiornamento
         
           If StatoFunzionamentoRidolfi(EI_RID) = False Then
              ' NOP
            Else ' Communta in Raffrescamento
                        
                 XComm1.WriteEnabledCnfRegA "1", EI_RID, 1, "pippo"
                 XComm1.SetEstInv 0, EI_RID, 1, "pippo"        
         
            End If
  
Mentre per i Termo su HomePLC i parametri sono questi:

Codice: Seleziona tutto


 If EventoOK(EI_RID) = True Then ' Esegue solo dopo il primo aggiornamento
          
           If StatoFunzionamento(EI_RID) = False Then
                   ' NOP
            Else ' Communta in Raffrescamento
          
                 Call XComm1.HP_EnabledReg(1, EI_RID, 1, 1, 1, "pippo")
                   XComm1.HP_SetEstInv 1, EI_RID, 0, 1, 1, "pippo"      ' Termo 30-33
       
            End If
  End If

Admin_HPLC
Site Admin
Messaggi: 300
Iscritto il: gio 14 gen 2021, 18:56

Re: Commutazione a Gruppi/Totale per Strutture Ricettive, Uffici ecc..

Messaggio da Admin_HPLC »

Nota d'uso, se in parallelo a questo codice esiste una Supervisione con gli Oggetti Termoregolatore o Room,
non serve altro,
mentre se il codice deve girare in Background senza supervisione in parallelo, può essere richiesto un refresh dello statis del termoregolatore all'avvio, questo per sincronizzare e velocizzare la risposta,
in particolare per tutti i termoregolatori su HomePLC, mentre quelli delle Room hanno già un refresh comandato dal Server.