[ئوچۇق مەنبە] ئەقلىي ئىقتىدارلىق تەربىيىلەش ئۆيى

—— DWIN ئاچقۇچىلار مۇنبىرىدىن

بۇ ساندا بىز سىزگە DWIN ئاچقۇچىلار مۇنبىرى - ئەقلىي ئىقتىدارلىق تېرىقچىلىق ئۆيىنىڭ مۇكاپاتقا ئېرىشكەن ئوچۇق كودنى تونۇشتۇرىمىز.ئىنژېنېرلار Modbus كېلىشىمى ئارقىلىق T5L ئەقلىي ئىقتىدارلىق ئېكراننى قىزىتىش ۋە شامالدۇرغۇچنىڭ تېمپېراتۇرىسىنى كونترول قىلىش ئىقتىدارىنى كونترول قىلدى.توك بىلەن تەمىنلەشنى تەڭشەش ئارقىلىق يورۇتۇش ئىقتىدارىنى تەقلىد قىلغىلى بولىدۇ.بۇ سىستېما ئېكرانغا قويۇلغان پارامېتىرلار بويىچە ئاپتوماتىك ئىجرا بولىدۇ ۋە خاتالىق تارىخى خاتىرىسىنى ساقلىالايدۇ.

1.UI ماتېرىيال كۆرسىتىش

asvdfb (2)
asvdfb (1)

2.UI لايىھىلەش

asvdfb (3)

1.C51 لايىھىلەش

ئاساسىي كۆرۈنمە يۈزىدىكى تېمپېراتۇرا ، نەملىك ۋە ئېگىزلىك قاتارلىق سانلىق مەلۇماتلارغا ئېرىشىش ۋە يېڭىلاش ، ھەمدە مودېل rtu ئارقىلىق تېمپېراتۇرىنى كونترول قىلىش مودۇلى ، ماتور ، ئاگاھلاندۇرۇش ۋە باشقا قۇل ماشىنىلىرىنى كونترول قىلىشتىكى ئاساسلىق كودلار تۆۋەندىكىچە.

ئاساسلىق كۆرۈنمە يۈزى كود پايدىلىنىشى:

#include "main_win.h"

# modbus.h نى ئۆز ئىچىگە ئالىدۇ

# sys_params.h نى ئۆز ئىچىگە ئالىدۇ

# "func_handler.h" نى ئۆز ئىچىگە ئالىدۇ

# uart2.h نى ئۆز ئىچىگە ئالىدۇ

#include

#include

# ئېنىقلىما 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 {

char date [17];

u8 desc;

} ALERT;

# ئېنىقلىما 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 [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 ئاگاھلاندۇرۇش جەدۋىلى [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]);

common_buf [len + 1] = 0;

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

}

void main_win_process_alert ()

{

u8 i;

for (i = 0; i

{

if (GET_ALERT_BIT (old_alert_val, i))

داۋاملاشتۇرۇش;

if (GET_ALERT_BIT (alert_val, i))

{

if (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 (old_alert_val, alert_val, sizeof (alert_val));

}

void main_win_disp_alert ()

{

u16 i;

u16 val;

u16 len = 0;

common_buf [0] = 0;

for (i = 0; i

{

val = 0;

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

}

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

for (i = 0; i

{

if (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 كۆرسەتكۈچى

if (btn_val == 0x0B)

{

main_win_disp_alert ();

قايتىش

}

index = btn_val-1;

btn_sta [index] =! btn_sta [index];

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

btn_sta [index] = 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);

if (index == 9)

is_main_win = 0;

بولمىسا ((index == 3) || (index == 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 = msg [MODBUS_RESPOND_POS_FUNC_CODE];

u8 data_len = msg [MODBUS_RESPOND_POS_DATA_LEN];

u8 i;

u8 offset;

msg_len = msg_len;

if (! is_main_win)

قايتىش

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

{

offset = MODBUS_RESPOND_POS_DATA;

for (i = 0; i

{

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

offset + = 2;

}

main_win_update ();

} بولمىسا ئەگەر ((f_code == MODBUS_FUNC_CODE_01) && (data_len == ALERT_BYTE_NUM))

{

offset = MODBUS_RESPOND_POS_DATA;

for (i = 0; i

{

alert_val = msg [offset];

offset ++;

}

main_win_process_alert ();

} بولمىسا ئەگەر ((f_code == MODBUS_FUNC_CODE_03) && (data_len == TEMP_HUM_VAL_MAX_NUM * 2))

{

offset = MODBUS_RESPOND_POS_DATA;

for (i = 0; i

{

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

offset + = 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;

for (i = 0; i

{

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

offset + = 2;

}

main_win_disp_date ();

}

}

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

{

static u8 flag = 0;

if (is_main_win)

{

if (alert_read_period == ALERT_READ_PERIOD)

{

alert_read_period = 0;

modbus_read_bits (510, ALERT_BIT_MAX_NUM);

قايتىش

}

if (date_update_period == DATE_UPDATE_PERIOD)

{

date_update_period = 0;

modbus_read_words (180, MAIN_WIN_DATE_MAX_NUM);

قايتىش

}

flag =! flag;

if (flag)

modbus_read_words (0, MAIN_WIN_VAL_MAX_NUM);

else

main_win_read_temp_hum ();

}

}

modbus rtu كود پايدىلىنىش ماتېرىيالى:

# modbus.h نى ئۆز ئىچىگە ئالىدۇ

#include "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 نى ئۆز ئىچىگە ئالىدۇ

static bit is_modbus_recv_complete = 0;

static u8 modbus_recv_buff [270];

static u16 modbus_recv_len = 0; // قوبۇل قىلىنغان بايتنىڭ ئومۇمىي ئۇزۇنلۇقى

static 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 len)

{

UART_SEND_BYTES (بايت ، لېن);

}

void modbus_recv_byte (u8 byte)

{

if (is_modbus_recv_complete)

قايتىش

if (modbus_recv_len

modbus_recv_buff [modbus_recv_len ++] = byte;

}

void modbus_check_recv_timeout ()

{

if (modbus_recv_timeout)

{

modbus_recv_timeout--;

if (modbus_recv_timeout == 0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet (u8 * packet)

{

u16 len;

u16 crc;

u8 func_code = packet [1];

while (modbus_send_interval);

if (func_code == MODBUS_FUNC_CODE_10)

{

((MODBUS_10_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;

} else

{

len = sizeof (MODBUS_PACKET);

}

crc = crc16 (بولاق ، len-2);

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

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

modbus_send_bytes (packet, len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

قايتۇرۇش 0; // مۇۋەپپەقىيەت

}

سىرتقى بوشلۇق modbus_msg_handler (u8 * msg, u16 msg_len);

void modbus_handler ()

{

u16 crc;

if (! 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; // ئىقتىدار كودى

packet.start_addr = addr; // ئادرېس

packet.data_len = len; // يېزىلغان قىممەت

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

return len;

}


يوللانغان ۋاقتى: 12-يانۋاردىن 20-يانۋارغىچە