Protocole MODBUS

Architecture du Système

Le périphérique USART1 permet de gérer le Modbus-RTU côté microcontrôleur STM32

architecture_modbus.svg


Format d’une trame Modbus

Le protocole Modbus utilise le support Ethernet ou liaison RS232/485 ( on parle alors de Modbus-RTU )

Le protocole Modbus possède 4 sortes de messages :

Donnée Modbus Type Sens de transfert nom openplc
Input Contact valeur BOOLEENNE à lire MASTER <-- SLAVE %IX
Output Coil valeur BOOLEENNE à écrire MASTER --> SLAVE %QX
Input/Holding read Register valeur ENTIERE à lire MASTER <-- SLAVE %IW
Holding Register - Write valeur ENTIERE à écrire MASTER --> SLAVE %QW

Côté Microcontrôleur

WORKSPACE_F446_PMSM_STM32CUBEIDE.zip

La tâche ModbusUserSlave_Task relève le message Modbus RTU et le relaye sur USART2 avec la fonction term_printf.

void ModbusUserSlave_Task(void *argument)
{
 static int i = 0;
  for(;;)
  {

	xSemaphoreTake(ModbusH2.ModBusSphrHandle , portMAX_DELAY);

	ModbusH2.dts_stm_rpi[0]=i++;  // STM32 --> RPI  

	if( ModbusH2.u8Buffer[1] == 16 ) //  Func : Write Multiple Registers(16) RPI --> STM32  
	{
		term_printf("modbus : %d %d\n\r",ModbusH2.u16regs[0],ModbusH2.u8Buffer[1]);
	}
	xSemaphoreGive(ModbusH2.ModBusSphrHandle);
	xSemaphoreTake( xSemaphore_Slow, portMAX_DELAY );
	vTaskDelay(200);
  }
}

Côté PC

var_modbus.png

%QW100 = Analog output pour le modbus RTU

graphcet_modbus.png

Pour les transitions et les actions, choisir inline :

transition.png

action.png


Test du modbus

L’utilitaire en ligne de commande mbpoll permet de vérifier l’état de la liaison entre le PC/RPI et la STM32 :

kerhoas@kerhoas-HP-EliteBook-850-G8-Notebook-PC:~$ mbpoll -a 17 -b 115200 -t 3 -r 1 -c 2 /dev/ttyUSB0 -P none
# -t 3          16-bit input register data type
# -c #          Number of values to read (1-125, 1 is default)
# -r #          Start reference (1 is default)

Protocol configuration: Modbus RTU
Slave configuration...: address = [17]
                        start reference = 1, count = 2
Communication.........: /dev/ttyUSB0,     115200-8N1 
                        t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, input register table

-- Polling slave 17... Ctrl-C to stop)
[1]: 	255
[2]: 	0
-- Polling slave 17... Ctrl-C to stop)
[1]: 	260
[2]: 	0
-- Polling slave 17... Ctrl-C to stop)
[1]: 	265
[2]: 	0
-- Polling slave 17... Ctrl-C to stop)
[1]: 	270
[2]: 	0
-- Polling slave 17... Ctrl-C to stop)
[1]: 	275
[2]: 	0
^C--- /dev/ttyUSB0 poll statistics ---
5 frames transmitted, 5 received, 0 errors, 0.0% frame loss

everything was closed.
Have a nice day !

Envoi d’un message PC –> STM32

Dans OpenPLC Runtime, ajouter un la carte nucleo en tant que Slave Device Modbus :

slave_device.png

slave_device_2.svg

Observons l’échange entre la carte STM32 et le l’ automate RPI avec un analyseur logique :

analyseur_logique.svg