Le périphérique USART1 permet de gérer le Modbus-RTU côté microcontrôleur STM32
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 |
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);
}
}
%QW100 = Analog output pour le modbus RTU
Pour les transitions et les actions, choisir inline :
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 !
Dans OpenPLC Runtime, ajouter un la carte nucleo en tant que Slave Device Modbus :
Observons l’échange entre la carte STM32 et le l’ automate RPI avec un analyseur logique :