[Açıq Mənbə] İntellektual Təlim Otağı

——DWIN Developer Forumundan

Bu buraxılışda biz sizə DWIN Developer Forumunun mükafat qazanmış açıq mənbə işini - ağıllı becərmə otağını təqdim edirik.Mühəndislər Modbus protokolu vasitəsilə isitmə və fan temperaturuna nəzarət funksiyalarını idarə etmək üçün T5L smart ekranını tətbiq etdilər.İşıqlandırma funksiyasını simulyasiya etmək üçün enerji təchizatı da tənzimlənə bilər.Sistem avtomatik olaraq ekranda qoyulan parametrlərə uyğun işləyə və nasazlıq tarixçəsi qeydlərini saxlaya bilər.

1.UI Material Ekranı

asvdfb (2)
asvdfb (1)

2.UI Dizaynı

asvdfb (3)

1.C51 Dizayn

Əsas interfeysdə temperatur, rütubət və hündürlük kimi məlumatların əldə edilməsi və yenilənməsi və temperatur nəzarət modulları, mühərriklər, siqnalizasiya aşkarlanması və digər köməkçi maşınları idarə etmək üçün modbus rtu-dan istifadə üçün əsas kodlar aşağıdakılardır.

Əsas interfeys kodu istinadı:

# "main_win.h" daxil edin

# "modbus.h" daxil edin

# "sys_params.h" daxil edin

# "func_handler.h" daxil edin

# "uart2.h" daxil edin

#daxildir

#daxildir

#TEMP_HUM_SLAVE_ADDR 2-ni təyin edin

#TEMP_HUM_VAL_MAX_NUM 2 müəyyən edin

#XƏBƏRDARLIQ_BIT_MAX_NUM 30-u təyin edin

#ALERT_BYTE_NUM (ALERT_BIT_MAX_NUM/8+((ALERT_BIT_MAX_NUM%8)!=0)) müəyyən et

#GET_ALERT_BIT(val, pos) təyin edin ((val[pos/8]>>(pos%8))&0x01)

typedef strukturu{

işarə tarixi[17];

u8 azalma;

}ALERT;

#ALERT_TABLE_LEN 20-ni təyin edin

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 tarix_dəyəri[MAIN_WIN_DATE_MAX_NUM] = {0};

u8 alert_val[ALERT_BYTE_NUM] = {0};

u8 old_alert_val[ALERT_BYTE_NUM] = {0};

ALERT xəbərdarlıq_cədvəli[ALERT_TABLE_LEN];

u16 alert_num = 0;

bit is_main_win = 0;

əsas_win_update() ləğv edin

{

}

əsas_win_disp_date() ləğv edin

{

u8 len;

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

ümumi_buf[len+1] = 0;

sys_write_vp(MAIN_WIN_DATE_VP, ümumi_buf, len/2+2);

}

void main_win_process_alert()

{

u8 i;

üçün(i=0;i

{

əgər(GET_ALERT_BIT(old_alert_val, i))

davam etdirmək;

əgər(GET_ALERT_BIT(alert_val, i))

{

əgər(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",

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

);

alert_num++;

}

}

memcpy(köhnə_xəbərdarlıq_dəyəri, xəbərdarlıq_dəyəri, ölçüsü(alert_val));

}

void main_win_disp_alert()

{

u16 i;

u16 val;

u16 len = 0;

ümumi_buf[0] = 0;

üçün(i=0;i

{

val = 0;

Əgər mən

{

val = alert_table.desc;

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

}

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

}

ümumi_buf[len+1] = 0;

sys_write_vp(ALERT_WIN_DATE_VP, ümumi_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);

üçün(i=0;i

{

əgər(i==0)

davam etdirmək;

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

}

əsas_win_click_handler (u16 btn_val) ləğv edin

{

u8 indeksi;

əgər(btn_val==0x0B)

{

main_win_disp_alert();

qayıtmaq;

}

indeks = btn_val-1;

btn_sta[indeks] = !btn_sta[indeks];

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

btn_sta[indeks] = 1;

modbus_write_bit(btn_addr[index], btn_sta[index]?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);

əgər(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 = msg[MODBUS_RESPOND_POS_FUNC_CODE];

u8 data_len = msg[MODBUS_RESPOND_POS_DATA_LEN];

u8 i;

u8 ofset;

msg_len = msg_len;

if(!is_main_win)

qayıtmaq;

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

{

ofset = MODBUS_RESPOND_POS_DATA;

üçün(i=0;i

{

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

ofset += 2;

}

main_win_update();

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

{

ofset = MODBUS_RESPOND_POS_DATA;

üçün(i=0;i

{

alert_val = msg[ofset];

ofset++;

}

main_win_process_alert();

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

{

ofset = MODBUS_RESPOND_POS_DATA;

üçün(i=0;i

{

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

ofset += 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))

{

ofset = MODBUS_RESPOND_POS_DATA;

üçün(i=0;i

{

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

ofset += 2;

}

main_win_disp_date();

}

}

main_win_read_temp_hum() ləğv edin

{

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

}

void main_win_handler()

{

statik u8 bayrağı = 0;

əgər (əsas_qalibdir)

{

əgər(alert_read_period==ALERT_READ_PERIOD)

{

alert_read_period = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

qayıtmaq;

}

əgər (tarix_yenilənmə_dövrü==DATE_UPDATE_PERIOD)

{

date_update_period = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

qayıtmaq;

}

bayraq = !bayraq;

əgər(bayraq)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

başqa

main_win_read_temp_hum();

}

}

modbus rtu kodu istinadı:

# "modbus.h" daxil edin

# "crc16.h" daxil edin

# "sys_params.h" daxil edin

#define UART_INCLUDE "uart2.h"

#UART_INIT uart2_init təyin edin

#UART_SEND_BYTES uart2_send_bayt təyin edin

#UART_BAUD 9600 müəyyən edin

#müəyyən edin MODBUS_RECV_TIMEOUT (u8)(35000.0f/UART_BAUD+2)

# MODBUS_SEND_INTERVAL 150-ni təyin edin

#include UART_INCLUDE

statik bit is_modbus_recv_complete = 0;

statik u8 modbus_recv_buff[270];

statik u16 modbus_recv_len = 0;//Qəbul edilən baytların ümumi uzunluğu

statik u8 modbus_recv_timeout = 0;//Daşma vaxtını qəbul edin

statik uçucu u16 modbus_send_interval = 0;

MODBUS_PACKET paketi;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

etibarsız modbus_send_bytes(u8 *bayt,u16 len)

{

UART_SEND_BYTES(bayt,len);

}

etibarsız modbus_recv_bayt (u8 bayt)

{

əgər (modbus_recv_tamamlanmışdır)

qayıtmaq;

əgər(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = bayt;

}

void modbus_check_recv_timeout()

{

if(modbus_recv_timeout)

{

modbus_recv_timeout--;

əgər (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_göndərmə_interval);

əgər(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;

}başqa

{

len = ölçüsü(MODBUS_PACKET);

}

crc = crc16(paket,len-2);

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

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

modbus_göndərmə_baytları(paket,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

0 qaytarın;//Uğur

}

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

void modbus_handler()

{

u16 crc;

if(!is_modbus_recv_complete)

qayıtmaq;

//Crc dəyərini yoxlayın

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 adr, u16 len)

{

paket.slave_addr = SLAVE_ADDR;

paket.func_code = fcode;//Funksiya kodu

paket.start_addr = ünvan;//Ünvan

paket.data_len = len;//Dəyər yazılıb

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

geri qaytarmaq;

}


Göndərmə vaxtı: 12 yanvar 2024-cü il