diff --git a/README.md b/README.md index d77a8f9..97ab023 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ git submodule add https://git.arktika.cyou/set506/STM32_Modbus path/to/Modbus git submodule update --init --recursive ``` -2. **Скопируйте файлы конфигурации** в отдельную папку в вашем проекте (вне субмодуля) и удалите `__`: +2. **Скопируйте файлы конфигурации** в отдельную папку в вашем проекте (вне субмодуля) и удалите `__` из имени файлов: ``` ProjectRoot/ @@ -67,14 +67,14 @@ ProjectRoot/ void USARTx_IRQHandler(void) { - RS_UART_Handler(&modbus1); + RS_UART_Handler(&hmodbus1); return; HAL_UART_IRQHandler(&huart); } void TIMx_IRQHandler(void) { - RS_TIM_Handler(&modbus1); + RS_TIM_Handler(&hmodbus1); return; HAL_TIM_IRQHandler(&htim); } @@ -100,7 +100,7 @@ ProjectRoot/ // Инициализация Modbus MODBUS_FirstInit(&hmodbus1, &mb_huart, &mb_htim); - MODBUS_Config(&hmodbus1, 1, 1000, MODBUS_MODE_SLAVE); + MODBUS_Config(&hmodbus1, MODBUS_DEVICE_ID, MODBUS_TIMEOUT, MODBUS_MODE_SLAVE); // Запуск приема Modbus MODBUS_SlaveStart(&hmodbus1, NULL); @@ -116,7 +116,22 @@ ProjectRoot/ ```c #include "modbus.h" - + // Запрос на 1 ID, считать холдинг регистры с 0 адреса 10 штук + RS_MsgTypeDef read_hold_cmd = MB_MASTER_READ_HOLDING_REGS(1, 0, 10); + // коллбек, вызовется при получении ответа от слейва + read_hold[10]; + void callback_func(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg) + { + // MB_RespGet_... Чтобы достать нужные данные из ответа + for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++) + { + uint16_t value; + if(MB_RespGet_RegisterValue(&MODBUS_MSG, addr, &value)) + { + read_hold[i] = value; + } + } + } int main(void) { // Инициализация HAL @@ -128,16 +143,11 @@ ProjectRoot/ // Инициализация Modbus MODBUS_FirstInit(&hmodbus1, &mb_huart, &mb_htim); - MODBUS_Config(&hmodbus1, 0, 1000, MODBUS_MODE_MASTER); + MODBUS_Config(&hmodbus1, 0, MODBUS_TIMEOUT, MODBUS_MODE_MASTER); - // Запуск приема Modbus - // Запрос на 1 ID, считать холдинг регистры с 0 адреса 10 штук - RS_MsgTypeDef msg = MB_MASTER_READ_HOLDING_REGS(1, 0, 10); - MODBUS_MasterRequest(&hmodbus1, &msg, &callback_func); - void callback_func(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg) - { - // MB_RespGet_... Чтобы достать нужные данные из ответа - } + // Запрос по Modbus + MODBUS_MasterRequest(&hmodbus1, &read_hold_cmd, &callback_func); + } ``` 3.5. Настройка карты данных @@ -198,11 +208,11 @@ ProjectRoot/ MB_DATA.HoldRegs.SetpointTemp = 2500; // Управление coils - MB_Set_Coil_Local(&MB_DATA.Coils, 0); // Включить Relay1 - MB_Reset_Coil_Local(&MB_DATA.Coils, 1); // Выключить Relay2 + MB_Coil_Set_Local(&MB_DATA.Coils, 0); // Включить Relay1 + MB_Coil_Reset_Local(&MB_DATA.Coils, 1); // Выключить Relay2 // Чтение coil - if (MB_Read_Coil_Local(&MB_DATA.Coils, 2)) { + if (MB_Coil_Read_Local(&MB_DATA.Coils, 2)) { // Pump включен } ``` @@ -210,37 +220,37 @@ ProjectRoot/ В режиме мастера есть функции для получения информации из ответа `MB_RespGet_...()` ```c // Чтение регистров: Получить запрошенные регистры - uint16_t value; - if(MB_RespGet_RegisterValue(&MODBUS_MSG, 105, ®_value)) - { - printf("Register 105 value: %d\n", reg_value); - } + uint16_t value; + if(MB_RespGet_RegisterValue(&MODBUS_MSG, 105, ®_value)) + { + printf("Register 105 value: %d\n", reg_value); + } // Чтение коилов: Получить запрошенные коилы - int state; - if(MB_RespGet_CoilState(&MODBUS_MSG, 25, &coil_state)) - { - printf("Coil 25 state: %s\n", coil_state ? "ON" : "OFF"); - } + int state; + if(MB_RespGet_CoilState(&MODBUS_MSG, 25, &coil_state)) + { + printf("Coil 25 state: %s\n", coil_state ? "ON" : "OFF"); + } // Чтение диагностики: Получить запрошенныую диагностику - uint16_t counter_value; - if(MB_RespGet_DiagnosticResponse(&MODBUS_MSG, &counter_value)) - { - printf("Counter value: %d\n", counter_value); - } + uint16_t counter_value; + if(MB_RespGet_DiagnosticResponse(&MODBUS_MSG, &counter_value)) + { + printf("Counter value: %d\n", counter_value); + } // Чтение идентификаторов: Получить запрошенные идентификаторы - uint8_t length; - char vendor_name[64]; - if(MB_RespGet_ObjectById(&MODBUS_MSG, 0x00, vendor_name, &length)) - { - printf("Vendor Name: %s (length: %d)\n", vendor_name, length); - } - - uint8_t obj_id, obj_length; - char obj_data[64]; - if(MB_RespGet_ObjectByIndex(&MODBUS_MSG, 0x00, &obj_id, obj_data, &obj_length)) - { - printf("First object - ID: 0x%02X, Data: %s\n", obj_id, obj_data); - } + uint8_t length; + char vendor_name[64]; + if(MB_RespGet_ObjectById(&MODBUS_MSG, 0x00, vendor_name, &length)) + { + printf("Vendor Name: %s (length: %d)\n", vendor_name, length); + } + + uint8_t obj_id, obj_length; + char obj_data[64]; + if(MB_RespGet_ObjectByIndex(&MODBUS_MSG, 0x00, &obj_id, obj_data, &obj_length)) + { + printf("First object - ID: 0x%02X, Data: %s\n", obj_id, obj_data); + } ```