Vai al contenuto
PLC Forum


Pc->plc In Ethernet Con Fins


rico285

Messaggi consigliati

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 FF

Si 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_Manual

2. 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 1

Bit 6: 0 = Command; 1 = Response, quindi setto a 0

Bit 5-1: sempre a 0

Bit 0: 0 = Response required; 1 = Response not required, immagino di dover settare a 0

RSV:

Sempre a 00 Hex

GCT:

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 network

01 to 7F = remote network address

Io comunico direttamente con la CPU.. direi di dover mettere 00, ma non ne sono sicuro.

DA1:

Nodo di destinazione

Metto 01 come settato sulla scheda

DA2:

Unità di destinazione

Metto 00 come settato sulla scheda

SNA:

Source network address

00 = local network

01 to 7F = remote network

com DNA.. immagino di dover settare a 00

SA1:

Nodo di origine

00: Internal communications in PLC

01 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 origine

00: CPU Unit

10 to 1F: CPU Bus Unit

Anche qui non so cosa mettere..

SID:

metto 00 come viene detto sul manuale

Quindi in definitiva risulta questo header (i vari campi separati da uno spazio per chiarezza):

[at] 80 00 02 00 01 00 00 ?? ?? 00

Ora devo inserire il codice del comando:

[at] 80 00 02 00 01 00 00 ?? ?? 00 04 02 FF FF

Calcolare l'FCS (uso una funzione trovata qui sul forum non ricordo dove :D )

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 0D

Nel 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;Terminatori

Mi 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 00

Header Code: dice di mettere sempre FA

Response 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 CPU

SA2: Non so cosa mettere...

SID: Sempre 00

Risulta questo frame:

[at] 00 FA 0 00 00 ?? 00 04 02 FF FF ?? 2A 0D

Comunque 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


Provo a darti un'aiuto per quanto riguarda il punto 3

3. 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 = 00

Ho 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 lavoro

ciao

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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 + parametri

di conseguenza risulta un frame di questo tipo (in Hex):

80 00 02 00 01 00 00 19 00 00 04 02 FF FF

dove 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 0

e neanche i caratteri terminatori * e CR (2A e 0D)

e neppure l'FCS

Spero 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 Sub

dove 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: da rico285
Link al commento
Condividi su altri siti

  • 4 months later...
marcoscarlassare

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 luego

ms

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...