Applicazioni e Software per l'industria

 

Il protocollo Modbus è uno dei più comuni ed utilizzati nel settore industriale, ed è anche un protocollo semplice da implementare ed utilizzare.

Le funzioni di lettura e scrittura sono state formulate per addattarsi alle più svariate applicazioni

Il protocollo Modbus permette di comunicare con più apparecchi collegati sulla stessa linea seriale; la distinzione tra un apparecchio e l'altro viene fatta attraverso un indirizzo software ( 1..255 ) che deve essere programmato all'interno di ogni singolo apparecchio.

LE FUNZIONI DISPONIBILI 
(è comunque bene verificare caso per caso, se l'apparecchi utilizzato ha eventuali restrizioni d'uso del protocollo):
 
Funzione '1':            read output table
Funzione '2':            read input table
Funzione '3':            read registers
Funzione '4':            read analog input
Funzione '5':            force single output
Funzione '6':            preset single register
Funzione '7':            read exception status
Funzione '8':            loopback maintenance
Funzione '9..14':      unsupported functions
Funzione '15':          force multiple outputs
Funzione '16':          preset multiple registers
Funzione '17':          Report device type
Funzione '18..66':     unsupported   functions
Funzione '67':          read scratch pad memory
Funzione '68..127':   unsupported options
Funzione '128..255':  reserved for exception responses

Formato del messaggio di trasmissione

Il messaggio di trasmissione è composto da una stringa di byte in cui:
- il secondo byte è la funzione del messaggio stesso.
- i byte successivi contengono un numero variabile di byte, a seconda della funzione utilizzata, e precisamente:
 
Funzioni 1 e 2:
            Domanda
Byte 1      Indirizzo
Byte 2      Funzione (01 o 02)
Byte 3      Bit di partenza   (byte alto)
Byte 4                        (byte basso)
Byte 5      Numero di bit   (byte alto)
Byte 6                      (byte basso)
Byte 7      CRC (byte basso)
Byte 8          (byte alto)
            Risposta
Byte 1      Indirizzo
Byte 2      Funzione (01 o 02)
Byte 3      n° di byte dati di ritorno
Byte 4...   byte di dati
Byte        CRC (byte basso)
Byte           (byte alto)
 
Ogni byte 'dato' di ritorno contiene impaccato lo stato di 8 bit.
 
Funzioni 3 e 4:
            Domanda
Byte 1      Indirizzo
Byte 2      Funzione (03 o 04)
Byte 3      Indirizzo di partenza   (byte alto)
Byte 4                              (byte basso)
Byte 5      Numero di indirizzo   (byte alto)
Byte 6                            (byte basso)
Byte 7      CRC (byte basso)
Byte 8          (byte alto)
            Risposta
Byte 1      Indirizzo
Byte 2      Funzione (03 o 04)
Byte 3      n° di byte dati di ritorno
Byte 4...   byte di dati
Byte        CRC (byte basso)
Byte           (byte alto)
 
Ogni 'dato' di ritorno viene espresso con due byte, e si riceve sempre prima il byte alto e poi il byte basso.
 
Funzione 5:
            Domanda
Byte 1      Indirizzo
Byte 2      Funzione (05)
Byte 3      Bit da forzare   (byte alto)
Byte 4                       (byte basso)
Byte 5      Valore di forzatura (0=off, 255=on)
Byte 6      valore fisso a 00H
Byte 7      CRC (byte basso)
Byte 8          (byte alto)
            Risposta
Se il comando è andato a buon fine, la risposta è la copia della domanda.
 
Funzione 6:
            Domanda
Byte 1      Indirizzo
Byte 2      Funzione (06)
Byte 3      Registro da forzare   (byte alto)
Byte 4                            (byte basso)
Byte 5      Valore di forzatura (byte alto)
Byte 6                          (byte basso)
Byte 7      CRC (byte basso)
Byte 8          (byte alto)
            Risposta
Se il comando è andato a buon fine, la risposta è la copia della domanda.
 
Funzione 15:
            Domanda
Byte 1      Indirizzo
Byte 2      Funzione (15)
Byte 3      bit partenza   (byte alto)
Byte 4                     (byte basso)
Byte 5      Numero di bit (byte alto)
Byte 6                    (byte basso)
Byte 7      n° di byte dati che seguono
Byte 8      1° dato
......      
Byte        CRC (byte basso)
Byte            (byte alto)
            Risposta
