1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Журнал действий оператора

Модераторы: Глоб.модераторы, специалисты по PLC

Ответить

Автор темы
alex_ugrumov
почётный участник форума
почётный участник форума
Сообщения: 635
Зарегистрирован: 29 сен 2008, 17:05
Имя: Алексей Угрюмов
Страна: Россия
город/регион: СПб
Благодарил (а): 13 раз
Поблагодарили: 25 раз

Журнал действий оператора

Сообщение alex_ugrumov »

Стоит задача записать все действия оператора.
Среди сообщений которые должны попадать в журнал есть и такие, в которых есть текущее значение параметров получаемых из контроллера.

Как это решили сделать.

Есть, например, кнопка на экране, которая set-ит бит в контроллере. к ней же приделали вызов скрипта. Скрипт устанавливает бит, скажем, LB 11.К этому биту (LB11) привязано генерирование сообщения и действия скинуть бит LB11.

Это работает - хорошо,

НО! есть пропуски в сообщениях. Не на каждое нажатие генерируется сообщения если нажимать на кнопку часто! Пропуск раз в ~5-10 нажатий.
Как это было установлено: бит взводимый в контроллере инкриментирует регистр. Значение этого регистра попадает в сообщение. И вот видим

Код: Выделить всё

100
101
102
103
105
106
Опа - 104 пропущено!. Подумали: а может панель не успевает вычитать измененное в контроллере значение регистра? Нет - тогда был бы повтор 103.
Значит или
- не вызвался макрос
- или не установился бит LB11
- или не сгенерировалось сообщение

Есть идеи как победить эту проблему?

Проблема на самом деле не выдуманная. Кнопка увеличивает или уменьшает уставку параметра на минимальное значение. И вот контролёры привязываются: нажатие же было, где запись в журнале?
Alex.

Автор темы
alex_ugrumov
почётный участник форума
почётный участник форума
Сообщения: 635
Зарегистрирован: 29 сен 2008, 17:05
Имя: Алексей Угрюмов
Страна: Россия
город/регион: СПб
Благодарил (а): 13 раз
Поблагодарили: 25 раз

Re: Журнал действий оператора

Сообщение alex_ugrumov »

Нет, не думаю. Как делали эксперимент:
Кнопка на экране
- устанавливает в "1" бит в ПЛК, для определённости М0
- вызывает макрос, взводящий локальный бит в панели LB11 (к которому привязано генерирование сообщения)
В контроллере при единичном значении М0
- производится инкремент контрольного регистра
- сброс бита М0 в "0"
Если бы цикл ПЛК был медленный - были бы повторы сообщений с одинаковым значением контрольного регистра, а не пропуски.
Alex.

VanMo
специалист по WEINTEK
специалист по WEINTEK
Сообщения: 120
Зарегистрирован: 05 фев 2014, 12:22
Имя: Иван Николаевич
Поблагодарили: 21 раз

Re: Журнал действий оператора

Сообщение VanMo »

В EasyBuilder Pro есть "журнал учета работ" (журнал операций), он записывает все действия оператора

Автор темы
alex_ugrumov
почётный участник форума
почётный участник форума
Сообщения: 635
Зарегистрирован: 29 сен 2008, 17:05
Имя: Алексей Угрюмов
Страна: Россия
город/регион: СПб
Благодарил (а): 13 раз
Поблагодарили: 25 раз

Re: Журнал действий оператора

Сообщение alex_ugrumov »

VanMo писал(а):В EasyBuilder Pro есть "журнал учета работ" (журнал операций), он записывает все действия оператора
Ок посмотрю
Alex.

Автор темы
alex_ugrumov
почётный участник форума
почётный участник форума
Сообщения: 635
Зарегистрирован: 29 сен 2008, 17:05
Имя: Алексей Угрюмов
Страна: Россия
город/регион: СПб
Благодарил (а): 13 раз
Поблагодарили: 25 раз

Re: Журнал действий оператора

Сообщение alex_ugrumov »

Перенёс в код макроса установку бита в "1" в контроллере.

Код: Выделить всё

macro_command main()

bool val = 1
SetData(val,"Mit", M, 0, 1)
SetData(val,"Local HMI", LB, 11, 1)

