Newsgroup: it.comp.lang.visual-basic
Titolo: VB6 mscomm e plc

Ciao, devo interrogare un contatore di energia che possiede la porta rs485.
Per lo scopo ho acquistato un convertitore da rs232->rs485.Il plc è stato
predisposto come dal suo manuale con la comunicazione in 485,9600,8,n,1 e
gli occorre che gli venga passata una stringa nel seguente formato
<STX>01R30<ETX><CHT> dove 01 è indirizzo del plc e r30 è la richiesta del
dato che voglio leggere e qua sorge il problema.Il controllo mscomm anzichè
restituirmi <stx>220v<etx><cht> mi passa bella sfilza di yyyyyyy in genere
vari caratteri sporchi.Qualche suggerimento?
Premetto che il collegamento è  con due fili dal plc al convertitore e  al
convertitore (R+R-T+T-) è stato ponticellato t+con r+ e t- con r-.Può essere
causa della gestione del DTR e del DSR?

prova a vedere  su 
www.elettronicamente.com
Vi sono molti progetti scaricabili gratuitamente (serve solo un'iscrizione)
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

   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?

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"

 On Sun, 18 Apr 2004 15:46:58 GMT> Il tuo collegamento è giusto in quanto

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?



 è il carattere di controllo...forse chr$(06)?
...
Ehh... senza sapere le specifiche del protocollo, e' difficile.
Se e' un carattere di controllo (che in quanto tale non puo' essere fisso,
altrimenti che controllo e'), bisogna conoscenre il metodo di calcolo.
Tanto per dirtene una, un metodo e' quello di fare uno XOR su tutti i
caratteri (1 carattere XOR 2 carattere, il risultato XOR 3 carattere e cosi'
via) e poi inviare il rislultato finale. Se il PLC, che si e' fatto il
calcolo, vede che il nostro carattere di controllo (checksum) e' quello che
si e' calcolato, prende buona la stringa che gli abbiamo passato e fa quello
che deve fare.
Buon lavoro... Maurizio

 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

 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 :((

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

 ha scritto nel messaggio
news:fjip801jvqrs7rmd8...@4ax.com...

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.

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