Byte 1      Indirizzo
Byte 2      Funzione (15)
Byte 3      bit partenza   (byte alto)
Byte 4                     (byte basso)
Byte 5      Numero di bit (byte alto)
Byte 6                    (byte basso)
Byte 7      CRC (byte basso)
Byte 8          (byte alto)
 
Ogni 'dato' viene espresso con due byte, e si trasmette sempre prima il byte alto e poi il byte basso.
 
Funzione 16:
            Domanda
Byte 1      Indirizzo
Byte 2      Funzione (16)
Byte 3      Indirizzo di partenza   (byte alto)
Byte 4                              (byte basso)
Byte 5      Numero di indirizzi   (byte alto)
Byte 6                            (byte basso)
Byte 7      n° di byte dati che seguono
Byte 8      1° dato (byte alto)
Byte 9      1° dato (byte basso)
......      
Byte        CRC (byte basso)
Byte            (byte alto)
            Risposta
Byte 1      Indirizzo
Byte 2      Funzione (15)
Byte 3      Indirizzo di partenza   (byte alto)
Byte 4                              (byte basso)
Byte 5      Numero di indirizzi   (byte alto)
Byte 6                            (byte basso)
Byte 7      CRC (byte basso)
Byte 8          (byte alto)
 
Ogni 'dato' viene espresso con due byte, e si trasmette sempre prima il byte alto e poi il byte basso.
 
p.s.: verificare sempre i manuali dell'apparecchiatura per sapere quali sono gli indirizzi permessi, ed il formato numerico da utilizzare per i dei dati in scambio.
 
CALCOLO DEL CRC
La funzione del CRC è di calcolare un numero di due Byte partendo dal messaggio di trasmissione (secondo una formula standard), cosi chè, chi lo riceve, rifacendo lo stesso calcolo e confrontandolo con lo stesso CRC ricevuto, può determinare se sono presenti o meno errori di trasmissione.
p.s.: Il calcolo del CRC non è influenzato dal tipo di parità utilizzato nella trasmissione dati.
Procedura di calcolo:
                            
               Puntatore al 1° byte da trasmettere
               Inizializzare il registro CRC a 16 bit con tutti '1'
              XOR tra CRC e il byte puntato, risultato in CRC
INIT COUNT     Inizializza COUNT con 0
SHIFT:         Shifta a destra il CRC di 1 bit
               Incrementa COUNT
               Che valore ha il bit uscito a destra dallo shift
                   Se vale 1, XOR tra CRC e 40961(dec.), risultato in CRC
                  Se vale 0, continua
              COUNT vale 8 ?
                   Se no, torna a SHIFT
                   Se sì, incrementa il puntatore al byte successivo
               Il puntatore ha superato i byte da trasmettere ?
                   Se no, XOR tra CRC ed il Byte da trasmettere e torna a INIT COUNT
                   Se sì, il CRC contiene il valore da utilizzare per la trasmissione.
 
Di seguito è un esempio scritto in Visual Basic per eseguire il calcolo del CRC per una data stringa di trasmissione.
 
dato(0) = 1         ' indirizzo strumento 1-247               Comunica con lo strumento n. 1
dato(1) = 3         ' n° funzione                                        Leggi i registri di appoggio
dato(2) = 0         ' indirizzo registro HI
dato(3) = 1         ' indirizzo registro LO                        Inizia dal registro n. 5
dato(4) = 0         ' n. registri HI
dato(5) = 3         ' n. registri LO                                     leggi 3 registri

' Calcola il Checksum
temp = dato(0)
temp = 65535 Xor temp
For Y = 1 To 8
    If temp / 2 <> Int(temp / 2) Then
        temp = Int(temp / 2)
        temp = 40961 Xor temp
    Else
        temp = Int(temp / 2)
    End If
Next Y
For x = 1 To 7
    temp = dato(x) Xor temp
    For Y = 1 To 8
        If temp / 2 <> Int(temp / 2) Then
            temp = Int(temp / 2)
            temp = 40961 Xor temp
        Else
            temp = Int(temp / 2)
        End If
    Next Y
Next x

alto = Int(temp / 256)
basso = temp - (alto * 256)

' Componi la stringa di trasmissione
StringaTrasmissione  = ""
For x = 0 To 5
    If dato(x) <> 0 Then
        StringaTrasmissione  = StringaTrasmissione + Chr(dato(x))
    Else
        StringaTrasmissione = StringaTrasmissione + Chr$(0)
    End If
Next x
StringaTrasmissione = StringaTrasmissione + Chr$(basso) + Chr$(alto)

 

 

Modificato il domenica 03 settembre 2000          meglio se visto in 1024 x 768 pixels