На самом деле решение перешло в другую степь. Так что текущее обсуждение - это скорее выяснение особенностей внутренней реализации софта в панелях weintek, чем решение изначальной проблемы
Тем не менее, если интересно....
изначально задача: маниакально записывать все действия оператора. Есть некая уставка. Живёт в контролере.Задаётся с панели в виде числа. Плюс есть на той же панели кнопочки +/- которые позволяют оператору изменять уставку минимальными приращениями, не вводя её с панели числом. Так вот если оператор ввёл уставку числом, например, 50.5, то в журнале должно появиться сообщение
Если же используются кнопочки + \ -, то д.б. сообщение типа
Код: Выделить всё
Уставка увеличена на минимальное приращение. Новое значение уставки 50.6
(да журнал при таком может засираться множеством таких подряд идущих сообщений. Но на наши предостережения нам сказали "любое действие оператора" - ok.) Предлагаю дальше не обсуждать задачу и решение, а сосредоточиться на том тестовом примере, который вывел недопонимание и разбирательстве со внутренним устройством системного ПО панели.
Сделали тестовый пример. Этот пример работает так:
В контроллере есть бит. Будем для определённости звать его М0.
По высокому уровню М0 в контроллере инкрементируется счётчик уставки. Будем называть его D0. И сбрасывается М0 в "0".
В панели сделали кнопку и привязали к ней макрос
Код: Выделить всё
macro_command main()
bool val = 1
SetData(val,"Mit", M, 0, 1)
SetData(val,"Local HMI", LB, 11, 1)
end macro_command
Этот макрос, как видно просто взодит два бита - один уже упомянутый в ПЛК, другой локальный в панели (LB11).
К биту LB11 привязано сообщение вида
первый "Watch" ссылается на D0 контроллера. Плюс в сообщении стоит "галка" сбрасывать бит LB11 при генерации сообщения.
То есть в итоге должны получать журнал вида
Итак работает это следующим образом
1) кнопка взводит в "1" два бита : один и контроллере (M0), другой локальный в панели (LB11)
2) в контроллере по "1"-му значению бита (M0) увеличивается счётчик (D0) и бит сбрасывается
3) в панели по "1"-му значению (LB11) генерируется сообщение и бит сбрасывается.
Ок работает.
Но тут мы видим пропуски. Иногда, если часто давить. Где-то раз на 20 кликов.
Объяснение происходящего очень простое.
Как работает система сообщений панели. у неё есть набор сообщений, каждое из которых привязано к какому-нибудь биту. Будь то бит локальный в панели или в контроллере. Система сообщение полингом этот набор битов опрашивает. При изменении их значения с "0" в "1" (для упрощения будем считать, что генерация сообщений происходит по высокому уровню) создаёт новое сообщение. (конечно может быть и так, что если сообщение привязано к локальному биту, то система сообщений могла бы подписываться на изменение этих локальных битов и при их изменении её бы внеполосно дёргали - но ситуацию это не изменит, как будет видно ниже по тексту. Плюс биты, вызывающие сообщения, обычно находятся в контроллере - всё равно из нужно оттуда дёргать). Итак есть полинг и значит подсистема генерации сообщений должна периодически вызываться и выполнять свою задачу.
а дальше происходит то, что в силу каких-то причин операционной системе иногда не удаётся выделить квант времени для работы задачи системы сообщений между двумя нажатиями на кнопку. отсюда и пропуски. Многозадачность. И очевидно приоритет обработки нажатия кнопки выше приоритета задачи генерации сообщений. (Кстати, если бы была подписка на изменения, как я писал выше, это бы не помогло - кванта времени всё равно могло не оказаться).
как это работает
Код: Выделить всё
действие M0 DO LB11 сообщение
изначально 0 0 0 -----------
кнопку нажали 1 0 1
в контроллере 0 1
в панели 0 Тест 1
кнопку нажали 1 1 1
в контроллере 0 2
в панели 0 Тест 2
кнопку нажали 1 2
в контроллере 0 3
в панели 0 Тест 3
Но иногда получается так, что обработка системы сообщений в панели пропускается между двумя вызовами нажатия на кнопку . Получается вот что
Код: Выделить всё
действие M0 DO LB11 сообщение
кнопку нажали 1 5 1
в контроллере 0 6
в панели 0 Тест 6
кнопку нажали 1 6 1
в контроллере 0 7
кнопку нажали 1 7 1
в контроллере 0 8
в панели 0 Тест 8
А насчёт "Домашний ПК справляется". Ну можно и его завалить, при желании.
А про производительность Weintek. У нас исторические тренды в 7 ниток за предыдущий час подтягиваются со внутреннего флеша секунд 10. То есть листанул на предыдущий час - и жди 10сек, пока картинка появится. "Но что Вы хотите за такие деньги?"
Alex.