——DWIN Garatzaileen Forotik
Ale honetan, DWIN Garatzaileen Foroaren kode irekiko kasu saritua aurkezten dizugu: laborantza gela adimenduna. Ingeniariek T5L pantaila adimenduna ezarri zuten berokuntza eta haizagailuaren tenperatura kontrolatzeko funtzioak Modbus protokoloaren bidez kontrolatzeko. Elikatze-iturria ere doi daiteke argiztapen-funtzioa simulatzeko. Sistema automatikoki exekutatu daiteke pantailan ezarritako parametroen arabera eta akatsen historiako erregistroak gorde.
1.UI Materialaren pantaila
2.UI Diseinua
1.C51 Diseinua
Interfaze nagusian tenperatura, hezetasuna eta altitudea bezalako datuak eskuratzeko eta eguneratzeko kode nagusiak eta modbus rtu erabiltzea tenperatura kontrolatzeko moduluak, motorrak, alarmak detektatzeko eta beste makina esklabo batzuk kontrolatzeko hauek dira.
Interfazearen kodearen erreferentzia nagusia:
#include "main_win.h"
#include "modbus.h"
#include "sys_params.h"
#include "func_handler.h"
#include "uart2.h"
#sartu
#sartu
#defini TEMP_HUM_SLAVE_ADDR 2
#defini TEMP_HUM_VAL_MAX_NUM 2
#defini ALERT_BIT_MAX_NUM 30
#defini ALERT_BYTE_NUM (ALERT_BIT_MAX_NUM/8+((ALERT_BIT_MAX_NUM%8)!=0))
#defini GET_ALERT_BIT(val, pos) ((val[pos/8]>>(pos%8))&0x01)
typedef egitura{
char data[17];
u8 desc;
}ALERTA;
#defini 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 alerta_taula[ALERT_TABLE_LEN];
u16 alerta_zenbakia = 0;
bit is_main_win = 0;
void main_win_update()
{
}
void main_win_disp_date()
{
u8 bakarrik;
len = sprintf(common_buf, "%u:%u", (u16)data_bal[3], (u16)data_bal[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(alerta_balda zaharra, i))
jarraitu;
if(GET_ALERT_BIT(alerta_balioa, i))
{
if(alerta_zenbakia>=ALERT_TABLE_LEN)
alert_num = ALERT_TABLE_LEN-1;
alerta_taula[alerta_zenbakia].desc = i+1;
sprintf(alerta_taula[alerta_zenbakia].data, "%u/%u/%u %u:%u",
data_bal[0], data_bal[1], data_bal[2], data_bal[3], data_bal[4]
);
alerta_zenbakia++;
}
}
memcpy(alerta_balida zaharra, alerta_balida, sizeof(alerta_balida));
}
void main_win_disp_alert()
{
u16 eta;
u16rekin;
u16 bakarrik = 0;
common_buf[0] = 0;
for(i=0;i
{
val = 0;
bada (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
{
bada (i==0)
jarraitu;
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 indizea;
if(btn_val==0x0B)
{
main_win_disp_alert();
itzuli;
}
indizea = btn_val-1;
btn_sta[aurkibidea] = !btn_sta[aurkibidea];
bada((aurkibidea==3)||(aurkibidea==7))
btn_sta[indizea] = 1;
modbus_write_bit(btn_addr[indizea], btn_sta[indizea]?0xFF00:0x0000);
btn_val = btn_sta[indizea];
sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*indizea, (u8*)&btn_val, 1);
bada (indizea==9)
is_main_win = 0;
bestela bada((indize==3)||(indize==7))
{
while(sys_get_touch_sta());
modbus_write_bit(btn_addr[indizea], 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 desplazamendua;
msg_len = msg_len;
bada(!irabazi_nagusia da)
itzuli;
if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_VAL_MAX_NUM*2))
{
desplazamendua = MODBUS_RESPOND_POS_DATA;
for(i=0;i
{
main_win_val = SYS_GET_U16(msg[offset], msg[desplazamendu+1]);
desplazamendua += 2;
}
main_win_update();
}else if((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))
{
desplazamendua = MODBUS_RESPOND_POS_DATA;
for(i=0;i
{
alert_val = msg[desplazamendua];
offset++;
}
nagusi_irabazi_prozesua_alerta();
}bestela bada((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))
{
desplazamendua = MODBUS_RESPOND_POS_DATA;
for(i=0;i
{
temp_hum_val = SYS_GET_U16 (msg[offset], msg[desplazamendu+1]);
desplazamendua += 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))
{
desplazamendua = MODBUS_RESPOND_POS_DATA;
for(i=0;i
{
data_bal = SYS_GET_U16 (msg[desplazamendua], msg[desplazamendua+1]);
desplazamendua += 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;//Berrezarri
}
void main_win_handler()
{
u8 bandera estatikoa = 0;
bada (irabazi_nagusia da)
{
if(alert_read_period==ALERT_READ_PERIOD)
{
alert_read_period = 0;
modbus_read_bits (510, ALERT_BIT_MAX_NUM);
itzuli;
}
if(data_eguneratzea_period==DATE_EGUNERAZIOA_ALDIA)
{
data_eguneratzea_periodo = 0;
modbus_read_words (180, MAIN_WIN_DATE_MAX_NUM);
itzuli;
}
bandera = !bandera;
bada (bandera)
modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);
bestela
main_win_read_temp_hum();
}
}
modbus rtu kodearen erreferentzia:
#include "modbus.h"
#include "crc16.h"
#include "sys_params.h"
#defini UART_INCLUDE "uart2.h"
#defini UART_INIT uart2_init
#defini UART_SEND_BYTES uart2_send_bytes
#defini UART_BAUD 9600
#defini MODBUS_RECV_TIMEOUT (u8) (35000.0f/UART_BAUD+2)
#defini MODBUS_SEND_INTERVAL 150
#include UART_INCLUDE
bit estatikoa is_modbus_recv_complete = 0;
u8 estatikoa modbus_recv_buff[270];
static u16 modbus_recv_len = 0;//byteen guztirako luzera onartzen da
static u8 modbus_recv_timeout = 0;//Onartu gainezkatze denbora
lurrunkor estatikoa u16 modbus_send_interval = 0;
MODBUS_PACKET paketea;
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(modbus_recv_complete da)
itzuli;
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 *paketea)
{
u16 bakarrik;
u16 crc;
u8 funtzio_kodea = paketea[1];
while(modbus_bidal_tartea);
if(func_code==MODBUS_FUNC_CODE_10)
{
((MODBUS_10_PACKET*)paketea)->byte_num = ((MODBUS_10_PACKET*)paketea)->hitz_zenbakia*2;
len = 9+((MODBUS_10_PACKET*)paketea)->byte_num;
}else if(func_code==MODBUS_FUNC_CODE_0F)
{
len = ((MODBUS_0F_PACKET*)paketea)->bit_num;
((MODBUS_0F_PACKET*)paketea)->byte_num = len/8+(len%8?1:0);
len = 9+((MODBUS_0F_PACKET*)paketea)->byte_num;
}bestela
{
len = sizeof(MODBUS_PACKET);
}
crc = crc16 (paketea,len-2);
paketea[len-2] = (u8)(crc>>8);
paketea[len-1] = (u8)crc;
modbus_send_bytes(paketea,len);
modbus_send_interval = MODBUS_SEND_INTERVAL;
itzuli 0;//Arrakasta
}
extern void modbus_msg_handler (u8 *msg,u16 msg_len);
void modbus_handler()
{
u16 crc;
if(!modbus_recv_complete da)
itzuli;
//Egiaztatu crc balioa
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 helbidea, u16 len)
{
packet.slave_addr = SLAVE_ADDR;
packet.func_code = fcode;//Funtzio kodea
packet.start_addr = helbidea;//helbidea
packet.data_len = len;//Idatzitako balioa
len = modbus_send_packet((u8*)&paketea);
itzuli len;
}
Argitalpenaren ordua: 2024-01-12