end macro_command
Эффект тот же. То есть в контроллер бит уходит, а значит и локальный взводится.
Значит пропуски сообщений возникают из-за времени скана в панели (если там есть такое понятие вообще). То есть при частых нажатиях бывает, что между двумя нажатиями (и вызовом соответственно макроса) нет вызова подсистемы генерации сообщений (которая должна сбросить бит информационный), и соответственно нет фронта - нет сообщения.
Решили установкой настройки на кнопку "минимальное время нажатия" 0,1сек. В принципе приемлемо.

Про журнал учёта работ - глянем
Alex.

VanMo
специалист по WEINTEK
специалист по WEINTEK
Сообщения: 120
Зарегистрирован: 05 фев 2014, 12:22
Имя: Иван Николаевич
Поблагодарили: 21 раз

Re: Журнал действий оператора

Сообщение VanMo »

Панель пропускает вызов макроса, если обнаруживает, что предыдущий вызов еще не завершился. Это может быть как раз при частом нажатии на кнопку. Мне кажется, установкой времени нажатия нельзя гарантировать отсутствие пропусков.

Автор темы
alex_ugrumov
почётный участник форума
почётный участник форума
Сообщения: 635
Зарегистрирован: 29 сен 2008, 17:05
Имя: Алексей Угрюмов
Страна: Россия
город/регион: СПб
Благодарил (а): 13 раз
Поблагодарили: 25 раз

Re: Журнал действий оператора

Сообщение alex_ugrumov »

В данном случае пропусков макросов нет, потому что изменяется значение в регистре контроллера, значит в контроллер бит уходит, а он отсылается от из макроса. Так что похоже причина именно в асинхронности выполнения макроса / опроса кнопок и цикла генерации сообщений.

Да и если будут пропуски макроса, опять же в этом случае, ничего страшного. Пропустился макрос -> значение в контроллер не ушло -> делать запись в журнале не нужно.
Alex.

Автор темы
alex_ugrumov
почётный участник форума
почётный участник форума
Сообщения: 635
Зарегистрирован: 29 сен 2008, 17:05
Имя: Алексей Угрюмов
Страна: Россия
город/регион: СПб
Благодарил (а): 13 раз
Поблагодарили: 25 раз

Re: Журнал действий оператора

Сообщение alex_ugrumov »

На самом деле решение перешло в другую степь. Так что текущее обсуждение - это скорее выяснение особенностей внутренней реализации софта в панелях weintek, чем решение изначальной проблемы

Тем не менее, если интересно....

изначально задача: маниакально записывать все действия оператора. Есть некая уставка. Живёт в контролере.Задаётся с панели в виде числа. Плюс есть на той же панели кнопочки +/- которые позволяют оператору изменять уставку минимальными приращениями, не вводя её с панели числом. Так вот если оператор ввёл уставку числом, например, 50.5, то в журнале должно появиться сообщение

Код: Выделить всё

Изменена уставка. Новая уставка 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 привязано сообщение вида

Код: Выделить всё

Тест %(WATCH1)d
первый "Watch" ссылается на D0 контроллера. Плюс в сообщении стоит "галка" сбрасывать бит LB11 при генерации сообщения.
То есть в итоге должны получать журнал вида

Код: Выделить всё

Тест 1
Тест 2
Тест 3
Итак работает это следующим образом
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.

Автор темы
alex_ugrumov
почётный участник форума
почётный участник форума
Сообщения: 635
Зарегистрирован: 29 сен 2008, 17:05
Имя: Алексей Угрюмов
Страна: Россия
город/регион: СПб
Благодарил (а): 13 раз
Поблагодарили: 25 раз

Re: Журнал действий оператора

Сообщение alex_ugrumov »

Упростил пример, чтобы проверить, как влияет обмен с контроллером на проблему и подтвердить своё предположение относительно причин возникновения.

Сделала следующее. Избавился от контроллера. Тест только на панели. Выполняется только указанный функционал (чтобы не было излишней загрузки).
Скрипт

Код: Выделить всё

macro_command main()
bool val = 1
int reg

GetData(reg,"Local HMI", LW, 0, 1)

reg = reg + 1 

