rico285 Inserito: 14 febbraio 2005 Segnala Share Inserito: 14 febbraio 2005 Un saluto a tutti gli utenti del forum.Ho un problema nel stabilire una comunicazione con un plc CJ1M-CPU12 ETN (con scheda ethernet ETH21 integrata). Premetto che ho già cercato per il forum eventuali altri esempi e/o discussioni senza però risultati. Inoltre non ho la possibilità di acquistare un server tipo CX Server-Lite.Il PC (IP: 192.168.250.25) è collegato in ethernet al PLC (IP: 192.168.250.1). Quest'ultimo non ha nessun settaggio particolare nella configurazione dell'ethernet che è lasciata con i parametri di default. Sulla scheda ethernet integrata l'UNIT No. è 0 (zero) mentre il NODE è 01.Da Visual Basic stabilisco una connessione col PLC aprendo un Socket sulla porta 9600 in TCP (questa è la porta di default per la comunicazione in FINS/TCP). Fin qui tutto ok.. se pingo l'ip del PLC questo risponde senza problemi.Ora devo costruire il comando da mandare al PLC.Supponiamo di dover mandare al PLC il comando per far passare l'unità da stato RUN a stato STOP/PROGRAM che corrisponde al comando FINS 04 02 a cui bisogna aggiungere (guardando sul manuale) FF FFSi pongono davanti a me due possibilità:1. Seguire quello che credo sia il paragrafo adatto alla mia situazione, ovvero 3-5-3 "Sending Commands from the Computer to the CPU Unit" del manuale W342E109_CS_CJ_Communications_Commands_Reference_Manual2. Utilizzare il frame completo descritto nel paragrafo 3-3-1 dello stesso manuale (che comprende alcune parti in PIU' rispetto al punto 1)Direi di seguire il punto 2 dato che nel caso non servissero i parametri in più rispetto al punto 1, non bisognerà fr altro che scartarli.Seguo il manuale per costruire i singoli comandi dell'header:ICF: Bit 7: sempre 1Bit 6: 0 = Command; 1 = Response, quindi setto a 0Bit 5-1: sempre a 0Bit 0: 0 = Response required; 1 = Response not required, immagino di dover settare a 0RSV:Sempre a 00 HexGCT:Qui dice di settarlo a 07 Hex quando si comunica attraverso un numero di reti <= 8; altrimenti settarlo a 02 Hex.Io non comunico attraverso 8 reti... sono direttamente collegato.. quindi immagino di dover mandare 02 (anche perchè a rigor di logica.. il manuale dice che questo numero viene decrementato ad ogni passaggio di rete.. quindi 02 dovrebbe essere adatto) DNA:00 = Local network01 to 7F = remote network addressIo comunico direttamente con la CPU.. direi di dover mettere 00, ma non ne sono sicuro.DA1:Nodo di destinazioneMetto 01 come settato sulla schedaDA2:Unità di destinazioneMetto 00 come settato sulla schedaSNA:Source network address00 = local network01 to 7F = remote networkcom DNA.. immagino di dover settare a 00SA1:Nodo di origine00: Internal communications in PLC01 to 20: Node address in Controller Link Network (1 to 32 decimal)01 to FE: Ethernet (1 to 254 decimal,for Ethernet Units with model numbers ending in ETN21)Non ho idea di cosa mettere qua.. o meglio l'avrei se sapessi a che nodo corrisponde il PC...SA2:Unità di origine00: CPU Unit10 to 1F: CPU Bus UnitAnche qui non so cosa mettere..SID:metto 00 come viene detto sul manualeQuindi in definitiva risulta questo header (i vari campi separati da uno spazio per chiarezza):[at] 80 00 02 00 01 00 00 ?? ?? 00Ora devo inserire il codice del comando:[at] 80 00 02 00 01 00 00 ?? ?? 00 04 02 FF FFCalcolare l'FCS (uso una funzione trovata qui sul forum non ricordo dove )ora metto ?? in quanto non conosco SA1 e SA2[at] 80 00 02 00 01 00 00 ?? ?? 00 04 02 FF FF ??infine aggiungo i due caratteri terminatori[at] 80 00 02 00 01 00 00 ?? ?? 00 04 02 FF FF ?? 2A 0DNel caso utilizzassi il metodo descritto al punto 1 dovrei usare questo frame:[at];Unit N°;Header Code;Response Wait Time;ICF;DA2;SA2;SID;Comando FINS;FCS;TerminatoriMi sorge un dubbio.. Quell' "Unit N°, Header Code e Response Wait Time" vanno aggiunti anche al frame che ho costruito prima? Oppure servono solo in questo caso? Sul manuale non mi pare venga mezionato, ma guardando l'immagine di come un frame è costruito vedo un Header del frame e poi un Header del comando... immagino che quello che ho costruito prima sia stato "Header del comando + Comando"...Counque sia questo frame dovrebbe risultare dal punto 1:[at]Unit N°: metto 00Header Code: dice di mettere sempre FAResponse wait time: metto 0 (una cifra)ICF: mi dice di settare a 00 invece dell' 80 che avevo calcolato sopra...DA2: Metto 00 in quanto la destinazione è la CPUSA2: Non so cosa mettere...SID: Sempre 00Risulta questo frame:[at] 00 FA 0 00 00 ?? 00 04 02 FF FF ?? 2A 0DComunque sia, indipendentemente dal frame risultante ora devo spedirlo con VB tramite il socket.Sul manuale dice che bisogna spedire i codici ASCII dei singoli numeri del frame quindi creo un array di BYTE con i codici ASCII dei singoli numeri... quindi ad esempio per i primi due corrispondenti alla [at] ci sarà 40 Hex e al posto del primo 0 ci sarà 30 Hex e così via..Facendo varie prove giungo sempre allo stesso risultato.. appena mando il codice il socket va nello stato Closing e il comando non ha nessun effetto.Quindi dopo questo lungo papiro giungo alle domande:1. Quale dei due tipi di frame devo usare?2. I Frame che ho costruito sono giusti?3. Cosa devo inserire nei campi segnati con "??" (Campi SA1 SA2)?4. E' effettivamente giusto il modo con cui mando il frame da VB a PLC?5. Non esiste un esempio in internet possibilmente in VB con la costruzione completa di un frame?Grazie per la pazienza nel leggere il papiro e per le eventuali risposte Link al commento Condividi su altri siti More sharing options...
pcontini Inserita: 14 febbraio 2005 Segnala Share Inserita: 14 febbraio 2005 Provo a darti un'aiuto per quanto riguarda il punto 33. Cosa devo inserire nei campi segnati con "??" (Campi SA1 SA2)?SA1: Nodo di origine - devi metter l'ultimo numero dell'indirizzi IP del tuo PC (nel tuo caso 25)SA2: Unità di origine - valore = 00Ho utilizzato uno scada commerciale per connettermi ad un cj con etn21 e i dati da impostare per il protocollo erano naturalmente gli stessi da da te menzionati.Purtroppo non posso esserti d'aiuto per gli altri punti ma mi interesserebe sapere se ne vieni a capo!!buon lavorociao Link al commento Condividi su altri siti More sharing options...
rico285 Inserita: 14 febbraio 2005 Autore Segnala Share Inserita: 14 febbraio 2005 Ti ringrazio per la risposta.. purtroppo non ho ancora risolto, nel senso che comunque il comando non risulta in niente se non in una disconnessione del socket. Però sei comunque stato di aiuto in quanto ora conosco il significato di tutti i campi del frame, che non è cosa da poco Link al commento Condividi su altri siti More sharing options...
rico285 Inserita: 15 febbraio 2005 Autore Segnala Share Inserita: 15 febbraio 2005 (modificato) Ho risolto il problema!Per le comunicazioni in ethernet con FINS bisogna semplicemente mandare da VB un array di byte in cui sono contenuti i valori in esadecimale di: header FINS + comando + parametridi conseguenza risulta un frame di questo tipo (in Hex):80 00 02 00 01 00 00 19 00 00 04 02 FF FFdove il 19 (in hex.. quindi in decimale sarebbe 25) è il nodo relativo al PC (ovvero l'ultimo ottetto dell'indirizzo IP del PC, come mi è stato gentilmente spiegato da pcontini)non è necessario l'header aggiuntivo: [at] 00 FA 0e neanche i caratteri terminatori * e CR (2A e 0D)e neppure l'FCSSpero che questo post sia utile a persone che si trovino nella medesima situazione.Riporto il codice VB con cui comando al PLC di mettersi in modalità stop/program'COSTRUZIONE E INVIO FRAME Private Sub cmdSend_Click() Dim s1(1 To 19) As Byte s1(1) = &H80 'ICF s1(2) = &H0 'RSV s1(3) = &H2 'GCT s1(4) = &H0 'DNA s1(5) = &H1 'DA1 (Nodo settato sulla scheda ethernet del PLC) s1(6) = &H0 'DA2 s1(7) = &H0 'SNA s1(8) = &H19 'SA1 (ultimo ottetto dell'indirizzo IP del PC) s1(9) = &H0 'SA2 s1(10) = &H0 'SID 'COMANDO s1(11) = &H4 s1(12) = &H2 s1(13) = &HFF s1(14) = &HFF Winsock.SendData s1 'Invia il frame End Subdove Winsock è un socket settato per la comunicazione in UDP (il TCP non sembra funzionare).una cosa curiosa che ho notato è il fatto che cambiando SA1 ad un altro numero (che non corrisponde all'IP del PC) il tutto funziona comunque... credo sia dovuto al fatto che essendo aperta UNA SOLA comunicazione in UDP, una volta legata la porta il PLC non controlli effettivamente il frame per vedere se l'ip vero e quello scritto corrispondano... comunque è solo una supposizione e bisognerebbe fare delle prove con più plc collegati.. cosa che io non posso fare al momento.Saluti Modificato: 15 febbraio 2005 da rico285 Link al commento Condividi su altri siti More sharing options...
pcontini Inserita: 15 febbraio 2005 Segnala Share Inserita: 15 febbraio 2005 Bene!Quando mi ricapita sottomano un cj+etn farò qualche provaCiao Link al commento Condividi su altri siti More sharing options...
marcoscarlassare Inserita: 30 giugno 2005 Segnala Share Inserita: 30 giugno 2005 CIAO,SA1 in realtà non è l'indirizzo IP del computer, bensì il nodo che ETN21 ti assegna durante il colloquio; mi spiego:quando tu apri un socket con ETN21, lei ti assegna un nodo (che tu puoi configurare come statico, dinamico o da tabella in base alle impostazioni nel CxProgrammer); tu di conseguenza devi impostare SA1=nodo in tutte le comunicazioni della sessione corrente, cioè fino al momento della chiusura del socket o fino alla disconnessione da parte ETN21 (c'è il parametro keep alive nel cx programmer da impostare, e cioè per quanti minuti ETN21 tiene aperto il socket anche in assenza di pacchetti).Hasta luegoms Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora