—— DWIN dörediji forumyndan
Gepleşigimiziň bu sanynda, akylly ekiş otagy bolan DWIN Öndüriji Forumynyň baýrakly açyk çeşmesini size hödürleýäris. In Engineenerler, Modbus protokoly arkaly ýyladyş we janköýer temperaturasyna gözegçilik etmek üçin T5L akylly ekrany amala aşyrdylar. Yşyklandyryş funksiýasyny simulirlemek üçin tok üpjünçiligi hem sazlanyp bilner. Ulgam ekranda goýlan parametrlere laýyklykda awtomatiki işledip biler we ýalňyş taryhy ýazgylaryny ýatda saklap biler.
1.UI material displeýi
![asvdfb (2)](https://ecdn6.globalso.com/upload/p/1355/source/2024-03/65f96ba08612736786.jpg)
![asvdfb (1)](https://ecdn6.globalso.com/upload/p/1355/source/2024-03/65f96ba210c7924337.jpg)
2.UI dizaýny
1.C51 Dizaýn
Esasy interfeýsdäki temperatura, çyglylyk we beýiklik ýaly maglumatlary almak we täzelemek, we temperatura gözegçilik modullaryny, hereketlendirijileri, duýduryşy kesgitlemek we beýleki gul maşynlaryny dolandyrmak üçin modbus rtu ulanmak üçin esasy kodlar aşakdakylardyr
Esasy interfeýs kody salgylanmasy:
# "main_win.h" goşuň
# modbus.h goşuň
# "sys_params.h" goşuň
# "funksiýa_handler.h" goşuň
# "uart2.h" goşuň
# goş
# goş
# TEMP_HUM_SLAVE_ADDR 2 kesgitläň
# TEMP_HUM_VAL_MAX_NUM 2 kesgitläň
# ALERT_BIT_MAX_NUM 30 kesgitläň
# ALERT_BYTE_NUM kesgitläň (ALERT_BIT_MAX_NUM / 8 + ((ALERT_BIT_MAX_NUM% 8)! = 0))
# kesgitlemek GET_ALERT_BIT (val, pos) ((val [pos / 8] >> (pos% 8)) & 0x01)
typedef strukturasy {
char senesi [17];
u8 aşak;
} ALERT;
# ALERT_TABLE_LEN 20 kesgitläň
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 esasy_win_val [MAIN_WIN_VAL_MAX_NUM];
u16 temp_hum_val [TEMP_HUM_VAL_MAX_NUM] = {0};
u16 senesi_val [MAIN_WIN_DATE_MAX_NUM] = {0};
u8 duýduryş_val [ALERT_BYTE_NUM] = {0};
u8 köne_alert_val [ALERT_BYTE_NUM] = {0};
ALERT duýduryş_table [ALERT_TABLE_LEN];
u16 alert_num = 0;
bit is_main_win = 0;
void main_win_update ()
{
}
boş_in_disp_date ()
{
diňe u8;
len = sprintf (umumy_buf, "% u:% u", (u16) senesi_val [3], (u16) senesi_val [4]);
umumy_buf [len + 1] = 0;
sys_write_vp (MAIN_WIN_DATE_VP, umumy_buf, len / 2 + 2);
}
boş_win_process_alert ()
{
u8 i;
üçin (i = 0; i
{
eger (GET_ALERT_BIT (köne_alert_val, i))
dowam et;
eger (GET_ALERT_BIT (duýduryş_val, i))
{
eger (alert_num> = ALERT_TABLE_LEN)
alert_num = ALERT_TABLE_LEN-1;
duýduryş_table [alert_num] .desc = i + 1;
sprintf (alert_table [alert_num]. senesi, "% u /% u /% u% u:% u",
sene_val [0], sene_val [1], sene_val [2], sene_val [3], sene_val [4]
);
alert_num ++;
}
}
memcpy (köne_alert_val, duýduryş_val, ululygy (duýduryş_val));
}
boş_win_disp_alert ()
{
u16 we;
u16 bilen;
u16 diňe = 0;
umumy_buf [0] = 0;
üçin (i = 0; i
{
val = 0;
eger (i
{
val = alert_table.desc;
len + = sprintf (umumy_buf + len, "% s \ r \ n", alert_table.date);
}
sys_write_vp (ALERT_WIN_DESC_START_VP + i, (u8 *) & val, 1);
}
umumy_buf [len + 1] = 0;
sys_write_vp (ALERT_WIN_DATE_VP, umumy_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);
üçin (i = 0; i
{
eger (i == 0)
dowam et;
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 *) & kesgitlenen_val, 2);
}
boş esasy_win_click_handler (u16 btn_val)
{
u8 indeks;
eger (btn_val == 0x0B)
{
main_win_disp_alert ();
gaýdyp gelmek;
}
indeks = btn_val-1;
btn_sta [indeks] =! btn_sta [indeks];
eger ((indeks == 3) || (indeks == 7))
btn_sta [indeks] = 1;
modbus_write_bit (btn_addr [indeks], btn_sta [indeks]? 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);
eger (indeks == 9)
is_main_win = 0;
başgaça bolsa ((indeks == 3) || (indeks == 7))
{
(sys_get_touch_sta ());
modbus_write_bit (btn_addr [indeks], 0x0000);
}
}
boş_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;
eger (! is_main_win)
gaýdyp gelmek;
eger ((f_code == MODBUS_FUNC_CODE_03) && (data_len == MAIN_WIN_VAL_MAX_NUM * 2))
{
ofset = MODBUS_RESPOND_POS_DATA;
üçin (i = 0; i
{
main_win_val = SYS_GET_U16 (msg [ofset], msg [ofset + 1]);
ofset + = 2;
}
main_win_update ();
} başgaça bolsa ((f_code == MODBUS_FUNC_CODE_01) && (data_len == ALERT_BYTE_NUM))
{
ofset = MODBUS_RESPOND_POS_DATA;
üçin (i = 0; i
{
alert_val = msg [ofset];
ofset ++;
}
main_win_process_alert ();
} başga bolsa ((f_code == MODBUS_FUNC_CODE_03) && (data_len == TEMP_HUM_VAL_MAX_NUM * 2))
{
ofset = MODBUS_RESPOND_POS_DATA;
üçin (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 ();
} başga bolsa ((f_code == MODBUS_FUNC_CODE_03) && (data_len == MAIN_WIN_DATE_MAX_NUM * 2))
{
ofset = MODBUS_RESPOND_POS_DATA;
üçin (i = 0; i
{
senesi_val = SYS_GET_U16 (msg [ofset], msg [ofset + 1]);
ofset + = 2;
}
main_win_disp_date ();
}
}
boş_win_read_temp_hum ()
{
u8 köne_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] = köne_slave_addr; // Tersine
}
void main_win_handler ()
{
statik u8 baýdak = 0;
eger (is_main_win)
{
eger (alert_read_period == ALERT_READ_PERIOD)
{
alert_read_period = 0;
modbus_read_bits (510, ALERT_BIT_MAX_NUM);
gaýdyp gelmek;
}
eger (sene_update_period == DATE_UPDATE_PERIOD)
{
sene_update_period = 0;
modbus_read_words (180, MAIN_WIN_DATE_MAX_NUM);
gaýdyp gelmek;
}
baýdak =! baýdak;
eger (baýdak)
modbus_read_words (0, MAIN_WIN_VAL_MAX_NUM);
başga
main_win_read_temp_hum ();
}
}
modbus rtu kody salgylanmasy:
# modbus.h goşuň
# "crc16.h" goşuň
# "sys_params.h" goşuň
# UART_INCLUDE "uart2.h" kesgitläň
# UART_INIT uart2_init kesgitläň
# UART_SEND_BYTES uart2_send_bytes kesgitläň
# UART_BAUD 9600 kesgitläň
# MODBUS_RECV_TIMEOUT (u8) kesgitläň (35000.0f / UART_BAUD + 2)
# MODBUS_SEND_INTERVAL 150 kesgitläň
# UART_INCLUDE goşuň
statiki bit is_modbus_recv_complete = 0;
statik u8 modbus_recv_buff [270];
statik u16 modbus_recv_len = 0; // kabul edilen baýtlaryň umumy uzynlygy
statik u8 modbus_recv_timeout = 0; // Artýan wagty kabul ediň
statiki üýtgäp durýan u16 modbus_send_interval = 0;
MODBUS_PACKET paket;
boş modbus_init ()
{
UART_INIT (UART_BAUD);
}
boş modbus_send_bytes (u8 * baýt, u16 len)
{
UART_SEND_BYTES (baýt, len);
}
boş modbus_recv_byte (u8 baýt)
{
eger (is_modbus_recv_complete)
gaýdyp gelmek;
eger (modbus_recv_len
modbus_recv_buff [modbus_recv_len ++] = baýt;
}
boş modbus_check_recv_timeout ()
{
eger (modbus_recv_timeout)
{
modbus_recv_timeout--;
eger (modbus_recv_timeout == 0)
{
is_modbus_recv_complete = 1;
}
}
}
u8 modbus_send_packet (u8 * paket)
{
diňe u16;
u16 crc;
u8 func_code = paket [1];
(modbus_send_interval);
eger (func_code == MODBUS_FUNC_CODE_10)
{
((MODBUS_10_PACKET *) paket) -> baýt_num = ((MODBUS_10_PACKET *) paket) -> söz_num * 2;
len = 9 + ((MODBUS_10_PACKET *) paket) -> baýt_num;
} başga bolsa (func_code == MODBUS_FUNC_CODE_0F)
{
len = ((MODBUS_0F_PACKET *) paket) -> bit_num;
((MODBUS_0F_PACKET *) paket) -> baýt_num = len / 8 + (len% 8? 1: 0);
len = 9 + ((MODBUS_0F_PACKET *) paket) -> baýt_num;
} başga
{
len = ululygy (MODBUS_PACKET);
}
crc = crc16 (paket, len-2);
paket [len-2] = (u8) (crc >> 8);
paket [len-1] = (u8) crc;
modbus_send_bytes (paket, len);
modbus_send_interval = MODBUS_SEND_INTERVAL;
0; // üstünlik
}
daşarky boşluk modbus_msg_handler (u8 * msg, u16 msg_len);
boş modbus_handler ()
{
u16 crc;
eger (! is_modbus_recv_complete)
gaýdyp gelmek;
// crc bahasyny barlaň
crc = ((u16) modbus_recv_buff [modbus_recv_len-2]
eger (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; // Funksiýa kody
packet.start_addr = addr; // Salgy
packet.data_len = len; // writtenazylan baha
len = modbus_send_packet ((u8 *) & paket);
len;
}
Iş wagty: -20anwar-12-2024