Vai al contenuto
PLC Forum


Comunicazione TCP fra S71200 e Ip camera


rossiroberto

Messaggi consigliati

Buonasera a tutti!

Sto cercando di far comunicare un S7-1200 1215C con un ip camera tramite tcp.

L'ip camera può eseguire degli script CGI ,per esempio questo se inviato da un browser disabilita l'inserimento di ora e data nel flusso video generato dalla camera:

http://192.168.0.11:2000/cgi-bin/CGIProxy.fcgi?cmd=setOSDSetting&isEnableTimeStamp=0&isEnableDevName=1&dispPos=0&isEnableOSDMask=0&usr=user&pwd=password

Quello che vorrei fare è far inviare la stringa al plc.

Inizialmente ho provato con l'istruzione TSEND_C, non funzionando per cercare di trovare il problema ho usato separatamente TCON e TSEND.

Per quanto riguarda la comunicazione "credo" che venga creata in quanto scollegando il cavo ethernet della ip camera lo STATUS di TCON passa da 7000 a 7002.

Per quanto riguarda  l'invio in http con il 1200 la stringa penso vada cosi formattata:

'/cgibin/CGIProxy.fcgi?cmd%3DsetOSDSetting%26isEnableTimeStamp%3D0%26isEnableDevName%3D1%26dispPos%3D0%26

isEnableOSDMask%3D0%26usr%3Duser%26pwd%3Dpassword$R$L'.

Come lunghezza (LEN) imposto =0.

Purtroppo,anche osservando con wireshark, non vedo nessun flusso di dati tra il plc e l'ip camera.

Se provo lo stesso progetto fra il plc e un pc con una sessione di hyperterminal avviata la stringa viene ricevuta dal pc senza problemi.

Secondo voi è un problema di come è formattata  la richiesta o di come è creata la connessione?

 

Grazie per i suggerimenti!

 

 

 

Link al commento
Condividi su altri siti


Attenzione a Wireshark, per lavorare su un PC diverso da quello che sta comunicando hai bisogno di:

- Uno Swatch con porta "monitor" oppure

- Un hub anni 80 oppure

- Un derivatore passivo a "T" di quelli utilizzati negli armadi switch.

Altrimenti, qualunque switch anche da 10 €, indirizza i pacchetti solo verso le porte che ha mappato, cioè se capisce che sulla porta 1 e sulla 3 ci sono due equipment che comunicano fra loro non manderà nulla di quei pacchetti sulla porta 2.

Ecco perché probabilmente non vedi nulla.

 

Fatto il collegamento, attivi il filtro TCP/IP per vedere la connessione e poi quello HTTP per vedere il flusso.

 

L'approccio dell'uomo semplice che userei io :) è sniffare la comunicazione con il browser, poi quella con il PLC e vedere quale carattere (perché quasi sicuramente è quello il problema) viene mandato male.

 

Link al commento
Condividi su altri siti

Grazie per  la risposta!

Per quanto riguarda wireshark hai ragione non posso vedere il "not found" di risposta dal server sul comando sbagliato!!

Quando parli di:

Quote

- Un derivatore passivo a "T" di quelli utilizzati negli armadi switch.

intendi un network tap?

 

Con l'approccio dell'uomo semplice (comunicazione browser-plc funzionante) trovo:

