—— DWIN ڊولپر فورم کان
هن شماري ۾، اسان توهان کي متعارف ڪرايون ٿا انعام کٽڻ وارو اوپن سورس ڪيس DWIN ڊولپر فورم جو - سمارٽ پوکڻ وارو ڪمرو. انجنيئرن T5L سمارٽ اسڪرين کي لاڳو ڪيو حرارتي ڪنٽرول ۽ فين جي درجه حرارت ڪنٽرول افعال کي Modbus پروٽوڪول ذريعي. بجلي جي فراهمي کي پڻ ترتيب ڏئي سگهجي ٿو روشني جي فنڪشن کي ترتيب ڏيڻ لاء. سسٽم خودڪار طريقي سان هلائي سگھي ٿو اسڪرين تي مقرر ڪيل پيٽرولن جي مطابق ۽ غلطي جي تاريخ رڪارڊ محفوظ ڪري سگھي ٿو.
1.UI مواد ڊسپلي
![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 استعمال ڪندي هن ريت آهن.
مکيه انٽرفيس ڪوڊ حوالو:
#شامل "main_win.h"
#شامل "modbus.h"
#شامل "sys_params.h"
#شامل "func_handler.h"
#شامل "uart2.h"
#شامل
#شامل
# تعريف ڪريو TEMP_HUM_SLAVE_ADDR 2
# وضاحت ڪريو TEMP_HUM_VAL_MAX_NUM 2
وضاحت ڪريو ALERT_BIT_MAX_NUM 30
# وضاحت ڪريو ALERT_BYTE_NUM (ALERT_BIT_MAX_NUM/8+((ALERT_BIT_MAX_NUM%8)!=0))
وضاحت ڪريو GET_ALERT_BIT(val, pos) ((val[pos/8]>>(pos%8))&0x01)
ٽائپ ڊيف ساخت{
چار تاريخ[17]؛
u8 desc؛
خبردار؛
وضاحت ڪريو 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؛
bit 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])؛
عام_بف[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
{
جيڪڏھن (GET_ALERT_BIT(old_alert_val, i))
جاري رکو
جيڪڏھن(GET_ALERT_BIT(alert_val, i))
{
جيڪڏھن (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؛
عام_بف[0] = 0؛
لاءِ (i = 0؛ i
{
ويل = 0؛
جيڪڏهن (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);
}
عام_بف[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
{
جيڪڏهن (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 انڊيڪس؛
جيڪڏهن (btn_val== 0x0B)
{
main_win_disp_alert()؛
واپسي؛
}
انڊيڪس = btn_val-1؛
btn_sta[index] = !btn_sta[انڊيڪس]؛
جيڪڏهن((انڊيڪس==3)||(انڊيڪس==7))
btn_sta[انڊيڪس] = 1؛
modbus_write_bit(btn_addr[index], btn_sta[index]?0xFF00:0x0000)؛
btn_val = btn_sta[انڊيڪس]؛
sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*انڊيڪس، (u8*)&btn_val، 1)؛
جيڪڏهن (انڊيڪس==9)
is_main_win = 0؛
ٻيو جيڪڏهن((انڊيڪس==3)||(انڊيڪس==7))
{
جڏهن ته(sys_get_touch_sta())؛
modbus_write_bit(btn_addr[انڊيڪس]، 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؛
جيڪڏهن (! is_main_win)
واپسي؛
جيڪڏهن (f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_VAL_MAX_NUM*2))
{
offset = 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))
{
offset = MODBUS_RESPOND_POS_DATA؛
لاءِ (i = 0؛ i
{
alert_val = msg[آفسيٽ]؛
آفسیٹ ++؛
}
main_win_process_alert();
}ٻيو جيڪڏهن((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))
{
offset = 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))
{
offset = 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؛//واپسي
}
void main_win_handler()
{
جامد u8 پرچم = 0؛
جيڪڏھن (is_main_win)
{
جيڪڏهن (alert_read_period==ALERT_READ_PERIOD)
{
alert_read_period = 0;
modbus_read_bits(510, ALERT_BIT_MAX_NUM)؛
واپسي؛
}
جيڪڏهن (تاريخ_اپڊيٽ_پيريڊ==DATE_UPDATE_PERIOD)
{
date_update_period = 0؛
modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);
واپسي؛
}
پرچم = !پرچم؛
جيڪڏهن (پرچم)
modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);
ٻيو
main_win_read_temp_hum();
}
}
modbus rtu ڪوڊ حوالو:
#شامل "modbus.h"
#شامل "crc16.h"
#شامل "sys_params.h"
# وضاحت ڪريو UART_INCLUDE "uart2.h"
# define UART_INIT uart2_init
# define UART_SEND_BYTES uart2_send_bytes
# وضاحت ڪريو UART_BAUD 9600
# وضاحت ڪريو MODBUS_RECV_TIMEOUT (u8)(35000.0f/UART_BAUD+2)
# define MODBUS_SEND_INTERVAL 150
#UART_INCLUDE شامل ڪريو
جامد بٽ is_modbus_recv_complete = 0؛
جامد u8 modbus_recv_buff[270]؛
جامد u16 modbus_recv_len = 0؛// ڪل ڊگھائي بائيٽ قبول ڪئي وئي
جامد 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(bytes,len);
}
void modbus_recv_byte(u8 byte)
{
جيڪڏهن (is_modbus_recv_complete)
واپسي؛
جيڪڏهن (modbus_recv_len
modbus_recv_buff[modbus_recv_len++] = بائيٽ؛
}
void modbus_check_recv_timeout()
{
جيڪڏهن (modbus_recv_timeout)
{
modbus_recv_timeout--؛
جيڪڏهن (modbus_recv_timeout==0)
{
is_modbus_recv_complete = 1؛
}
}
}
u8 modbus_send_packet(u8 *packet)
{
u16 صرف؛
u16 crc؛
u8 func_code = پيڪٽ[1]؛
جڏهن ته (modbus_send_interval)؛
جيڪڏھن (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؛
} ٻي صورت ۾ (func_code==MODBUS_FUNC_CODE_0F)
{
len = ((MODBUS_0F_PACKET*)پيڪٽ)->bit_num؛
((MODBUS_0F_PACKET*)پيڪٽ)->byte_num = len/8+(len%8?1:0)؛
len = 9+((MODBUS_0F_PACKET*)پيڪٽ)->byte_num؛
} ٻيو
{
len = سائيز جو (MODBUS_PACKET)؛
}
crc = crc16 (پيڪٽ، لين-2)؛
packet[len-2] = (u8)(crc>>8)؛
packet[len-1] = (u8)crc؛
modbus_send_bytes (پيڪٽ، لين)؛
modbus_send_interval = MODBUS_Send_INTERVAL؛
واپسي 0؛// ڪاميابي
}
extern void modbus_msg_handler(u8 *msg,u16 msg_len)؛
void modbus_handler()
{
u16 crc؛
جيڪڏهن (! is_modbus_recv_complete)
واپسي؛
// CRC قدر چيڪ ڪريو
crc = ((u16)modbus_recv_buff[modbus_recv_len-2]
جيڪڏھن(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؛//فنڪشن ڪوڊ
packet.start_addr = addr؛// پتو
packet.data_len = len؛// قدر لکيل
len = modbus_send_packet((u8*)&packet)؛
واپسي لين؛
}
پوسٽ جو وقت: جنوري-12-2024