[Codi obert]Sala de formació intel·ligent

——Del Fòrum de desenvolupadors de DWIN

En aquest número, us presentem el cas de codi obert premiat del Fòrum de Desenvolupadors DWIN: la sala de cultiu intel·ligent.Els enginyers van implementar la pantalla intel·ligent T5L per controlar la calefacció i les funcions de control de temperatura del ventilador mitjançant el protocol Modbus.La font d'alimentació també es pot ajustar per simular la funció d'il·luminació.El sistema pot funcionar automàticament segons els paràmetres establerts a la pantalla i desar registres d'historial d'errors.

1. Pantalla de material d'UI

asvdfb (2)
asvdfb (1)

2.Disseny d'UI

asvdfb (3)

1.C51 Disseny

Els codis principals per adquirir i actualitzar dades com ara la temperatura, la humitat i l'altitud a la interfície principal i utilitzar modbus rtu per controlar mòduls de control de temperatura, motors, detecció d'alarmes i altres màquines esclaus són els següents

Referència del codi de la interfície principal:

#include "main_win.h"

#inclou "modbus.h"

#include "sys_params.h"

#include "func_handler.h"

#inclou "uart2.h"

#incloure

#incloure

#definir TEMP_HUM_SLAVE_ADDR 2

#definir TEMP_HUM_VAL_MAX_NUM 2

#definir ALERT_BIT_MAX_NUM 30

#definir 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{

data del caràcter[17];

u8 desc;

}ALERTA;

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

u8 alert_val[ALERT_BYTE_NUM] = {0};

u8 old_alert_val[ALERT_BYTE_NUM] = {0};

ALERT taula_alerta[ALERT_TABLE_LEN];

u16 número_alerta = 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;

per (i=0;i

{

if(GET_ALERT_BIT(antiga_val_alerta, i))

continuar;

if(GET_ALERT_BIT(val_alerta, i))

{

if(alert_num>=ALERT_TABLE_LEN)

alert_num = ALERT_TABLE_LEN-1;

taula_alerta[num_alerta].desc = i+1;

sprintf(taula_alerta[núm_alerta].data, "%u/%u/%u %u:%u",

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

);

alert_num++;

}

}

memcpy (val_alerta_antiga, valor_alerta, mida de (val_alerta));

}

void main_win_disp_alert()

{

u16 i;

u16 val;

u16 len = 0;

common_buf[0] = 0;

per (i=0;i

{

val = 0;

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

{

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

per (i=0;i

{

si (i==0)

continuar;

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)

{

índex u8;

if(btn_val==0x0B)

{

main_win_disp_alert();

tornar;

}

índex = btn_val-1;

btn_sta[índex] = !btn_sta[índex];

if((índex==3)||(índex==7))

btn_sta[índex] = 1;

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

btn_val = btn_sta[índex];

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

if(índex==9)

is_main_win = 0;

sinó si((índex==3)||(índex==7))

{

while(sys_get_touch_sta());

modbus_write_bit(btn_addr[índex], 0x0000);

}

}

void main_win_msg_handler(u8 *msg,u16 msg_len)

{

u8 f_code = msg[MODBUS_RESPOND_POS_FUNC_CODE];

u8 data_len = missatge [MODBUS_RESPOND_POS_DATA_LEN];

u8 i;

desplaçament u8;

msg_len = msg_len;

if(!is_main_win)

tornar;

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

{

desplaçament = MODBUS_RESPOND_POS_DATA;

per (i=0;i

{

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

desplaçament += 2;

}

main_win_update();

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

{

desplaçament = MODBUS_RESPOND_POS_DATA;

per (i=0;i

{

alerta_val = missatge [desplaçament];

offset++;

}

main_win_process_alert();

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

{

desplaçament = MODBUS_RESPOND_POS_DATA;

per (i=0;i

{

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

desplaçament += 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))

{

desplaçament = MODBUS_RESPOND_POS_DATA;

per (i=0;i

{

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

desplaçament += 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;//Reverteix

}

void main_win_handler()

{

bandera u8 estàtica = 0;

if(és_principal_win)

{

if(alert_read_period==ALERT_READ_PERIOD)

{

període_de_lectura_alerta = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

tornar;

}

if(data_update_period==DATE_UPDATE_PERIOD)

{

data_període_actualització = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

tornar;

}

bandera = !bandera;

si (bandera)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

altra cosa

main_win_read_temp_hum();

}

}

referència del codi modbus rtu:

#inclou "modbus.h"

#inclou "crc16.h"

#include "sys_params.h"

#define UART_INCLUDE "uart2.h"

#definir UART_INIT uart2_init

#definir UART_SEND_BYTES uart2_send_bytes

#definir UART_BAUD 9600

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

#define MODBUS_SEND_INTERVAL 150

#inclou UART_INCLUDE

bit estàtic is_modbus_recv_complete = 0;

static u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;//Longitud total de bytes acceptats

static u8 modbus_recv_timeout = 0;//Accepta el temps de desbordament

estàtic volàtil u16 modbus_send_interval = 0;

paquet MODBUS_PACKET;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

void modbus_send_bytes (u8 *bytes, u16 len)

{

UART_SEND_BYTES(bytes,len);

}

void modbus_recv_byte (u8 byte)

{

if(és_modbus_recv_complet)

tornar;

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 *paquet)

{

u16 len;

u16 crc;

u8 codi_funció = paquet[1];

while(modbus_send_interval);

if(func_code==MODBUS_FUNC_CODE_10)

{

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

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

}else if(func_code==MODBUS_FUNC_CODE_0F)

{

len = ((MODBUS_0F_PACKET*)paquet)->núm_bit;

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

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

} altrament

{

len = sizeof(MODBUS_PACKET);

}

crc = crc16(paquet,len-2);

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

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

modbus_send_bytes(paquet,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

retorna 0;//Éxit

}

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

void modbus_handler()

{

u16 crc;

if(!is_modbus_recv_complete)

tornar;

//Comprova el valor de 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;//Codi de funció

packet.start_addr = adreça;//Adreça

packet.data_len = len;//Valor escrit

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

tornar len;

}


Hora de publicació: 12-gen-2024