Difference between revisions of "Flameman/modbus"

From eLinux.org
Jump to: navigation, search
(crc16)
(Blanked the page)
(Tag: Blanking)
 
(3 intermediate revisions by 2 users not shown)
Line 1: Line 1:
'''Modbus'''
 
  
= URL =
 
 
* org [http://www.modbus.org/]
 
* brief [http://www.rtaautomation.com/modbusrtu/]
 
 
= Intro =
 
 
Il Modbus è un protocollo di comunicazione seriale creato da Modicon nel 1979 per mettere in comunicazione i propri controllori logici programmabili (PLC). È diventato uno standard de facto nella comunicazione di tipo industriale, ed è ora il protocollo di connessione più diffuso fra i dispositivi elettronici industriali. Le principali ragioni di un così elevato utilizzo del Modbus rispetto agli altri protocolli di comunicazione sono:
 
 
* e' un protocollo pubblicato apertamente e royalty-free
 
* può essere implementato in pochi giorni, non in mesi
 
* Muove raw bits e words senza porre molte restrizioni ai venditori
 
 
 
 
Modbus consente la comunicazione fra diversi dispositivi connessi alla stessa rete, per esempio un sistema che misura la temperatura e l'umidità e comunica il risultato a un computer. Modbus è spesso usato per connettere un computer supervisore con un'unità terminale remota (RTU) nel controllo di supervisione e sistemi di acquisizione dati (SCADA).
 
 
 
Esistono due versioni del protocollo:
 
 
* seriale (RS232 default, oppure RS485)
 
* Ethernet
 
 
 
 
== Frame Format ==
 
All modbus variants choose different frame formats.
 
 
 
{|class="wikitable" border="1" style="float:middle;margin:0 0 1em 1em"
 
|-
 
! colspan="5" | Modbus RTU Frame Format
 
|-
 
!Name
 
!Length
 
!Function
 
|-
 
| bgcolor="#D8EC9B" |'''Start'''
 
| bgcolor="#D8EC9B" | 4 bits
 
| bgcolor="#D8EC9B" | ''4 bits of idle charactors''
 
|-
 
| bgcolor="#E9ED9B" |'''Address'''
 
| bgcolor="#E9ED9B" | 8 bits
 
| bgcolor="#E9ED9B" | ''Station Address''
 
|-
 
| bgcolor="#18EE9B" |'''Function'''
 
| bgcolor="#18EE9B" | 8 bits
 
| bgcolor="#18EE9B" | ''Indicates the function codes like read coils / inputs''
 
|-
 
| bgcolor="#F8EF9B" |'''Data'''
 
| bgcolor="#F8EF9B" | n * 8 bits
 
| bgcolor="#F8EF9B" | ''Data + length will be filled depending on the message type''
 
|-
 
| bgcolor="#A8F09B" |'''CRC Check'''
 
| bgcolor="#A8F09B" | 16 bits
 
| bgcolor="#A8F09B" | ''Error checks''
 
|-
 
| bgcolor="#A8A15B" |'''End'''
 
| bgcolor="#A8A15B" | 4 bits
 
| bgcolor="#A8A15B" | ''4 idle characters indicating end of frame''
 
|-
 
|}
 
 
{|class="wikitable" border="1" style="float:middle;margin:0 0 1em 1em" 
 
|-
 
! colspan="5" | Modbus ASCII Frame Format
 
|-
 
!Name
 
!Length
 
!Function
 
|-
 
| bgcolor="#D8EC9B" |'''Start'''
 
| bgcolor="#D8EC9B" | 1 char
 
| bgcolor="#D8EC9B" | ''starts with colon ( : ) (ASCII value is 3A hex)''
 
|-
 
| bgcolor="#E9ED9B" |'''Address'''
 
| bgcolor="#E9ED9B" | 2 chars
 
| bgcolor="#E9ED9B" | ''Station Address''
 
|-
 
| bgcolor="#18EE9B" |'''Function'''
 
| bgcolor="#18EE9B" | 2 chars
 
| bgcolor="#18EE9B" | ''Indicates the function codes like read coils / inputs''
 
|-
 
| bgcolor="#F8EF9B" |'''Data'''
 
| bgcolor="#F8EF9B" | n chars
 
| bgcolor="#F8EF9B" | ''Data +length will be filled depending on the message type''
 
|-
 
| bgcolor="#A8F09B" |'''LRC Check'''
 
| bgcolor="#A8F09B" | 2 chars
 
| bgcolor="#A8F09B" | ''Error checks''
 
|-
 
| bgcolor="#A8A15B" |'''End'''
 
| bgcolor="#A8A15B" | 2 chars
 
| bgcolor="#A8A15B" | ''carriage return – line feed(CRLF) pair (ASCII values of 0D & 0A hex)''
 
|-
 
|}
 
 
{|class="wikitable" border="1" style="float:middle;margin:0 0 1em 1em"
 
|-
 
! colspan="5" | Modbus TCP Frame Format
 
|-
 
!Name
 
!Length
 
!Function
 
|-
 
| bgcolor="#D8EC9B" |'''Transaction Identifier'''
 
| bgcolor="#D8EC9B" | 2 bytes
 
| bgcolor="#D8EC9B" | ''For synchronization between messages of server
 
& client''
 
|-
 
| bgcolor="#A8A15B" |'''Protocol Identifier'''
 
| bgcolor="#A8A15B" | 2 bytes
 
| bgcolor="#A8A15B" | ''Zero for MODBUS/TCP''
 
|-
 
| bgcolor="#D8EC9B" |'''Length Field'''
 
| bgcolor="#D8EC9B" | 2 bytes
 
| bgcolor="#D8EC9B" | ''Number of remaining bytes in this frame''
 
|-
 
| bgcolor="#E9ED9B" |'''Unit Identifier'''
 
| bgcolor="#E9ED9B" | 1 byte
 
| bgcolor="#E9ED9B" | ''Slave Address (255 if not used)''
 
|-
 
| bgcolor="#18EE9B" |'''Function code'''
 
| bgcolor="#18EE9B" | 1 byte
 
| bgcolor="#18EE9B" | ''Function codes as in other variants''
 
|-
 
| bgcolor="#F8EF9B" |'''Data bytes'''
 
| bgcolor="#F8EF9B" | n bytes
 
| bgcolor="#F8EF9B" | ''Data as response or commands''
 
|-
 
|}
 
 
Unit identifier is used with MODBUS/TCP devices that are composites of several MODBUS devices, e.g. on MODBUS/TCP to MODBUS RTU gateways. In such case, the unit identifier tells the Slave Address of the device behind the gateway. Natively MODBUS/TCP-capable devices usually ignore the Unit Identifier.
 
 
== Brief ==
 
 
Modbus protocol, despite the passage of time (was developed in the company Modicon in 1980) continues to be standard in most industrial controllers (PLC) and is widely used in industrial automation systems.
 
Modbus can work in two modes, ASCII and RTU, and the use is compatible with RS232 interface (RS422, RS485, modems, etc.)
 
In recent years, great popularity gaining also Modbus TCP / IP -Modbus protocol implementation based on TCP / IP Ethernet network.
 
With the significant decline in prices microcontroller interface RS232 and Ethernet, Modbus recently started to be frequently used in embedded systems.
 
 
This site is intended to assist in implementing the Modbus in embedded systems.
 
 
Esistono due varianti, con differenti rappresentazioni dei dati numerici e piccole differenze sul protocollo stesso.
 
 
* Modbus RTU è una rappresentazione dei dati compatta di tipo esadecimale
 
* Modbus ASCII è facilmente leggibile e ridondante
 
 
Entrambe le varianti usano la comunicazione seriale.
 
 
* Il formato RTU fa seguire ai comandi/dati un campo checksum di tipo ''cyclic redundancy check (CRC)''
 
* il formato ASCII usa un checksum di tipo ''LRU (longitudinal redundancy check)''.
 
 
I nodi configurati per la variante RTU non possono comunicare con nodi configurati per l'ASCII e viceversa.
 
 
Modbus/TCP è molto simile al Modbus RTU, ma trasmette i pacchetti del protocollo dentro pacchetti di dati TCP/IP.
 
 
A ogni periferica che necessita di comunicare per mezzo del Modbus viene assegnato un indirizzo unico. Ognuna di queste può inviare un comando Modbus, sebbene generalmente (nel seriale obbligatoriamente) solo una periferica agisce come master. Un comando Modbus contiene l'indirizzo Modbus della periferica con la quale si vuole comunicare. Solo quest'ultima agirà sul comando, sebbene anche le altre periferiche lo ricevano. Tutti i comandi Modbus contengono informazioni di controllo, che assicurano che il comando arrivato sia corretto. Il comandi base possono chiedere ad un RTU di cambiare un valore in uno dei suoi registri, così come comandare alla periferica di restituire uno o più valori contenuti nei suoi registri.
 
 
Ci sono diversi modem che supportano Modbus. Alcuni di questi sono specificatamente progettati per questo protocollo. Alcune implementazioni usano fili, comunicazioni wireless o anche SMS o GPRS. Problemi tipici in cui può imbattersi il progettista sono l'alta latenza e problemi di temporizzazione.
 
 
 
 
== CRC ==
 
 
 
 
 
=== crc16 ===
 
 
==== crc16.h ====
 
 
= Varianti =
 
 
Quasi tutte le implementazioni hanno variazioni dallo standard ufficiale. Differenti varietà non possono comunicare correttamente fra dispositivi di fornitori differenti. Alcune delle più comuni variazioni sono:
 
 
    * Tipi di dati
 
          o Floating Point IEEE
 
          o Interi a 32 bit
 
          o Dati a 8 bit
 
          o tipi di dati misti
 
          o Campi bit su interi
 
          o moltiplicatori per cambiare i dati da/in interi. 10, 100, 1000, 256 ...
 
 
    * Estensioni del protocollo
 
          o Indirizzi degli slave a 16 bit
 
          o dimensione dei dati a 32 bit (1 indirizzo = 32 bit di dati restituiti)
 
          o word swapped data
 
 
 
= Limitazioni =
 
 
Modbus è stato progettato nel lontano 1970 per ''comunicare con i PLC''. I tipi di dati sono limitati a quelli supportati dai PLC a suo tempo. Oggetti binari di grandi dimensioni non sono supportati. Non esiste un metodo standard per un nodo di trovare la descrizione di un tipo di dato; per esempio, determinare se un valore registro rappresenta una temperatura fra i 30 e i 175 gradi
 

Latest revision as of 07:21, 10 July 2020