——Iš DWIN kūrėjų forumo
Šiame numeryje pristatome apdovanojimus pelniusį atvirojo kodo DWIN kūrėjų forumo dėklą – išmanųjį auginimo kambarį. Inžinieriai įdiegė T5L išmanųjį ekraną, kad valdytų šildymo ir ventiliatoriaus temperatūros valdymo funkcijas per Modbus protokolą. Maitinimo šaltinis taip pat gali būti reguliuojamas, kad imituotų apšvietimo funkciją. Sistema gali automatiškai veikti pagal ekrane nustatytus parametrus ir išsaugoti gedimų istorijos įrašus.
1.UI medžiagos ekranas
![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 dizainas
1.C51 Dizainas
Pagrindiniai kodai, skirti gauti ir atnaujinti duomenis, pvz., temperatūrą, drėgmę ir aukštį pagrindinėje sąsajoje, ir naudoti modbus rtu temperatūros valdymo moduliams, varikliams, aliarmo aptikimui ir kitoms pagalbinėms mašinoms valdyti, yra šie.
Pagrindinės sąsajos kodo nuoroda:
#include "main_win.h"
#include "modbus.h"
#include "sys_params.h"
#include "func_handler.h"
#include "uart2.h"
#įtraukti
#įtraukti
#define TEMP_HUM_SLAVE_ADDR 2
#define TEMP_HUM_VAL_MAX_NUM 2
#define ALERT_BIT_MAX_NUM 30
#define ALERT_BYTE_NUM (ALERT_BIT_MAX_NUM/8+((ALERT_BIT_MAX_NUM%8)!=0))
#define GET_ALERT_BIT(val, poz) ((val[pos/8]>>(pos%8))&0x01)
typedef struct{
simbolio data[17];
u8 desc;
}BUDRUS;
#define ALERT_TABLE_LEN 20
statinis u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};
statinis 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 alert_table[ALERT_LENTELĖ_LEN];
u16 įspėjimo_skaičius = 0;
bitas yra_pagrindinis_laimėjimas = 0;
negalioja main_win_update()
{
}
negalioja main_win_disp_date()
{
tik u8;
len = sprintf(common_buf, "%u:%u", (u16)data_val[3], (u16)data_val[4]);
bendrasis_buf[len+1] = 0;
sys_write_vp(MAIN_WIN_DATE_VP, common_buf, len/2+2);
}
negalioja main_win_process_alert()
{
u8 i;
for(i=0;i
{
if(GET_ALERT_BIT(senas_alert_val, i))
Tęsti;
if(GET_ALERT_BIT(alert_val, i))
{
if(alert_num>=ALERT_TABLE_LEN)
įspėjimo_numeris = ALERT_LENTELĖ_LEN-1;
įspėjimo_lentelė[alert_num].desc = i+1;
sprintf(alert_table[alert_num].date, "%u/%u/%u %u:%u",
data_val[0], data_val[1], data_val[2], data_val[3], data_val[4]
);
įspėjimo_numeris++;
}
}
memcpy(old_alert_val, alert_val, sizeof(alert_val));
}
negalioja main_win_disp_alert()
{
u16 ir;
su u16;
tik u16 = 0;
bendrasis_buf[0] = 0;
for(i=0;i
{
val = 0;
jeigu aš
{
val = alert_table.desc;
len += sprintf(bendras_buf+len, "%s\r\n", alert_table.date);
}
sys_write_vp(ALERT_WIN_DESC_START_VP+i, (u8*)&val, 1);
}
bendrasis_buf[len+1] = 0;
sys_write_vp(ALERT_WIN_DATE_VP, common_buf, len/2+2);
}
negalioja main_win_init()
{
float fiksuotas_val;
u8 i;
yra_pagrindinis_laimėjimas = 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
{
jei(i==0)
Tęsti;
sys_write_vp(MAIN_WIN_WIND_SPEED_VP+MAIN_WIN_VAL_OFFSET*i, (u8*)&main_win_val, 1);
}
fiksuotas_val = pagrindinis_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 indeksas;
if(btn_val==0x0B)
{
pagrindinis_win_disp_alert();
grąžinti;
}
indeksas = btn_val-1;
btn_sta[indeksas] = !btn_sta[indeksas];
if((indeksas==3)||(indeksas==7))
btn_sta[indeksas] = 1;
modbus_write_bit(btn_addr[index], btn_sta[index]?0xFF00:0x0000);
btn_val = btn_sta[indeksas];
sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*indeksas, (u8*)&btn_val, 1);
if(indeksas==9)
yra_pagrindinis_laimėjimas = 0;
kitaip if((indeksas==3)||(indeksas==7))
{
while(sys_get_touch_sta());
modbus_write_bit(btn_addr[indeksas], 0x0000);
}
}
void main_win_msg_handler(u8 *msg,u16 msg_len)
{
u8 f_kodas = msg[MODBUS_RESPOND_POS_FUNC_CODE];
u8 data_len = msg[MODBUS_RESPOND_POS_DATA_LEN];
u8 i;
u8 poslinkis;
msg_len = msg_len;
if(!is_main_win)
grąžinti;
if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_VAL_MAX_NUM*2))
{
poslinkis = MODBUS_RESPOND_POS_DATA;
for(i=0;i
{
main_win_val = SYS_GET_U16(msg[offset], msg[offset+1]);
poslinkis += 2;
}
main_win_update();
}else if((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))
{
poslinkis = MODBUS_RESPOND_POS_DATA;
for(i=0;i
{
alert_val = msg[offset];
offset++;
}
main_win_process_alert();
}else if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))
{
poslinkis = MODBUS_RESPOND_POS_DATA;
for(i=0;i
{
temp_hum_val = SYS_GET_U16(msg[offset], msg[offset+1]);
poslinkis += 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))
{
poslinkis = MODBUS_RESPOND_POS_DATA;
for(i=0;i
{
data_val = SYS_GET_U16(msg[poslinkis], msg[poslinkis+1]);
poslinkis += 2;
}
main_win_disp_date ();
}
}
void main_win_read_temp_hum()
{
u8 old_slave_addr = VERGO_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;//Grąžinti
}
void main_win_handler()
{
statinė u8 vėliavėlė = 0;
if(yra_main_win)
{
if(alert_read_period==ALERT_READ_PERIOD)
{
alert_read_period = 0;
modbus_read_bits(510, ALERT_BIT_MAX_NUM);
grąžinti;
}
if(date_update_period==DATE_UPDATE_PERIOD)
{
data_atnaujinimo_periodas = 0;
modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);
grąžinti;
}
vėliavėlė = !vėliava;
jei (vėliava)
modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);
Kitas
main_win_read_temp_hum();
}
}
modbus RTU kodo nuoroda:
#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
statinis bitas yra_modbus_recv_complete = 0;
statinis u8 modbus_recv_buff[270];
static u16 modbus_recv_len = 0;//Priimtas bendras baitų ilgis
static u8 modbus_recv_timeout = 0;//Priimti perpildymo laiką
statinis nepastovus u16 modbus_send_interval = 0;
MODBUS_PACKET paketas;
negalioja modbus_init()
{
UART_INIT(UART_BAUD);
}
void modbus_send_bytes(u8 *bytes,u16 len)
{
UART_SEND_BYTES(baitai,len);
}
negalioja modbus_recv_byte (u8 baitas)
{
if(is_modbus_recv_complete)
grąžinti;
if(modbus_recv_len
modbus_recv_buff[modbus_recv_len++] = baitas;
}
negalioja 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 *paketas)
{
tik u16;
u16 crc;
u8 func_code = paketas[1];
while(modbus_send_interval);
if(func_code==MODBUS_FUNC_CODE_10)
{
((MODBUS_10_PAKETAS*)paketas)->baitų_skaičius = ((MODBUS_10_PAKETAS*)paketas)->žodžio_skaičius*2;
len = 9+((MODBUS_10_PACKET*)paketas)->baitų_skaičius;
}else if(func_code==MODBUS_FUNC_CODE_0F)
{
len = ((MODBUS_0F_PACKET*)paketas)->bit_num;
((MODBUS_0F_PACKET*)paketas)->baitų_skaičius = len/8+(len%8?1:0);
len = 9+((MODBUS_0F_PACKET*)paketas)->baitų_skaičius;
}Kitas
{
len = dydis(MODBUS_PAKETAS);
}
crc = crc16(paketas,len-2);
paketas[len-2] = (u8)(crc>>8);
paketas [len-1] = (u8) crc;
modbus_send_bytes(paketas,len);
modbus_send_interval = MODBUS_SEND_INTERVAL;
grąžinti 0;//Sėkmė
}
extern void modbus_msg_handler(u8 *msg,u16 msg_len);
void modbus_handler()
{
u16 crc;
if(!is_modbus_recv_complete)
grąžinti;
//Patikrinkite crc reikšmę
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 addr, u16 len)
{
paketas.slave_addr = SLAVE_ADDR;
packet.func_code = fkodas;//Funkcijos kodas
packet.start_addr = addr;//Adresas
packet.data_len = len;//Parašyta reikšmė
len = modbus_send_packet((u8*)&packet);
grįžti len;
}
Paskelbimo laikas: 2024-01-12