From 7fc2425782ad777b12578d513331daf80ef89d31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=97=D0=B0=D0=BF=D0=B5?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=D0=BE=D0=B2?= Date: Thu, 22 Jun 2023 08:31:16 +0000 Subject: [PATCH] Complete main --- main/new_main.c | 252 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 main/new_main.c diff --git a/main/new_main.c b/main/new_main.c new file mode 100644 index 0000000..d6f0e65 --- /dev/null +++ b/main/new_main.c @@ -0,0 +1,252 @@ +#include +#include +#include +#include +#include +#include +#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; +}