[Ochiq manba]Intellektual o'quv xonasi

——DWIN dasturchilar forumidan

Ushbu sonda biz sizga DWIN Developer Forumining mukofotga sazovor bo'lgan ochiq manbali ishi - aqlli o'stirish xonasi bilan tanishtiramiz.Muhandislar Modbus protokoli orqali isitish va fan haroratini nazorat qilish funksiyalarini boshqarish uchun T5L smart-ekranini amalga oshirdilar.Yoritish funksiyasini simulyatsiya qilish uchun quvvat manbai ham sozlanishi mumkin.Tizim avtomatik ravishda ekranda o'rnatilgan parametrlarga muvofiq ishlashi va nosozliklar tarixi yozuvlarini saqlashi mumkin.

1.UI Material Displey

asvdfb (2)
asvdfb (1)

2.UI dizayni

asvdfb (3)

1.C51 Dizayn

Asosiy interfeysdagi harorat, namlik va balandlik kabi ma'lumotlarni olish va yangilash va haroratni boshqarish modullari, motorlar, signalni aniqlash va boshqa qul mashinalarini boshqarish uchun modbus rtu-dan foydalanishning asosiy kodlari quyidagilardan iborat.

Asosiy interfeys kodi havolasi:

#o'z ichiga "main_win.h"

# "modbus.h" ni o'z ichiga oladi

# "sys_params.h" ni o'z ichiga oladi

#o'z ichiga "func_handler.h"

#o'z ichiga "uart2.h"

#o'z ichiga oladi

#o'z ichiga oladi

#TEMP_HUM_SLAVE_ADDR 2 ni aniqlang

#TEMP_HUM_VAL_MAX_NUM 2 ni aniqlang

#ALERT_BIT_MAX_NUM 30 ni aniqlang

#aniqlash ALERT_BYTE_NUM (ALERT_BIT_MAX_NUM/8+((ALERT_BIT_MAX_NUM%8)!=0))

#aniqlang GET_ALERT_BIT(val, pos) ((val[pos/8]>>(pos%8))&0x01)

typedef tuzilishi{

belgi sanasi[17];

u8 pasaytirish;

}Ogohlantirish;

#ALERT_TABLE_LEN 20 ni aniqlang

statik u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

statik 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 sana_val[MAIN_WIN_DATE_MAX_NUM] = {0};

u8 alert_val[ALERT_BYTE_NUM] = {0};

u8 old_alert_val[ALERT_BYTE_NUM] = {0};

ALERT alert_jadval[ALERT_TABLE_LEN];

u16 alert_num = 0;

bit is_main_win = 0;

void main_win_update()

{

}

void main_win_disp_date()

{

u8 len;

len = sprintf (common_buf, "%u:%u", (u16)date_val[3], (u16)date_val[4]);

umumiy_buf[len+1] = 0;

sys_write_vp (MAIN_WIN_DATE_VP, umumiy_buf, len/2+2);

}

void main_win_process_alert()

{

u8 i;

uchun(i=0;i

{

agar(GET_ALERT_BIT(old_alert_val, i))

davom ettirish;

agar(GET_ALERT_BIT(alert_val, i))

{

agar(alert_num>=ALERT_TABLE_LEN)

alert_num = ALERT_TABLE_LEN-1;

alert_table[alert_num].desc = i+1;

sprintf(alert_table[alert_num].date, "%u/%u/%u %u:%u",

sana_val[0], sana_val[1], sana_val[2], sana_val [3], sana_val[4]

);

alert_num++;

}

}

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

}

void main_win_disp_alert()

{

u16 i;

u16 val;

u16 len = 0;

umumiy_buf[0] = 0;

uchun(i=0;i

{

val = 0;

agar (ya'ni

{

val = alert_table.desc;

len += sprintf(common_buf+len, "%s\r\n", alert_table.date);

}

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

}

umumiy_buf[len+1] = 0;

sys_write_vp (ALERT_WIN_DATE_VP, umumiy_buf, len/2+2);

}

void 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);

uchun(i=0;i

{

agar(i==0)

davom ettirish;

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*)&fikslangan_val, 2);

}

void main_win_click_handler(u16 btn_val)

{

u8 indeksi;

agar(btn_val==0x0B)

{

main_win_disp_alert();

qaytish;

}

indeks = btn_val-1;

btn_sta[indeks] = !btn_sta[indeks];

if((indeks==3)||(indeks==7))

btn_sta[indeks] = 1;

modbus_write_bit(btn_addr[indeks], btn_sta[indeks]?0xFF00:0x0000);

btn_val = btn_sta[indeks];

sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*indeks, (u8*)&btn_val, 1);

agar(indeks==9)

is_main_win = 0;

else if((indeks==3)||(indeks==7))

{

while(sys_get_touch_sta());

modbus_write_bit(btn_addr[index], 0x0000);

}

}

