Inviare codice "0A" (hex) a shell

di darioV il
66 risposte

66 Risposte - Pagina 2

  • A me rimane un dubbio.
    I moduli sono da 8 canali, RS485 (almeno così pare), quindi ciascun modulo dovrebbe avere un suo indirizzo (nella documentazione effettivamente compaiono i dip switch per configurarlo).
    Io continuo a non comprendere come mai NON sia presente (necessario) l'indirizzo del modulo nel comando .....
  • darioV ha scritto:


    Ciao a tutti, devo comandare da access dei relè su delle schede RS485 da 8 relè cadauna.
    la gestione dei singoli relè in realtà viene fatta dal programma usbrelay.exe al quale invio tramite shell la seguente stringa
    Shell("C:\DB_Access\usbrelay.exe -c:4 -r:1#0")

    dove il numero del relè è identificato dal paramentro -r:x dove x è il numero esadecimale del relè
    I relè vengono attivati/disattivati correttamente fino al n° 9 ma quando devo comandare il relè 10 ovviamente mi attiva/disattiva il n° 16.
    Dovrei passargli come numero "0A" ma se lo faccio non ottengo errori ma il relè non viene comandato.
    Sapete indicarmi come passare quel parametro alla shell?
    Grazie
    Hai provato ad aggiungere "&H0A" dove lo Zero può anche essere soppresso... perchè ho il dubbio che il programma usbrelay.exe non riesca a capire il VarType da applicare... se gli anteponi il [&H] forse dovrebbe/potrebbe capire che è un HEX...? (ovviamente il linguaggio di sviluppo condiziona questa ipotesi) magari basta la [HA]... prova un po.

    Da quanto ho capito il 1° è il Numero del Relè forse da apassare in HEX, il secondo lo Stato (0/1)
    
    -r:HA#1
    ...
    -r:&HA#1
  • Al momento ho aggirato il problema utilizzando i file .bat lanciati da WshShell così da non far comparire la finestra della riga di comando.
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.Run Chr(34) & "C:\DB_Access\file_bat\R10_ON.bat" & Chr(34), 0
    Set WshShell = Nothing
    il file R10_ON.bat
    @echo off
    cls
    echo FF0A00>off.txt
    certutil -decodehex off.txt off.bin
    certutil -decodehex on.txt on.bin
    MODE COM4:9600,n,8,1
    copy off.bin \\.\com4/b
    echo "                          Relay is OFF"
    del on.bin
    del off.bin
    del on.txt
    del off.txt
    
    Se non troviamo il modo per inviare 0A alla scheda userò questo sistema
  • Hai provato ad aggiungere "&H0A" dove lo Zero può anche essere soppresso... perchè ho il dubbio che il programma usbrelay.exe non riesca a capire il VarType da applicare... se gli anteponi il [&H] forse dovrebbe/potrebbe capire che è un HEX...? (ovviamente il linguaggio di sviluppo condiziona questa ipotesi) magari basta la [HA]... prova un po.

    Da quanto ho capito il 1° è il Numero del Relè forse da apassare in HEX, il secondo lo Stato (0/1)
    
    -r:HA#1
    ...
    -r:&HA#1
    dunque ho provato con
    
    -r:&H0A#1
    -r:H0A@1
    -r:HA#1
    
    senza risultato
  • Apparentemente questa non da errore, che poi funzioni è tutto da vedere
    
    C:\Users\Desktop\USBRelay\USBRelay.exe -c:5 -r:0A#0
  • @Alex ha scritto:


    Apparentemente questa non da errore, che poi funzioni è tutto da vedere
    
    C:\Users\Desktop\USBRelay\USBRelay.exe -c:5 -r:0A#0
    purtroppo non funziona
  • Dato che il tool ha un bug prova da VBA con
    
    Open "COM4:9600,N,8,1" For Binary As #1
       Put #1, , Chr(&HFF) & Chr(&H0A) & Chr(&H01)
    Close #1
    
  • oregon ha scritto:


    Dato che il tool ha un bug prova da VBA con
    
    Open "COM4:9600,N,8,1" For Binary As #1
       Put #1, , Chr(&HFF) & Chr(&H0A) & Chr(&H01)
    Close #1
    
    FUNZIONA!!!!!!

    E' anche molto più veloce rispetto alla soluzione che avevo trovato

    grazie
  • darioV ha scritto:


    oregon ha scritto:


    Dato che il tool ha un bug prova da VBA con
    
    Open "COM4:9600,N,8,1" For Binary As #1
       Put #1, , Chr(&HFF) & Chr(&H0A) & Chr(&H01)
    Close #1
    
    grazie
    Di nulla
  • Ciao riattivo la discussione per un problema che si manifesta con la comunicazione con la porta COM4.
    Il DB di Access deve essere attivo 24 su 24, 7 su 7 per gestire delle luci e delle resistenze.
    In base al variare di parametri da parte dell'utente, vengono comandati i relè delle luci e delle resistenze.
    I relè delle resistenze però vengono anche comandati automaticamente in base a un ciclo perpetuo di controllo dell'orario ogni x minuti
    Ho riscontrato durante questi giorni di test che a volte, dopo alcune ore senza eseguire nessuna variazione di alcun parametro le schede a volte non rispondono più all'invio dei comandi.
    Se lancio un tool per la comunicazione con la porta, la apro e la chiudo, le schede riprendono a rispondere.

    Altra cosa; è possibile leggere lo stato dei relè delle varie schede per sapere quali sono attivati?
    da terminale il comando
    FF A1 00 (A2,A3)
    che produce esempio
    FF A1 00 01 00 00 00 01 00 00 
    grazie
  • darioV ha scritto:


    Ho riscontrato durante questi giorni di test che a volte, dopo alcune ore senza eseguire nessuna variazione di alcun parametro le schede a volte non rispondono più all'invio dei comandi.
    al momento ho risolto richiamando il programma usbrelay.exe all'attivazione di una particolare maschera inviando il comando di apertura e chiusura del relè 1
    Shell ("C:\DB_Access\usbrelay.exe -c:4 -r:1#1")
    Shell ("C:\DB_Access\usbrelay.exe -c:4 -r:1#0")

    oregon ha scritto:


    Dato che il tool ha un bug prova da VBA con
    
    Open "COM4:9600,N,8,1" For Binary As #1
       Put #1, , Chr(&HFF) & Chr(&H0A) & Chr(&H01)
    Close #1
    
    Quanto suggerito da Oregon è possibile renderlo "dinamico"?
    intendo riuscire a inviare il comando a n relè il cui numero posso recuperarlo da un recordset tramite un ciclo for - next tipo
    
    Open "COM4:9600,N,8,1" For Binary As #1
    Do
    For i = 1 To 14
    	If i = rst(0) Then
                    Debug.Print rst(0) & " acceso"
                    Put #1, , Chr(&HFF) & Chr(&H & rst(0)) & Chr(&H1)
                    rst.MoveNext
            Else
                    Debug.Print i & " spento"
                    Put #1, , Chr(&HFF) & Chr(&H & rst(0)) & Chr(&H0)
    	End If
    Next i
    Loop Until rstRLOFF.EOF
    esempio il recordset conterrà 2,7,11 quindi dovrei inviare &H2, &H7 e &H11 ma non trovo il modo per farlo, ho provato con apici e virgolette in vari modi ma senza risultato
  • Il valore va bene anche in decimale ... l'esadecimale è solo una rappresentazione e l'avevo usato per la costante ma non è necessario

    Chr(rst(0))
  • oregon ha scritto:


    Il valore va bene anche in decimale ... l'esadecimale è solo una rappresentazione e l'avevo usato per la costante ma non è necessario

    Chr(rst(0))
    perfetto funziona, grazie
  • Se non vuoi usare l'esadecimale puoi scrivere

    Put #1, , Chr(255) & Chr(rst(0)) & Chr(1)
  • oregon ha scritto:


    Se non vuoi usare l'esadecimale puoi scrivere

    Put #1, , Chr(255) & Chr(rst(0)) & Chr(1)
    direi che è più comodo
Devi accedere o registrarti per scrivere nel forum
66 risposte