[විවෘත මූලාශ්‍රය]බුද්ධිමත් පුහුණු කාමරය

——DWIN Developer Forum වෙතින්

මෙම කලාපයේදී, අපි ඔබට 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))

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

typedef struct{

අක්ෂර දිනය[17];

u8 desc;

}දැනුම්දීම;

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

u8 alert_val[ALERT_BYTE_NUM] = {0};

u8 old_alert_val[ALERT_BYTE_NUM] = {0};

ඇඟවීම්_වගුව[ALERT_TABLE_LEN];

u16 alert_num = 0;

bit is_main_win = 0;

අවලංගු main_win_update()

{

}

අවලංගු main_win_disp_date()

{

u8 ලෙන්;

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

common_buf[len+1] = 0;

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

}

අවලංගු main_win_process_alert()

{

u8 i;

සඳහා (i=0;i

{

නම්(GET_ALERT_BIT(old_alert_val, i))

දිගටම;

නම්(GET_ALERT_BIT(alert_val, i))

{

if(alert_num>=ALERT_TABLE_LEN)

ඇලර්ට්_නම් = ALERT_TABLE_LEN-1;

alert_table[alert_num].desc = i+1;

sprintf(alert_table[alert_num].දිනය, "%u/%u/%u %u:%u",

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

);

අනතුරු ඇඟවීමේ_num++;

}

}

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

}

හිස් main_win_disp_alert()

{

u16 i;

u16 val;

u16 ලෙන් = 0;

common_buf[0] = 0;

සඳහා (i=0;i

{

val = 0;

නම් (i

{

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

}

common_buf[len+1] = 0;

sys_write_vp(ALERT_WIN_DATE_VP, common_buf, len/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

{

නම් (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 දර්ශකය;

නම්(btn_val==0x0B)

{

main_win_disp_alert();

ආපසු;

}

දර්ශකය = btn_val-1;

btn_sta[index] = !btn_sta[index];

if((index==3)||(index==7))

btn_sta[දර්ශකය] = 1;

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

වෙනත් නම්((දර්ශකය==3)||(දර්ශකය==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 ඕෆ්සෙට්;

msg_len = msg_len;

නම්(!ප්‍රධාන_ජය වේ)

ආපසු;

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

{

offset = MODBUS_RESPOND_POS_DATA;

සඳහා (i=0;i

{

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

ඕෆ්සෙට් += 2;

}

main_win_update();

}එසේ නම් ((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

offset = MODBUS_RESPOND_POS_DATA;

සඳහා (i=0;i

{

alert_val = පණිවිඩය[offset];

ඕෆ්සෙට් ++;

}

main_win_process_alert();

}එසේ නම් ((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))

{

offset = 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();

}එසේ නම් ((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

offset = 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;//ප්‍රතිවර්තනය කරන්න

}

හිස් main_win_handler()

{

ස්ථිතික u8 ධජය = 0;

නම් (ප්‍රධාන_ජය වේ)

{

if(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

#UART_INCLUDE ඇතුලත් කරන්න

ස්ථිතික බිටු is_modbus_recv_complete = 0;

ස්ථිතික u8 modbus_recv_buff[270];

ස්ථිතික u16 modbus_recv_len = 0;//බයිට් වල මුළු දිග පිළිගැනේ

static u8 modbus_recv_timeout = 0;// පිටාර ගැලීමේ කාලය පිළිගන්න

ස්ථිතික වාෂ්පශීලී u16 modbus_send_interval = 0;

MODBUS_PACKET පැකට්ටුව;

හිස් modbus_init()

{

UART_INIT(UART_BAUD);

}

හිස් modbus_send_bytes(u8 *bytes,u16 len)

{

UART_SEND_BYTES(බයිට්, ලෙන්);

}

හිස් modbus_recv_byte(u8 byte)

{

නම්(is_modbus_recv_complete)

ආපසු;

නම්(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = බයිට්;

}

අවලංගු modbus_check_recv_timeout()

{

නම්(modbus_recv_timeout)

{

modbus_recv_timeout--;

නම්(modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *packet)

{

u16 ලෙන්;

u16 crc;

u8 func_code = පැකට්ටුව[1];

while(modbus_send_interval);

නම්(func_code==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET*)packet)->byte_num = ((MODBUS_10_PACKET*)පැකට්ටුව)->word_num*2;

len = 9+((MODBUS_10_PACKET*) පැකට්ටුව)-> byte_num;

}එසේ නම් (func_code==MODBUS_FUNC_CODE_0F)

{

len = ((MODBUS_0F_PACKET*) පැකට්ටුව)->bit_num;

((MODBUS_0F_PACKET*) පැකට්ටුව)->byte_num = len/8+(len%8?1:0);

len = 9+((MODBUS_0F_PACKET*) පැකට්ටුව)-> byte_num;

}වෙනත්

{

ලෙන් = sizeof(MODBUS_PACKET);

}

crc = crc16 (පැකට්ටුව, len-2);

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

හිස් 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];

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;//Function code

packet.start_addr = addr;//ලිපිනය

packet.data_len = len;//අගය ලියා ඇත

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

ආපසු ලෙන්;

}


පසු කාලය: ජනවාරි-12-2024