SetData(reg,"Local HMI", LW, 0, 1)
SetData(val,"Local HMI", LB, 11, 1)

end macro_command
Сообщение по прежнему привязано к LB11 и сбрасывает его при генерации. В текст сообщения теперь подставляется значение регистра LW0 (локального с панели).

Результат такой же - пропуски. Панель MT6100i.

Так что выводы те же. Причины подтверждены. Обмен с контроллером на результат на проявление эффекта не влияет.

В принципе - это приемлемое поведение для панели. Точно так же она может пропускать очень короткие импульсы (так же как и контроллер может пропускать такие импульсы в общем случае, если не предпринимается специальных мер для их фиксации). Так что просто нужно иметь ввиду.
Alex.

Chenchukov
здесь недавно
здесь недавно
Сообщения: 87
Зарегистрирован: 19 май 2014, 08:48
Имя: Егор Дмитриевич Ченчуков
Страна: Россия

Re: Журнал действий оператора

Сообщение Chenchukov »

alex_ugrumov писал(а):Стоит задача записать все действия оператора.
НО! есть пропуски в сообщениях. Не на каждое нажатие генерируется сообщения если нажимать на кнопку часто! Пропуск раз в ~5-10 нажатий.
Как это было установлено: бит взводимый в контроллере инкриментирует регистр. Значение этого регистра попадает в сообщение. И вот видим
Опа - 104 пропущено!. Подумали: а может панель не успевает вычитать измененное в контроллере значение регистра? Нет - тогда был бы повтор 103.
Значит или
- не вызвался макрос
- или не установился бит LB11
- или не сгенерировалось сообщение

Есть идеи как победить эту проблему?

Проблема на самом деле не выдуманная. Кнопка увеличивает или уменьшает уставку параметра на минимальное значение. И вот контролёры привязываются: нажатие же было, где запись в журнале?
здесь я описывал примеры пропуска макросов и способы временного лечения
viewtopic.php?f=99&t=5116
например, можно установить нужный бит и вызывать макрос не по фронту установки бита , а по условию "пока бит установлен", а в макросе сбросить бит


еще смотрите viewtopic.php?f=99&t=5130
и
viewtopic.php?f=99&t=5104

Автор темы
alex_ugrumov
почётный участник форума
почётный участник форума
Сообщения: 635
Зарегистрирован: 29 сен 2008, 17:05
Имя: Алексей Угрюмов
Страна: Россия
город/регион: СПб
Благодарил (а): 13 раз
Поблагодарили: 25 раз

Re: Журнал действий оператора

Сообщение alex_ugrumov »

Егор, Вы читали остальной тренд? Уже выяснено, что макрос вызывается каждый раз!Нет пропуска в вызове макроса! иногда ароисходит "не вызов" модуля, отвечающего за генерацию сообщения, между парой вызовов макроса. Это не лечится в принципе, можно только уменьшить частоту вызова макроса.
Alex.

Chenchukov
здесь недавно
здесь недавно
Сообщения: 87
Зарегистрирован: 19 май 2014, 08:48
Имя: Егор Дмитриевич Ченчуков
Страна: Россия

Re: Журнал действий оператора

Сообщение Chenchukov »

alex_ugrumov писал(а):Егор, Вы читали остальной тренд? Уже выяснено, что макрос вызывается каждый раз!Нет пропуска в вызове макроса! иногда ароисходит "не вызов" модуля, отвечающего за генерацию сообщения, между парой вызовов макроса. Это не лечится в принципе, можно только уменьшить частоту вызова макроса.
Рекомендую Вам перед написанием макросов обратить внимание на существенные отличия между функциями SetData и SetDataEx, то же для GetData и GetDataEx

Автор темы
alex_ugrumov
почётный участник форума
почётный участник форума
Сообщения: 635
Зарегистрирован: 29 сен 2008, 17:05
Имя: Алексей Угрюмов
Страна: Россия
город/регион: СПб
Благодарил (а): 13 раз
Поблагодарили: 25 раз

Re: Журнал действий оператора

Сообщение alex_ugrumov »

Спасибо за совет, Егор. Посмотрел. Вообще к теме топика и проблеме отношения не имеет.
Alex.
Ответить

Вернуться в «Операторские панели»