 megajohn (14.12.2009 15:46, просмотров: 3179)
 megajohn (14.12.2009 15:46, просмотров: 3179)
Концепция работы с 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 ?