[ઓપન સોર્સ]બુદ્ધિશાળી તાલીમ ખંડ

——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 સ્ટ્રક્ચર{

ચાર તારીખ[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()

{

}

રદબાતલ main_win_disp_date()

{

u8 લેન;

len = sprintf(common_buf, "%u:%u", (u16)date_val[3], (u16)date_val[4]);

સામાન્ય_બફ[લેન+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(જૂની_ચેતવણી_વાલ, i))

ચાલુ રાખો

જો(GET_ALERT_BIT(ચેતવણી_વાલ, i))

{

જો(ચેતવણી_સંખ્યા>=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]

);

ચેતવણી_સંખ્યા++;

}

}

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

}

void main_win_disp_alert()

{

u16 i;

u16 val;

u16 લેન = 0;

સામાન્ય_બફ[0] = 0;

માટે(i=0;i

{

val = 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);

}

સામાન્ય_બફ[લેન+1] = 0;

sys_write_vp(ALERT_WIN_DATE_VP, common_buf, len/2+2);

}

void main_win_init()

{

ફ્લોટ 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[ઇન્ડેક્સ] = !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))

{

ઑફસેટ = 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;

મોડબસ_રીડ_વર્ડ્સ(0, TEMP_HUM_VAL_MAX_NUM);

sys_params.user_config[5] = old_slave_addr;//Revert

}

void main_win_handler()

{

સ્ટેટિક u8 ફ્લેગ = 0;

જો(મુખ્ય_જીત)

{

જો (ચેતવણી_રીડ_પીરિયડ==ALERT_READ_PERIOD)

{

alert_read_period = 0;

મોડબસ_રીડ_બિટ્સ(510, ALERT_BIT_MAX_NUM);

પરત

}

જો(તારીખ_અપડેટ_પીરિયડ==DATE_UPDATE_PERIOD)

{

date_update_period = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

પરત

}

ધ્વજ = !ધ્વજ;

જો (ધ્વજ)

મોડબસ_રીડ_વર્ડ્સ(0, MAIN_WIN_VAL_MAX_NUM);

બીજું

main_win_read_temp_hum();

}

}

મોડબસ આરટીયુ કોડ સંદર્ભ:

# "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(બાઇટ્સ,લેન);

}

void modbus_recv_byte(u8 બાઈટ)

{

જો(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 મોડબસ_સેન્ડ_પેકેટ(u8 *પેકેટ)

{

u16 લેન;

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;

લેન = 9+((MODBUS_10_PACKET*)પેકેટ)->બાઇટ_નંમ;

}અન્ય જો(func_code==MODBUS_FUNC_CODE_0F)

{

len = ((MODBUS_0F_PACKET*)પેકેટ)->bit_num;

((MODBUS_0F_PACKET*)પેકેટ)->byte_num = len/8+(len%8?1:0);

લેન = 9+((MODBUS_0F_PACKET*)પેકેટ)->બાઇટ_નંમ;

}બીજું

{

len = sizeof(MODBUS_PACKET);

}

crc = crc16(પેકેટ, len-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);

રદબાતલ મોડબસ_હેન્ડલર()

{

u16 crc;

જો(!is_modbus_recv_complete)

પરત

// crc મૂલ્ય તપાસો

crc = ((u16)modbus_recv_buff[modbus_recv_len-2]<<8)+modbus_recv_buff[modbus_recv_len-1];

જો(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;//મૂલ્ય લખેલું

લેન = મોડબસ_સેન્ડ_પેકેટ((u8*)&પેકેટ);

પરત લેન;

}


પોસ્ટ સમય: જાન્યુઆરી-12-2024