[Ачык чыганак] Интеллектуаль укыту бүлмәсе

—— DWIN ясаучылар форумыннан

Бу санда без сезгә DWIN уйлап табучылар форумының премияле ачык чыганагы - акыллы эшкәртү бүлмәсе белән таныштырабыз.Инженерлар Modbus протоколы аша җылыту һәм җылылык температурасын контрольдә тоту өчен T5L акыллы экранны тормышка ашырдылар.Электр белән тәэмин итү шулай ук ​​яктырту функциясен симуляцияләү өчен көйләнергә мөмкин.Система экранда куелган параметрлар буенча автоматик рәвештә эшли ала һәм хаталар тарихы язмаларын саклый ала.

1.UI материал күрсәтү

asvdfb (2)
asvdfb (1)

2.UI дизайны

asvdfb (3)

1.C51 Дизайн

Төп интерфейстагы температура, дым, биеклек кебек мәгълүмат алу һәм яңарту, һәм температура белән идарә итү модулларын, двигательләрне, сигнализацияне ачыклау һәм башка кол машиналарын контрольдә тоту өчен modbus rtu куллану өчен төп кодлар түбәндәгечә.

Төп интерфейс коды сылтамасы:

# main_win.h кертегез

# modbus.h кертегез.

# sys_params.h кертегез.

# "func_handler.h" кертегез.

# "uart2.h" кертегез.

# кертү

# кертү

# TEMP_HUM_SLAVE_ADDR 2 билгеләгез

# TEMP_HUM_VAL_MAX_NUM 2 билгеләгез

# ALERT_BIT_MAX_NUM 30 билгеләгез

# ALERT_BYTE_NUM билгеләгез (ALERT_BIT_MAX_NUM / 8 + ((ALERT_BIT_MAX_NUM% 8)! = 0))

# GET_ALERT_BIT (val, pos) билгеләгез ((val [pos / 8] >> (pos% 8)) & 0x01)

typedef struktur {

схема датасы [17];

u8 төшү;

} ALERT;

# ALERT_TABLE_LEN 20 билгеләгез

статик u8 btn_sta [MAIN_WIN_BTN_MAX_NUM] = {0};

статик u8 btn_addr [MAIN_WIN_BTN_MAX_NUM] = {50, 51, 52, 69, 53, 54, 55, 70, 56, 57, 58, 59};

u16 main_win_val [MAIN_WIN_VAL_MAX_NUM];

u16 temp_hum_val [TEMP_HUM_VAL_MAX_NUM] = {0};

u16 дата_вал [MAIN_WIN_DATE_MAX_NUM] = {0};

u8 alert_val [ALERT_BYTE_NUM] = {0};

u8 old_alert_val [ALERT_BYTE_NUM] = {0};

ALERT alert_table [ALERT_TABLE_LEN];

u16 alert_num = 0;

бит is_main_win = 0;

буш main_win_update ()

{

}

буш main_win_disp_date ()

{

u8 лен;

len = sprintf (уртак_буф, "% u:% u", (u16) дата_вал [3], (u16) дата_вал [4]);

уртак_буф [лен + 1] = 0;

sys_write_vp (MAIN_WIN_DATE_VP, уртак_буф, лен / 2 + 2);

}

буш main_win_process_alert ()

