Newsgroup: it.comp.os.linux.development
Titolo: seriale virtuale

salve, nella mia ditta utilizziamo dei plc per la gestione di alcune
macchine industriali il collegamento con il pc e' seriale. per la gestione
utilizzo un programma dedicato che gira su un server hp. per necessita di
spazio ho bisogno di spostare il server a notevole distanza dai plc e volevo
sfruttare per il cablaggio la rete lan gia esistente. ho comprato un
convertitore da rs232 a ethernet che mi permette di accedere al terminale
remoto via tcp/ip.
il problema e' che il programma dedicato lavora sulla seriale e non posso
modificarlo. e' possibile in linux/unix creare una seriale virtuale in modo
tale che il programma si colleghi a  questa seriale e quest'ultima
reindirizzi il flusso di dati alla connessione tcp? io ho fatto gia un po di
esperienza sulla programmazione dei socket in linux con il c quello che non
so e se e' possibile creare questa seriale "virtuale".
Qualcuno sa' darmi qualche dritta?
Ciao,
Teresa.

Non ho mica capito bene: un server tcp lo sai fare, le porte seriali su
piattaforma PC-compatibile sono le canoniche /dev/ttyS0, ..., /dev/ttyS3.
Cosa ti manca?
Ciao,
 ___ 
/_|_\  Umberto Salsi
\/_\/  
www.icosaedro.it

 Cosa ti manca?
 forse non sono stata chiara, il plc non posso collegarlo direttamente via
seriale al server quindi uso questo convertitore (
www.sena.com
) da rs-232 a
ethernet che mi permette di vedere il terminale seriale del plc come se
fosse un host della mia rete locale,(quindi accessibili via telnet con un
indirizzo ed una porta es 
192.168.0.1:6789
) il problema e' che il programma
di gestione  non e' in grado di effettuare una connessione di tipo telnet ne
posso modificarlo in quanto e' un software propietario di terze parti. posso
solo specificargli nel file di conf su quale seriale fisica e' collegato il
plc (es /dev/ttyS0) ma non potendo collegare direttamente via seriale il plc
vorrei creare una falsa seriale (tipo /dev/ttyS4) che pero' deve comportarsi
come una seriale per il programma di gestione ma in realta' reindirizzi il
flusso seriale proveniente dal prog di gestione al plc attraverso una
connessione telnet... ora il problema e' come realizzare questa finta
seriale che si occupi del reindirizzamento.
Spero di essermi espressa meglio :-)
Ciao,
Teresa.

 > Cosa ti manca?
mi sto leggendo il serial programming how-to ed ho visto che in linux le
seriali vendono gestite come fossero un file. a questo punto il problema
pero' resta, il programma cerca di scrivere su di un file ed io con il mio
programma dovrei leggere in contemporanea quello che c'e' scritto su questo
file, giusto? il dubbio che mi rimane e' che penso i device file non siano
dei veri e propi file(quindi se ad esempio apro /dev/ttyS0 durante una
connessione non credo che ci legggerei niente, o no?!) ed inoltre se non
cancello di volta in volta questo file non diventera' enorme?
forse sto scrivendo stupidaggini, qualcuno puo' al limite consigliarmi
qualche testo che mi faccia comprendere meglio la gestione di questo
particolare tipo di file?
Ciao,
Teresa.

potresti provare con una pipe e con netcat , ma non sono sicuro che
funzioni.
ps: non ci sono i driver x il convertitore ?
-- 
La calcolatrice all'impiegato: "Conta pure su di me".
                -- Sergio Paoletti, "Topolino"

seriali vendono gestite come fossero un file.
Quasi come file. Poi ci sono operazioni speciali (per esempio quelle per
impostare per la comunicazione) che su un file non puoi fare perche'  non
hanno senso. Questo non vuol dire che sia impossibile fare quello che tu dici
ma che potrebbe risultare un po' piu' complicato del previsto.
Vista l'inesperienza, non e' meglio provare a vedere se riesci a utilizzare
due convertitori seriale/rete (uno sul server e l'altro sulla preiferica) in
modo che si interfaccino tra di loro lasciando il resto cosi' com'e'?
Alessandro.

 seriale che si occupi del reindirizzamento.
Per "connessione telnet" immagino tu ti riferisca a uno stream TCP.
Puoi realizzare una finta seriale /dev/fintaseriale controllata da un
driver messo nel kernel. Il driver si occupa di stabilire una connessione
TCP con il PLC. Per realizzare un driver puoi fare riferimento al libro
di Alessandro Rubini edito da O'Reilly "Linux Device Drivers". Penso che
un driver del genere si possa risolvere in un paio di paginette di codice.
Se non vuoi affrontare questa fatica, e' probabile che qualcuno abbia gia'
fatto qualcosa del genere. Cerca con San Gugol.
Altrim. assembla un bel PC, con una seriale e una scheda di rete, ci
crei un programmino che gira in user space che fa da convertitore di
protocollo da seriale a TCP. Questo programma e' ancora piu' breve ed e'
piu' facile da fare.


 so e se e' possibile creare questa seriale "virtuale".
Ho fatto questa prova con minicom, programma terminale che lavora
sulla seriale.
Sulla macchina remota 192.168.100.2 (che nel tuo caso sarebbe
attaccata al PLC):
    $ nc -l -p 5000
(netcat in ascolto su porta 5000)
Sulla macchina locale 192.168.100.1 (nel tuo caso macchina operatore):
    $ mkfifo /tmp/fakeserial
    $ nc 192.168.100.2 </tmp/fakeserial >/tmp/fakeserial
    [...aperto un altro xterm...]
    $ minicom -so
    [...andato in "Serial port setup" e impostato /tmp/fakeserial come
    "Serial Device"...]
Fatto questo, ciò che scrivevo su 192.168.100.1 in minicom che credeva
di parlare a una seriale, compariva sulla macchina remota.  Suppongo
che per chiudere il cerchio basti dare sulla macchina remota:
    $ nc -l -p 5000 >/dev/ttyS0 </dev/ttyS0
...in modo che faccia "comparire" quel che scrivi sulla seriale invece
che a video.
-- 
Dagli errori di Windows 98:
 277 0x0115 Il file con la tabella degli attributi estesi è pieno.
1070 0x042E Dopo l'avvio, il servizio si è sospeso in uno stato di attesa.
1440 0x05A0 Schermo già bloccato.

 Ho fatto questa prova con minicom, programma
<cut>

mi sono letto la man page di mkfifo ed ho ftto un po di prove, l'unico
problema
che resta e' che cosi non i puo avere la bidirezionalita', in altre parole
da quello che ho letto di sui fifo uno dei due prog deve aprire la fifo
in lettura e l'altro in scrittura, quindi nel mio caso potrei invire comandi
al plc ma perderei i dati che mi arrivaano dal plc.
potreste consigliarmi qualche testo on-line per approfondire l'uso della
redirezion dell'i/o?
ho letto su appunti linux ma mi sono rimasti ancora dei dubbi.
in ogni caso grazie per l'aiuto che mi state dando! :-)
Ciao,
teresa

 una birra! :-)