Frame 28: 594 bytes on wire (4752 bits), 594 bytes captured (4752 bits) on interface 0
Ethernet II, Src: AsustekC_5d:a6:f2 (00:17:31:5d:a6:f2), Dst: 00:62:6e:63:e3:30 (00:62:6e:63:e3:30)
Internet Protocol Version 4, Src: 192.168.0.2, Dst: 192.168.0.11
Transmission Control Protocol, Src Port: 50575, Dst Port: 2000, Seq: 1, Ack: 1, Len: 540
Hypertext Transfer Protocol
     GET /cgi-bin/CGIProxy.fcgi?cmd%3DsetOSDSetting%26isEnableTimeStamp%3D1%26isEnableDevName%3D1%26dispPos%3D0%26isEnableOSDMask%3D0%26usr%3Duser%26pwd%3password HTTP/1.1\r\n
        [Expert Info (Chat/Sequence): GET /cgi-bin/CGIProxy.fcgi?cmd%3DsetOSDSetting%26isEnableTimeStamp%3D1%26isEnableDevName%3D1%26dispPos%3D0%26isEnableOSDMask%3D0%26usr%3Duser%26pwd%3Dpassword HTTP/1.1\r\n]
        Request Method: GET
        Request URI: /cgi-bin/CGIProxy.fcgi?cmd%3DsetOSDSetting%26isEnableTimeStamp%3D1%26isEnableDevName%3D1%26dispPos%3D0%26isEnableOSDMask%3D0%26usr%3Duser%26pwd%3Dpassword
            Request URI Path: /cgi-bin/CGIProxy.fcgi
            Request URI Query: cmd%3DsetOSDSetting%26isEnableTimeStamp%3D1%26isEnableDevName%3D1%26dispPos%3D0%26isEnableOSDMask%3D0%26usr%3user%26pwd%3Dpassword
                Request URI Query Parameter: cmd%3DsetOSDSetting%26isEnableTimeStamp%3D1%26isEnableDevName%3D1%26dispPos%3D0%26isEnableOSDMask%3D0%26usr%3user%26pwd%3Dpassword
        Request Version: HTTP/1.1
    Host: 192.168.0.11:2000\r\n
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0\r\n
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
    Accept-Language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3\r\n
    Accept-Encoding: gzip, deflate\r\n
    Cookie: language=ITA; userName=user; remenber=; pwd=; multi=1\r\n
    Connection: keep-alive\r\n
    \r\n
    [Full request URI: http://192.168.0.11:2000/cgi-bin/CGIProxy.fcgi?cmd%3DsetOSDSetting%26isEnableTimeStamp%3D1%26isEnableDevName%3D1%26dispPos%3D0%26isEnableOSDMask%3D0%26usr%3Duser%26pwd%3Dpassword]
    [HTTP request 1/1]
    [Response in frame: 30]

 

Dalla quale io ho provato questa formattazione (avendo scoperto che http 1.1 vuole la dichiarazione anche del header host):


'GET /cgi-bin/CGIProxy.fcgi?cmd%3DsetOSDSetting%26isEnableTimeStamp%3D1%26isEnableDevName%3D1%26dispPos%3D0%26isEnableOSDMask%3D0%26usr%3Duser%26pwd%3Dpassword HTTP/1.1\r\n$R$LHost: 192.168.0.11:2000\r\n$R$L$R$L

 

Purtroppo non funziona ancora perchè sicuramente manca qualcosa!!:angry:

 

 

 

 

 

Link al commento
Condividi su altri siti

Nel frame la parte relativa al protocollo http dovrebbe essere tutta questa: 
GET /cgi-bin/CGIProxy.fcgi?cmd%3DsetOSDSetting%26isEnableTimeStamp%3D1%26isEnableDevName%3D1%26dispPos%3D0%26isEnableOSDMask%3D0%26usr%3Duser%26pwd%3password HTTP/1.1\r\n
Host: 192.168.0.11:2000\r\n
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
Accept-Language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3\r\n
Accept-Encoding: gzip, deflate\r\n
Cookie: language=ITA; userName=user; remenber=; pwd=; multi=1\r\n
Connection: keep-alive\r\n
\r\n

 

Link al commento
Condividi su altri siti

Quote

intendi un network tap?

Esattamente.

 

L'header è necessario altrimenti non è più un protocollo, sicuramente un mare di campi non verrano minimamente considerati dalla camera ma conviene che ci siano.

Per non incasinarti con il protocollo ti conviene lavorare sul dump esadecimale TCP così non fai errori di caratteri di controllo, buttarlo in una DB e spedirlo.

 

Link al commento
Condividi su altri siti

Grazie  per le risposte!!

Quote

Per non incasinarti con il protocollo ti conviene lavorare sul dump esadecimale TCP....

 

Sto studiando come farlo :thumb_yello:

Link al commento
Condividi su altri siti

Un saluto a tutti!

 

Ho fatto un pò di passi avanti, con un tap vedo lo scambio dati e lavorando sul dump esadecimale sono riuscito ad ottenere un "200 ok" dal server del' ip camera:thumb_yello:.

Avrei una domanda sul

Quote

buttarlo in una DB

cioè sulla formattazione del dump per poi fare un copia \incolla su una DB con un array.

Attualmente ho importato il dump in una tabella excel e con un pò di formule e dei copia incolla (perdendoci molto tempo!) ho ottenuto la mia bella colonna:

16#08

16#44

16#13

16#4d

...

Esiste un metodo migliore o devo "automatizzare" di più il foglio excel che uso per la conversione?

 

 

 

 

 

Link al commento
Condividi su altri siti

Quote

sono riuscito ad ottenere un "200 ok" dal server del' ip 

Ottimo, abbiamo azzeccato la strada ;) 

 

Quote

Esiste un metodo migliore o devo "automatizzare" di più il foglio excel che uso per la conversione?

Dipende da quanti telegrammi devi costruire.

Se sono tanti ovviamente ti conviene automatizzare la procedura.

 

Hai varie strade secondo me:

 

1) Partendo dal dump testuale di Wireshark (0x0a, 0x0b, ecc..) fai un S&R 0x->16#, ti crei una DB come sorgente e poi la importi, Notepad++ fa miracoli con i files di testo.

2) Se sai programmare puoi creare un'immagine binaria della DB e usare Snap7 per riempirla.

 

Magari il TIA Portal ha delle funzioni avanzate per l'import/export delle DB, io purtroppo non li conosco, ma se ci sono quì senz'altro qualcuno li usa ;) 

 

 

Link al commento
Condividi su altri siti

  • 5 weeks later...

Rieccomi!

Lavoro permettendo sono riuscito a terminare il programma per la comunicazione tra l'S7-1200 e l'IP camera.

Per creare i telegrammi ho creato un file .xls dove, mettendo in una cella il dump, ottengo la mia bella tabellina da incollare in una db.

 

 http.jpg

 

Per dividere il dump nelle varie colonne ho utilizzato la formula:

=STRINGA.ESTRAI($B$1;RIF.RIGA()*2-1;2)   \\ con dump esadecimale posto in B1

Per il resto sono normali conversioni spostamenti....

 

Saluti

Roberto

 

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...