[Open Source]Efitrano fanofanana manan-tsaina

——Avy amin'ny DWIN Developer Forum

Amin'ity laharana ity dia ampahafantarinay anao ny tranga loharano misokatra nahazo loka an'ny DWIN Developer Forum - ny efitrano fambolena marani-tsaina.Ny injeniera dia nampihatra ny T5L smart screen mba hifehezana ny hafanana sy ny fiasan'ny hafanana amin'ny alàlan'ny protocol Modbus.Ny famatsiana herinaratra ihany koa dia azo amboarina mba hanahafana ny fiasan'ny jiro.Ny rafitra dia afaka mandeha ho azy araka ny masontsivana napetraka eo amin'ny efijery ary mitahiry rakitsoratra momba ny hadisoana.

1.UI Material Display

asvdfb (2)
asvdfb (1)

2. UI Design

asvdfb (3)

1.C51 Design

Ny kaody fototra amin'ny fahazoana sy fanavaozana angon-drakitra toy ny mari-pana, ny hamandoana ary ny haavo eo amin'ny interface lehibe, ary ny fampiasana modbus rtu hifehezana ny maody fanaraha-maso ny mari-pana, motera, fanairana, ary milina andevo hafa dia toy izao manaraka izao

Famaritana ny kaody interface tsara:

#include "main_win.h"

#ampidiro ny "modbus.h"

#include "sys_params.h"

#include "func_handler.h"

#ampidiro ny "uart2.h"

#ao anatin'izany

#ao anatin'izany

#farito ny TEMP_HUM_SLAVE_ADDR 2

#farito ny TEMP_HUM_VAL_MAX_NUM 2

#define ALERT_BIT_MAX_NUM 30

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

}ALATIANA;

#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 alert_table[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 i;

ho (i=0;i

{

raha(GET_ALERT_BIT(old_alert_val, i))

mitohy;

raha(GET_ALERT_BIT(alert_val, i))

{

raha(alert_num>=ALERT_TABLE_LEN)

alert_num = ALERT_TABLE_LEN-1;

table_alert[alert_num].desc = i+1;

sprintf(tabilao_fampandrenesana[nomer_alert].daty, "%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;

ho (i=0;i

{

val = 0;

raha toa aho ka

{

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

ho (i=0;i

{

raha(i==0)

mitohy;

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

{

fanondroana u8;

raha(btn_val==0x0B)

{

main_win_disp_alert();

fiverenana;

}

index = btn_val-1;

btn_sta[index] = !btn_sta[index];

raha((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*index, (u8*)&btn_val, 1);

raha(index==9)

is_main_win = 0;

raha tsy izany ((index==3)||(index==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 offset;

msg_len = msg_len;

raha(!dia_main_win)

fiverenana;

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

{

offset = MODBUS_RESPOND_POS_DATA;

ho (i=0;i

{

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

offset += 2;

}

main_win_update();

} hafa raha((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

offset = MODBUS_RESPOND_POS_DATA;

ho (i=0;i

{

alert_val = msg[offset];

offset++;

}

main_win_process_alert();

} hafa raha((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

ho (i=0;i

{

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

offset += 2;

modbus_write_word(5+i, temp_hum_val);

}

main_win_update();

} hafa raha((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

ho (i=0;i

{

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

offset += 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()

{

saina u8 static = 0;

raha (dia_main_win)

{

raha(vanim-potoana_famakiana_fahatsiarovana==FOTOANA_FOTOANA_FAHEFANA)

{

fe-potoana_mamaky_fanairana = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

fiverenana;

}

raha(date_update_period==DATE_UPDATE_PERIOD)

{

date_update_period = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

fiverenana;

}

saina = !flag;

raha (faneva)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

hafa

main_win_read_temp_hum();

}

}

Modbus rtu code reference:

#ampidiro ny "modbus.h"

#ampidiro ny "crc16.h"

#include "sys_params.h"

#define UART_INCLUDE "uart2.h"

#define UART_INIT uart2_init

#farito UART_SEND_BYTES uart2_send_bytes

#define UART_BAUD 9600

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

#define MODBUS_SEND_INTERVAL 150

#Ampidiro ny UART_INCLUDE

static bit is_modbus_recv_complete = 0;

static u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0; // Total halavan'ny bytes nekena

static u8 modbus_recv_timeout = 0; // Ekeo ny fotoana fihoaram-pefy

miovaova static u16 modbus_send_interval = 0;

fonosana MODBUS_PACKET;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

void modbus_send_bytes(u8 *bytes,u16 len)

{

UART_SEND_BYTES(bytes,len);

}

void modbus_recv_byte(u8 byte)

{

raha (dia_modbus_recv_complete)

fiverenana;

raha(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = byte;

}

void modbus_check_recv_timeout()

{

raha(modbus_recv_timeout)

{

modbus_recv_timeout--;

raha(modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *packet)

{

u16 len;

u16 crc;

u8 func_code = fonosana[1];

while(modbus_send_interval);

raha(func_code==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET*) fonosana) -> byte_num = ((MODBUS_10_PACKET*) fonosana) -> word_num*2;

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

} hafa raha(func_code==MODBUS_FUNC_CODE_0F)

{

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

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

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

} hafa

{

len = sizeof(MODBUS_PACKET);

}

crc = crc16(packet,len-2);

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

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

modbus_send_bytes(packet,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

miverina 0; // fahombiazana

}

extern void modbus_msg_handler(u8 *msg,u16 msg_len);

void modbus_handler()

{

u16 crc;

raha(!dia_modbus_recv_complete)

fiverenana;

//Jereo ny sandan'ny crc

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

raha(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 code

packet.start_addr = addr;//Address

packet.data_len = len;//Value voasoratra

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

miverina len;

}


Fotoana fandefasana: Jan-12-2024