——Kusuka ku-DWIN Developer Forum
Kulolu shicilelo, sethula kuwe icala lomthombo ovulekile eliwine umklomelo we-DWIN Developer Forum - igumbi lokulima elihlakaniphile.Onjiniyela basebenzise isikrini esihlakaniphile se-T5L ukulawula imisebenzi yokushisa nokulawula izinga lokushisa labalandeli ngephrothokholi ye-Modbus.Ukunikezwa kwamandla kungabuye kulungiswe ukuze kulingise umsebenzi wokukhanyisa.Uhlelo lungasebenza ngokuzenzakalelayo ngokuya ngemingcele esethwe esikrinini futhi lulondoloze amarekhodi omlando wamaphutha.
1.UI Material Display
2.UI Design
1.C51 Idizayini
Amakhodi amakhulu okuthola nokubuyekeza idatha njengezinga lokushisa, umswakama, nokuphakama kwesixhumi esibonakalayo esiyinhloko, nokusebenzisa i-modbus rtu ukulawula amamojula okulawula izinga lokushisa, amamotho, ukutholwa kwe-alamu, neminye imishini yezigqila kanje
Ireferensi yekhodi yesixhumi esibonakalayo:
#faka phakathi "win_main.h"
#faka phakathi "modbus.h"
#faka phakathi "sys_params.h"
#faka phakathi "func_handler.h"
#faka phakathi "uart2.h"
#faka
#faka
#chaza TEMP_HUM_SLAVE_ADDR 2
#chaza TEMP_HUM_VAL_MAX_NUM 2
#chaza ALERT_BIT_MAX_NUM 30
#chaza i-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)
uhlobo lwe-typedef{
idethi yezinhlamvu[17];
u8 desc;
}ISIXWAYISO;
#chaza ALERT_TABLE_LEN 20
i-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};
i-u8 alert_val[ALERT_BYTE_NUM] = {0};
u8 old_alert_val[ALERT_BYTE_NUM] = {0};
Ithebula_lesexwayiso[ALERT_TABLE_LEN];
u16 inombolo_yesaziso = 0;
bit is_main_win = 0;
void main_win_update()
{
}
i-void main_win_disp_date()
{
u8 leli;
len = i-sprintf(common_buf, "%u:%u", (u16)dethi_val[3], (u16)idethi_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 ngi;
okwe(i=0;i
{
uma(GET_ALERT_BIT(ival_isixwayiso_elidala, i))
qhubeka;
uma(GET_ALERT_BIT(ival_yesaziso, i))
{
uma(inombolo_yesaziso>=ALERT_TABLE_LEN)
inombolo_yesaziso = ALERT_TABLE_LEN-1;
i-alert_table[inombolo_yesaziso].desc = i+1;
i-sprintf(ithebula_lesexwayiso[inombolo_yesaziso].usuku, "%u/%u/%u %u:%u",
date_val[0], date_val[1], date_val[2], date_val[3], date_val[4]
);
inombolo_yesixwayiso++;
}
}
i-memcpy(ival_yesaziso_yakudala, isixwayiso_valli, usayiziof(ival_yesixwayiso));
}
i-void main_win_disp_alert()
{
u16 ngi;
u16 val;
u16 len = 0;
common_buf[0] = 0;
okwe(i=0;i
{
ival = 0;
uma (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);
}
i-void main_win_init()
{
i-float fixed_val;
u8 ngi;
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);
okwe(i=0;i
{
uma(i==0)
qhubeka;
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 index;
uma(btn_val==0x0B)
{
main_win_disp_alert();
buyela;
}
inkomba = btn_val-1;
btn_sta[index] = !btn_sta[index];
uma((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);
uma(inkomba==9)
is_main_win = 0;
okunye uma((index==3)||(index==7))
{
ngenkathi(sys_get_touch_sta());
modbus_write_bit(btn_addr[index], 0x0000);
}
}
i-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 ngi;
u8 offset;
msg_len = msg_len;
uma(!iwini_eyinhloko)
buyela;
uma((f_code==MODBUS_FUNC_CODE_03)&(data_len==MAIN_WIN_VAL_MAX_NUM*2))
{
offset = MODBUS_RESPOND_POS_DATA;
okwe(i=0;i
{
main_win_val = SYS_GET_U16(msg[offset], msg[offset+1]);
i-offset += 2;
}
main_win_update();
}okunye uma((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))
{
offset = MODBUS_RESPOND_POS_DATA;
okwe(i=0;i
{
alert_val = msg[offset];
i-offset++;
}
main_win_process_alert();
}okunye uma((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))
{
offset = MODBUS_RESPOND_POS_DATA;
okwe(i=0;i
{
temp_hum_val = SYS_GET_U16(msg[offset], msg[offset+1]);
i-offset += 2;
modbus_write_word(5+i, temp_hum_val);
}
main_win_update();
}okunye uma((f_code==MODBUS_FUNC_CODE_03)&(data_len==MAIN_WIN_DATE_MAX_NUM*2))
{
offset = MODBUS_RESPOND_POS_DATA;
okwe(i=0;i
{
date_val = SYS_GET_U16(msg[offset], msg[offset+1]);
i-offset += 2;
}
main_win_disp_date();
}
}
i-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;//Buyela
}
i-void main_win_handler()
{
ifulegi le-static u8 = 0;
uma(kubalulekile_wina)
{
uma(inkathi_yokufunda_yesaziso==ALERT_READ_PERIOD)
{
alert_read_period = 0;
modbus_read_bits(510, ALERT_BIT_MAX_NUM);
buyela;
}
uma(date_update_period==DATE_UPDATE_PERIOD)
{
date_update_period = 0;
modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);
buyela;
}
ifulegi = !ifulegi;
uma (ifulegi)
modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);
okunye
main_win_read_temp_hum();
}
}
ireferensi yekhodi ye-modbus rtu:
#faka phakathi "modbus.h"
#faka phakathi "crc16.h"
#faka phakathi "sys_params.h"
#define UART_INNCLUDE "uart2.h"
#define UART_INIT uart2_init
#define UART_SEND_BYTES uart2_send_bytes
#chaza UART_BAUD 9600
#define MODBUS_RECV_TIMEOUT (u8)(35000.0f/UART_BAUD+2)
#chaza i-MODBUS_SEND_INTERVAL 150
#ihlanganisa UART_INNCLUDE
i-static bit is_modbus_recv_complete = 0;
static u8 modbus_recv_buff[270];
static u16 modbus_recv_len = 0;//Isamba sobude bamabhayithi amukelwe
static u8 modbus_recv_timeout = 0;//Yamukela isikhathi sokuchichima
i-static volatile u16 modbus_send_interval = 0;
MODBUS_PACKET iphakethe;
i-void modbus_init()
{
UART_INIT(UART_BAUD);
}
i-void modbus_send_bytes(u8 *bytes,u16 len)
{
UART_SEND_BYTES(amabhayithi,len);
}
i-void modbus_recv_byte(u8 byte)
{
uma(is_modbus_recv_complete)
buyela;
uma(modbus_recv_len
modbus_recv_buff[modbus_recv_len++] = ibhayithi;
}
void modbus_check_recv_timeout()
{
uma(modbus_recv_timeout)
{
modbus_recv_timeout--;
uma(modbus_recv_timeout==0)
{
is_modbus_recv_complete = 1;
}
}
}
u8 modbus_send_packet(u8 *packet)
{
u16 leli;
u16 crc;
u8 func_code = iphakethe[1];
ngenkathi(modbus_send_interval);
uma(func_code==MODBUS_FUNC_CODE_10)
{
((MODBUS_10_PACKET*)iphakethe)->byte_num = ((MODBUS_10_PACKET*)iphakethe)->inombolo_yegama*2;
len = 9+((MODBUS_10_PACKET*)iphakethe)->byte_num;
}okunye uma(func_code==MODBUS_FUNC_CODE_0F)
{
len = ((MODBUS_0F_PACKET*)iphakethe)->bit_num;
((MODBUS_0F_PACKET*)iphakethe)->byte_num = len/8+(len%8?1:0);
len = 9+((MODBUS_0F_PACKET*)iphakethe)->byte_num;
}okunye
{
len = sizeof(MODBUS_PACKET);
}
crc = crc16(iphakethe,len-2);
iphakethe[len-2] = (u8)(crc>>8);
iphakethe[len-1] = (u8)crc;
modbus_send_bytes(iphakethe,len);
modbus_send_interval = MODBUS_SEND_INTERVAL;
buyisela 0;//Impumelelo
}
i-extern void modbus_msg_handler(u8 *msg,u16 msg_len);
i-void modbus_handler()
{
u16 crc;
uma(!is_modbus_recv_complete)
buyela;
//Hlola inani le-crc
crc = ((u16)modbus_recv_buff[modbus_recv_len-2]<<8)+modbus_recv_buff[modbus_recv_len-1];
uma(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;//Ikhodi yomsebenzi
packet.start_addr = addr;//Address
packet.data_len = len;//Inani libhaliwe
len = modbus_send_packet((u8*)&packet);
buyisela len;
}
Isikhathi sokuthumela: Jan-12-2024