[ክፍት ምንጭ] የማሰብ ችሎታ ያለው የሥልጠና ክፍል

——ከDWIN ገንቢ መድረክ

በዚህ እትም ውስጥ፣ ተሸላሚ የሆነውን የDWIN ገንቢ መድረክን - ብልጥ የእርሻ ክፍልን እናስተዋውቅዎታለን።በModbus ፕሮቶኮል በኩል የማሞቂያ እና የአየር ማራገቢያ የሙቀት መቆጣጠሪያ ተግባራትን ለመቆጣጠር መሐንዲሶች T5L ስማርት ስክሪንን ተግባራዊ አድርገዋል።የመብራት ተግባሩን ለመምሰል የኃይል አቅርቦቱ ማስተካከልም ይቻላል.ስርዓቱ በስክሪኑ ላይ በተቀመጡት መመዘኛዎች መሰረት በራስ-ሰር መስራት እና የስህተት ታሪክ መዝገቦችን ማስቀመጥ ይችላል።

1.UI ቁሳዊ ማሳያ

asvdfb (2)
asvdfb (1)

2.UI ንድፍ

asvdfb (3)

1.C51 ንድፍ

በዋናው በይነገጽ ላይ እንደ ሙቀት፣ እርጥበት እና ከፍታ ያሉ መረጃዎችን ለማግኘት እና ለማዘመን እንዲሁም modbus rtu በመጠቀም የሙቀት መቆጣጠሪያ ሞጁሎችን ፣ ሞተሮችን ፣ ማንቂያዎችን እና ሌሎች የባሪያ ማሽኖችን ለመቆጣጠር ዋናዎቹ ኮዶች እንደሚከተለው ናቸው ።

ዋና የበይነገጽ ኮድ ማጣቀሻ፡-

# "ዋና_ዊን.ሸ"ን ያካትቱ

"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) ((ቫል[pos/8]>>(pos%8))&0x01 ይግለጹ

