[Ашық дереккөз]Интеллектуалды оқу бөлмесі

——DWIN әзірлеушілер форумынан

Бұл шығарылымда біз сізге DWIN әзірлеушілер форумының жүлделі ашық бастапқы коды - ақылды өсіру бөлмесімен таныстырамыз.Инженерлер T5L смарт экранын Modbus протоколы арқылы қыздыру және желдеткіш температурасын басқару функцияларын басқару үшін енгізді.Жарықтандыру функциясын модельдеу үшін қуат көзін де реттеуге болады.Жүйе экранда орнатылған параметрлерге сәйкес автоматты түрде жұмыс істей алады және ақаулар тарихы жазбаларын сақтай алады.

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 құрылымы{

таңба күні[17];

u8 кему;

}ALERT;

#ALERT_TABLE_LEN 20 анықтаңыз

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

static 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_LEN];

u16 alert_num = 0;

бит is_main_win = 0;

void main_win_update()

{

}

void main_win_disp_date()

{

u8 len;

len = sprintf(common_buf, "%u:%u", (u16)дата_валы[3], (u16)дата_валы[4]);

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

sys_write_vp(MAIN_WIN_DATE_VP, ортақ_буф, len/2+2);

}

void main_win_process_alert()

{

u8 i;

үшін(i=0;i

{

егер(GET_ALERT_BIT(eski_alert_val, i))

жалғастыру;

егер(GET_ALERT_BIT(alert_val, i))

{

егер(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",

дата_мәні[0], дата_мән[1], дата_мәні[2], күн_мәні[3], күн_мәні[4]

);

ескерту_нөмірі++;

}

}

memcpy(ескі_ескерту_вал, ескерту_вал, өлшемі(ескерту_вал));

}

void main_win_disp_alert()

{

u16 i;

u16 вал;

u16 len = 0;

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

үшін(i=0;i

{

val = 0;

Егер мен

{

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

}

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

sys_write_vp(ALERT_WIN_DATE_VP, ортақ_буф, 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);

үшін(i=0;i

{

егер(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);

}

void main_win_click_handler(u16 btn_val)

{

u8 индексі;

егер(btn_val==0x0B)

{

main_win_disp_alert();

қайтару;

}

индекс = btn_val-1;

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

if((индекс==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);

егер(индекс==9)

is_main_win = 0;

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

{

while(sys_get_touch_sta());

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

}

}

void main_win_msg_handler(u8 *msg,u16 msg_len)

{

u8 f_code = хабар[MODBUS_RESPOND_POS_FUNC_CODE];

u8 data_len = хабар[MODBUS_RESPOND_POS_DATA_LEN];

u8 i;

u8 офсет;

msg_len = msg_len;

егер(!is_main_win)

қайтару;

егер((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(msg[offset], msg[offset+1]);

ығысу += 2;

}

main_win_update();

}else if((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();

}else if((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(msg[offset], msg[offset+1]);

ығысу += 2;

modbus_write_word(5+i, temp_hum_val);

}

main_win_update();

}else if((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(msg[offset], msg[offset+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;//Қайтару

}

void main_win_handler()

{

статикалық u8 жалауы = 0;

егер(негізгі_жеңіс)

{

егер(alert_read_period==ALERT_READ_PERIOD)

{

alert_read_period = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

қайтару;

}

егер(date_update_period==DATE_UPDATE_PERIOD)

{

date_update_period = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

қайтару;

}

жалау = !жалау;

егер(жалау)

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 анықтау

#included UART_INCLUDE

статикалық бит is_modbus_recv_complete = 0;

статикалық u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;//Қабылданған байттардың жалпы ұзындығы

статикалық u8 modbus_recv_timeout = 0;//Толып кету уақытын қабылдау

статикалық тұрақсыз u16 modbus_send_interval = 0;

MODBUS_PACKET пакеті;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

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

{

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

}

void modbus_recv_byte(u8 байт)

{

егер(бұл_modbus_recv_толды)

қайтару;

егер(modbus_recv_len

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

}

void modbus_check_recv_timeout()

{

егер(modbus_recv_timeout)

{

modbus_recv_timeout--;

егер(modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *пакет)

{

u16 лен;

u16 crc;

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

while(modbus_send_interval);

егер(функция_коды==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET*)пакет)->байт_нөмірі = ((MODBUS_10_PACKET*)пакет)->сөз_саны*2;

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

}else if(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);

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

пакет[len-1] = (u8)crc;

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

modbus_send_interval = MODBUS_SEND_INTERVAL;

0 қайтару;//Сәттілік

}

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

void modbus_handler()

{

u16 crc;

егер(!is_modbus_recv_complete)

қайтару;

//Crc мәнін тексеріңіз

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

егер(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 adr, u16 len)

{

packet.slave_addr = SLAVE_ADDR;

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

packet.start_addr = адрес;//Мекенжай

packet.data_len = len;//Жазылған мән

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

қайтару лен;

}


Жіберу уақыты: 12 қаңтар 2024 ж