[Open Source]Rohang Pelatihan Cerdas

——Ti DWIN Forum pamekar

Dina masalah ieu, kami ngenalkeun ka anjeun kasus open source anu meunang pangajén tina DWIN Developer Forum - ruangan budidaya pinter.Insinyur ngalaksanakeun layar pinter T5L pikeun ngatur pemanasan sareng fungsi kontrol suhu kipas ngaliwatan protokol Modbus.Catu daya ogé tiasa disaluyukeun pikeun simulasi fungsi cahaya.Sistim nu bisa otomatis ngajalankeun nurutkeun parameter disetel dina layar tur nyimpen rékaman sajarah lepat.

1.UI Bahan Témbongkeun

asvdfb (2)
asvdfb (1)

2. Desain UI

asvdfb (3)

1.C51 Desain

Kodeu utama pikeun meunangkeun sareng ngapdet data sapertos suhu, kalembaban, sareng luhurna dina antarmuka utama, sareng nganggo modbus rtu pikeun ngontrol modul kontrol suhu, motor, deteksi alarem, sareng mesin budak sanésna nyaéta kieu.

Rujukan kode panganteur utama:

#include "main_win.h"

#include "modbus.h"

#include "sys_params.h"

#include "func_handler.h"

#kalebet "uart2.h"

#kaasup

#kaasup

#define TEMP_HUM_SLAVE_ADDR 2

#define TEMP_HUM_VAL_MAX_NUM 2

#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 {

tanggal char[17];

u8 desc;

} AWAS;

#define ALERT_TABLE_LEN 20

statik u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

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

batal main_win_update()

{

}

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

}

batal main_win_process_alert()

{

u8 abdi;

pikeun(i=0;i

{

lamun (GET_ALERT_BIT (old_alert_val, i))

neruskeun;

lamun(GET_ALERT_BIT(alert_val, i))

{

lamun (nomer_alert>=ALERT_TABLE_LEN)

alert_num = ALERT_TABLE_LEN-1;

alert_table[alert_num].desc = i+1;

sprintf(tabel_siaga[nomer_siaga].tanggal, "%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));

}

batal main_win_disp_alert()

{

u16 abdi;

u16 val;

u16 lén = 0;

common_buf[0] = 0;

pikeun(i=0;i

{

val = 0;

lamun abdi

{

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

}

batal main_win_init()

{

ngambang fixed_val;

u8 abdi;

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

pikeun(i=0;i

{

lamun (i == 0)

neruskeun;

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

}

batal main_win_click_handler(u16 btn_val)

{

indéks u8;

lamun(btn_val==0x0B)

{

main_win_disp_alert();

mulang;

}

indéks = btn_val-1;

btn_sta[indéks] = !btn_sta[indéks];

lamun ((indéks == 3) || (indéks == 7))

btn_sta[indéks] = 1;

modbus_write_bit (btn_addr [indéks], btn_sta [indéks]? 0xFF00: 0x0000);

btn_val = btn_sta[indéks];

sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*indéks, (u8*)&btn_val, 1);

lamun (indéks == 9)

is_main_win = 0;

lain lamun ((indéks == 3) || (indéks == 7))

{

sedengkeun (sys_get_touch_sta ());

modbus_write_bit(btn_addr [indéks], 0x0000);

}

}

batal 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 abdi;

u8 offset;

msg_len = msg_len;

lamun(!is_main_win)

mulang;

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

{

offset = MODBUS_RESPOND_POS_DATA;

pikeun(i=0;i

{

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

offset += 2;

}

main_win_update();

}Lain lamun((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

offset = MODBUS_RESPOND_POS_DATA;

pikeun(i=0;i

{

alert_val = msg[offset];

offset++;

}

main_win_process_alert();

}Lain lamun((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

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

}Lain lamun((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

pikeun(i=0;i

{

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

offset += 2;

}

main_win_disp_date();

}

}

batal 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; // Balikkeun

}

batal main_win_handler()

{

bandéra u8 statik = 0;

lamun (is_main_win)

{

lamun (periode_baca_siaga==PERIODE_BACAAN_ALAT)

{

période_baca_siaga = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

mulang;

}

lamun (tanggal_update_period==DATE_UPDATE_PERIOD)

{

date_update_period = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

mulang;

}

bandéra = !bandéra;

lamun (bandéra)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

lain

main_win_read_temp_hum();

}

}

rujukan kode modbus rtu:

#include "modbus.h"

#include "crc16.h"

#include "sys_params.h"

#define UART_INCLUDE "uart2.h"

#define UART_INIT uart2_init

#define UART_SEND_BYTES uart2_send_bytes

#define UART_BAUD 9600

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

#define MODBUS_SEND_INTERVAL 150

#include UART_INCLUDE

bit statik is_modbus_recv_complete = 0;

statik u8 modbus_recv_buff [270];

statik u16 modbus_recv_len = 0;//Total panjang bait katampa

statik u8 modbus_recv_timeout = 0; // Narima waktos mudal

statik volatile u16 modbus_send_interval = 0;

pakét MODBUS_PACKET;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

batal modbus_send_bytes(u8 *bait,u16 len)

{

UART_SEND_BYTES(bait,len);

}

batal modbus_recv_byte(u8 byte)

{

lamun (is_modbus_recv_complete)

mulang;

lamun (modbus_recv_len

modbus_recv_buff [modbus_recv_len++] = bait;

}

batal modbus_check_recv_timeout()

{

lamun (modbus_recv_timeout)

{

modbus_recv_timeout--;

lamun (modbus_recv_timeout == 0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *packet)

{

u16 len;

u16 crc;

u8 func_code = pakét [1];

sedengkeun (modbus_send_interval);

lamun (func_code==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET*)pakét)->byte_num = ((MODBUS_10_PACKET*)pakét)->word_num*2;

len = 9+((MODBUS_10_PACKET*)pakét)->byte_num;

}Lain lamun (func_code==MODBUS_FUNC_CODE_0F)

{

len = ((MODBUS_0F_PACKET*)pakét)->bit_num;

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

len = 9+((MODBUS_0F_PACKET*)pakét)->byte_num;

}lain

{

len = ukuran(MODBUS_PACKET);

}

crc = crc16(pakét,len-2);

pakét [len-2] = (u8)(crc>>8);

pakét[len-1] = (u8)crc;

modbus_send_bytes(pakét,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

balik 0; // Suksés

}

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

batal modbus_handler()

{

u16 crc;

lamun (! is_modbus_recv_complete)

mulang;

// Pariksa nilai crc

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

lamun (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;//Kode fungsi

packet.start_addr = addr;//Alamat

packet.data_len = len;//Nilai ditulis

len = modbus_send_packet ((u8 *) & pakét);

balik len;

}


waktos pos: Jan-12-2024