SR201-Relay module

di il
25 risposte

25 Risposte - Pagina 2

  • Re: SR201-Relay module

    orione1976 ha scritto:


    Per Rubik: Ho un progetto in vb6 preso in rete, funziona ma fa schifo e sta nel file che ho postato sopra, vorrei riscriverlo in vb.net per rifare la grafica e basta, se puoi dagli uno sguardo cortesemente, ovviamente c'è tutto perchè funziona ma non mi è chiaro.
    Non fa schifo, è una demo, sufficiente per sviluppare un software tuo.
    In VB.Net, con System.Net.Sockets si pilota inviando soli pochi byte sulla rete, permettendo il controllo anche con connessione disastrata.
    Li uso in montagna con collegamenti HyperLan, per riavviare l'IP cam o il router quando si impallano, non ho prestato particolare attenzione alla grafica:
    questa è la routine che sceglie i comandi da inviare in base al tasto premuto.
    
      ' **************** TUTTI I MESSAGGI POSSIBILI, VER 2 RELE' ***********************
        Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click
            Select Case sender.name
                Case "Button1"
                    Connessione(IP, "11") ' on relè 1
    
                Case "Button2"
                    Connessione(IP, "12") ' on relè 2
    
                Case "Button3"
                    Connessione(IP, "21") ' off relè 1
    
                Case "Button4"
                    Connessione(IP, "22") ' off relè 2
    
                Case "Button5"
                    Connessione(IP, "00") ' richiesta stato
    
            End Select
        End Sub
    

    Il mio codice lavora in asincrono, se te lo posto ti confondo le idee.

    prova a scrivere qualcosa tu leggendo questo esempio:
    https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient?view=net-5.0

    se il codice al link ti appare in C#, in alto puoi scegliere: PS. vai alla prima pagina e modifica il titolo della tua disccussione in: SR201-Relay module
  • Re: SR201-Relay module

    Ok grazie Rubik.... vadoi a studiare e fare dei test, grazie per il link e la risposta... ho modificato il titolo del post come sconsigliato...
  • Re: SR201-Relay module

    Per accendere e spegnere i relè non dovresti avere problemi, è sufficiente che nell'esempio delle MSDN cambi la porta in:
    
    Dim porta As Int32 = 6722 ' porta comandi SR-201
    
    e il nome della Sub visto che nel mio esempio è Connessione, invece nelle MSDN è Connect
    Invece per interpretare la risposta, basta che guardi cosa contiene responseData
    La risposta in responseData ti serve per aggiornare la tua interfaccia grafica e è la conferma che la commutazione è avvenuta.

    Per gestire la situazione quando il relé non è raggiungibile, ne parliamo quando hai superato questo step.
    Negli esempi c'è anche un programma in Delphi (sorgente e compilato) per cambiare l'IP, impostare se vuoi il ripristino dello stato precedente dopo mancanza di corrente e abilitazione visibilità web attraverso il sito cinese. (non l'ho mai usato)
  • Re: SR201-Relay module

    Grazie Rubik, funziona ovviamente, ho visto anche che se invio per esempio 11:30 come testo, mi attiva il rel'è e me lo disattiva dopo 30 secondi e idem il contrario ovviamente, in questo modo posso usarlo come pulsante volendo e non solo interruttore.... molto bene

    L'invio del codice 00 non sortisce effetto perchè in udp non da lo stato relè...

    responseData da la stringa 10000000 se è attivo relè 1 e 00000000 se qualsiasi relè è spento, 02000000 se accendo il relè 2 etc...
    come posso gestire quindi lo stato nel load per sapere se il relè è attivo o no?


    grazie
  • Re: SR201-Relay module

    orione1976 ha scritto:


    Grazie Rubik, funziona ovviamente, ho visto anche che se invio per esempio 11:30 come testo, mi attiva il rel'è e me lo disattiva dopo 30 secondi e idem il contrario ovviamente, in questo modo posso usarlo come pulsante volendo e non solo interruttore.... molto bene
    Esatto, per sapere cosa inviare usi l'esempio VB6, dove provi i comandi e verifichi le risposte, che assolve alla sua funzione di demo.

    orione1976 ha scritto:


    L'invio del codice 00 non sortisce effetto perchè in udp non da lo stato relè...
    La connessione deve essere TCP altrimenti non hai la risposta in responseData.

    orione1976 ha scritto:


    responseData da la stringa 10000000 se è attivo relè 1 e 00000000 se qualsiasi relè è spento, 02000000 se accendo il relè 2 etc...
    come posso gestire quindi lo stato nel load per sapere se il relè è attivo o no?
    L'invio del comando 00 non sortisce alcun effetto sullo stato dei relè, ma in responseData, troverai la stringa che ti svela lo stato dei relè.

    Il dato ricevuto come risposta è di un solo byte e viene convertito in una stringa che rappresenta gli 8 bit che lo compongono, per questo in responseData troverai solo 0 e 1; "02000000 se accendo il relè 2", non esiste.
    Una volta ricevuta la stringa, il metodo più semplice e leggibile è scegliere tramite Select Case tutti i casi possibili:
    
          Select Case responseData
          
                Case "00000000" ' relè diseccitati
                    ' esegui le operazioni del caso
    
                Case "01000000" ' eccitato il secondo relè
                    ' esegui le operazioni del caso
    
                Case "11000000" ' eccitato primo e secondo relè
                    ' esegui le operazioni del caso
    
                Case "10000000" ' eccitato primo relè
                    ' esegui le operazioni del caso
    
                Case Else ' non si è ricevuta una risposta valida
                    ' esegui le operazioni del caso
                   
            End Select
    
    Altri metodi usabili di lettura risposta:

    1) Fare un ciclo che scandisce le 8 posizioni, ma nel caso a due relè che da solo 4 combinazioni possibili, non si avrebbe una riduzione di codice significativa.

    2) Mascheramento dei bit senza convertire il dato ricevuto, che comprometterebbe la leggibilità, a favore di un'efficienza più alta ma inutile.

    3) Tutti i sistemi che la fantasia di un programmatore può partorire.
  • Re: SR201-Relay module

    Hai ragione Rubik in effetti avevo messo degli If dopo il responseData andando ad interpretare le possibili risposte e quindi se inviavo lo 00 ovviamente rispondeva.... poi li ho cancellati per fare dei test e senza istruzione non poteva funzionare.

    Ok allora è giusto quello che avevo interpretato, metto un ciclo if tanto sono solo 4 possibilità e poi gestisco l'evnto che è di mio interesse, quindi lo carico nel load e ovviamente mi da lo stato....
    Poi riguardo anche il codice vb, ma a logica dovrei risolvere anche così.

    Grazie per l'assistenza.... e pure la dritta di tenere il contatto alimentato con relè diseccitato è una bella dritta...


    Proseguo con l'ingegno....
  • Re: SR201-Relay module

    Ultima cosa se posso.....

    e se la scheda è disconnessa oppure è sbagliato l'ip, ovviamente non ricevo info, dove la vedo questa cosa? ho provato a vedere la lunghezza del bte di ritorno mettendolo minore o 0 a zero ma non funziona.
  • Re: SR201-Relay module

    Rubik ha scritto:


    Per gestire la situazione quando il relé non è raggiungibile, ne parliamo quando hai superato questo step.
    Come vedi già ti avevo anticipato...

    Quando invii un comando che non va a buon fine, net.Socket da due tipi di errore:
    1) ArgumentNullException, la scheda di rete del PC non è connessa
    2) SocketException, l'SR-201 non è raggiungible (spento o IP sbagliato)

    Come al solito ci sono vari modi di gestire la cosa, se modifichi l'esempio delle MSDN così:
    
            stream.Close()
            client.Close()
            Catch err As ArgumentNullException
               	responseData = err.Message
               	
            Catch err As SocketException
                    responseData = err.Message
    
    in responseData ti arriva il testo con la motivazione dell'errore.

    Se del testo non ti importa nulla ma vuoi solo avere un sistema per aggiornare la grafica in conseguenza dell'errore:
    
            stream.Close()
            client.Close()
            Catch err As ArgumentNullException
               	responseData = "00000002"
               	
            Catch err As SocketException
                    responseData = "00000003"
    
    e ai 4 if che hai fatto per lo stato dei relè ne aggiungi altri due
    "00000002" = connessione assente
    "00000003" = IP irraggiungibile
    Se non vuoi distinguere i due tipi di errore, basta un solo if, e mandi lo stesso codice per ambedue gli errori

    La cosa bruttina è che il time-out per essere sicuri che non c'è risposta è di circa 20" (regolabile con ReceiveTimeout), e in quel tempo il programma rimane bloccato.
    Per evitare questo, il socket deve agire su un thread separato in modo che si può mostrare l'attesa e il form non rimane bloccato.


    SR201.gif
    SR201.gif

  • Re: SR201-Relay module

    Esatto... avevi anticipato il problema in effetti.... ho provato sia gli if che il Select Case che ovviamente ed è solo una questione di praticità, solo che se metto come nell'esempio il responseData sull'eccezione nel Catch, mi risulta non dichiarato perchè è in un ramo diverso no?
    Try
    ' Create a TcpClient.
    ' Note, for this client to work you need to have a TcpServer
    ' connected to the same address as specified by the server, port
    ' combination.
    Dim port As Int32 = 6722
    Dim client As New TcpClient(server, port)

    ' Translate the passed message into ASCII and store it as a Byte array.
    Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(message)

    ' Get a client stream for reading and writing.
    ' Stream stream = client.GetStream();
    Dim stream As NetworkStream = client.GetStream()

    ' Send the message to the connected TcpServer.
    stream.Write(data, 0, data.Length)

    Console.WriteLine("Sent: {0}", message)

    ' Receive the TcpServer.response.
    ' Buffer to store the response bytes.
    data = New [Byte](256) {}

    ' String to store the response ASCII representation.
    Dim responseData As [String] = [String].Empty

    ' Read the first batch of the TcpServer response bytes.
    Dim bytes As Int32 = stream.Read(data, 0, data.Length)
    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)
    Console.WriteLine("Received: {0}", responseData)

    Select Case responseData

    Case "00000000" ' relè diseccitati
    ' esegui le operazioni del caso
    MsgBox("relè spenti")

    Case "01000000" ' eccitato il secondo relè
    ' esegui le operazioni del caso
    MsgBox("rele 2 ON e 1 OFF")

    Case "11000000" ' eccitato primo e secondo relè
    ' esegui le operazioni del caso
    MsgBox("rele 1 e 2 ON")
    Case "10000000" ' eccitato primo relè
    ' esegui le operazioni del caso
    MsgBox("rele 1 ON e 2 OFF")
    Case "00000002" ' connessione assente
    MsgBox("Connessione Assente")
    Case "00000003" ' IP non raggiungibile
    MsgBox("IP non raggiungibile")
    End Select

    ' Close everything.
    stream.Close()
    client.Close()
    Catch err As ArgumentNullException
    responseData = err.Message

    Catch err As SocketException
    responseData = err.Message
    End Try
    Vedi?
  • Re: SR201-Relay module

    Ma così è un polpettone, dovresti fare delle sub da richiamare...
    1) sub dei bottoni
    2) sub che legge l'SR201
    3) sub che interpreta la risposta
    4) sub che aggiorna l'interfaccia
    5) sub che gestisce gli errori

    Comunque il tuo programma tutto su una sub così funziona spero, non l'ho provato.
    Come hai intuito, le variabili dichiarate all'interno di Try, End Try sono locali e non sono esposte.
    
    Imports System.Net.Sockets
    
    Public Class Form1
    
        Dim IP = "192.168.1.100"
    
        ' **************** TUTTI I MESSAGGI POSSIBILI, VER 2 RELE' ***********************
        Private Sub Buttone_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click
            Select Case sender.name
                Case "Button1"
                    Connessione(IP, "11") ' on relè 1
    
                Case "Button2"
                    Connessione(IP, "12") ' on relè 2
    
                Case "Button3"
                    Connessione(IP, "21") ' off relè 1
    
                Case "Button4"
                    Connessione(IP, "22") ' off relè 2
    
                Case "Button5"
                    Connessione(IP, "00") ' richiesta stato
    
            End Select
        End Sub
    
        Private Sub Connessione(server As String, message As String)
    
            Dim responseData As [String] = [String].Empty
            Try
                ' Create a TcpClient.
                ' Note, for this client to work you need to have a TcpServer
                ' connected to the same address as specified by the server, port
                ' combination.
                Dim port As Int32 = 6722
                Dim client As New TcpClient(server, port)
    
                ' Translate the passed message into ASCII and store it as a Byte array.
                Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(message)
    
                ' Get a client stream for reading and writing.
                ' Stream stream = client.GetStream();
                Dim stream As NetworkStream = client.GetStream()
    
                ' Send the message to the connected TcpServer.
                stream.Write(data, 0, data.Length)
    
                ' Console.WriteLine("Sent: {0}", message)
    
                ' Receive the TcpServer.response.
                ' Buffer to store the response bytes.
                data = New [Byte](256) {}
    
                ' String to store the response ASCII representation.
                ' Read the first batch of the TcpServer response bytes.
                Dim bytes As Int32 = stream.Read(data, 0, data.Length)
                responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)
                ' Console.WriteLine("Received: {0}", responseData)
    
    
                ' Close everything.
                stream.Close()
                client.Close()
            Catch err As ArgumentNullException
                responseData = err.Message
    
            Catch err As SocketException
                responseData = err.Message
            End Try
    
    
            Select Case responseData
    
                Case "00000000" ' relè diseccitati
                    ' esegui le operazioni del caso
                    MsgBox("relè spenti" & vbNewLine & responseData)
    
                Case "01000000" ' eccitato il secondo relè
                    ' esegui le operazioni del caso
                    MsgBox("rele 2 ON e 1 OFF" & vbNewLine & responseData)
    
                Case "11000000" ' eccitato primo e secondo relè
                    ' esegui le operazioni del caso
                    MsgBox("rele 1 e 2 ON" & vbNewLine & responseData)
    
                Case "10000000" ' eccitato primo relè
                    ' esegui le operazioni del caso
                    MsgBox("rele 1 ON e 2 OFF" & vbNewLine & responseData)
    
                Case Else ' connessione assente
                    MsgBox(responseData)
    
            End Select
        End Sub
    End Class
    
    Cerca di dargli un'ordinata altrimenti ti intrecci.
  • Re: SR201-Relay module

    No no... certo che farò delle sub ognuna per la cosa specifica, ora ènin fase test quindi m'interessa pocomla leggibilità... poi si, va sistemato ovviamente...

    Boh allora provo ordinandolo subito e vediamo che esce fuori così cerco di gestire le risposte.
Devi accedere o registrarti per scrivere nel forum
25 risposte