[Avoin lähdekoodi] Älykäs koulutushuone

——DWIN-kehittäjäfoorumista

Tässä numerossa esittelemme sinulle DWIN Developer Forumin palkitun avoimen lähdekoodin tapauksen - älykkään viljelyhuoneen. Insinöörit ottivat käyttöön T5L-älynäytön ohjaamaan lämmityksen ja tuulettimen lämpötilan säätötoimintoja Modbus-protokollan kautta. Virtalähdettä voidaan myös säätää simuloimaan valaistustoimintoa. Järjestelmä voi toimia automaattisesti näytölle asetettujen parametrien mukaisesti ja tallentaa vikahistoriatiedot.

1. Käyttöliittymän materiaalinäyttö

asvdfb (2)
asvdfb (1)

2. Käyttöliittymän suunnittelu

asvdfb (3)

1.C51 Suunnittelu

Tärkeimmät koodit tietojen, kuten lämpötilan, kosteuden ja korkeuden, hankkimiseen ja päivittämiseen päärajapinnassa sekä modbus rtu:n käyttämiseen lämpötilansäätömoduulien, moottoreiden, hälytyksen havaitsemisen ja muiden orjakoneiden ohjaamiseen ovat seuraavat.

Pääliittymäkoodin viite:

#include "main_win.h"

#include "modbus.h"

#include "sys_params.h"

#include "func_handler.h"

#include "uart2.h"

#sisältää

#sisältää

#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(arvo, pos) ((val[pos/8]>>(pos%8))&0x01)

typedef struct{

merkkipäivämäärä[17];

u8 desc;

}VAROITUS;

#define ALERT_TABLE_LEN 20

staattinen u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

staattinen 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 date_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 hälytysnumero = 0;

bitti on_päävoitto = 0;

void main_win_update()

{

}

void main_win_disp_date()

{

vain u8;

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

yhteinen_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(vanha_hälytys_arvo, i))

jatkaa;

if(GET_ALERT_BIT(alert_val, i))

{

if(alert_num>=ALERT_TABLE_LEN)

hälytysnumero = ALERT_TABLE_PITO-1;

hälytystaulukko[hälytyksen_numero].desc = i+1;

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

päivämäärä_valmius[0], päivämäärä_valmius[1], päivämäärä_valmius[2], päivämäärä_valmius[3], päiväyspäivämäärä[4]

);

hälytysnumero++;

}

}

memcpy(vanha_hälytys_arvo, hälytysarvo, koko(hälytys_arvo));

}

void main_win_disp_alert()

{

u16 ja;

u16:n kanssa;

vain u16 = 0;

yhteinen_buf[0] = 0;

for(i=0;i

{

val = 0;

jos minä

{

val = hälytys_taulukko.desc;

len += sprintf(common_buf+len, "%s\r\n", hälytystaulukko.päivämäärä);

}

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

}

yhteinen_buf[len+1] = 0;

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

}

void main_win_init()

{

float kiinteä_arvo;

u8 i;

on_päävoitto = 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

{

jos(i==0)

jatkaa;

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

}

kiinteä_arvo = 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-indeksi;

if(btn_val==0x0B)

{

main_win_disp_alert();

palata;

}

indeksi = btn_val-1;

btn_sta[indeksi] = !btn_sta[indeksi];

if((indeksi==3)||(indeksi==7))

btn_sta[indeksi] = 1;

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

btn_val = btn_sta[indeksi];

sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*indeksi, (u8*)&btn_arvo, 1);

jos(indeksi==9)

on_päävoitto = 0;

muuten jos((indeksi==3)||(indeksi==7))

{

while(sys_get_touch_sta());

modbus_write_bit(btn_addr[index], 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 offset;

msg_len = msg_len;

if(!on_main_win)

palata;

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

{

offset = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

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

offset += 2;

}

main_win_update();

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

{

offset = 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))

{

offset = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

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

offset += 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;

for(i=0;i

{

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

offset += 2;

}

main_win_disp_date();

}

}

void main_win_read_temp_hum()

{

u8 old_slave_addr = SLAVE_OSOITE;

        

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;//Palauta

}

void main_win_handler()

{

staattinen u8-lippu = 0;

if(on_main_win)

{

if(hälytys_lukujakso==VAROITUSLUETTAJAKAUSI)

{

hälytys_lukujakso = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

palata;

}

if(päivämäärä_päivitysjakso==PÄIVÄYS_PÄIVITYSkausi)

{

päivämäärä_päivitysjakso = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

palata;

}

lippu = !lippu;

jos (lippu)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

muu

main_win_read_temp_hum();

}

}

modbus rtu koodin viite:

#include "modbus.h"

#include "crc16.h"

#include "sys_params.h"

#define UART_SISÄLTÄ "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

staattinen bitti on_modbus_recv_complete = 0;

staattinen u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;//Tavujen kokonaispituus hyväksytty

static u8 modbus_recv_timeout = 0;//Hyväksy ylivuotoaika

staattinen haihtuva u16 modbus_send_interval = 0;

MODBUS_PACKET-paketti;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

void modbus_send_bytes(u8 *tavua,u16 len)

{

UART_SEND_BYTES(tavua,len);

}

void modbus_recv_byte(u8 tavu)

{

if(on_modbus_recv_complete)

palata;

if(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = tavu;

}

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

{

vain u16;

u16 crc;

u8 func_code = paketti[1];

while(modbus_send_interval);

if(toimintokoodi==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PAKETTI*)paketti)->tavun_numero = ((MODBUS_10_PAKETTI*)paketti)->sanan_numero*2;

len = 9+((MODBUS_10_PAKETTI*)paketti)->tavun_numero;

}else if(func_code==MODBUS_FUNC_CODE_0F)

{

len = ((MODBUS_0F_PACKET*)paketti)->bitin_num;

((MODBUS_0F_PAKETTI*)paketti)->tavun_määrä = len/8+(len%8?1:0);

len = 9+((MODBUS_0F_PACKET*)paketti)->tavun_numero;

}muu

{

len = koko(MODBUS_PAKETTI);

}

crc = crc16(paketti,len-2);

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

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

modbus_send_bytes(paketti,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

palauttaa 0;//Onnistui

}

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

void modbus_handler()

{

u16 crc;

if(!is_modbus_recv_complete)

palata;

//Tarkista crc-arvo

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)

{

paketti.slave_addr = SLAVE_OSOITE;

packet.func_code = fcode;//Toimintokoodi

packet.start_addr = addr;//Osoite

packet.data_len = len;//Kirjoitettu arvo

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

palata len;

}


Postitusaika: 12.1.2024