[Sumber Terbuka]Ruang Pelatihan Cerdas

——Dari Forum Pengembang DWIN

Dalam edisi ini, kami memperkenalkan kepada Anda kasus sumber terbuka pemenang penghargaan dari Forum Pengembang DWIN - ruang budidaya cerdas.Para insinyur menerapkan layar pintar T5L untuk mengontrol fungsi pemanas dan kontrol suhu kipas melalui protokol Modbus.Catu daya juga dapat disesuaikan untuk mensimulasikan fungsi pencahayaan.Sistem dapat berjalan secara otomatis sesuai dengan parameter yang ditetapkan di layar dan menyimpan catatan riwayat kesalahan.

1. Tampilan Materi UI

asvdfb (2)
asvdfb (1)

2.Desain UI

asvdfb (3)

1.C51 Desain

Kode utama untuk memperoleh dan memperbarui data seperti suhu, kelembaban, dan ketinggian pada antarmuka utama, dan menggunakan modbus rtu untuk mengontrol modul kontrol suhu, motor, deteksi alarm, dan mesin budak lainnya adalah sebagai berikut

Referensi kode antarmuka utama:

#sertakan "main_win.h"

#sertakan "modbus.h"

#sertakan "sys_params.h"

#sertakan "func_handler.h"

#sertakan "uart2.h"

#termasuk

#termasuk

#tentukan TEMP_HUM_SLAVE_ADDR 2

#tentukan TEMP_HUM_VAL_MAX_NUM 2

#tentukan ALERT_BIT_MAX_NUM 30

#tentukan 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)

struktur typedef{

tanggal karakter[17];

u8 deskripsi;

}PERINGATAN;

#definisikan ALERT_TABLE_LEN 20

statis u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

statis 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 tanggal_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[ALERT_TABLE_LEN];

u16 angka_waspada = 0;

sedikit is_main_win = 0;

batalkan main_win_update()

{

}

batal main_win_disp_date()

{

u8 len;

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

common_buf[len+1] = 0;

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

}

batalkan main_win_process_alert()

{

u8 saya;

untuk(saya=0;saya

{

jika(GET_ALERT_BIT(val_alert_lama, i))

melanjutkan;

jika(GET_ALERT_BIT(alert_val, i))

{

jika(angka_peringatan>=ALERT_TABLE_LEN)

alert_num = ALERT_TABLE_LEN-1;

alert_table[alert_num].desc = i+1;

sprintf(alert_table[alert_num].tanggal, "%u/%u/%u %u:%u",

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

);

alert_num++;

}

}

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

}

batalkan main_win_disp_alert()

{

u16 saya;

u16 val;

u16 len = 0;

buf_umum[0] = 0;

untuk(saya=0;saya

{

val = 0;

jika saya

{

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

}

batalkan main_win_init()

{

mengambang fixed_val;

u8 saya;

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

untuk(saya=0;saya

{

jika(saya==0)

melanjutkan;

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

}

batalkan main_win_click_handler(u16 btn_val)

{

indeks u8;

jika(btn_val==0x0B)

{

main_win_disp_alert();

kembali;

}

indeks = btn_val-1;

btn_sta[indeks] = !btn_sta[indeks];

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

jika(indeks==9)

is_main_win = 0;

lain jika((indeks==3)||(indeks==7))

{

sementara(sys_get_touch_sta());

modbus_write_bit(btn_addr[indeks], 0x0000);

}

}

batalkan main_win_msg_handler(u8 *pesan,u16 pesan_len)

{

u8 f_code = pesan[MODBUS_RESPOND_POS_FUNC_CODE];

u8 data_len = pesan[MODBUS_RESPOND_POS_DATA_LEN];

u8 saya;

u8 diimbangi;

pesan_len = pesan_len;

jika(!is_main_win)

kembali;

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

{

offset = MODBUS_RESPOND_POS_DATA;

untuk(saya=0;saya

{

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

mengimbangi += 2;

}

main_win_update();

}lainnya jika((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

offset = MODBUS_RESPOND_POS_DATA;

untuk(saya=0;saya

{

alert_val = pesan[offset];

offset++;

}

main_win_process_alert();

}lainnya jika((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

untuk(saya=0;saya

{

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

mengimbangi += 2;

modbus_write_word(5+i, temp_hum_val);

}

main_win_update();

}lainnya jika((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

untuk(saya=0;saya

{

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

mengimbangi += 2;

}

main_win_disp_date();

}

}

batalkan main_win_read_temp_hum()

{

u8 old_slave_addr = BUDAK_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;//Kembalikan

}

batalkan main_win_handler()

{

bendera u8 statis = 0;

jika(is_main_win)

{

jika(alert_read_period==ALERT_READ_PERIOD)

{

peringatan_baca_periode = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

kembali;

}

jika(tanggal_pembaruan_periode==DATE_UPDATE_PERIOD)

{

tanggal_pembaruan_periode = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

kembali;

}

bendera = !bendera;

jika (bendera)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

kalau tidak

main_win_read_temp_hum();

}

}

referensi kode modbus rtu:

#sertakan "modbus.h"

#sertakan "crc16.h"

#sertakan "sys_params.h"

#define UART_INCLUDE "uart2.h"

#definisikan UART_INIT uart2_init

#tentukan UART_SEND_BYTES uart2_send_bytes

#tentukan UART_BAUD 9600

#tentukan MODBUS_RECV_TIMEOUT (u8)(35000.0f/UART_BAUD+2)

#tentukan MODBUS_SEND_INTERVAL 150

#sertakan UART_INCLUDE

bit statis is_modbus_recv_complete = 0;

statis u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;//Total panjang byte yang diterima

static u8 modbus_recv_timeout = 0;//Terima waktu luapan

statis mudah menguap u16 modbus_send_interval = 0;

paket MODBUS_PACKET;

batalkan modbus_init()

{

UART_INIT(UART_BAUD);

}

batal modbus_send_bytes(u8 *byte,u16 len)

{

UART_SEND_BYTES(byte,len);

}

batal modbus_recv_byte(u8 byte)

{

jika(is_modbus_recv_complete)

kembali;

jika(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = byte;

}

batalkan modbus_check_recv_timeout()

{

jika(modbus_recv_timeout)

{

modbus_recv_timeout--;

jika(modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *paket)

{

u16 len;

u16 krc;

u8 func_code = paket[1];

sementara(modbus_send_interval);

jika(func_code==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET*)paket)->byte_num = ((MODBUS_10_PACKET*)paket)->word_num*2;

len = 9+((MODBUS_10_PACKET*)paket)->byte_num;

}lainnya jika(func_code==MODBUS_FUNC_CODE_0F)

{

len = ((MODBUS_0F_PACKET*)paket)->bit_num;

((MODBUS_0F_PACKET*)paket)->byte_num = len/8+(len%8?1:0);

len = 9+((MODBUS_0F_PACKET*)paket)->byte_num;

}kalau tidak

{

len = ukuran(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;

kembali 0;//Sukses

}

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

batalkan modbus_handler()

{

u16 krc;

jika(!is_modbus_recv_complete)

kembali;

//Periksa nilai crc

crc = ((u16)modbus_recv_buff[modbus_recv_len-2]<<8)+modbus_recv_buff[modbus_recv_len-1];

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

{

paket.slave_addr = SLAVE_ADDR;

packet.func_code = fcode;//Kode fungsi

packet.start_addr = addr;//Alamat

packet.data_len = len;//Nilai tertulis

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

kembali len;

}


Waktu posting: 12 Januari 2024