megajohn (14.12.2009 15:46, просмотров: 2852)
Концепция работы с HMI (touch-screen панелями) по ModBus. Вообщем, в начале реализовал типо так
Tmenu_item PGM menu[] =
{
// desktop
MENU_LB( 0, only_show_once, &pars.b_hmi_edited_en, true ),
MENU_LW( 0, only_show, &pars.count_pots, 0 ), // test
MENU_LW(100, only_show, &caret_pos_need_clk_, 0 ), // test
MENU_LW( 99, only_show, &caret_pos_curr_clk_, 0 ), // test
MENU_LW( 98, only_show, &pendulum_curr_clk_, 0 ), // test
MENU_LB( 1, only_show, &pars.b_startstop_ico, false ),
MENU_LB( 2, edited, &pars.b_startstop_btn, false ),
// vertical 1
MENU_LW( 1, edited, &base.w_level_step, 5 ), // шаг между этажами
MENU_LW( 2, edited, &base.w_pos_upload, 9 ), // Уровень транспортера
MENU_LW( 3, both_dir, &base.w_len_stop, 2 ), // Путь торможения каретки
MENU_LW( 4, edited, &base.w_cyl_up_delay_s, 1 ), // задержка снятия давления с цилиндра подъёма
MENU_LW( 5, edited, &base.w_transp_off_delay_clk, 1 ), // Время остановки ленты до постановки банок на ленту
}
структура меню:
LB - coil, LW - reg (в понятиях Weintek)
адрес в панели
Тип параметра: изменяется на панели, изменяется в контроллере, либо там либо там
адрес переменной
значение по умолчанию
и каждый параметр передается по отдельности. но когда количество пунктов меню перевалило за 100, то оказалось, что суммарный опрос стал большим, и соотвесвенно реакция системы уменьшилась. Хотел ввести еще типа приоритетов для параметров, то есть параметры с приоритетом High отправляются чаще, чем Low.
В итоге остановился на варианте меню работы с блоками:
bool *group_lb_show_p[] =
{
&pars.b_hmi_edited_en, // 0
&pars.b_startstop_ico, // 1
};
bool *group_lb_edited_p[] =
{
&pars.b_startstop_btn, // 50
&pars.b_adjust_out_en, // 51
&base.b_recipe_30_13, // 52
};
bool *group_lb_both_dir_p[] =
{
&pars.bo_capture_pot, // 100
&pars.bo_caret_brake, // 101
...
&pars.b_floor30, // 129
};
u16 *group_lw_show_p[] =
{
&pars.count_pots, // 0
&caret_pos_curr_clk, // 1
&pendulum_curr_clk, // 2
};
u16 *group_lw_edited_p[] =
{
&base.w_level_step, // 50
&base.w_pos_upload, // 51
&base.w_len_stop, // 52
...
&base.w_soap_time_s, // 70
&base.w_delay_rotate_s, // 71
&base.w_delay_pump_s, // 72
};
Tmenu_item2 PGM menu[] =
{
MENU_GROUP_LB( only_show, 0, 1, group_lb_show_p ),
MENU_GROUP_LB( edited, 50, 52, group_lb_edited_p ),
MENU_GROUP_LB( both_dir, 100, 129, group_lb_both_dir_p ),
MENU_GROUP_LW( only_show, 0, 2, group_lw_show_p ),
MENU_GROUP_LW( edited, 50, 72, group_lw_edited_p ),
}
в итоге все быстро, но данные одного типа должны идти друг за другом.
Посему вопрос: может кто лучше реализовывал вариант работы меню для HMI ?