Vai al contenuto

Interfacciarsi con SlimLine da Visual Studio

Home Forum Controllori SlimLine e Netsyst (LogicLab) Interfacciarsi con SlimLine da Visual Studio

Stai visualizzando 11 post - dal 1 a 11 (di 11 totali)
  • Autore
    Post
  • #35437
    Andrea
    Partecipante

    Sto cercando di interfacciare lo SlimLine con un PC usando Visual Studio (VB o C#), esiste un esempio applicativo o delle indicazioni per la comunicazione TCP ? Ho trovato delle DLL Modbus ma non so come configurarle per “parlare” con lo SlimLine, esiste un file di configurazione o qualcosa di simile ?

    #37847
    Sergio Bertana
    Amministratore del forum

    Se usi una DLL Modbus non dovresti avere problemi, Modbus è un protocollo standard, non capisco cosa intendi per file di configurazione. Quello che occorre sapere è la porta TCP a cui connetterti (Standard è la 502) e l’indirizzo di nodo Modbus (Di default è 1). Poi devi fare riferimento al Manuale programmazione IEC61131-3, al capitolo che riguarda i Protocolli di comunicazione.

    #37851
    Andrea
    Partecipante

    Avevo dato un’occhiata al manuale ma avevo dei dubbi. Mi è parso di capire che conviene trasmettere dei dati su modbus TCP in formato WORD e non come BIT e quindi, se ho capito bene, occorre creare una variabile (array da 16 bit) WORD con indirizzo %MW100.100 e accedere ad essa con indirizzo modbus 40049 (((Indirizzo variabile/2)+Offset)-1 ? ((100/2)+40000)-1=40049). Se invece volessi accedere al singolo bit, lo creo come tipo BOOL, es. %MX100.50 e accedo sempre con indirizzo modbus 40050 ?

    In realtà, essendo la variabile precedente di tipo word occupa tutti gli indirizzi fino al 40065 e quindi il primo indirizzo utile sarà 40066 ?

    Non ho ben capito quali siano le funzioni che si usano per la lettura: ModbusRTUMaster_v1, ModbusSlave ? Oppure siccome il modbus è nativo basta semplicemente accedere all’area di memoria e scrivere o leggere come se fossero variabili normali di processo ?

    Inoltre, è importante l’uso del SysGetCrc anche su FTP (anche se il manuale parla solo di RTU) oppure si può anche fare a meno di questo controllo sul CRC (nel caso in cui il modbus è nativo e quindi non occorre usare nessuna istruzione) ?

    Mi è parso poi di capire che posso usare il software Toolly per fare dei test sul modbus TCP prima di usare una DLL Modbus, corretto ?

    #37852
    Sergio Bertana
    Amministratore del forum

    Il protocollo Modbus gestisce l’accesso sia a variabili BOOL (Inputs e coils)  che WORD (Input e holding registers), il frame modbus può essere al massimo 256 bytes di lunghezza. Il supporto al Modbus è nativo nel firmware dello SlimLine quindi basta inviare da un server i frame di interrogazione ed il sistema risponde. I comandi gestiti sono:

    16#01 Read coil status (Massimo 250 coils)
    16#02 Read input status (Massimo 250 inputs)
    16#03 Read holding registers (Massimo 125 registri)
    16#04 Read input registers (Massimo 125 registri)
    16#06 Preset single register
    16#0F Force multiple coils (Massimo 250 coils)
    16#10 Preset multiple registers (Massimo 125 registri)

    Da notare che tutti i comandi operano sulla stessa area di memoria la DB 100, che come indirizzo Modbus viene ofsettata di 40000, per comprendere come sono allocate in memoria le variabili ecco un estratto del manuale. Se si accede a variabili BOOL una o più consecutive si deve indicare l’indirizzo quindi variabile BOOL %MX100.50 ha indirizzo Modbus 40050, mentre per le variabili WORD occorre dividere l’indirizzo per 2, %MW100.100 ha indirizzo Modbus 40050 (Questo topic può interessarti).

    Nota! Il protocollo Modbus prevede un offset di 1, se l’indirizzo è 40050 i gestori del protocollo (Credo anche la DLL) inviano nel frame l’indirizzo 40049 ed ecco perché SlimLine somma 1 all’indirizzo ricevuto.

    Riguardo al CRC, Modbus prevede un LRC nel Modbus Ascii, un CRC nel Modbus RTU, mentre nel Modbus TCP il controllo del frame è delegato al protocollo TCP. Molto utile nel debug della comunicazione TCP e Wireshark.

    #37853
    Sergio Bertana
    Amministratore del forum

    Ti consiglio la lettura di questi due documenti che sono la bibbia del Modbus, Modicon Modbus Protocol Reference Guide, e MODBUS Messaging on TCP/IP Implementation Guide.

    Per quanto riguarda Toolly certo puoi usarlo per testare la comunicazione modbus sia in seriale che in TCP, ecco nel mio esempio ho ripreso quanto riportato nel manuale di programmazione SlimLine ed ho acquisito il valore dei 6 registri del RTC.

    Ho definito il frame di comando 00 00 00 00 00 06 01 03 00 63 00 06 nella finestra command, ho aperto la connessione con lo SlimLine sulla porta 502 ed inviando comandi consecutivi ecco nella finestra principale la ricezione dei frames di risposta del tipo 00 00 00 00 00 0F 01 03 0C 00 08 00 09 00 09 00 1A 00 0A 07 DD (Screenshot).

    #37859
    Andrea
    Partecipante

    Grazie per le indicazioni e dei documenti che sto studiando… una curiosità: lo SlimLine ha gli indirizzi Modbus che partono da 40000, questo significa che posso accedere ad altri dispositivi che hanno ad esempio le variabili o i registri posti agli indirizzi da 1 a 20 (per esempio) semplicemente con il comando 16#04: ma con questo comando, dove sarà copiato il valore della variabile ? Sempre nella DB100 ?

    Ad esempio voglio leggere una temperatura tramite una sonda collegata ad un termostato (in rete MODBUS RTU – RS485) per la gestione di un fan-coil, questa variabile è all’indirizzo 2 della tabella modbus del termostato (SLAVE indirizzo MODBUS 10 per esempio), il FRAME sarà quindi realizzato in ESADECIMALE (in MODBUS RTU, TCP è quindi senza CRC) e sarà del tipo 0A 04 00 01 00 01 (CRC HI) (CRC LO) ma non ho ben capito dove ELSIST scrive questo valore sia se parliamo di RTU ma soprattutto di TCP. Potrei avere indicazioni in merito ?

    Altra domanda: vorrei collegare più PLC in rete MODBUS TCP che a loro volta parlano in modbus RTU col campo; mi sembra di capire che devo condividere e organizzare la DB100 di tutti in maniera identica (es. indirizzi da 40000 a 42000) mentre devo differenziarli per quanto riguarda le variabili da acquisire dal campo; il problema nasce (forse) se i dispositivi che sono sul campo “parlano” a baud rate diverso. In questo caso è previsto l’uso di 2 schede MODBUS diverse che dialogano con le due linee a baud rate diverso ?

    #37860
    Sergio Bertana
    Amministratore del forum

    SlimLine accetta comandi Modbus con indirizzamento compreso tra 40000 e 44095 accesso a bit e 40000 e 42047 accesso a registi, questi indirizzi agiscono sulla DB 100. E’ previsto un alias a 20000 stesso range di indirizzamento. Gli indirizzi da 100 a 105 accedono al real time clock. Altri indirizzi al di fuori di quelli previsti ritornano un codice di eccezione.

    Non ho capito la tua domanda sulla lettura del termostato, cosa centra SlimLine con il termostato. Se il termostato è in Modbus dovrai tu dal PC leggerlo. Oppure potrai leggerlo da SlimLine utilizzando il FB ModbusMaster, ed a questo punto avendo fatto tu il programma sullo SlimLine sarai tu a decidere dove appoggiare il valore di temperatura nella DB 100 in modo da poterla poi acquisire.

    Per la rete di SlimLine che parlano in Modbus con il campo vale il discorso fatto prima, vari FB ModbusMaster messe in cascata acquisiranno i valori dai dispositivi sul campo che poi saranno allocati nella DB 100 dove il PC li andrà ad acquisire in Modbus TCP (Topic con esempio simile). Se i dispositivi hanno baud rate diversi devi usare porte seriali diverse, tutti i dispositivi modbus in una rete RS485 devono avere lo stesso modo di comunicazione. Eventualmente puoi utilizzare le porte RS232 con dei convertitori di interfaccia.

    #38786
    Luciano
    Partecipante

    Questo vuol dire che si possono utilizzare ben 2048 WORD da poter utilizzare per lo scambio dati in Modbus con SlimLine ?
    Se può essere utile a qualcuno io con Visual studio 2012 utilizzo “nmodbus library” che è opensource.

    #38787
    Sergio Bertana
    Amministratore del forum

    Si tutta la DB 100 è accessibile dal modbus nativo gestito dal sistema opearativo, quindi ci sono a disposizione 2048 words da DB 100.0 a 100.4094, a cui corrispondono gli indirizzi modbus da 40000 a 42047. Le WORD allocate dopo l’indirizzo 100.2048 sono ritentive allo spegnimento.

    Ricordo che si può inserire nel proprio programma uno o più gestori di modbus slave con il FB ModbusSlave, e definire aree di memoria al di fuori della DB100 accessibili da modbus su indirizzi modbus definibili nella istanza della FB.

    Altra libreria free di modbus trovatra in rete e la “free-dotnet-modbus“.

    #39936
    Stefano
    Partecipante

    È possibile settare delle variabili in DB 100.0 in modo che siano in RW per il programma ma in RO per l’accesso modbus ?

    #39937
    Sergio Bertana
    Amministratore del forum

    No non è possibile, ma puoi risolvere questa necessità usando una variabile di copia nel tuo programma. Siccome il modbus accede alle variabili al termine della esecuzione della task Back, tu puoi copiare il valore delle variabili che vuoi siano RO nelle variabili di appoggio sull’ultimo POU eseguito in Back.

    Poi nel primo POU eseguito in back ricopiarne il valore dalla variabile di appoggio nella variabile in DB100. In questo modo anche se modbus le modifica loro avranno sempre il valore che assegni tu da programma. Quindi di fatto diventano variabili ReadOnly.

Stai visualizzando 11 post - dal 1 a 11 (di 11 totali)
  • Devi essere connesso per rispondere a questo topic.