Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
7fc2425782 |
252
main/new_main.c
Normal file
252
main/new_main.c
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
#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;
|
||||||
|
}
|
153
modbus/modbus.c
153
modbus/modbus.c
@ -1,153 +0,0 @@
|
|||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
unsigned int CRC16_Modbus(unsigned char* buf, int len)
|
|
||||||
{
|
|
||||||
unsigned int crc = 0xFFFF;
|
|
||||||
for (int pos = 0; pos < len; pos++)
|
|
||||||
{
|
|
||||||
crc ^= (unsigned int)buf[pos]; // XOR-байт в наименьший sig. байт crc
|
|
||||||
for (int i = 8; i != 0; i--) // Повторите цикл над каждым битом
|
|
||||||
{
|
|
||||||
if ((crc & 0x0001) != 0) // Если установлен LSB
|
|
||||||
{
|
|
||||||
crc >>= 1; // Сдвиг вправо и XOR 0xA001
|
|
||||||
crc ^= 0xA001;
|
|
||||||
}
|
|
||||||
else // В противном случае LSB не установлен
|
|
||||||
{
|
|
||||||
crc >>= 1; // Сдвиг вправо
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
crc = ((crc & 0x00ff) << 8) | ((crc & 0xff00) >> 8); // преобразование младших байтов
|
|
||||||
return crc;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t read_input_status(uint8_t address, uint16_t discret_input, uint16_t quantity_reg, uint8_t* buf, size_t buf_len)
|
|
||||||
{
|
|
||||||
int i=0;
|
|
||||||
buf[i] = address;
|
|
||||||
i++;
|
|
||||||
buf[i] = 0x02;
|
|
||||||
i++;
|
|
||||||
buf[i] = (discret_input >>8)&0xFF;
|
|
||||||
i++;
|
|
||||||
buf[i] = discret_input&0xFF;
|
|
||||||
i++;
|
|
||||||
buf[i] = (quantity_reg >> 8) & 0xFF;
|
|
||||||
i++;
|
|
||||||
buf[i] = quantity_reg & 0xFF;
|
|
||||||
i++;
|
|
||||||
uint16_t crc = CRC16_Modbus(buf, i);
|
|
||||||
buf[i] = crc & 0xFF;
|
|
||||||
i++;
|
|
||||||
buf[i] = (crc >> 8) & 0xFF;
|
|
||||||
i++;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
int read_input_status_parse(uint8_t* buf, size_t buf_len, uint8_t* meaning)
|
|
||||||
{
|
|
||||||
if (buf_len < 8) {
|
|
||||||
// Недостаточная длина ответа
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// Проверка контрольной суммы
|
|
||||||
uint16_t crc = CRC16_Modbus(buf, buf_len - 2);
|
|
||||||
uint16_t received_crc = buf[buf_len - 2] + (buf[buf_len - 1] << 8);
|
|
||||||
|
|
||||||
if (crc != received_crc) {
|
|
||||||
// Контрольная сумма не совпадает
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
*meaning = buf[buf_len - 5];
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t read_input_register(uint8_t address, uint16_t input_reg, uint8_t* buf, size_t buf_len)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
buf[i] = address;
|
|
||||||
i++;
|
|
||||||
buf[i] = 0x04;
|
|
||||||
i++;
|
|
||||||
buf[i] = (input_reg >> 8) & 0xFF;
|
|
||||||
i++;
|
|
||||||
buf[i] = input_reg & 0xFF;
|
|
||||||
i++;
|
|
||||||
buf[i] = 0x00;
|
|
||||||
i++;
|
|
||||||
buf[i] = 0x01;
|
|
||||||
i++;
|
|
||||||
uint16_t crc = CRC16_Modbus(buf, i);
|
|
||||||
buf[i] = crc & 0xFF;
|
|
||||||
i++;
|
|
||||||
buf[i] = (crc >> 8) & 0xFF;
|
|
||||||
i++;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
int read_input_register_parse(uint8_t* buf, size_t buf_len , uint16_t* meaning)
|
|
||||||
{
|
|
||||||
if (buf_len < 5) {
|
|
||||||
// Недостаточная длина ответа
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Проверка контрольной суммы
|
|
||||||
uint16_t crc = CRC16_Modbus(buf, buf_len - 2);
|
|
||||||
uint16_t received_crc = buf[buf_len - 2] + (buf[buf_len - 1] << 8);
|
|
||||||
|
|
||||||
if (crc != received_crc) {
|
|
||||||
// Контрольная сумма не совпадает
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
*meaning = buf[buf_len - 3] + (buf[buf_len - 4] << 8);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t forse_single_coil(uint8_t address, uint16_t address_input, int on, uint8_t* buf, size_t buf_len)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
buf[i] = address;
|
|
||||||
i++;
|
|
||||||
buf[i] = 0x05;
|
|
||||||
i++;
|
|
||||||
buf[i] = (address_input >> 8)&0xFF;
|
|
||||||
i++;
|
|
||||||
buf[i] = address_input & 0xFF;
|
|
||||||
i++;
|
|
||||||
buf[i] = on ? 0xFF : 0x00;
|
|
||||||
i++;
|
|
||||||
buf[i] = 0x00;
|
|
||||||
i++;
|
|
||||||
uint16_t crc = CRC16_Modbus(buf, i);
|
|
||||||
buf[i] = crc & 0xFF;
|
|
||||||
i++;
|
|
||||||
buf[i] = (crc >> 8) & 0xFF;
|
|
||||||
i++;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
int forse_single_coil_parse(uint8_t* buf, size_t buf_len)
|
|
||||||
{
|
|
||||||
if (buf_len < 8) {
|
|
||||||
// Недостаточная длина ответа
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Проверка контрольной суммы
|
|
||||||
uint16_t crc = CRC16_Modbus(buf, buf_len - 2);
|
|
||||||
uint16_t received_crc = buf[buf_len - 2] + (buf[buf_len - 1] << 8);
|
|
||||||
|
|
||||||
if (crc != received_crc) {
|
|
||||||
// Контрольная сумма не совпадает
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
#ifndef MODBUS_H
|
|
||||||
#define MODBUS_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
unsigned int CRC16_Modbus(unsigned char* buf, int len);
|
|
||||||
size_t read_input_status(uint8_t address, uint16_t discret_input, uint16_t quantity_reg,uint8_t* buf, size_t buf_len);
|
|
||||||
int read_input_status_parse(uint8_t* buf, size_t buf_len, uint8_t* meaning);
|
|
||||||
size_t read_input_register(uint8_t address, uint16_t input_reg, uint8_t* buf, size_t buf_len);
|
|
||||||
int read_input_register_parse(uint8_t* buf, size_t buf_len, uint16_t* meaning);
|
|
||||||
size_t forse_single_coil(uint8_t address, uint16_t address_input, int on, uint8_t* buf, size_t buf_len);
|
|
||||||
int forse_single_coil_parse(uint8_t* buf, size_t buf_len);
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in New Issue
Block a user