[Open Source] ဉာဏ်ရည်ဉာဏ်သွေး လေ့ကျင့်ရေးခန်း

—— DWIN Developer Forum မှ

ဤစာစောင်တွင်၊ စမတ်စိုက်ပျိုးရေးအခန်းဖြစ်သည့် DWIN Developer Forum ၏ ဆုရ open source case ကို သင့်အား မိတ်ဆက်ပေးအပ်ပါသည်။အင်ဂျင်နီယာများသည် Modbus ပရိုတိုကောမှတစ်ဆင့် အပူနှင့် ပန်ကာအပူချိန်ထိန်းချုပ်မှု လုပ်ဆောင်ချက်များကို ထိန်းချုပ်ရန်အတွက် T5L စမတ်စခရင်ကို အကောင်အထည်ဖော်ခဲ့သည်။အလင်းရောင်လုပ်ဆောင်ချက်ကို အတုယူရန် ပါဝါထောက်ပံ့မှုကိုလည်း ချိန်ညှိနိုင်သည်။စနစ်သည် စခရင်ပေါ်ရှိ သတ်မှတ်ဘောင်များအတိုင်း အလိုအလျောက်လည်ပတ်နိုင်ပြီး အမှားမှတ်တမ်းမှတ်တမ်းများကို သိမ်းဆည်းနိုင်သည်။

1.UI Material Display

asvdfb (၂)၊
asvdfb (၁)၊

2.UI ဒီဇိုင်း

asvdfb (၃)၊

1.C51 ဒီဇိုင်း

ပင်မအင်တာဖေ့စ်ပေါ်ရှိ အပူချိန်၊ စိုထိုင်းဆနှင့် အမြင့်ပေများကဲ့သို့သော ဒေတာရယူခြင်းနှင့် အပ်ဒိတ်လုပ်ခြင်းအတွက် အဓိကကုဒ်များ၊ အပူချိန်ထိန်းချုပ်မှု modules၊ motors၊ alarm detection နှင့် အခြားသော slave စက်များကို ထိန်းချုပ်ရန်အတွက် modbus rtu ကိုအသုံးပြုခြင်းမှာ အောက်ပါအတိုင်းဖြစ်သည်။

ပင်မအင်တာဖေ့စ်ကုဒ်ကိုးကား-

#"main_win.h" ပါဝင်သည်

# "modbus.h" ပါဝင်သည်

# "sys_params.h" ပါဝင်သည်

#"func_handler.h" ပါဝင်သည်

#"uart2.h" ပါဝင်သည်

#ပါဝင်ပါတယ်။

#ပါဝင်ပါတယ်။

#သတ်မှတ် TEMP_HUM_SLAVE_ADDR ၂

#သတ်မှတ် TEMP_HUM_VAL_MAX_NUM ၂

#define ALERT_BIT_MAX_NUM 30

#define ALERT_BYTE_NUM (ALERT_BIT_MAX_NUM/8+((ALERT_BIT_MAX_NUM%8)!=0))

#define GET_ALERT_BIT(val၊ pos) ((val[pos/8]>>(pos%8))&0x01)

typedef struct{

Char date[17];

u8 desc;

}သတိပေးချက်

#Define ALERT_TABLE_LEN 20

static u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

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

u16 alert_num = 0;

bit is_main_win = 0;

main_win_update() ပျက်ပြယ်သည်

{

}

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

}

main_win_process_alert() ပျက်ပြယ်သည်

{

u8 i;

for(i=0;i

{

if(GET_ALERT_BIT(old_alert_val၊ 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]

);

သတိပေးချက်_နံပါတ် ++;

}

}

memcpy(old_alert_val၊ alert_val၊ sizeof(alert_val));

}

main_win_disp_alert() ပျက်ပြယ်သည်

{

u16 i;

u16 val;

u16 len = 0;

common_buf[0] = 0;

for(i=0;i

{

val = 0;

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

}

common_buf[len+1] = 0;

sys_write_vp(ALERT_WIN_DATE_VP၊ common_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

{

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

}

main_win_click_handler(u16 btn_val) ပျက်ပြယ်သွားသည်

{

u8 အညွှန်း;

if(btn_val==0x0B)

{

main_win_disp_alert();

ပြန်လာ;

}

အညွှန်း = btn_val-1;

btn_sta[index] = !btn_sta[index];

if((index==3)||(index==7))

btn_sta[index] = 1;

modbus_write_bit(btn_addr[index]၊ btn_sta[index]?0xFF00:0x0000);

btn_val = btn_sta[index];

sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*အညွှန်း၊ (u8*)&btn_val, 1);

if(index==9)

is_main_win = 0;

တခြား if((index==3)||(index==7))

{

while(sys_get_touch_sta());

modbus_write_bit(btn_addr[index]၊ 0x0000);

}

}

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

အော့ဖ်ဆက် ++;

}

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

}

}

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;//ပြန်ပြောင်းရန်

}

main_win_handler()ပျက်ပြယ်

{

static u8 အလံ = 0;

if(is_main_win)

{

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

ပြန်လာ;

}

အလံ = !အလံ;

အကယ်၍ (အလံ)

modbus_read_words(0၊ MAIN_WIN_VAL_MAX_NUM);

တခြား

main_win_read_temp_hum();

}

}

modbus rtu ကုဒ်ရည်ညွှန်းချက်-

# "modbus.h" ပါဝင်သည်

"crc16.h" ပါဝင်သည်

# "sys_params.h" ပါဝင်သည်

#define UART_INCLUDE "uart2.h"

#define UART_INIT uart2_init

#define UART_SEND_BYTES uart2_send_bytes

#define UART_BAUD 9600

#သတ်မှတ် MODBUS_RECV_TIMEOUT (u8)(35000.0f/UART_BAUD+2)

#Define MODBUS_SEND_INTERVAL 150

#UART_INCLUDE ပါဝင်ပါသည်။

static bit is_modbus_recv_complete=0;

static u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;//ဘိုက်များ၏ စုစုပေါင်းအရှည်ကို လက်ခံသည်။

static u8 modbus_recv_timeout = 0;// ပြည့်လျှံချိန်ကို လက်ခံပါ။

static volatile u16 modbus_send_interval = 0;

MODBUS_PACKET ပက်ကတ်;

modbus_init() ပျက်ပြယ်သည်

{

UART_INIT(UART_BAUD);

}

void modbus_send_bytes(u8 *bytes၊u16 len)

{

UART_SEND_BYTES(bytes၊len);

}

modbus_recv_byte(u8 byte) ပျက်ပြယ်

{

if(is_modbus_recv_complete)

ပြန်လာ;

if(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = ဘိုက်;

}

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 *packet)

{

u16 len;

u16 crc;

u8 func_code = ပက်ကတ်[1];

while(modbus_send_interval);

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

}else if(func_code==MODBUS_FUNC_CODE_0F)

{

len = ((MODBUS_0F_PACKET*)packet)->bit_num;

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

len = 9+((MODBUS_0F_PACKET*)packet)->byte_num;

}အခြား

{

len = sizeof(MODBUS_PACKET);

}

crc = crc16(packet၊len-2);

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

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

modbus_send_bytes(packet၊len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

0;//အောင်မြင်မှု ပြန်လာပါ။

}

ပြင်ပပျက်ပြယ်သော 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;// Function ကုဒ်

packet.start_addr = addr;//လိပ်စာ

packet.data_len = len;//Value ရေးထားသည်။

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

len ပြန်လာ;

}


စာတိုက်အချိန်- Jan-12-2024