Vilket MODBUS bibliotek använder du?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46872
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Vilket MODBUS bibliotek använder du?

Inlägg av TomasL »

DanielM skrev: 7 februari 2025, 12:41:52
TomasL skrev: 2 januari 2025, 20:21:32 Vi implementerade det bibliotek jag länkade till ihop med OpenRTOS på en PIC32MX795, det funkar perfekt utan några som helst modifikationer, från dag 1.
Dock fick vi lite problem med ABB omformare, som i vissa lägen skickar fel checksumma, så vi fick modda lite grand innan ABB fixade det hela.
I Mastern körde vi både MASTER RTU och SERVER TCP, i TCP-koden så använde vi DMA vid mottagning, eftersom det inte finns någon timing på TCP-versionen.
I RTU-koden så körde vi tighta interrupt för både mottagning och sändning, i hastigheter upp till runt 230kb/s(230400 b/s) över det fick vi problem. Eftersom vi defaultade till 19,2 så var det inga problem.

Om du ska ta emot X bytes, som du har ingen kännedom om. Hur skulle du göra då?

Du kan använda en interrupt som aktiveras vid 1 byte. Men om du skickar 10 byte, då kommer interrupten att köras 10 gånger, eller hinner du läsa 10 byte, innan du återkallar på interruptens inställning igen?
I modbus vet man alltid hur många bytes som skall sändas och tas emot, mastern vet i alla lägen hur många bytes slaven sänder.
Slaven vet naturligtvis inte hur många bytes som mastern sänder, men normalt sett, så, beroende på implementation handlar det om 8, 16 , 32 eller 64 bytes, och det är inga problem med interrupt och eventuell dma.
Processorn är alltid såpass mycket snabbare än överföringshastigheten, så interrupten kommer inte sådär jätteofta.
Det normala för en modbus-lina är 9k6 eller 19k2.
Ja, man startar om timern varje gång, men som sagt, snurrar processorn med flera 10-tals MHz eller flera 100-tal MHz, så hinns rätt mycket med, 2000 int/sec är ju inte så mycket i ett sånt läge, och är bufferten länge än 1 Byte, så blir det ju motsvarande färre antal int.
DanielM
Inlägg: 2415
Blev medlem: 5 september 2019, 14:19:58

Re: Vilket MODBUS bibliotek använder du?

Inlägg av DanielM »

Men skulle du säga att det är en normal strategi att sätta en UART interrupt på 1 byte? Jag förväntar mig att innan UART har exekverat interrupten, så är alla bytes lästa. Med andra ord: DMA behövs inte.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46872
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Vilket MODBUS bibliotek använder du?

Inlägg av TomasL »

Man sätter interrupten på lämpligt antal byte, beroende på hur stor hårdvarubufferten är.
typ 1/2-full 3/4-full.
DanielM
Inlägg: 2415
Blev medlem: 5 september 2019, 14:19:58

Re: Vilket MODBUS bibliotek använder du?

Inlägg av DanielM »

Jag lyckades lösa detta med att ha en IT + DMA.
STM32 hade tydligen inbyggt stöd för detta. Det funktionen gör är att den exekverar interrupt-funktionen när UART meddelandet är slutfört. :tumupp:

Kod: Markera allt

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
	/* Read the modbus data */
	counted_bytes = 0;
	modbus_server_polling();

	/* Get the operation  */
	uint16_t* PARAMETERS = modbus_server_get_parameters_array();
	operation = PARAMETERS[48];

	/* Execute the operation */
	switch(operation){
	case COMPUTE_MPC_MODEL:
		compute_mpc_model();
		operation = FEEDBACK_CONTROL;
		PARAMETERS[48] = FEEDBACK_CONTROL;
		break;
	case SAVE_REGISTER_TO_MEMORY:
		write_initial_memory();
		operation = FEEDBACK_CONTROL;
		PARAMETERS[48] = FEEDBACK_CONTROL;
		break;
	default:
		break;
	}

	/* Start DMA again */
	HAL_UARTEx_ReceiveToIdle_DMA(&huart1, UART_RX_DATA, UART_RX_DATA_SIZE);
}


/* Start UART with IT and DMA */
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, UART_RX_DATA, UART_RX_DATA_SIZE);
Skriv svar