#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdint.h> #include <string.h> #include <stdbool.h> #include "UARTTT.h" #include "modbus.h" #define F_CPU 16000000 //Îáúÿâëåíèå àäðåññà Slave #define SLAVE_ADDR 0x32 // Îáúÿâëåíèå íîìåðîâ Discrete Inputs (êîíöåâèêè 1,2 - âíåøíèå; 3-4 - âíóòðåííèå) #define DISCRETE_INPUTS_1 0x0000 #define DISCRETE_INPUTS_2 0x0001 #define DISCRETE_INPUTS_3 0x0002 #define DISCRETE_INPUTS_4 0x0003 // Îáúÿâëåíèå íîìåðîâ Coil (ýëåêòðîïðèâîäû 1,2 - îòêðûòèå; 3-4 - çàêðûòèå) #define COIL_1 0x0000 #define COIL_2 0x0001 #define COIL_3 0x0002 #define COIL_4 0x0003 // Îáúÿâëåíèå íîìåðîâ Input Registers #define INPUT_REGISTERS 0x0000 // Êîíñòàíòû äëÿ îïðåäåëåíèÿ ïîðîãîâîãî çíà÷åíèÿ îñâåùåííîñòè #define LIGHT_DAY_TO_NIGHT 0x01F4 //500 #define LIGHT_NIGHT_TO_DAY 0x0258 //600 // Ôóíêöèÿ ÷òåíèÿ çíà÷åíèÿ ñ äàò÷èêà îñâåùåííîñòè int read_light_sensor(uint16_t* result) { uint8_t buf_light[16]; uint8_t buf_ans_light[16]; size_t size; size_t size_ans; size = read_input_register(SLAVE_ADDR, INPUT_REGISTERS, buf_light, sizeof(buf_light)); UART_send(buf_light, size); size_ans = UART_receive(buf_ans_light, sizeof(buf_ans_light)); if (size_ans > 0) { return read_input_register_parse(buf_ans_light, size_ans, result); } else return size_ans; } // Ôóíêöèÿ ÷òåíèÿ çíà÷åíèÿ êîíöåâèêîâ int read_inter_lock_swith(uint8_t* result, uint8_t discreteInputs) { uint8_t buf_ILS[16]; uint8_t buf_ans_ILS[16]; size_t size; size_t size_ans; size = read_input_status(SLAVE_ADDR, discreteInputs, 0x01, buf_ILS, sizeof(buf_ILS)); UART_send(buf_ILS, size); size_ans = UART_receive(buf_ans_ILS, sizeof(buf_ans_ILS)); if (size_ans > 0) { return read_input_status_parse(buf_ans_ILS, size_ans, result); } else return size_ans; } typedef enum { OPEN_SHUTTERS_COIL_1, OPEN_SHUTTERS_COIL_2, STOP_COIL_1, STOP_COIL_2, CLOSE_SHUTTERS_COIL_3, CLOSE_SHUTTERS_COIL_4, STOP_COIL_3, STOP_COIL_4 } CommandType; // Ôóíêöèÿ âêëþ÷åíèå è âûêëþ÷åíèÿ äëÿ îòêðûòèÿ èëè çàêðûòèÿ øòîð int process_command(CommandType command) { uint8_t buf[10]; uint8_t buf_ans[10]; size_t size; size_t size_ans; uint8_t buf_2[10]; uint8_t buf_ans_2[10]; size_t size_2; size_t size_ans_2; if (command == OPEN_SHUTTERS_COIL_1) { // Êîìàíäà îòêðûòèÿ øòîð (âêëþ÷åíèå coil_1) size = forse_single_coil(SLAVE_ADDR, COIL_1, 0xFF, buf, sizeof(buf)); UART_send(buf, size); size_ans = UART_receive(buf_ans, size_ans); if (size_ans > 0) { return forse_single_coil_parse(buf, sizeof(buf_ans)); } else return size_ans; } else if (command == OPEN_SHUTTERS_COIL_2) { // Êîìàíäà îòêðûòèÿ øòîð (âêëþ÷åíèå coil_2) size = forse_single_coil(SLAVE_ADDR, COIL_2, 0xFF, buf_2, sizeof(buf_2)); UART_send(buf_2, size_2); size_ans_2 = UART_receive(buf_ans_2, sizeof(buf_ans_2)); if (size_ans_2 > 0) { return forse_single_coil_parse(buf_2, size_ans_2); } else return size_ans_2; } else if (command == STOP_COIL_1) { // Êîìàíäà îñòàíîâêè coil_1 size = forse_single_coil(SLAVE_ADDR, COIL_1, 0x00, buf, sizeof(buf)); UART_send(buf, size); size_ans = UART_receive(buf_ans, sizeof(buf_ans)); if (size_ans > 0) { return forse_single_coil_parse(buf, size_ans); } else return size_ans; } else if (command == STOP_COIL_2) { // Êîìàíäà îñòàíîâêè coil_2 size = forse_single_coil(SLAVE_ADDR, COIL_2, 0x00, buf, sizeof(buf)); UART_send(buf_2, size_2); size_ans_2 = UART_receive(buf_ans_2, sizeof(buf_ans_2)); if (size_ans_2 > 0) { return forse_single_coil_parse(buf_2, size_ans_2); } else return size_ans_2; } else if (command == CLOSE_SHUTTERS_COIL_3) { // Êîìàíäà çàêðûòèÿ øòîð(âêëþ÷åíèå coil_3) size = forse_single_coil(SLAVE_ADDR, COIL_3, 0xFF, buf, sizeof(buf)); UART_send(buf, size); size_ans = UART_receive(buf_ans, sizeof(buf_ans)); if (size_ans > 0) { return forse_single_coil_parse(buf, size_ans); } else return size_ans; } else if (command == CLOSE_SHUTTERS_COIL_3) { // Êîìàíäà çàêðûòèÿ øòîð(âêëþ÷åíèå coil_4) size = forse_single_coil(SLAVE_ADDR, COIL_4, 0xFF, buf, sizeof(buf)); UART_send(buf_2, size_2); size_ans_2 = UART_receive(buf_ans_2, sizeof(buf_ans_2)); if (size_ans_2 > 0) { return forse_single_coil_parse(buf_2, size_ans_2); } else return size_ans_2; } else if (command == STOP_COIL_3) { // Êîìàíäà îñòàíîâêè coil_3 size = forse_single_coil(SLAVE_ADDR, COIL_3, 0x00, buf, sizeof(buf)); UART_send(buf, size); size_ans = UART_receive(buf_ans, sizeof(buf_ans)); if (size_ans > 0) { return forse_single_coil_parse(buf, size_ans); } else return size_ans; } else if (command == STOP_COIL_4) { // Êîìàíäà îñòàíîâêè coil_4 size = forse_single_coil(SLAVE_ADDR, COIL_4, 0x00, buf, sizeof(buf)); UART_send(buf_2, size_2); size_ans_2 = UART_receive(buf_ans_2, sizeof(buf_ans_2)); if (size_ans_2 > 0) { return forse_single_coil_parse(buf_2, size_ans_2); } else return size_ans_2; } } int main(void) { UART_init(); uint8_t buf[16]; uint8_t buf_ans[16]; sei(); bool day_right_now = true; // true - äåíü false - íî÷ü while (1) { uint16_t light_sensor; // Ïåðåìåííàÿ äëÿ çàïèñè çíà÷åíèÿ äàò÷èêà îñâåùåíèÿ int read_result_sensor = read_light_sensor(&light_sensor); // Ôóíêöèÿ ÷òåíèÿ çíà÷åíèÿ äàò÷èêà îñâåùåíèÿ è çàïèñü â ñîîòâåòñòâóþùóþ ïåðåìåííóþ if (read_result_sensor < 1) { // Ïðîâåðêà íà èñêëþ÷åíèå continue; } uint8_t read_inter_lock_swith_1; // Ïåðåìåííàÿ äëÿ çàïèñè çíà÷åíèÿ êîíöåâèêà 1 uint8_t read_inter_lock_swith_2; // Ïåðåìåííàÿ äëÿ çàïèñè çíà÷åíèÿ êîíöåâèêà 2 uint8_t read_inter_lock_swith_3; // Ïåðåìåííàÿ äëÿ çàïèñè çíà÷åíèÿ êîíöåâèêà 3 uint8_t read_inter_lock_swith_4; // Ïåðåìåííàÿ äëÿ çàïèñè çíà÷åíèÿ êîíöåâèêà 4 int read_result_inter_1 = read_inter_lock_swith(&read_inter_lock_swith_1, DISCRETE_INPUTS_1); // Ôóíêöèÿ ÷òåíèÿ ñîñòîÿíèÿ 1 êîíåâèêà è çàïèñü â ñîîòâåòñòâóþùóþ ïåðåìåííóþ int read_result_inter_2 = read_inter_lock_swith(&read_inter_lock_swith_2, DISCRETE_INPUTS_2); // Ôóíêöèÿ ÷òåíèÿ ñîñòîÿíèÿ 2 êîíåâèêà è çàïèñü â ñîîòâåòñòâóþùóþ ïåðåìåííóþ int read_result_inter_3 = read_inter_lock_swith(&read_inter_lock_swith_3, DISCRETE_INPUTS_3); // Ôóíêöèÿ ÷òåíèÿ ñîñòîÿíèÿ 3 êîíåâèêà è çàïèñü â ñîîòâåòñòâóþùóþ ïåðåìåííóþ int read_result_inter_4 = read_inter_lock_swith(&read_inter_lock_swith_4, DISCRETE_INPUTS_4); // Ôóíêöèÿ ÷òåíèÿ ñîñòîÿíèÿ 4 êîíåâèêà è çàïèñü â ñîîòâåòñòâóþùóþ ïåðåìåííóþ if (read_result_inter_1 < 1 || read_result_inter_2 < 1 || read_result_inter_3 < 1 || read_result_inter_4 < 1) { // Ïðîâåðêà íà èñêëþ÷åíèå continue; } if (day_right_now == true) { // Åñëè ó íàñ ñåé÷àñ äåíü, òî... if (light_sensor < LIGHT_DAY_TO_NIGHT) { // Åñëè çíà÷åíèå ñ äàò÷èêà ìåíüøå ïîðîãà ïåðåõîäà èç äíÿ â íî÷ü, òî... day_right_now = false; // Óñòàíàâëèâàåì çíà÷åíèå false, òî åñòü íî÷ü. } } else { // Åñëè ó íàñ ñåé÷àñ íî÷ü, òî... if (light_sensor > LIGHT_NIGHT_TO_DAY) { // Åñëè çíà÷åíèå ñ äàò÷èêà áîëüøå ïîðîãà ïåðåõîäà èç íî÷è â äåíü, òî... day_right_now = true; // Óñòàíàâëèâàåì çíà÷åíèå true, òî åñòü äåíü. } } // Ëîãèêà ðàáîòû øòîð if (day_right_now == false) { // Åñëè ó íàñ íî÷ü, òî... if (read_inter_lock_swith_3 == 0x00) { // Åñëè âíóòðåííèé êîíöåâèê(3) = 0. int process_comand_1 = process_command(CLOSE_SHUTTERS_COIL_3); // Çàïóñê 1 ïðèâîäà (îòêðûòèå øòîð). continue; } else { // Åñëè âíóòðåííèé êîíöåâèê (3) = 1. int process_comand_3 = process_command(STOP_COIL_3); // Îñòàíîâêà ðàáîòû 1 ïðèâîäà. continue; } if (read_inter_lock_swith_4 == 0x00) { // Åñëè âíóòðåííèé êîíöåâèê(4) = 0. int process_comand_2 = process_command(CLOSE_SHUTTERS_COIL_4); // Çàïóñê 2 ïðèâîäà (îòêðûòèå øòîð). continue; } else { // Åñëè âíóòðåííèé êîíöåâèê (4) = 1. int process_comand_4 = process_command(STOP_COIL_4); // Îñòàíîâêà ðàáîòû 2 ïðèâîäà continue; } } else { // Åñëè ó íàñ äåíü, òî... if (read_inter_lock_swith_1 == 0x00) { // Åñëè âíåøíèé êîíöåâèê (1) = 0. int process_command_5 = process_command(OPEN_SHUTTERS_COIL_1); // Çàïóñê 3 ïðèâîäà (çàêðûòèå øòîð). continue; } else { // Åñëè âíåøíèé êîíöåâèê(1) = 1. int process_command_7 = process_command(STOP_COIL_1); // Îñòàíîâêà ðàáîòû 3 ïðèâîäà. continue; } if (read_inter_lock_swith_2 == 0x00) { //Åñëè âíåøíèé êîíöåâèê (2) = 0. int process_command_6 = process_command(OPEN_SHUTTERS_COIL_2); // Çàïóñê 4 ïðèâîäà (çàêðûòèå øòîð). continue; } else { // Åñëè âíåøíèé êîíöåâèê(2) = 1. int process_command_8 = process_command(STOP_COIL_2); // Îñòàíîâêà ðàáîòû 4 ïðèâîäà. continue; } } } return 0; }