[Нээлттэй эх сурвалж]Ухаалаг сургалтын өрөө

——DWIN хөгжүүлэгчдийн форумаас

Энэ дугаарт бид та бүхэнд DWIN хөгжүүлэгч форумын шагналт нээлттэй эхийн хэрэглүүр буюу ухаалаг тариалалтын өрөөг танилцуулж байна.Инженерүүд T5L ухаалаг дэлгэцийг Modbus протоколоор дамжуулан халаалт болон сэнсний температурын хяналтын функцийг хянах зорилгоор нэвтрүүлсэн.Мөн гэрэлтүүлгийн функцийг дуурайхын тулд цахилгаан хангамжийг тохируулж болно.Систем нь дэлгэцэн дээр тавьсан параметрийн дагуу автоматаар ажиллаж, гэмтлийн түүхийг хадгалах боломжтой.

1.UI материалын дэлгэц

asvdfb (2)
asvdfb (1)

2. UI дизайн

asvdfb (3)

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)

typedef бүтэц{

тэмдэгтийн огноо[17];

u8 бууруулах;

}ALERT;

#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_LEN];

u16 alert_num = 0;

bit is_main_win = 0;

main_win_update () хүчингүй

{

}

main_win_disp_date () хүчингүй

{

u8 len;

len = sprintf(нийтлэг_buf, "%u:%u", (u16) огнооны_хугацаа [3], (u16) огнооны_хугацаа[4]);

нийтлэг_буф[len+1] = 0;

sys_write_vp(MAIN_WIN_DATE_VP, нийтлэг_buf, len/2+2);

}

хүчингүй болгох main_win_process_alert()

{

u8 i;

for(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;

дохиоллын_хүснэгт[алert_num].desc = i+1;

sprintf(анхаарлын_хүснэгт[alert_num].огноо, "%u/%u/%u %u:%u",

огноо_тооцоо[0], огноо_тооцоо[1], огноо_тооцоо[2], огноо_тооцоо[3], огноо_үнэ[4]

);

дохионы_тоо++;

}

}

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

}

void main_win_disp_alert()

{

u16 i;

u16 вал;

u16 len = 0;

нийтлэг_буф[0] = 0;

for(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);

}

нийтлэг_буф[len+1] = 0;

sys_write_vp(ALERT_WIN_DATE_VP, нийтлэг_buf, len/2+2);

}

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

{

хэрэв(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*)&зассан_валь, 2);

}

main_win_click_handler (u16 btn_val) хүчингүй болсон

{

u8 индекс;

хэрэв(btn_val==0x0B)

{

main_win_disp_alert();

буцаах;

}

индекс = btn_val-1;

btn_sta[индекс] = !btn_sta[индекс];

if((индекс==3)||(индекс==7))

btn_sta[индекс] = 1;

modbus_write_bit(btn_addr[индекс], btn_sta[индекс]?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;

else if((индекс==3)||(индекс==7))

{

while(sys_get_touch_sta());

modbus_write_bit(btn_addr[индекс], 0x0000);

}

}

void main_win_msg_handler(u8 *msg,u16 msg_len)

{

u8 f_code = мессеж[MODBUS_RESPOND_POS_FUNC_CODE];

u8 data_len = мессеж[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;

for(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;

for(i=0;i

{

alert_val = мессеж[офсет];

офсет++;

}

main_win_process_alert();

}өөрөөр байвал((f_code==MODBUS_FUNC_CODE_03)&(өгөгдлийн_лен==TEMP_HUM_VAL_MAX_NUM*2))

{

офсет = MODBUS_RESPOND_POS_DATA;

for(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)&(дата_лен==MAIN_WIN_DATE_MAX_NUM*2))

{

офсет = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

date_val = SYS_GET_U16(msg[офсет], мессеж[офсет+1]);

офсет += 2;

}

main_win_disp_date();

}

}

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;

хэрэв (үндсэн_ялалт)

{

хэрэв(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"-г тодорхойлох

#UART_INIT uart2_init-ийг тодорхойлно

#UART_SEND_BYTES uart2_send_bytes-ийг тодорхойлох

#UART_BAUD 9600-г тодорхойлох

# MODBUS_RECV_TIMEOUT (u8)(35000.0f/UART_BAUD+2)-г тодорхойлох

#MODBUS_SEND_INTERVAL 150-г тодорхойлох

#UART_INCLUDE орно

статик бит is_modbus_recv_complete = 0;

статик u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;//Хүлээн зөвшөөрөгдсөн байтуудын нийт урт

static u8 modbus_recv_timeout = 0;//Хилжих хугацааг хүлээн зөвшөөрөх

статик тогтворгүй u16 modbus_send_interval = 0;

MODBUS_PACKET багц;

хүчингүй modbus_init()

{

UART_INIT(UART_BAUD);

}

хүчингүй бол modbus_send_bytes(u8 *bytes,u16 len)

{

UART_SEND_BYTES(байт,лен);

}

хүчингүй болгох modbus_recv_byte(u8 байт)

{

хэрэв(modbus_recv_бүрэн бол)

буцаах;

хэрэв(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = байт;

}

хүчингүй болсон modbus_check_recv_timeout()

{

хэрэв (modbus_recv_timeout)

{

modbus_recv_timeout--;

хэрэв(modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *пакет)

{

u16 len;

u16 crc;

u8 func_code = пакет[1];

while(modbus_send_interval);

хэрэв(функцийн_код==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET*)пакет)->байт_тоо = ((MODBUS_10_PACKET*)пакет)->word_num*2;

len = 9+((MODBUS_10_PACKET*)пакет)->байт_тоо;

}өөрөөр байвал(функийн_код==MODBUS_FUNC_CODE_0F)

{

len = ((MODBUS_0F_PACKET*)пакет)->бит_тоо;

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

len = 9+((MODBUS_0F_PACKET*)пакет)->байт_тоо;

} өөр

{

len = sizeof(MODBUS_PACKET);

}

crc = crc16(пакет, лен-2);

пакет[len-2] = (u8)(crc>>8);

пакет[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;

хэрэв(!modbus_recv_бүрэн)

буцаах;

//crc утгыг шалгана уу

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;//Функцийн код

paket.start_addr = хаяг;//Хаяг

packet.data_len = len;//Утга бичигдсэн

len = modbus_send_packet((u8*)&пакет);

буцах лен;

}


Шуудангийн цаг: 2024 оны 1-р сарын 12-ны хооронд