የጽሕፈት መኪና መዋቅር{

ቻር ቀን[17];

u8 desc;

ማስጠንቀቂያ;

# ALERT_TABLE_LEN 20ን ይግለጹ

static 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_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;

ቢት_ዋና_ዊን = 0;

ባዶ ዋና_አሸናፊ_ዝማኔ()

{

}

ባዶ ዋና_አሸናፊ_ዲስፕ_ቀን()

{

u8 ሌንስ;

ሌን = sprintf (የጋራ_buf፣ "%u:%u"፣ (u16) date_val[3]፣ (u16) date_val[4]);

የጋራ_buf[len+1] = 0;

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

}

ባዶ ዋና_አሸናፊ_ሂደት_ማንቂያ()

{

u8 i;

ለ(i=0;i

{

ከሆነ(GET_ALERT_BIT(የድሮ_ማስጠንቀቂያ_ቫል፣ i))

ቀጥል;

ከሆነ(GET_ALERT_BIT(ማንቂያ_ቫል፣ i))

{

ከሆነ(ማስጠንቀቂያ_num>=ALERT_TABLE_LEN)

alert_num = ALERT_TABLE_LEN-1;

ማንቂያ_ሠንጠረዥ[alert_num].desc = i+1;

sprintf(የማስጠንቀቂያ_ሠንጠረዥ[alert_num].ቀን፣ "%u/%u/%u %u:%u",

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

);

ማንቂያ_ቁጥር++;

}

}

memcpy (የድሮ_ማስጠንቀቂያ_ቫል፣ ማንቂያ_ቫል፣ የመጠን (የማስጠንቀቂያ_ቫል));

}

ባዶ ዋና_አሸናፊ_ዲስፕ_ማንቂያ()

{

u16 እኔ;

u16 ቫል;

u16 ሌንስ = 0;

የተለመደ_buf [0] = 0;

ለ(i=0;i

{

ቫል = 0;

እኔ ብሆን

{

val = alert_table.desc;

len += sprintf(የጋራ_buf+len፣ "%s\r\n", alert_table.date);

}

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

}

የጋራ_buf[len+1] = 0;

sys_write_vp(ALERT_WIN_DATE_VP፣ common_buf፣ len/2+2);

}

ባዶ ዋና_ዊን_ኢኒት()

{

ተንሳፋፊ ቋሚ_val;

u8 i;

ዋናው_ድል = 1;

 

ዋና_ዊን_ቫል [5] = (u16) (temp_hum_val [0]/10.0+0.5f);

ዋና_ዊን_ቫል [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);

}

የተወሰነ_ቫል = ዋና_ዊን_ቫል[0]/WIND_SPEED_SCALE+FLOAT_FIX_VAL;

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

}

ባዶ ዋና_አሸናፊ_ክሊክ_አስተዳዳሪ(u16 btn_val)

{

u8 ኢንዴክስ;

ከሆነ(btn_val==0x0B)

{

ዋና_ዊን_ዲስፕ_ማስጠንቀቂያ();

መመለስ;

}

ኢንዴክስ = btn_val-1;

btn_sta[index] = !btn_sta[index];

ከሆነ (((ኢንዴክስ==3)||(ኢንዴክስ==7))

btn_sta [ኢንዴክስ] = 1;

modbus_write_bit (btn_addr [ኢንዴክስ]፣ btn_sta [ኢንዴክስ]? 0xFF00: 0x0000);

btn_val = btn_sta[index];

sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*ኢንዴክስ፣ (u8*)&btn_val፣ 1);

ከሆነ (ኢንዴክስ==9)

ዋናው_ድል = 0;

ሌላ ከሆነ ((ኢንዴክስ==3)||(ኢንዴክስ==7))

{

ሳለ (sys_get_touch_sta ());

modbus_write_bit (btn_addr [ኢንዴክስ]፣ 0x0000);

}

}

ባዶ ዋና_አሸናፊ_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;

ከሆነ(! ዋናው_ድል)

መመለስ;

ከሆነ((f_code==MODBUS_FUNC_CODE_03)&&(ዳታ_ሌን==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;

}

ዋና_አሸናፊ_ዝማኔ ();

}ሌላ ከሆነ((f_code==MODBUS_FUNC_CODE_01)&&(ዳታ_ሌን==ALERT_BYTE_NUM))

{

ማካካሻ = MODBUS_RESPOND_POS_DATA;

ለ(i=0;i

{

alert_val = msg[offset];

ማካካሻ ++;

}

ዋና_አሸናፊ_ሂደት_ማንቂያ();

}ሌላ ከሆነ((f_code==MODBUS_FUNC_CODE_03)&&(ዳታ_ሌን==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);

}

ዋና_አሸናፊ_ዝማኔ ();

}ሌላ ከሆነ((f_code==MODBUS_FUNC_CODE_03)&&(ዳታ_ሌን==MAIN_WIN_DATE_MAX_NUM*2))

{

ማካካሻ = MODBUS_RESPOND_POS_DATA;

ለ(i=0;i

{

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

ማካካሻ += 2;

}

ዋና_ዊን_ዲስፕ_ቀን();

}

}

ባዶ ዋና_አሸናፊ_አንብብ_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;// ተመለስ

}

ባዶ ዋና_አሸናፊ ()

{

የማይንቀሳቀስ u8 ባንዲራ = 0;

(ዋና_ድል) ከሆነ

{

ከሆነ(የማንቂያ_የማንበብ_ጊዜ==ALERT_READ_PERIOD)

{

ማንቂያ_ማንበብ_period = 0;

modbus_read_bits (510, ALERT_BIT_MAX_NUM);

መመለስ;

}

ከሆነ (የዘመኑ_ዘመን_ወቅት==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);

ሌላ

ዋና_ዊን_ንባብ_temp_hum ();

}

}

modbus rtu ኮድ ማጣቀሻ፡-

"modbus.h"ን ጨምሮ

"crc16.h"ን ጨምሮ

# "sys_params.h"ን ያካትቱ

UART_INCLUDE "uart2.h"ን ይግለጹ

# UART_INIT uart2_initን ይግለጹ

# UART_SEND_BYTES uart2_ባይት_ላክ

# 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 *ባይት፣u16 ሌንስ)

{

UART_SEND_BYTES(ባይት፣ሌን);

}

ባዶ modbus_recv_byte(u8 ባይት)

{

(modbus_recv_የተሟላ) ከሆነ

መመለስ;

ከሆነ(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = ባይት;

}

ባዶ modbus_check_recv_ጊዜ አልቋል()

{

ከሆነ(modbus_recv_ጊዜ ካለፈ)

{

modbus_recv_ጊዜ--;

ከሆነ(modbus_recv_ጊዜአለፈ==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *ጥቅል)

{

u16 ሌንስ;

u16 crc;

u8 func_code = ፓኬት [1];

ሳለ(modbus_send_interval);

ከሆነ(func_code==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET*)packet)->ባይት_ቁጥር = ((MODBUS_10_PACKET*)ጥቅል)->ቃል_ቁጥር*2;

ሌንስ = 9+((MODBUS_10_PACKET*)ፓኬት)->ባይት_ቁጥር;

}ሌላ ከሆነ(func_code==MODBUS_FUNC_CODE_0F)

{

ሌንስ = ((MODBUS_0F_PACKET*)ፓኬት)->ቢት_ቁጥር;

((MODBUS_0F_PACKET*) ፓኬት)->ባይት_ቁጥር = ሌንስ/8+(ሌን%8?1፡0)፤

ሌንስ = 9+((MODBUS_0F_PACKET*)ፓኬት)->ባይት_ቁጥር;

}ሌላ

{

ሌንስ = የመጠን (MODBUS_PACKET);

}

crc = crc16 (ፓኬት, ሌን-2);

ፓኬት[len-2] = (u8) (crc>> 8);

ፓኬት[len-1] = (u8) crc;

modbus_send_bytes(ፓኬት፣ሌን);

modbus_send_interval = MODBUS_SEND_INTERVAL;

መመለስ 0;// ስኬት

}

የውጭ ባዶ modbus_msg_handler(u8 *msg,u16 msg_len);

ባዶ modbus_handler ()

{

u16 crc;

ከሆነ(!modbus_recv_የተሟላ)

መመለስ;

// የ 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 addr፣ u16 len)

{

packet.slave_addr = SLAVE_ADDR;

packet.func_code = fcode;//የተግባር ኮድ

packet.start_addr = addr;//አድራሻ

packet.data_len = ሌንስ፤// ዋጋ ተጽፏል

ሌንስ = modbus_send_packet ((u8*) & ፓኬት);

መመለሻ ሌን;

}


የልጥፍ ጊዜ: ጥር-12-2024