[Open Source]Intelligenter Schulungsraum

——Vom DWIN-Entwicklerforum

In dieser Ausgabe stellen wir Ihnen den preisgekrönten Open-Source-Fall des DWIN Developer Forums vor – den smarten Kultivierungsraum.Die Ingenieure implementierten den T5L-Smart-Screen zur Steuerung der Heiz- und Lüftertemperaturregelungsfunktionen über das Modbus-Protokoll.Die Stromversorgung kann auch angepasst werden, um die Beleuchtungsfunktion zu simulieren.Das System kann automatisch entsprechend den auf dem Bildschirm eingestellten Parametern laufen und Fehlerverlaufsaufzeichnungen speichern.

1.UI-Materialanzeige

asvdfb (2)
asvdfb (1)

2.UI-Design

asvdfb (3)

1.C51-Design

Die Hauptcodes zum Erfassen und Aktualisieren von Daten wie Temperatur, Luftfeuchtigkeit und Höhe auf der Hauptschnittstelle und zur Verwendung von Modbus RTU zur Steuerung von Temperatursteuermodulen, Motoren, Alarmerkennung und anderen Slave-Maschinen sind wie folgt

Hauptschnittstellencode-Referenz:

#include „main_win.h“

#include „modbus.h“

#include „sys_params.h“

#include „func_handler.h“

#include „uart2.h“

#enthalten

#enthalten

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

typedef struct{

Char-Datum[17];

u8 absteigend;

}ALARM;

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

u8 alarm_val[ALERT_BYTE_NUM] = {0};

u8 old_alert_val[ALERT_BYTE_NUM] = {0};

ALERT alarm_table[ALERT_TABLE_LEN];

u16 alarm_num = 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;

for(i=0;i

{

if(GET_ALERT_BIT(old_alert_val, i))

weitermachen;

if(GET_ALERT_BIT(alert_val, i))

{

if(alert_num>=ALERT_TABLE_LEN)

alarm_num = ALERT_TABLE_LEN-1;

alarm_table[alert_num].desc = i+1;

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

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

);

alarm_num++;

}

}

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

}

void main_win_disp_alert()

{

u16 i;

u16 val;

u16 len = 0;

common_buf[0] = 0;

for(i=0;i

{

Wert = 0;

wenn ich

{

val = alarm_table.desc;

len += sprintf(common_buf+len, "%s\r\n", warning_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

{

if(i==0)

weitermachen;

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

if(btn_val==0x0B)

{

main_win_disp_alert();

zurückkehren;

}

index = btn_val-1;

btn_sta[index] = !btn_sta[index];

if((index==3)||(index==7))

btn_sta[index] = 1;

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

btn_val = btn_sta[index];

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

if(index==9)

is_main_win = 0;

sonst if((index==3)||(index==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(!is_main_win)

zurückkehren;

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

Versatz += 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

{

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

Versatz += 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]);

Versatz += 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;//Zurücksetzen

}

void main_win_handler()

{

statisches u8-Flag = 0;

if(is_main_win)

{

if(alert_read_period==ALERT_READ_PERIOD)

{

alarm_read_period = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

zurückkehren;

}

if(date_update_period==DATE_UPDATE_PERIOD)

{

date_update_period = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

zurückkehren;

}

flag = !flag;

if(flag)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

anders

main_win_read_temp_hum();

}

}

Modbus-RTU-Code-Referenz:

#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

statisches Bit is_modbus_recv_complete = 0;

static u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;//Gesamtlänge der akzeptierten Bytes

static u8 modbus_recv_timeout = 0;//Überlaufzeit akzeptieren

statisch flüchtig u16 modbus_send_interval = 0;

MODBUS_PACKET-Paket;

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

zurückkehren;

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

{

u16 len;

u16 crc;

u8 func_code = packet[1];

while(modbus_send_interval);

if(func_code==MODBUS_FUNC_CODE_10)

{

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

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

}else if(func_code==MODBUS_FUNC_CODE_0F)

{

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

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

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

}anders

{

len = sizeof(MODBUS_PACKET);

}

crc = crc16(packet,len-2);

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

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

modbus_send_bytes(packet,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

return 0;//Erfolg

}

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

void modbus_handler()

{

u16 crc;

if(!is_modbus_recv_complete)

zurückkehren;

//Crc-Wert prüfen

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

packet.start_addr = addr;//Adresse

packet.data_len = len;//Wert geschrieben

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

return len;

}


Zeitpunkt der Veröffentlichung: 12. Januar 2024