[Open Source]Sala di formazione intelligente

——Dal forum degli sviluppatori DWIN

In questo numero vi presentiamo il pluripremiato caso open source del DWIN Developer Forum: la sala di coltivazione intelligente. Gli ingegneri hanno implementato lo schermo intelligente T5L per controllare le funzioni di riscaldamento e controllo della temperatura della ventola tramite il protocollo Modbus. L'alimentazione può anche essere regolata per simulare la funzione di illuminazione. Il sistema può funzionare automaticamente in base ai parametri impostati sullo schermo e salvare i record della cronologia dei guasti.

1.Visualizzazione del materiale dell'interfaccia utente

asvdfb (2)
asvdfb (1)

2.Progettazione dell'interfaccia utente

asvdfb (3)

1.C51 Progettazione

I codici principali per l'acquisizione e l'aggiornamento di dati quali temperatura, umidità e altitudine sull'interfaccia principale e l'utilizzo di modbus rtu per controllare moduli di controllo della temperatura, motori, rilevamento allarmi e altre macchine slave sono i seguenti

Riferimento al codice dell'interfaccia principale:

#include "main_win.h"

#include "modbus.h"

#include "sys_params.h"

#include "func_handler.h"

#include "uart2.h"

#includere

#includere

#define TEMP_HUM_SLAVE_ADDR 2

#definisce TEMP_HUM_VAL_MAX_NUM 2

#define ALERT_BIT_MAX_NUM 30

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

struttura typedef{

char data[17];

u8 discesa;

}METTERE IN GUARDIA;

#define ALERT_TABLE_LEN 20

statico u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

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

u8 val_avviso[ALERT_BYTE_NUM] = {0};

u8 old_alert_val[ALERT_BYTE_NUM] = {0};

ALERT alert_table[ALERT_TABLE_LEN];

u16 numero_avviso = 0;

bit is_main_win = 0;

void main_win_update()

{

}

void main_win_disp_date()

{

solo u8;

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

buf_comune[len+1] = 0;

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

}

void main_win_process_alert()

{

u8 io;

per(i=0;i

{

if(GET_ALERT_BIT(old_alert_val, i))

Continua;

if(GET_ALERT_BIT(val_avviso, i))

{

if(numero_avviso>=ALERT_TABLE_LEN)

alert_num = ALERT_TABLE_LEN-1;

alert_table[alert_num].desc = i+1;

sprintf(tabella_avviso[num_avviso].date, "%u/%u/%u %u:%u",

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

);

numero_avviso++;

}

}

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

}

void main_win_disp_alert()

{

u16 e;

con u16;

solo u16 = 0;

buf_comune[0] = 0;

per(i=0;i

{

valore = 0;

se io

{

val = alert_tabella.desc;

len += sprintf(common_buf+len, "%s\r\n", alert_table.date);

}

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

}

buf_comune[len+1] = 0;

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

}

void main_win_init()

{

float valore_fisso;

u8 io;

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

per(i=0;i

{

se(i==0)

Continua;

sys_write_vp(MAIN_WIN_WIND_SPEED_VP+MAIN_WIN_VAL_OFFSET*i, (u8*)&main_win_val, 1);

}

valore_fisso = valore_win_main[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)

{

indice u8;

se(btn_val==0x0B)

{

main_win_disp_alert();

ritorno;

}

indice = btn_val-1;

btn_sta[indice] = !btn_sta[indice];

if((indice==3)||(indice==7))

btn_sta[indice] = 1;

modbus_write_bit(btn_addr[indice], btn_sta[indice]?0xFF00:0x0000);

btn_val = btn_sta[indice];

sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*index, (u8*)&btn_val, 1);

se(indice==9)

is_main_win = 0;

altrimenti se((indice==3)||(indice==7))

{

while(sys_get_touch_sta());

modbus_write_bit(btn_addr[indice], 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 io;

spostamento u8;

msg_len = msg_len;

if(!is_main_win)

ritorno;

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

{

offset = MODBUS_RESPOND_POS_DATA;

per(i=0;i

{

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

spostamento += 2;

}

main_win_update();

}else if((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

offset = MODBUS_RESPOND_POS_DATA;

per(i=0;i

{

alert_val = msg[offset];

spostamento++;

}

main_win_process_alert();

}else if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

per(i=0;i

{

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

spostamento += 2;

modbus_write_word(5+i, temp_hum_val);

}

main_win_update();

}else if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

per(i=0;i

{

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

spostamento += 2;

}

main_win_disp_date();

}

}

void main_win_read_temp_hum()

{

u8 vecchio_slave_add = 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;//Ripristina

}

void main_win_handler()

{

flag u8 statico = 0;

se(is_main_win)

{

if(alert_read_period==ALERT_READ_PERIOD)

{

alert_read_period = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

ritorno;

}

if(date_update_period==DATE_UPDATE_PERIOD)

{

data_periodo_aggiornamento = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

ritorno;

}

bandiera = !bandiera;

se (bandiera)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

altro

main_win_read_temp_hum();

}

}

Riferimento al codice Modbus rtu:

#include "modbus.h"

#include "crc16.h"

#include "sys_params.h"

#define UART_INCLUDE "uart2.h"

#define UART_INIT uart2_init

#define UART_SEND_BYTES uart2_send_bytes

#define UART_BAUD 9600

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

#define MODBUS_SEND_INTERVAL 150

#include UART_INCLUDE

bit statico is_modbus_recv_complete = 0;

statico u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;//Lunghezza totale dei byte accettati

statico u8 modbus_recv_timeout = 0;//Accetta il tempo di overflow

statico volatile u16 modbus_send_interval = 0;

pacchetto MODBUS_PACKET;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

void modbus_send_bytes(u8 *bytes,u16 len)

{

UART_SEND_BYTES(byte,len);

}

void modbus_recv_byte(u8 byte)

{

if(is_modbus_recv_complete)

ritorno;

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_invia_pacchetto(u8 *pacchetto)

{

solo u16;

u16 crc;

u8 codice_funzione = pacchetto[1];

while(modbus_send_interval);

if(codice_funzione==MODBUS_FUNC_CODE_10)

{

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

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

}altrimenti se(codice_funzione==MODBUS_FUNC_CODE_0F)

{

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

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

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

}altro

{

len = dimensionedi(MODBUS_PACKET);

}

crc = crc16(pacchetto,len-2);

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

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

modbus_send_bytes(pacchetto,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

return 0;//Successo

}

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

void modbus_handler()

{

u16 crc;

if(!is_modbus_recv_complete)

ritorno;

//Controlla il valore crc

crc = ((u16)modbus_recv_buff[modbus_recv_len-2]

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 indirizzo, u16 lente)

{

pacchetto.slave_addr = SLAVE_ADDR;

pacchetto.func_code = fcode;//Codice funzione

pacchetto.start_addr = indirizzo;//Indirizzo

pacchetto.data_len = len;//Valore scritto

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

lente di ritorno;

}


Orario di pubblicazione: 12 gennaio 2024