[ღია წყარო]ინტელექტუალური სასწავლო ოთახი

——DWIN დეველოპერთა ფორუმიდან

ამ ნომერში წარმოგიდგენთ DWIN დეველოპერთა ფორუმის ღია კოდის ჯილდოს მქონე საქმეს - ჭკვიანი გაშენების ოთახს.ინჟინერებმა დანერგეს T5L ჭკვიანი ეკრანი გათბობისა და ვენტილატორის ტემპერატურის კონტროლის ფუნქციების გასაკონტროლებლად Modbus პროტოკოლით.ელექტრომომარაგება ასევე შეიძლება დარეგულირდეს განათების ფუნქციის სიმულაციისთვის.სისტემას შეუძლია ავტომატურად იმუშაოს ეკრანზე დაყენებული პარამეტრების მიხედვით და შეინახოს შეცდომების ისტორიის ჩანაწერები.

1.UI მასალის ჩვენება

asvdfb (2)
asvdfb (1)

2.UI დიზაინი

asvdfb (3)

1.C51 დიზაინი

ძირითადი კოდები, როგორიცაა ტემპერატურა, ტენიანობა და სიმაღლე მთავარ ინტერფეისზე, და modbus rtu-ის გამოყენებით ტემპერატურის კონტროლის მოდულების, ძრავების, განგაშის ამოცნობის და სხვა სლავური მანქანების სამართავად, არის შემდეგი კოდები.

მთავარი ინტერფეისის კოდის მითითება:

#include "main_win.h"

#include "modbus.h"

#include "sys_params.h"

#include "func_handler.h"

#include "uart2.h"

#შეიცავს

#შეიცავს

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

char თარიღი[17];

u8 desc;

}ALERT;

#define ALERT_TABLE_LEN 20

სტატიკური u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

სტატიკური 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;

ბიტი 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]);

საერთო_ბუფ[len+1] = 0;

sys_write_vp(MAIN_WIN_DATE_VP, common_buf, len/2+2);

}

void main_win_process_alert()

{

u8 i;

for(i=0;i

{

if(GET_ALERT_BIT(ძველი_გაფრთხილება_val, i))

გაგრძელება;

if(GET_ALERT_BIT(გაფრთხილება_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]

);

alert_num++;

}

}

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

}

void main_win_disp_alert()

{

u16 i;

u16 val;

u16 len = 0;

საერთო_ბუფ[0] = 0;

for(i=0;i

{

val = 0;

თუ მე

{

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

}

საერთო_ბუფ[len+1] = 0;

sys_write_vp(ALERT_WIN_DATE_VP, common_buf, len/2+2);

}

void main_win_init()

{

float fixed_val;

u8 i;

არის_მთავარი_მოგება = 1;

 

main_win_val[5] = (u16)(ტემპ_ჰუმ_ვალ[0]/10.0+0.5f);

main_win_val[6] = (u16)(ტემპ_ჰუმ_ვალ[1]/10.0+0.5f);

for(i=0;i

{

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

}

void 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((ინდექსი==3)||(ინდექსი==7))

btn_sta[ინდექსი] = 1;

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

btn_val = btn_sta[ინდექსი];

sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*ინდექსი, (u8*)&btn_val, 1);

თუ (ინდექსი==9)

არის_მთავარი_მოგება = 0;

else if((ინდექსი==3)||(ინდექსი==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 ოფსეტი;

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

}სხვა შემთხვევაში ((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();

}სხვა შემთხვევაში ((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();

}სხვა შემთხვევაში ((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();

}

}

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

{

სტატიკური u8 დროშა = 0;

if (is_main_win)

{

if (გაფრთხილების_კითხვის_პერიოდი==ALERT_READ_PERIOD)

{

გაფრთხილების_წაკითხვის პერიოდი = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

დაბრუნების;

}

თუ (თარიღი_განახლების_პერიოდი==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 კოდის მითითება:

#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

სტატიკური ბიტი არის_modbus_recv_complete = 0;

static u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;// მიღებულია ბაიტების საერთო სიგრძე

სტატიკური u8 modbus_recv_timeout = 0;//გადადინების დროის მიღება

სტატიკური არასტაბილური u16 modbus_send_interval = 0;

MODBUS_PACKET პაკეტი;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

void modbus_send_bytes (u8 *ბაიტი,u16 len)

{

UART_SEND_BYTES(ბაიტი,ლენი);

}

void modbus_recv_byte (u8 ბაიტი)

{

if (is_modbus_recv_complete)

დაბრუნების;

if(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = ბაიტი;

}

void 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*)პაკეტი)->ბაიტი_რაოდენობა = ((MODBUS_10_PACKET*)პაკეტი)->სიტყვის_რაოდენობა*2;

len = 9+((MODBUS_10_PACKET*)პაკეტი)->ბაიტი_რაოდენობა;

}სხვა შემთხვევაში (func_code==MODBUS_FUNC_CODE_0F)

{

len = ((MODBUS_0F_PACKET*)პაკეტი)->bit_num;

((MODBUS_0F_PACKET*)პაკეტი)->ბაიტი_რაოდენობა = len/8+(len%8?1:0);

len = 9+((MODBUS_0F_PACKET*)პაკეტი)->ბაიტი_რაოდენობა;

}სხვა

{

len = sizeof(MODBUS_PACKET);

}

crc = crc16 (პაკეტი,len-2);

პაკეტი[len-2] = (u8)(crc>>8);

პაკეტი[len-1] = (u8)crc;

modbus_send_bytes(packet,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

დაბრუნება 0;//წარმატება

}

extern void 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 adr, u16 len)

{

packet.slave_addr = SLAVE_ADDR;

packet.func_code = fcode;//ფუნქციის კოდი

packet.start_addr = adr;//მისამართი

packet.data_len = len;//დაწერილი მნიშვნელობა

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

დაბრუნება len;

}


გამოქვეყნების დრო: იან-12-2024