——از انجمن توسعه دهندگان DWIN
در این شماره، کیس منبع باز انجمن توسعه دهندگان DWIN - اتاق کشت هوشمند را به شما معرفی می کنیم. مهندسان صفحه نمایش هوشمند T5L را برای کنترل عملکردهای گرمایش و کنترل دمای فن از طریق پروتکل Modbus پیاده سازی کردند. منبع تغذیه را نیز می توان برای شبیه سازی عملکرد روشنایی تنظیم کرد. سیستم می تواند به طور خودکار مطابق با پارامترهای تنظیم شده روی صفحه اجرا شود و سوابق تاریخچه خطا را ذخیره کند.
1.UI Material Display
![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
1.C51 طراحی
کدهای اصلی برای به دست آوردن و به روز رسانی داده هایی مانند دما، رطوبت و ارتفاع در رابط اصلی و استفاده از modbus rtu برای کنترل ماژول های کنترل دما، موتورها، تشخیص هشدار و سایر ماشین های برده به شرح زیر است.
مرجع کد رابط اصلی:
#include "main_win.h"
#include "modbus.h"
#include "sys_params.h"
#include "func_handler.h"
#شامل "uart2.h"
#عبارتند از
#عبارتند از
#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{
تاریخ char[17];
u8 desc;
}هشدار؛
#define ALERT_TABLE_LEN 20
ثابت u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};
ثابت 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 alert_num = 0;
بیت is_main_win = 0;
void main_win_update()
{
}
void main_win_disp_date()
{
فقط u8
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;
برای (i=0;i
{
if(GET_ALERT_BIT(alert_alert_val، i))
ادامه هید؛
if(GET_ALERT_BIT(alert_val، i))
{
if(alert_num>=ALERT_TABLE_LEN)
alert_num = ALERT_TABLE_LEN-1;
alert_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]
)
alert_num++;
}
}
memcpy(old_alert_val، alert_val، sizeof(alert_val));
}
void main_win_disp_alert()
{
u16 و
با u16;
فقط u16 = 0;
common_buf[0] = 0;
برای (i=0;i
{
val = 0;
اگر من
{
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);
برای (i=0;i
{
if(i==0)
ادامه هید؛
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;
if(btn_val==0x0B)
{
main_win_disp_alert();
برگشت؛
}
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;
else 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;
msg_len = msg_len;
if(!is_main_win)
برگشت؛
if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_VAL_MAX_NUM*2))
{
افست = MODBUS_RESPOND_POS_DATA.
برای (i=0;i
{
main_win_val = SYS_GET_U16(msg[offset], msg[offset+1]);
افست += 2;
}
main_win_update();
}دیگر اگر((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))
{
افست = MODBUS_RESPOND_POS_DATA.
برای (i=0;i
{
alert_val = msg[offset];
افست ++;
}
main_win_process_alert();
}در غیر این صورت((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))
{
افست = MODBUS_RESPOND_POS_DATA.
برای (i=0;i
{
temp_hum_val = SYS_GET_U16(msg[offset], msg[offset+1]);
افست += 2;
modbus_write_word(5+i، temp_hum_val);
}
main_win_update();
}دیگر اگر ((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))
{
افست = MODBUS_RESPOND_POS_DATA.
برای (i=0;i
{
date_val = SYS_GET_U16(msg[offset], msg[offset+1]);
افست += 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;//Revert
}
void main_win_handler()
{
پرچم ثابت u8 = 0;
if (is_main_win)
{
if(alert_read_period==ALERT_READ_PERIOD)
{
alert_read_period = 0;
modbus_read_bits(510، ALERT_BIT_MAX_NUM);
برگشت؛
}
if(date_update_period==DATE_UPDATE_PERIOD)
{
date_update_period = 0;
modbus_read_words(180، MAIN_WIN_DATE_MAX_NUM);
برگشت؛
}
پرچم = !flag;
اگر (پرچم)
modbus_read_words(0، MAIN_WIN_VAL_MAX_NUM);
دیگر
main_win_read_temp_hum();
}
}
مرجع کد modbus rtu:
#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
#تعریف UART_BAUD 9600
#define MODBUS_RECV_TIMEOUT (u8) (35000.0f/UART_BAUD+2)
#define MODBUS_SEND_INTERVAL 150
#include UART_INCLUDE
بیت استاتیک is_modbus_recv_complete = 0;
static u8 modbus_recv_buff[270];
static u16 modbus_recv_len = 0;//طول کل بایت ها پذیرفته شد
static u8 modbus_recv_timeout = 0;//زمان سرریز را بپذیرید
static volatile u16 modbus_send_interval = 0;
بسته MODBUS_PACKET؛
void modbus_init()
{
UART_INIT(UART_BAUD)؛
}
void modbus_send_bytes (u8 *bytes,u16 len)
{
UART_SEND_BYTES (بایت، لن)؛
}
void modbus_recv_byte (u8 بایت)
{
if(is_modbus_recv_complete)
برگشت؛
if(modbus_recv_len
modbus_recv_buff[modbus_recv_len++] = بایت;
}
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 *packet)
{
فقط u16؛
u16 crc;
u8 func_code = بسته[1];
while(modbus_send_interval);
if(func_code==MODBUS_FUNC_CODE_10)
{
((MODBUS_10_PACKET*)بسته)->بایت_تعداد = ((MODBUS_10_PACKET*)بسته)->تعداد_word*2;
len = 9+((MODBUS_10_PACKET*)بسته)->بایت_تعداد;
}elle if(func_code==MODBUS_FUNC_CODE_0F)
{
len = ((MODBUS_0F_PACKET*)بسته)->bit_num;
((MODBUS_0F_PACKET*)بسته)->بایت_تعداد = len/8+(len%8?1:0);
len = 9+((MODBUS_0F_PACKET*)بسته)->بایت_تعداد;
}دیگر
{
len = sizeof(MODBUS_PACKET)؛
}
crc = crc16 (packet,len-2);
بسته[len-2] = (u8)(crc>>8);
بسته[len-1] = (u8)crc;
modbus_send_bytes (packet,len);
modbus_send_interval = MODBUS_SEND_INTERVAL;
بازگشت 0؛//موفقیت
}
extern void modbus_msg_handler(u8 *msg,u16 msg_len);
void modbus_handler()
{
u16 crc;
if(!is_modbus_recv_complete)
برگشت؛
//مقدار crc را بررسی کنید
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 adr، u16 len)
{
packet.slave_addr = SLAVE_ADDR;
packet.func_code = fcode;//کد تابع
packet.start_addr = adr;//آدرس
packet.data_len = len;//مقدار نوشته شده است
len = modbus_send_packet((u8*)&packet);
بازگشت لن;
}
زمان ارسال: ژانویه-12-2024