[Open Source]Sal Fòmasyon Entelijan

——Soti nan DWIN Developer Forum

Nan nimewo sa a, nou prezante w ka sous louvri DWIN Developer Forum - sal kiltivasyon entelijan.Enjenyè yo te aplike ekran entelijan T5L pou kontwole chofaj ak fonksyon kontwòl tanperati fanatik atravè pwotokòl Modbus la.Ekipman pou pouvwa a ka ajiste tou pou simulation fonksyon ekleraj la.Sistèm nan ka otomatikman kouri dapre paramèt yo mete sou ekran an epi sove dosye istwa fay.

1.UI Display Materyèl

asvdfb (2)
asvdfb (1)

2.UI Design

asvdfb (3)

1.C51 Design

Kòd prensipal yo pou jwenn ak mete ajou done tankou tanperati, imidite, ak altitid sou koòdone prensipal la, epi lè l sèvi avèk modbus rtu pou kontwole modil kontwòl tanperati, motè, deteksyon alam, ak lòt machin esklav yo jan sa a.

Prensipal referans kòd koòdone:

#include "main_win.h"

#include "modbus.h"

#include "sys_params.h"

#include "func_handler.h"

#include "uart2.h"

#enkli

#enkli

#defini TEMP_HUM_SLAVE_ADDR 2

#defini TEMP_HUM_VAL_MAX_NUM 2

#defini ALERT_BIT_MAX_NUM 30

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

#defini GET_ALERT_BIT(val, pos) ((val[pos/8]>>(pos%8))&0x01)

typedef struct{

dat char[17];

u8 desc;

}ALÈT;

#defini ALERT_TABLE_LEN 20

estatik 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 dat_val[MAIN_WIN_DATE_MAX_NUM] = {0};

u8 alert_val[ALERT_BYTE_NUM] = {0};

u8 old_alert_val[ALERT_BYTE_NUM] = {0};

ALERT tab_alèt[ALERT_TABLE_LEN];

u16 alert_num = 0;

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

pou (mwen = 0; mwen

{

if(GET_ALERT_BIT(ansyen_alèt_val, mwen))

kontinye;

if(GET_ALERT_BIT(alèt_val, mwen))

{

if(alèt_num>=ALERT_TABLE_LEN)

alert_num = ALERT_TABLE_LEN-1;

alert_table [alèt_num].desc = i+1;

sprintf(tab_alèt[num_alèt].dat, "%u/%u/%u %u:%u",

dat_val[0], dat_val[1], dat_val[2], dat_val[3], dat_val[4]

);

alert_num++;

}

}

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

}

void main_win_disp_alert ()

{

u16 mwen;

u16 val;

u16 len = 0;

common_buf[0] = 0;

pou (mwen = 0; mwen

{

val = 0;

Si mwen

{

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

{

flote fixed_val;

u8 mwen;

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

pou (mwen = 0; mwen

{

si (mwen ==0)

kontinye;

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)

{

endèks u8;

if(btn_val==0x0B)

{

main_win_disp_alert();

retounen;

}

endèks = btn_val-1;

btn_sta[endèks] = !btn_sta[endèks];

si((endèks==3)||(endèks==7))

btn_sta[endèks] = 1;

modbus_write_bit(btn_addr[endèks], btn_sta[endèks]?0xFF00:0x0000);

btn_val = btn_sta[endèks];

sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*endèks, (u8*)&btn_val, 1);

si (endèks==9)

is_main_win = 0;

lòt moun si((endèks==3)||(endèks==7))

{

while(sys_get_touch_sta());

modbus_write_bit(btn_addr[endèks], 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 mwen;

u8 konpanse;

msg_len = msg_len;

si(!se_principal_genyen)

retounen;

if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_VAL_MAX_NUM*2))

{

konpanse = MODBUS_RESPOND_POS_DATA;

pou (mwen = 0; mwen

{

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

konpanse += 2;

}

main_win_update();

}lòt si((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

konpanse = MODBUS_RESPOND_POS_DATA;

pou (mwen = 0; mwen

{

alert_val = msg[offset];

konpanse++;

}

main_win_process_alert ();

}lòt si((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))

{

konpanse = MODBUS_RESPOND_POS_DATA;

pou (mwen = 0; mwen

{

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

konpanse += 2;

modbus_write_word(5+i, temp_hum_val);

}

main_win_update();

}lòt si((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

konpanse = MODBUS_RESPOND_POS_DATA;

pou (mwen = 0; mwen

{

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

konpanse += 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;//Retour

}

void main_win_handler()

{

estatik u8 drapo = 0;

si (se_prensipal_genyen)

{

if(alèt_read_period==ALERT_READ_PERIOD)

{

alert_read_period = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

retounen;

}

if(date_update_period==DATE_UPDATE_PERIOD)

{

dat_update_period = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

retounen;

}

drapo = !drapo;

si (drapo)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

lòt bagay

main_win_read_temp_hum();

}

}

Modbus rtu kòd referans:

#include "modbus.h"

#include "crc16.h"

#include "sys_params.h"

#defini UART_INCLUDE "uart2.h"

#defini UART_INIT uart2_init

#defini UART_SEND_BYTES uart2_send_bytes

#defini UART_BAUD 9600

#defini MODBUS_RECV_TIMEOUT (u8)(35000.0f/UART_BAUD+2)

#defini MODBUS_SEND_INTERVAL 150

#gen ladan UART_INCLUDE

ti estatik is_modbus_recv_complete = 0;

estatik u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;// Longè total bytes aksepte

static u8 modbus_recv_timeout = 0;//Aksepte tan debòde

estatik temèt u16 modbus_send_interval = 0;

MODBUS_PACKET pake;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

anile modbus_send_bytes (u8 *bytes, u16 len)

{

UART_SEND_BYTES(bytes,len);

}

anile modbus_recv_byte (u8 byte)

{

si (modbus_recv_complete)

retounen;

if(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = byte;

}

void modbus_check_recv_timeout ()

{

si (modbus_recv_timeout)

{

modbus_recv_timeout--;

if(modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet (u8 *pake)

{

u16 len;

u16 crc;

u8 func_code = pake [1];

while(modbus_send_interval);

if(func_code==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET*)pake)->byte_num = ((MODBUS_10_PACKET*)pake)->mo_num*2;

len = 9+((MODBUS_10_PACKET*)pake)->byte_num;

}lòt si (func_code==MODBUS_FUNC_CODE_0F)

{

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

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

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

}lòt bagay

{

len = sizeof(MODBUS_PACKET);

}

crc = crc16 (pake,len-2);

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

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

modbus_send_bytes(pake,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

retounen 0;//Siksè

}

ekstèn void modbus_msg_handler (u8 *msg,u16 msg_len);

anile modbus_handler()

{

u16 crc;

si(!se_modbus_recv_complete)

retounen;

//Tcheke valè 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;//Fonksyon kòd

packet.start_addr = adr;//Adrès

packet.data_len = len;//Valè ekri

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

retounen len;

}


Tan poste: Jan-12-2024