[Ачык булак]Интеллектуалдык машыгуу бөлмөсү

——DWIN иштеп чыгуучулар форумунан

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

1.UI Материалдык дисплей

asvdfb (2)
asvdfb (1)

2.UI дизайны

asvdfb (3)

1.C51 Дизайн

Негизги интерфейстеги температура, нымдуулук жана бийиктик сыяктуу маалыматтарды алуу жана жаңыртуу жана температураны башкаруу модулдарын, моторлорду, сигнализацияны аныктоону жана башка кул машиналарды башкаруу үчүн modbus rtu колдонуунун негизги коддору төмөнкүдөй

Негизги интерфейс кодунун шилтемеси:

#include "main_win.h"

#include "modbus.h"

#include "sys_params.h"

#include "func_handler.h"

#include "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 desc;

}ALERT;

#SAYGI_ТАБЛИЦИ_ТАБЛИЦИН 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;

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

{

эгерде(GET_ALERT_BIT(eski_alert_val, i))

улантуу;

эгерде(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(эски_аскердик_вал, эскертүү_валь, sizeof(эскертүү_валь));

}

void main_win_disp_alert()

{

u16 i;

u16 val;

u16 len = 0;

common_buf[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);

}

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)

улантуу;

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

кайтаруу;

}

индекс = 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[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;

for(i=0;i

{

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

офсет += 2;

}

main_win_update();

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

{

офсет = 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))

{

офсет = 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();

}else if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

офсет = MODBUS_RESPOND_POS_DATA;

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

{

эгерде(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"

#аныктоо 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 аныктайт

#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;//Ашыкча убакытты кабыл алуу

статикалык туруксуз u16 modbus_send_interval = 0;

MODBUS_PACKET пакети;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

void modbus_send_bytes(u8 *байт, u16 лен)

{

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 *пакет)

{

u16 len;

u16 crc;

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

while(modbus_send_interval);

if(func_code==MODBUS_FUNC_CODE_10)

{

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

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

}else if(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*)пакет)->байт_саны;

}башка

{

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;

if(!is_modbus_recv_complete)

кайтаруу;

//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-жылдын 12-январына чейин