void main_win_msg_handler(u8 *msg,u16 msg_len)

{

u8 f_code = xabar[MODBUS_RESPOND_POS_FUNC_CODE];

u8 data_len = xabar[MODBUS_RESPOND_POS_DATA_LEN];

u8 i;

u8 ofset;

msg_len = msg_len;

if(!is_main_win)

qaytish;

agar((f_code==MODBUS_FUNC_CODE_03)&&(ma'lumotlar_len==MAIN_WIN_VAL_MAX_NUM*2))

{

ofset = MODBUS_RESPOND_POS_DATA;

uchun(i=0;i

{

main_win_val = SYS_GET_U16(msg[ofset], msg[offset+1]);

ofset += 2;

}

main_win_update();

}alse if((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

ofset = MODBUS_RESPOND_POS_DATA;

uchun(i=0;i

{

alert_val = msg[ofset];

ofset++;

}

main_win_process_alert();

}alse if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))

{

ofset = MODBUS_RESPOND_POS_DATA;

uchun(i=0;i

{

temp_hum_val = SYS_GET_U16(msg[ofset], msg[offset+1]);

ofset += 2;

modbus_write_word(5+i, temp_hum_val);

}

main_win_update();

}alse if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

ofset = MODBUS_RESPOND_POS_DATA;

uchun(i=0;i

{

date_val = SYS_GET_U16(msg[ofset], msg[offset+1]);

ofset += 2;

}

main_win_disp_date();

}

}

main_win_read_temp_hum() bekor qiladi

{

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;//Qaytish

}

void main_win_handler()

{

statik u8 bayrog'i = 0;

agar(main_win)

{

agar(alert_read_period==ALERT_READ_PERIOD)

{

alert_read_period = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

qaytish;

}

agar(date_update_period==DATE_UPDATE_PERIOD)

{

date_update_period = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

qaytish;

}

bayroq = !flag;

agar (bayroq)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

boshqa

main_win_read_temp_hum();

}

}

modbus RTU kodiga havola:

# "modbus.h" ni o'z ichiga oladi

# "crc16.h" ni o'z ichiga oladi

# "sys_params.h" ni o'z ichiga oladi

#define UART_INCLUDE "uart2.h"

#UART_INIT uart2_initni aniqlang

#UART_SEND_BYTES uart2_send_baytni aniqlang

#UART_BAUD 9600 ni aniqlang

#define MODBUS_RECV_TIMEOUT (u8)(35000.0f/UART_BAUD+2)

#MODBUS_SEND_INTERVAL 150 ni aniqlang

#include UART_INCLUDE

statik bit is_modbus_recv_complete = 0;

statik u8 modbus_recv_buff[270];

statik u16 modbus_recv_len = 0;//Qabul qilingan baytlarning umumiy uzunligi

statik u8 modbus_recv_timeout = 0;//Toshib ketish vaqtini qabul qiling

statik uchuvchi u16 modbus_send_interval = 0;

MODBUS_PACKET paketi;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

bekor modbus_send_bytes(u8 *bayt,u16 len)

{

UART_SEND_BYTES(bayt, len);

}

bekor modbus_recv_byte (u8 bayt)

{

agar (is_modbus_recv_complete)

qaytish;

agar (modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = bayt;

}

void modbus_check_recv_timeout()

{

agar (modbus_recv_timeout)

{

modbus_recv_timeout--;

agar (modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *paket)

{

u16 len;

u16 crc;

u8 func_code = paket[1];

while(modbus_send_interval);

agar(func_code==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET*)paket)->bayt_num = ((MODBUS_10_PACKET*)paket)->word_num*2;

len = 9+((MODBUS_10_PACKET*)paket)->bayt_num;

}else if(func_code==MODBUS_FUNC_CODE_0F)

{

len = ((MODBUS_0F_PACKET*)paket)->bit_num;

((MODBUS_0F_PACKET*)paket)->bayt_num = len/8+(len%8?1:0);

len = 9+((MODBUS_0F_PACKET*)paket)->bayt_num;

}boshqa

{

len = o'lcham (MODBUS_PACKET);

}

crc = crc16 (paket, len-2);

paket[len-2] = (u8)(crc>>8);

paket[len-1] = (u8)crc;

modbus_send_bytes (paket, len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

qaytish 0;//Muvaffaqiyat

}

extern void modbus_msg_handler(u8 *msg,u16 msg_len);

void modbus_handler()

{

u16 crc;

if(!is_modbus_recv_complete)

qaytish;

//Crc qiymatini tekshiring

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;//Funktsiya kodi

paket.start_addr = manzil;//Manzil

paket.data_len = len;//Qiymat yozilgan

len = modbus_send_packet((u8*)&paket);

qaytarish len;

}


Xabar vaqti: 2024 yil 12-yanvar