Temo dovrò rinunciare alla birra (sigh!), un modo per rendere
bidirezionale l'esempio che ti esponevo non mi viene in mente.
-- 
"Great things are done by a series of small things brought together."
                                                         -- Van Gogh on Unix

sto leggendo il libro linux device driver V.2 ora pero' i dubbi si
affollano nella mia mente... :-) ho letto che nei moduli non e' possibile
linkare le librerie standard e questo complica non poco lo sviluppo del
 driver.(almeno dal mio punto di vista)
ho visto che la seriale e' un device a caratteri che da quanto ho capito
e' il tipo piiu' semplice.
potendo includere le librerie standard l'idea sarebbe stata di realizzare
un device a caratteri includendo nel driver la gestione dei socket.
a questo punto penso che non potendo includere le librerie forse una
soluzione sarebbe creare un interfaccia a caratteri piu' un programma per
la gestione dei socket facendo scambiare i dati fra i due con due fifo
come nell'esempio postatomi da Massimiliano Mirra(che ringrazio ancora per
la disponibilita') 
Che ne pensate? e' fattibile?
Purtroppo non posso usare due convertitori (in modo da rendere il processo
trasparente) in quanto sul al server arrivano molte seriali(una per ogni
plc)e questo farebbe lievitare enormemente i costi al punto da rendere
preferibile stenderi i cavi seriali...

 affollano nella mia mente... :-) ....
Non è proprio quello che cerchi ma dai un'occhiata qui:
http://www.maxstream.net/helpdesk/article-129
C'è del codice che potresti modificare .

 linkare le librerie standard 
per ragioni del genere spesso si fanno cose in userspace, per esempio dai
una occhiata a 
http://www.circlemud.org/~jelson/software/fusd/
dovresti riuscire ad emulare la seriale se non ho capito male.
Ciao
Vincenzo

 affollano nella mia mente... :-) 
Be', potevi dirlo subito che eri *così* motivata. :-)
Leggi qua, fa al caso tuo:
 
http://www.circlemud.org/~jelson/software/fusd/
E' un modulo per kernel, che permette di creare un character device
fittizio il quale a sua volta demanda a un programma le operazioni di
open/close/read/write.
Daresti il char device fittizio in pasto al programma che richiede la
seriale, poi il programma che gestisce il device potrà instradare il
tutto sulla rete.
Non ne ho fatto gran uso (ho solo wrappato il necessario per togliermi
lo sfizio di scrivere un device in ruby 8-)), ma l'ho trovato
abbastanza semplice e molto ben documentato.
Massimiliano
-- 
Windows Configuration
=====================
   No, there's nothing here about X, so be quiet.
                                                       (From Gnus info file)


Sinceramente mi piace molto imparare cose nuove, nel frattempo non me ne
sono stata con le mani in mano, ho visto un'altra azienda che produce
convertitori come quello che dovrei usare io e che da' gia' i suoi driver:
http://docs.tibbo.com/index.html?vspdl.htm
ho visto che si possono scaricare i sorgenti anche se penso siano
propietari...
ora do' un occhiata ai link che mi avete postato.
P.S: leggendo l'indirizzo che avete postato mi avete fatto ricordare di un
engine per mud che scrissi tanto tempo fa in c(da zero)
funzionava bene ed aveva gia tutte le funzioni principali, mi poggiavo ad un
db mysql per la gestione dei dati....
Ciao,
Teresa.

ho letto la documentazione di fusd e' sembra propio fare al caso mio. solo
tre dubbi mi restano.. :-)
devo implementare la gestione dell' ioctl? o nel mio caso dato che la
periferica non puo essere configurata da remoto e' inutile
l'altra e' che cmq fusd utilizza cmq un modulo per l'interfacciamento fra il
kernel ee il programma in user-space, sara possibile compilarlo su hpux o
nel caso che modifiche dovrei fare?
infine esiste un'implementazione di devfs per hpux dato che fusd si poggia
pesantemente su questo?
Grazie ancora per l'aiuto che mi state dando.
Ciao,
Luca