[ਓਪਨ ਸੋਰਸ] ਇੰਟੈਲੀਜੈਂਟ ਟ੍ਰੇਨਿੰਗ ਰੂਮ

——DWIN ਡਿਵੈਲਪਰ ਫੋਰਮ ਤੋਂ

ਇਸ ਅੰਕ ਵਿੱਚ, ਅਸੀਂ ਤੁਹਾਡੇ ਲਈ DWIN ਡਿਵੈਲਪਰ ਫੋਰਮ - ਸਮਾਰਟ ਕਲਟੀਵੇਸ਼ਨ ਰੂਮ ਦੇ ਅਵਾਰਡ ਜੇਤੂ ਓਪਨ ਸੋਰਸ ਕੇਸ ਬਾਰੇ ਜਾਣੂ ਕਰਵਾਉਂਦੇ ਹਾਂ।ਇੰਜੀਨੀਅਰਾਂ ਨੇ ਮਾਡਬਸ ਪ੍ਰੋਟੋਕੋਲ ਦੁਆਰਾ ਹੀਟਿੰਗ ਅਤੇ ਫੈਨ ਤਾਪਮਾਨ ਨਿਯੰਤਰਣ ਫੰਕਸ਼ਨਾਂ ਨੂੰ ਨਿਯੰਤਰਿਤ ਕਰਨ ਲਈ T5L ਸਮਾਰਟ ਸਕ੍ਰੀਨ ਨੂੰ ਲਾਗੂ ਕੀਤਾ।ਲਾਈਟਿੰਗ ਫੰਕਸ਼ਨ ਦੀ ਨਕਲ ਕਰਨ ਲਈ ਪਾਵਰ ਸਪਲਾਈ ਨੂੰ ਵੀ ਐਡਜਸਟ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।ਸਿਸਟਮ ਆਪਣੇ ਆਪ ਹੀ ਸਕਰੀਨ 'ਤੇ ਸੈੱਟ ਕੀਤੇ ਪੈਰਾਮੀਟਰਾਂ ਦੇ ਅਨੁਸਾਰ ਚੱਲ ਸਕਦਾ ਹੈ ਅਤੇ ਨੁਕਸ ਇਤਿਹਾਸ ਰਿਕਾਰਡ ਨੂੰ ਸੁਰੱਖਿਅਤ ਕਰ ਸਕਦਾ ਹੈ।

1.UI ਸਮੱਗਰੀ ਡਿਸਪਲੇ

asvdfb (2)
asvdfb (1)

2.UI ਡਿਜ਼ਾਈਨ

asvdfb (3)

1.C51 ਡਿਜ਼ਾਈਨ

ਮੁੱਖ ਇੰਟਰਫੇਸ 'ਤੇ ਤਾਪਮਾਨ, ਨਮੀ ਅਤੇ ਉਚਾਈ ਵਰਗੇ ਡੇਟਾ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਨ ਅਤੇ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਮੁੱਖ ਕੋਡ, ਅਤੇ ਤਾਪਮਾਨ ਕੰਟਰੋਲ ਮੋਡੀਊਲ, ਮੋਟਰਾਂ, ਅਲਾਰਮ ਖੋਜ ਅਤੇ ਹੋਰ ਸਲੇਵ ਮਸ਼ੀਨਾਂ ਨੂੰ ਨਿਯੰਤਰਿਤ ਕਰਨ ਲਈ ਮਾਡਬਸ ਆਰਟੀਯੂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਹੇਠ ਲਿਖੇ ਅਨੁਸਾਰ ਹਨ।

ਮੁੱਖ ਇੰਟਰਫੇਸ ਕੋਡ ਦਾ ਹਵਾਲਾ:

# "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 struct{

ਚਾਰ ਮਿਤੀ [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_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()

{

u8i;

ਲਈ(i=0;i

{

if(GET_ALERT_BIT(ਪੁਰਾਣਾ_ਅਲਰਟ_ਵਾਲ, 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 i;

u16 val;

u16 len = 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()

{

ਫਲੋਟ fixed_val;

u8i;

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[index];

ਜੇਕਰ((ਸੂਚੀ==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[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];

u8i;

u8 ਆਫਸੈੱਟ;

msg_len = msg_len;

ਜੇਕਰ(! is_main_win)

ਵਾਪਸੀ;

ਜੇਕਰ((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[ਆਫਸੈੱਟ];

ਆਫਸੈੱਟ++;

}

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;//ਵਾਪਸ

}

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

ਸਥਿਰ u16 modbus_recv_len = 0;// ਬਾਈਟਾਂ ਦੀ ਕੁੱਲ ਲੰਬਾਈ ਸਵੀਕਾਰ ਕੀਤੀ ਗਈ

ਸਥਿਰ u8 modbus_recv_timeout = 0;// ਓਵਰਫਲੋ ਸਮਾਂ ਸਵੀਕਾਰ ਕਰੋ

ਸਥਿਰ ਅਸਥਿਰ 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(ਬਾਈਟ, len);

}

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

ਜੇਕਰ(modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *ਪੈਕੇਟ)

{

u16 len;

u16 crc;

u8 func_code = ਪੈਕੇਟ[1];

ਜਦਕਿ(modbus_send_interval);

ਜੇਕਰ(func_code==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET*)ਪੈਕੇਟ)->byte_num = ((MODBUS_10_PACKET*)ਪੈਕੇਟ)->word_num*2;

len = 9+((MODBUS_10_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 = sizeof(MODBUS_PACKET);

}

crc = crc16 (ਪੈਕੇਟ, len-2);

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

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

modbus_send_bytes (ਪੈਕੇਟ, len);

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]<<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;//ਫੰਕਸ਼ਨ ਕੋਡ

packet.start_addr = addr;//ਪਤਾ

packet.data_len = len;//ਮੁੱਲ ਲਿਖਿਆ ਗਿਆ

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

ਵਾਪਸੀ len;

}


ਪੋਸਟ ਟਾਈਮ: ਜਨਵਰੀ-12-2024