bye
--
Esistono 10 tipi di persone: chi conosce il binario e chi no.
Gestione Ottica - Gestionale per Ottici e Programmi Gratuiti su:
http://www.nicolaottomano.it
Interfacciare una RS485 con Windows e in particolare con Xp è un
problema, perchè in genere si deve rispettare un tempo molto breve
prima di 'lasciare libera' la linea, e se il dispositivo risponde
prima che si disimpegni la linea stessa con l'RTS\ a causa dei suoi
multitasking si crea una situazione di errore.
Oltretutto con Xp hanno cambiato l' api SetCommState e io ho avuto
parecchi problemi con la RS485 su programmi che con W98 andavano
benissimo.
Attualmente ho risolto con un converter RS232-RS485 dalla Intracom
http://www.icintracom.biz/ (mod. ICC IO-A52) che ha un processorino a
bordo e inverte automaticamente la linea quando mancano dati in input,
e che quindi ha bisogno solo di GND, RXD e TXD.
In questo modo bypasso windows e i suoi problemi di sincronia con
l'RTS\ e ho risolto i problemi, tutto ok anche con Xp.
Può essere che i tuoi problemi dipendano proprio dal fatto che la UART
del pc non riesce a decodificare i caratteri in arrivo per problemi di
direzione della linea, e non vedo soluzioni diverse da quella che ti
ho suggerito.
ciao
Stefano
Ciao Stefano, il sistema operativo che utilizzo è WinMe su un portatile, ora
però mi assilla anche un altro dubbio: il contatore possiede tre uscite I/O
e la Massa che però non ho collegato al converter visto che mi trovo nel
converter T+T-R+R- può esserne la causa?Il converter che utilizzo è un
IC-485S della Aten che mi ha procurato l'elettricista.
La stringa che gli passo è :
mscomm1.rtsenable=true
mscoom1.output "xxxxx"
mscomm1.rtsenable=false
Qualche consiglio?
>Ciao Stefano, il sistema operativo che utilizzo è WinMe su un portatile, ora
>però mi assilla anche un altro dubbio: il contatore possiede tre uscite I/O
>e la Massa che però non ho collegato al converter visto che mi trovo nel
>converter T+T-R+R- può esserne la causa?Il converter che utilizzo è un
>IC-485S della Aten che mi ha procurato l'elettricista.
>La stringa che gli passo è :
>
>mscomm1.rtsenable=true
>mscoom1.output "xxxxx"
>mscomm1.rtsenable=false
>
>Qualche consiglio?
Il tuo collegamento è giusto in quanto la RS485 è differenziale e
basta collegare T/R+ eT/ R- per comunicare.
Le altre uscite non so cosa sono, occorre guardare il libretto di
istruzioni.
Anche il tuo modo di passargli la stringa è corretto, se il baudrate è
giusto non ci sono molte altre cose da verificare.
L'unica cosa che mi viene in mente è provare a usare un altro
converter 232 con un pc in ascolto per vedere cosa effettivamente
transita sulla linea, anche perchè i dispositivi che ricevono una
stringa con errore in genere rispondono con un NAK.
Poi fai in modo che il tutto venga scritto su un file che esamini
con calma con un editor che veda tutti i codici (Ultraedit ad esempio)
Se caratteri Y sono degli 0FFh, vuol dire che la UART ha perso la
sincronia con lo start bit, se tu gestissi la UART direttamente come
si fa con un microcontroller vedresti dei 'frame error' in questo
caso.
Ma se la periferica risponde troppo presto mi sa che devi cambiare il
convertitore, anche sa la colpa in fondo non è sua ma di Windows.
Ti copio anche gli standard di comunicazione:
;STANDARD DI COMUNICAZIONE SECONDO DIN 66019
STX = 02H ;INIZIO TRASMISSIONE
ETX = 03H ;FINE TESTO
EOT = 04H ;FINE TRASMISSIONE
ENQ = 05H ;RICHIESTA COLLEGAMENTO AL TERMINALE
ACK = 06H ;DATO RICEVUTO CORRETTAMENTE RISPOSTA "OK"
NAK = 15H ;RISPOSTA "NON COMPRESO, RIPETERE"
Grazie dei consigli, questa mattina ho ordinato lo stesso tipo di converter
da te consigliato ( anche l'elettricista ha acquistato il primo converter
alla intracom) appena arriva riproverò la connessione e speriamo bene :)
poi ti dirò Saluti.
Ciao Stefano, oggi pome mi hanno portato il convertitore che mi hai
consigliato ed ho iniziato a fare qualche prova ed è nato un altro dubbio:
la stringa di comunicazione che gli devo passare è in esadecimale....?
Quindi se io devo passare una stringa del tipo <stx>02r30<etx><chk>
<---dove chk è il controllo di tutti i bit
è corretto un passaggio di stringa del tipo (ho guardato un pò su post
vecchi) comm1.output=chr$(02) & "02r30"&chr$(03) & chr$(06) ??? non so come
è il carattere di controllo...forse chr$(06)?
Ho provato a passargli questa stringa ma mi rilascia sempre dei caratteri
anomali...
Ho provato anche così ma niente:
stringa = Chr(Val("&H02")) + Chr(Val("&H2r04")) + Chr(Val("&H03"))
Comm1.Output = stringa
Mi restituisce due ?? rovesciati...
Qualche suggerimento?
>
> Ciao Stefano, oggi pome mi hanno portato il convertitore che mi hai
> consigliato ed ho iniziato a fare qualche prova ed č nato un altro dubbio:
> la stringa di comunicazione che gli devo passare č in esadecimale....?
>
> Quindi se io devo passare una stringa del tipo <stx>02r30<etx><chk>
><---dove chk č il controllo di tutti i bit
>
> č corretto un passaggio di stringa del tipo (ho guardato un pň su post
> vecchi) comm1.output=chr$(02) & "02r30"&chr$(03) & chr$(06) ??? non so come
>č il carattere di controllo...forse chr$(06)?
>
> Ho provato a passargli questa stringa ma mi rilascia sempre dei caratteri
>anomali...
>
> Ho provato anche cosě ma niente:
>
> stringa = Chr(Val("&H02")) + Chr(Val("&H2r04")) + Chr(Val("&H03"))
meglio stringa = Chr$(&H2) & .... .. & Chr$(&h3)
cosě ti risparmi due conversioni
mi sfugge 02r30 č un comando o un indirizzo seguito da un comando?
> Comm1.Output = stringa
ok
> Mi restituisce due ?? rovesciati...
puň essere un messaggio di errore, prova a convertirli con la funzione
Asc( ) per vedere il valore numerico
> Qualche suggerimento?
In mancanza di dati specifici sul protocollo, solo nozioni generiche.
Il protocollo RS485 dovrebbe usare gli standard STX(02h) per iniziare
e ETX(03h) per finire la stringa,e al centro solo caratteri ASCII>20H
In genere prevede anche un checksum o BCC (puň essere lo xor
di tutte le parole della stringa o gli otto bits bassi della somma, a
seconda del protocollo).
La stringa diventa: 02h..addr...dati....03h BCC
Per esempio, per trasmettere all'indirizzo 01 "ABC" diventa:
(in bytes esadecimali)
2 30 31 34 31 34 32 34 33 3 +1byte di BCC
"A" che in ascii č 41H diventa 34H 31H cioč l'ascii di 4 e 1 e cosě
via
(Se BCC<20h allora BCC=BCC+20h per non confonderli coi comandi)
ti metto anche la funzione per il calcolo BCC con lo xor
che chiami cosě:
stringa= stringa & Chr$(CrCC(stringa))
poi:
Comm1.Output = stringa
_____________________
Public Function CrCC(ByVal InSt As String) As Long
Dim T As Byte, Bcc As Long 'da STX+1 fino a ETX
' Bcc = 0
For i = 2 To Len(InSt) 'Step 2
T = Asc(Mid$(InSt, i, 1))
Bcc = Bcc Xor T
If Asc(Mid$(InSt, i, 1)) = Etx Then Exit For
Next
If Bcc < &H20 Then Bcc = Bcc + &H20
'InSt = InSt + Chr$(Bcc) + Chr$(0) ' + Chr$(0)
CrCC = Bcc
End Function
_____________________
ciao
Stefano
> Il protocollo RS485 dovrebbe usare gli standard STX(02h) per iniziare
> e ETX(03h) per finire la stringa,e al centro solo caratteri ASCII>20H
>
> In genere prevede anche un checksum o BCC (può essere lo xor
> di tutte le parole della stringa o gli otto bits bassi della somma, a
> seconda del protocollo).
>
> La stringa diventa: 02h..addr...dati....03h BCC
>
> Per esempio, per trasmettere all'indirizzo 01 "ABC" diventa:
> (in bytes esadecimali)
> 2 30 31 34 31 34 32 34 33 3 +1byte di BCC
>
> "A" che in ascii è 41H diventa 34H 31H cioè l'ascii di 4 e 1 e così
> via
>
>
> (Se BCC<20h allora BCC=BCC+20h per non confonderli coi comandi)
>
> ti metto anche la funzione per il calcolo BCC con lo xor
> che chiami così:
> stringa= stringa & Chr$(CrCC(stringa))
> poi:
> Comm1.Output = stringa
>
> _____________________
>
> Public Function CrCC(ByVal InSt As String) As Long
> Dim T As Byte, Bcc As Long 'da STX+1 fino a ETX
>
> ' Bcc = 0
> For i = 2 To Len(InSt) 'Step 2
> T = Asc(Mid$(InSt, i, 1))
> Bcc = Bcc Xor T
> If Asc(Mid$(InSt, i, 1)) = Etx Then Exit For
> Next
> If Bcc < &H20 Then Bcc = Bcc + &H20
> 'InSt = InSt + Chr$(Bcc) + Chr$(0) ' + Chr$(0)
> CrCC = Bcc
>
> End Function
> _____________________
>
> ciao
> Stefano
> In mancanza di dati specifici sul protocollo, solo nozioni generiche.
>
> Il protocollo RS485 dovrebbe usare gli standard STX(02h) per iniziare
> e ETX(03h) per finire la stringa,e al centro solo caratteri ASCII>20H
>
> In genere prevede anche un checksum o BCC (può essere lo xor
> di tutte le parole della stringa o gli otto bits bassi della somma, a
> seconda del protocollo).
>
> La stringa diventa: 02h..addr...dati....03h BCC
>
> Per esempio, per trasmettere all'indirizzo 01 "ABC" diventa:
> (in bytes esadecimali)
> 2 30 31 34 31 34 32 34 33 3 +1byte di BCC
>
> "A" che in ascii è 41H diventa 34H 31H cioè l'ascii di 4 e 1 e così
> via
>
>
> (Se BCC<20h allora BCC=BCC+20h per non confonderli coi comandi)
>
> ti metto anche la funzione per il calcolo BCC con lo xor
> che chiami così:
> stringa= stringa & Chr$(CrCC(stringa))
> poi:
> Comm1.Output = stringa
>
> _____________________
>
> Public Function CrCC(ByVal InSt As String) As Long
> Dim T As Byte, Bcc As Long 'da STX+1 fino a ETX
>
> ' Bcc = 0
> For i = 2 To Len(InSt) 'Step 2
> T = Asc(Mid$(InSt, i, 1))
> Bcc = Bcc Xor T
> If Asc(Mid$(InSt, i, 1)) = Etx Then Exit For
> Next
> If Bcc < &H20 Then Bcc = Bcc + &H20
> 'InSt = InSt + Chr$(Bcc) + Chr$(0) ' + Chr$(0)
> CrCC = Bcc
>
> End Function
> _____________________
>
> ciao
> Stefano
Sono riuscito a trovare il manualino del contatore d'energia su internet:
http://www.langer-messtechnik.de/download/D96FM4-manual.pdf,
c'è una sezione chiamata network communication in cui dice:
Communication by means of frames of variable lenght, 7 bit ASCII code
character, code from 00 up to 127...e dopodiche è spiegata la struttura per
l'interrogazione dello strumento.
Se non erro tutta la stringa deve essere convertita in caratteri ascii più
la funzione finale di controllo...visto che poi la funzione Asc restiuisce
il codice del primo carattere della stringa occorre fargli convertire tutti
i caratterti della stringa
<stx>
01r04 <---dove 01 è l'adress del contatore e r04 sono i dati che si
vogliono leggere
<etx>
<chk><--check sum di tutti i caratteri
in sostanza al contatore arriverebbe una sequenza di numeri... ma non sono
sicuro.. mi sa che sto perdendo il nord :((
>
>Sono riuscito a trovare il manualino del contatore d'energia su internet:
>http://www.langer-messtechnik.de/download/D96FM4-manual.pdf,
>c'è una sezione chiamata network communication in cui dice:
>Communication by means of frames of variable lenght, 7 bit ASCII code
>character, code from 00 up to 127...e dopodiche è spiegata la struttura per
>l'interrogazione dello strumento.
Questo significa che devi aprire la porta con settings: 9600,n,7,1
>Se non erro tutta la stringa deve essere convertita in caratteri ascii più
>la funzione finale di controllo...visto che poi la funzione Asc restiuisce
>il codice del primo carattere della stringa occorre fargli convertire tutti
>i caratterti della stringa
><stx>
Chr$(2)
>01r04 <---dove 01 è l'adress del contatore e r04 sono i dati che si
>vogliono leggere
"01r04" stringa
><etx>
Chr$(3)
><chk><--check sum di tutti i caratteri
il checksum con lo XOR, come la funzione che ti ho mandato prima
>in sostanza al contatore arriverebbe una sequenza di numeri
no gli mandi una stringa con Mscomm1.output
Poi meglio che setti Mscomm1.InputLen=1 e che fai un polling di un
carattere alla volta fino a ETX, poi aspetti il checksum e lo
confronti.
Lui risponderà con una sequenza analoga:
The answer from the instrument has the format:
<STX> <blank> value <blank> factor <blank> unit <blank> <ETX> <CHK>
2 20 hex 20 hex K or M 20 hex 20 hex 3 XOR
abbastanza chiaro, mi sembra, dopo pochi tentativi devi riuscire a
leggere qualcosa.
ciao
Stefano
Ciao Stefano sono ancora qui a disturbati (perdonami :) )
Forse qualcosa è migliorato visto che ora lo strumento mi dice: _ZZHzJ
:))) l'Hz sembrerebbe Hertz ma non credo lo sia :)
non mi è chiaro purtroppo ancora bene il suo funzionamento:
lo strumento mi restituisce sempre dei caratteri anomali sia che metto
l'indirizzo 01 (indirizzo reale della macchina) che un indirizzo 02 o 03 o
04 seguito dal comando r30 nella stringa che invio al contatore di energia
stringa = Chr$(2) & "01r30" & Chr$(3)
Comm1.Output = stringa & CrCC(stringa) <-- è corretto questo passaggio?non
ho capito bene cosa gli arriva allo strumento con il checksum..
la somma totale dei bit?
e settare mscomm1.inputlen=1 intendi fare passare allo strumento un
carattere per volta con un ciclo? tipo: & H 0 2 s t r i n g a & h 0 3
Ultimo e non meno importante per vedere qualcosa di leggibile ammesso che
passi la stringa correttamente occorrerà riconvertire carattere per
carattere che lo strumento restituisce in decimale?
Grazie per l'aiuto.
>Forse qualcosa è migliorato visto che ora lo strumento mi dice: _ZZHzJ
>:))) l'Hz sembrerebbe Hertz ma non credo lo sia :)
Neanch'io
>non mi è chiaro purtroppo ancora bene il suo funzionamento:
>lo strumento mi restituisce sempre dei caratteri anomali sia che metto
>l'indirizzo 01 (indirizzo reale della macchina) che un indirizzo 02 o 03 o
>04 seguito dal comando r30 nella stringa che invio al contatore di energia
L'indirizzo lo devi selezionare come il baud rate, vedi il tuo manuale
a pag.12
>stringa = Chr$(2) & "01r30" & Chr$(3)
devi mettere il checksum, che è lo XOR di tutte le cifre precedenti.
ti rimetto la funzione:
_____________________
Public Function CrCC(ByVal InSt As String) As Long
Dim T As Byte, Bcc As Long 'da STX fino a ETX
' Bcc = 0
For i = 1 To Len(InSt) 'Step 2
T = Asc(Mid$(InSt, i, 1))
Bcc = Bcc Xor T
If Asc(Mid$(InSt, i, 1)) = Etx Then Exit For
Next
If Bcc < &H20 Then Bcc = Bcc + &H20
'InSt = InSt + Chr$(Bcc) + Chr$(0) ' + Chr$(0)
CrCC = Bcc
End Function
_____________________
>Comm1.Output = stringa & CrCC(stringa) <-- è corretto questo passaggio?non
stringa= stringa & Chr$(CrCC(stringa))
Comm1.Output = stringa
>ho capito bene cosa gli arriva allo strumento con il checksum..
>la somma totale dei bit?
gli arriva un carattere di controllo per capire se la stringa è valida
o no
>e settare mscomm1.inputlen=1 intendi fare passare allo strumento un
>carattere per volta con un ciclo? tipo: & H 0 2 s t r i n g a & h 0 3
InputLen=1 vuol dire che tu leggi la sua risposta un carattere alla
volta, devi fare un loop fino a ETX poi aspettare il CrCC e
confrontarlo.
>Ultimo e non meno importante per vedere qualcosa di leggibile ammesso che
>passi la stringa correttamente occorrerà riconvertire carattere per
>carattere che lo strumento restituisce in decimale?
Ti consiglio di usare un file sequenziale dove mettere la
comunicazione ed esaminare quello, si fa prima a capire cosa non va e
vedere cosa arriva, poi fai le routines di elaborazione della
risposta.
OPEN "prova.txt" FOR APPEND as #1 'o usa freefile
e dopo ogni
Comm1.Output = stringa
fai anche
print #1, stringa
e dopo ogni lettura di carattere
ChrInp= Comm1.input
fai
print #1, ChrInp ;
alla fine
CLOSE #1
ed esamini il file "prova.txt" con un editor che veda anche
l'esadecimale
UltraEdit va benissimo
www.ultraedit.com
più di così non so come aiutarti
ciao
Stefano