{

u8 i;

өчен (i = 0; i

{

if (GET_ALERT_BIT (old_alert_val, i))

дәвам итү;

if (GET_ALERT_BIT (alert_val, i))

{

if (alert_num> = ALERT_TABLE_LEN)

alert_num = ALERT_TABLE_LEN-1;

alert_table [alert_num] .desc = i + 1;

sprintf (alert_table [alert_num]. дата, "% u /% u /% u% u:% u",

дата_вал [0], дата_вал [1], дата_вал [2], дата_вал [3], дата_вал [4]

);

alert_num ++;

}

}

memcpy (old_alert_val, alert_val, sizeof (alert_val));

}

буш main_win_disp_alert ()

{

u16 i;

u16 val;

u16 len = 0;

уртак_буф [0] = 0;

өчен (i = 0; i

{

val = 0;

Әгәр мин

{

val = alert_table.desc;

len + = sprintf (уртак_буф + лен, "% s \ r \ n", alert_table.date);

}

sys_write_vp (ALERT_WIN_DESC_START_VP + i, (u8 *) & val, 1);

}

уртак_буф [лен + 1] = 0;

sys_write_vp (ALERT_WIN_DATE_VP, уртак_буф, лен / 2 + 2);

}

буш main_win_init ()

{

float fixed_val;

u8 i;

is_main_win = 1;

 

main_win_val [5] = (u16) (temp_hum_val [0] /10.0+0.5f);

main_win_val [6] = (u16) (temp_hum_val [1] /10.0+0.5f);

өчен (i = 0; i

{

if (i == 0)

дәвам итү;

sys_write_vp (MAIN_WIN_WIND_SPEED_VP + MAIN_WIN_VAL_OFFSET * i, (u8 *) & main_win_val, 1);

}

fixed_val = main_win_val [0] / WIND_SPEED_SCALE + FLOAT_FIX_VAL;

sys_write_vp (MAIN_WIN_WIND_SPEED_VP, (u8 *) & fixed_val, 2);

}

буш main_win_click_handler (u16 btn_val)

{

u8 индексы;

if (btn_val == 0x0B)

{

main_win_disp_alert ();

кайту;

}

индекс = btn_val-1;

btn_sta [индекс] =! btn_sta [индекс];

if ((index == 3) || (индекс == 7))

btn_sta [индекс] = 1;

modbus_write_bit (btn_addr [индекс], btn_sta [индекс]? 0xFF00: 0x0000);

btn_val = btn_sta [индекс];

sys_write_vp (MAIN_WIN_BTN_STA_START_VP + MAIN_WIN_BTN_STA_OFFSET * индексы, (u8 *) & btn_val, 1);

if (index == 9)

is_main_win = 0;

бүтән очракта ((индекс == 3) || (индекс == 7))

{

шул вакытта (sys_get_touch_sta ());

modbus_write_bit (btn_addr [индекс], 0x0000);

}

}

буш main_win_msg_handler (u8 * msg, u16 msg_len)

{

u8 f_code = msg [MODBUS_RESPOND_POS_FUNC_CODE];

u8 data_len = msg [MODBUS_RESPOND_POS_DATA_LEN];

u8 i;

u8 офсет;

msg_len = msg_len;

if (! is_main_win)

кайту;

if ((f_code == MODBUS_FUNC_CODE_03) && (data_len == MAIN_WIN_VAL_MAX_NUM * 2))

{

офсет = MODBUS_RESPOND_POS_DATA;

өчен (i = 0; i

{

main_win_val = SYS_GET_U16 (мн [офсет], мн [офсет + 1]);

офсет + = 2;

}

main_win_update ();

} бүтән очракта ((f_code == MODBUS_FUNC_CODE_01) && (data_len == ALERT_BYTE_NUM))

{

офсет = MODBUS_RESPOND_POS_DATA;

өчен (i = 0; i

{

alert_val = msg [офсет];

офсет ++;

}

main_win_process_alert ();

} бүтән очракта ((f_code == MODBUS_FUNC_CODE_03) && (data_len == TEMP_HUM_VAL_MAX_NUM * 2))

{

офсет = MODBUS_RESPOND_POS_DATA;

өчен (i = 0; i

{

temp_hum_val = SYS_GET_U16 (мн [офсет], мн [офсет + 1]);

офсет + = 2;

modbus_write_word (5 + i, temp_hum_val);

}

main_win_update ();

} бүтән очракта ((f_code == MODBUS_FUNC_CODE_03) && (data_len == MAIN_WIN_DATE_MAX_NUM * 2))

{

офсет = MODBUS_RESPOND_POS_DATA;

өчен (i = 0; i

{

date_val = SYS_GET_U16 (мн [офсет], мн [офсет + 1]);

офсет + = 2;

}

main_win_disp_date ();

}

}

буш main_win_read_temp_hum ()

{

u8 old_slave_addr = SLAVE_ADDR;

        

sys_params.user_config [5] = TEMP_HUM_SLAVE_ADDR;

modbus_read_words (0, TEMP_HUM_VAL_MAX_NUM);

sys_params.user_config [5] = old_slave_addr; // Кире

}

буш main_win_handler ()

{

статик u8 флагы = 0;

if (is_main_win)

{

if (alert_read_period == ALERT_READ_PERIOD)

{

alert_read_period = 0;

modbus_read_bits (510, ALERT_BIT_MAX_NUM);

кайту;

}

if (date_update_period == DATE_UPDATE_PERIOD)

{

date_update_period = 0;

modbus_read_words (180, MAIN_WIN_DATE_MAX_NUM);

кайту;

}

флаг =! флаг;

if (флаг)

modbus_read_words (0, MAIN_WIN_VAL_MAX_NUM);

бүтән

main_win_read_temp_hum ();

}

}

modbus rtu код сылтамасы:

# modbus.h кертегез.

# "crc16.h" кертегез.

# sys_params.h кертегез.

# UART_INCLUDE "uart2.h" билгеләгез.

# UART_INIT uart2_init билгеләгез

# UART_SEND_BYTES uart2_send_bytes билгеләгез

# UART_BAUD 9600 билгеләгез

# MODBUS_RECV_TIMEOUT (u8) билгеләгез (35000.0f / UART_BAUD + 2)

# MODBUS_SEND_INTERVAL 150 билгеләгез

# UART_INCLUDE кертегез

статик бит is_modbus_recv_complete = 0;

статик u8 modbus_recv_buff [270];

статик u16 modbus_recv_len = 0; // Кабул ителгән байтларның гомуми озынлыгы

статик u8 modbus_recv_timeout = 0; // Ташу вакытын кабул итегез

статик үзгәрүчән u16 modbus_send_interval = 0;

MODBUS_PACKET пакеты;

буш modbus_init ()

{

UART_INIT (UART_BAUD);

}

буш modbus_send_bytes (u8 * байт, u16 лен)

{

UART_SEND_BYTES (байт, лен);

}

буш modbus_recv_byte (u8 байт)

{

if (is_modbus_recv_complete)

кайту;

if (modbus_recv_len

modbus_recv_buff [modbus_recv_len ++] = байт;

}

буш modbus_check_recv_timeout ()

{

if (modbus_recv_timeout)

{

modbus_recv_timeout--;

if (modbus_recv_timeout == 0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet (u8 * пакет)

{

u16 len;

u16 крк;

u8 func_code = пакет [1];

шул вакытта (modbus_send_interval);

if (func_code == MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET *) пакет) -> байт_нум = ((MODBUS_10_PACKET *) пакет) -> сүз_нум * 2;

len = 9 + ((MODBUS_10_PACKET *) пакет) -> байт_нум;

} бүтән очракта (func_code == MODBUS_FUNC_CODE_0F)

{

len = ((MODBUS_0F_PACKET *) пакет) -> бит_нум;

((MODBUS_0F_PACKET *) пакет) -> байт_нум = лен / 8 + (лен% 8? 1: 0);

len = 9 + ((MODBUS_0F_PACKET *) пакет) -> байт_нум;

} бүтән

{

len = sizeof (MODBUS_PACKET);

}

crc = crc16 (пакет, лен-2);

пакет [лен-2] = (u8) (crc >> 8);

пакет [лен-1] = (u8) крк;

modbus_send_bytes (пакет, лен);

modbus_send_interval = MODBUS_SEND_INTERVAL;

кире 0; // Уңыш

}

тышкы буш modbus_msg_handler (u8 * msg, u16 msg_len);

буш modbus_handler ()

{

u16 крк;

if (! is_modbus_recv_complete)

кайту;

// crc кыйммәтен тикшерегез

crc = ((u16) modbus_recv_buff [modbus_recv_len-2] << 8) + modbus_recv_buff [modbus_recv_len-1];

if (crc16 (modbus_recv_buff, modbus_recv_len-2) == crc)

{

modbus_msg_handler (modbus_recv_buff, modbus_recv_len);

}

modbus_recv_len = 0;

is_modbus_recv_complete = 0;

}

u8 modbus_send_fcode (u8 fcode, u16 addr, u16 len)

{

packet.slave_addr = SLAVE_ADDR;

packet.func_code = fcode; // Функция коды

packet.start_addr = addr; // Адрес

packet.data_len = len; // Язылган кыйммәт

len = modbus_send_packet ((u8 *) & пакет);

кире лен;

}


Пост вакыты: 12-2024 гыйнвар