Показано с 1 по 9 из 9

Тема: Как создать массивы с переменными и вызвать их при изменении другой переменной

  1. #1

    По умолчанию Как создать массивы с переменными и вызвать их при изменении другой переменной

    Здравствуйте! история такая,Есть программа для ПЛК 110-60 [м02] к ней раньше привязывались весовые терминалы типа токвес WLM100. Сейчас заказали новые токвесы WK-100 у них уже полноценный MODBUS 485. Управление переделать удалось. Но вот одна проблемма. В Скаде есть вкладка рецептов в которой оператор записыывает переменные. И есть две кнопки переключения по рецептам. Проблемма такая что нельзя сохранить разные рецепты на всех вкладках сохраняеться только 1 рецепт один и тот же.
    вот пример программы управления

    (* Копирование текущего рецепта из скады в ПЛК *)
    copy_P_Recipe_To_curRecipeScada();

    (* Если оператор уходит с экрана рецептов *)
    IF closeRecipeScreen AND NOT nowWriteToWLM THEN (* AND NOT nowWriteToWLM оставить??? *)
    copy_tempRecipeScada_To_curRecipeScada();
    numCurRecipeInScada:=numCurRecipeInWLM;
    copy_allRecipes_To_curRecipeScada();
    copy_curRecipeScada_To_tempRecipeScada();
    closeRecipeScreen:=FALSE;
    END_IF;

    (* Переход к просмотру следующего рецепта по требованию, если можно *)
    IF needViewNextRecipe AND NOT nowWriteToWLM THEN
    IF numCurRecipeInScada<NUM_OF_RECIPIES THEN
    copy_tempRecipeScada_To_curRecipeScada();
    numCurRecipeInScada:=numCurRecipeInScada+1;
    copy_allRecipes_To_curRecipeScada();
    copy_curRecipeScada_To_tempRecipeScada();
    END_IF
    needViewNextRecipe:=FALSE;
    END_IF;

    (* (* Переход к просмотру следующего рецепта (+10) по требованию, если можно *)
    IF needViewNextRecipe10 AND NOT nowWriteToWLM THEN
    IF numCurRecipeInScada+10<=NUM_OF_RECIPIES THEN
    copy_tempRecipeScada_To_curRecipeScada();
    numCurRecipeInScada:=numCurRecipeInScada+10;
    copy_allRecipes_To_curRecipeScada();
    copy_curRecipeScada_To_tempRecipeScada();
    END_IF
    needViewNextRecipe10:=FALSE;
    END_IF;*)

    (* Переход к просмотру предыдущего рецепта по требованию, если можно *)
    IF needViewPrevRecipe AND NOT nowWriteToWLM THEN
    IF numCurRecipeInScada>1 THEN
    copy_tempRecipeScada_To_curRecipeScada();
    numCurRecipeInScada:=numCurRecipeInScada-1;
    copy_allRecipes_To_curRecipeScada();
    copy_curRecipeScada_To_tempRecipeScada();
    END_IF
    needViewPrevRecipe:=FALSE;
    END_IF;

    (* (* Переход к просмотру предыдущего рецепта (-10) по требованию, если можно *)
    IF needViewPrevRecipe10 AND NOT nowWriteToWLM THEN
    IF numCurRecipeInScada>10 THEN
    copy_tempRecipeScada_To_curRecipeScada();
    numCurRecipeInScada:=numCurRecipeInScada-10;
    copy_allRecipes_To_curRecipeScada();
    copy_curRecipeScada_To_tempRecipeScada();
    END_IF
    needViewPrevRecipe10:=FALSE;
    END_IF;*)

    (* Переход к записи рецепта терминала 0 по требованию *)
    IF needWriteRecipe THEN
    (* Проверяем новый рецепт на правильность *)
    wrongRecipe:=checkCurRecipeScada();
    (* Если рецепт неправильный - записывать не будем. Возвращаем все на место. Сообщаем на экран. *)
    IF wrongRecipe THEN
    copy_tempRecipeScada_To_curRecipeScada();
    copy_curRecipeScada_To_allRecipes();
    needWriteRecipe:=FALSE;
    (* Иначе, если рецепт правильный - готовимся к записи. *)
    ELSE
    (* Готовимся к записи *)
    copy_curRecipeScada_To_allRecipes();
    nowWriteToWLM:=TRUE;
    needWriteRecipe:=FALSE; (* обнуляем в _toMODBUS *)
    END_IF
    END_IF

    подскажите как написать код, чтобы я мог хранить 10 рецептов в памяти ПЛК, чтобы при загрузке они загружались в скаду и менять их по нажаттию кнопок. Переменная номера рецепта numCurRecipeInScada , переменные кнопок ТeedViewPrevRecipe и needViewNextRecipe
    mbwk1_recipe11_write := Recipe1_1;
    mbwk1_recipe11_write := Recipe1_1;
    mbwk1_recipe12_write := Recipe1_2;
    mbwk1_recipe13_write:= Recipe1_3;
    mbwk1_recipe21_write := Recipe2_1;
    mbwk1_recipe22_write := Recipe2_2;
    mbwk1_recipe23_write:= Recipe2_3;
    mbwk1_recipe31_write :=Recipe3_1;
    mbwk1_recipe32_write := Recipe3_2;
    mbwk1_recipe33_write := Recipe3_3;
    mbwk2_recipe11_write := Recipe4_1;
    mbwk2_recipe12_write := Recipe4_2;
    mbwk2_recipe13_write := Recipe4_3;
    mbwk3_recipe11_write := Recipe5_1;
    mbwk3_recipe12_write := Recipe5_2;
    mbwk3_recipe13_write := Recipe5_3;
    mbwk3_recipe21_write:= Recipe6_1;
    mbwk3_recipe22_write := Recipe6_2;
    mbwk3_recipe23_write := Recipe6_3; перед знаком рано слева переменная MODBUS после равно переменная SCADA. Помогите пожалуйста. Неделю уже мучаюсь ничего сделать не могу.

  2. #2

    По умолчанию

    Во-первых, не понятно что такое за "recipe11", "recipe12" и прочие. Все переменные нужно называть понятно и ясно так, чтобы по их названию можно было понять их назначение.
    Во-вторых, не ясно, каким образом переменные редактируются-то. Тема создана в разделе "CodeSys v2", где напрямую нет никаких экранов, SCADA и прочих средств редактирования и ввода. И где это всё отображается?
    В-третьих, чтобы удобно сохранять несколько логически связанных штуковин (рецепт из нескольких настроек), используй структуру STRUCT (почитай справку по CodeSys про это). Ну что-то типа:
    Код:
    TYPE RecpValues :
    STRUCT
    	Param1   :WORD; (* Дать нормальные имена по назначению *)
    	Param2   :WORD;
    	Param3   :WORD;
    	Param4   :WORD;
    END_STRUCT
    END_TYPE
    Тогда описывать твои рецепты можно уже или как массив рецептов:
    Код:
    VAR RETAIN (* Для примера - сохранение в памяти ПЛК - RETAIN-переменные *)
         RecpSettings: ARRAY [1..10] OF RecpValues;
    END_VAR
    А получать доступ по номеру рецепта к этому массиву
    Код:
    VAR
         SelectedRecp  : INT;   (* Номер текущего выбранного рецепта в массиве *)
    END_VAR
    ...
    ...
    RecpSettings[SelectedRecp].Param1 (* Обращение к переменным текущего рецепта *)
    RecpSettings[SelectedRecp].Param2
    Ну и надо будет тогда написать некую штуковину вида "Показать на экране рецепт", которая получает ссылку на структуру рецепта (RecpValues) и отображает её поля, и хреновину вида "Отредактировать на экране рецепт", которая записывает данные с экрана (настройки) в структуру рецепта (RecpValues).
    И им передавать эту самую ссылку на текущий рецепт RecpSettings[SelectedRecp].
    Последний раз редактировалось Алексеев Савр; 12.05.2021 в 09:15.

  3. #3

    По умолчанию

    Всем привет. Подскажите, что я делаю не так...

    1. Создаем проект со своими переменными данными (т.н. "рецепты"):
    Безымянный111.png
    В нем забиты уже 4 набора данных (4 "рецепта")

    2. Потом создадим экран визуализации и расположим на нем кнопку "Загрузить данные из файла"
    В этой кнопке есть функция "OnMouseCLick" (т.е. действие по нажатию мыши).
    Мы туда впишем "Выполнить команду - LoadReceipeFrom".
    Наверное что-то должно куда-то загрузиться при нажатии на эту кнопку... Но ХЗ... (сюрприз будет дальше).
    Укажем, два параметра: группа рецептов "Sopla" и рецепт "0.008".
    Безымянный112.png

    3. Также на этой форме будут отображены все переменные, которые были предварительно объявлены.
    Но, для эксперимента, этим переменным заданы начальные значения в момент присваивания, что-бы визуально увидеть изменения при загрузке рецепта.
    При запуске проекта эти начальные значения переменных отображаются в форме правильно:
    Безымянный113.png

    4. Запустим проект, нажмем на эту кнопку.
    Откроется окно с выбором файла для загрузки "Load Recipe"
    Выберем один из заранее созданных файлов
    Его содержимое таково:
    Безымянный114.png
    Как видите: там есть все соответствующие поля.

    5. НО! НИЧЕГО НЕ ПРОИЗОШЛО!
    Ни оперативные переменные, ни наборы из 4 переменных данных ("рецепты") не поменяли своих значений!
    Как такое может быть? Зачем эти рецепты нужны?
    Безымянный115.png

    Скрытый текст:

    Честно говоря, мне так запарило эти скрины делать! Программировал бы дальше на Питоне, сохранял бы проекты в Гит и проблем бы не знал!
    Е-маё. Потратил 8 часов, голова болит уже и все рано не понимаю как это работает!
    И я проверил другие значения кнопок - "SaveRecipeAs", "DeleteRecipe", "CreateRecipe", "WriteRecipe" - там везде сюрприз, непонятный своим смыслом.
    Я даже думаю, что все это - пример того, "как не надо делать"!


    Есть человек, который мне объяснить зачем это и как это работает/должно работать?
    Спасибо.

  4. #4

    По умолчанию

    Есть человек, который мне объяснить зачем это и как это работает/должно работать?
    Попробуйте посмотреть эти видео ролики от Евгения Кислова:
    https://www.youtube.com/watch?v=6V2TP4PQ0m0
    https://www.youtube.com/watch?v=A1WrZVJUWhY

  5. #5

    По умолчанию

    О да! Сегодня я остался после работы.
    Мне просто интересно: либо я сегодня сдохну на работе или мы все же запустим работу этих рецептов.
    Потом мы запишем "Послание потомкам, которые еще не знают..." (если хватит сил).

    Итак, разберем видео от Евгения Кислова (https://www.youtube.com/watch?v=6V2TP4PQ0m0):

    1. Евгений создает структуру "RECIPE", а мы создаем структуру "Table1":
    Безымянный21.png

    2. Евгений создает заранее прописанные рецепты (2 шт), а мы создаем такие же рецепты (4 шт). У него одна группа рецептов, а у нас две группы рецептов:
    Безымянный22.png

    Скрытый текст:

    Внимательный читатель, наверное, заметил, что у Евгения, структура вложена в PLC_PRG. У нас же - они перечислены как "PLC_PRG.struct_name.var_name". Думаю, что это мелочь.


    3. В окне визуализации Евгений создал много кнопок для работы с рецептами, а мы (с внимательным читателем) создадим только одну, так сказать "для чистоты эксперимента":
    Безымянный23.png

    4. Евгений прописывает действие при нажатии на кнопку, и мы не отстаём от него. Только он пользуется переменными, а мы вписываем названия прямо в поля:
    Безымянный24.png

    5. Выводить значение интересующей переменной Евгений будет через графический примитив "прямоугольник". Мы поступим так-же:
    Безымянный25.png

    6. Евгений применил спец.настройку в менеджере рецептов, и мы поступили также:
    Безымянный26.png

    7. Вместе с Евгением запускаем контроллеры в режиме "Логин с загрузкой". Он жмет кнопку и значение действительно вычитывается. Мы - остаемся "с носом"! Ни хрена не прочиталось!
    Безымянный27.png

    8. На работающем контроллере, Евгений показывает, что у него переменные скопировались. А у нас - не скопировались:
    Безымянный28.png

    Все. Пора домой.
    Всем - добра. Евгению - привет.
    Последний раз редактировалось ВладОвен; 21.04.2022 в 09:19.

  6. #6

    По умолчанию

    А ничего что в 4-м пункте в "Команды конфигурации" у Евгения указано "Записать список", а у Вас - "Выполнить программу на ПЛК"?

  7. #7

    По умолчанию

    Нет. Это особенность работы этой формы в среде CodeSys.
    Эта надпись "Выполнить программу на ПЛК" создаст таковую команду в списке команд при нажатии клавиши "+" (после нажатия).
    Пока же в списке указана только команда "WriteRecipe".

    Я этот момент изучил подробно. Тут все норм.


  8. #8

    По умолчанию

    Всем привет.
    Подскажите, а есть ли ST-команда, которая вычитывает рецепт в структуру?
    Т.е. не кнопка на экране визуализации, при нажатии на которую вычитывается рецепт, а именно просто ST-команда.

  9. #9

    По умолчанию

    Цитата Сообщение от ВладОвен Посмотреть сообщение
    Всем привет.
    Подскажите, а есть ли ST-команда, которая вычитывает рецепт в структуру?
    Т.е. не кнопка на экране визуализации, при нажатии на которую вычитывается рецепт, а именно просто ST-команда.
    Почему вы упорно пишите в раздел Codesys 2.3, с вопросами по Codesys 3.5. Вам уже ведь несколько раз писали, спрашивайте в соответствующем разделе.
    Последний раз редактировалось kondor3000; 30.05.2022 в 15:59.

Похожие темы

  1. Ответов: 3
    Последнее сообщение: 10.01.2020, 15:55
  2. Динамические массивы в ST ???
    от garfild4232 в разделе Помощь Разработчикам
    Ответов: 3
    Последнее сообщение: 02.03.2016, 09:24
  3. Запись в переменной из другой FB
    от DmitriiAnyushin в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 22.09.2015, 15:12
  4. Событие при изменении значения
    от S.A.D. в разделе Master SCADA 3
    Ответов: 2
    Последнее сообщение: 07.07.2011, 11:31
  5. как вызвать callback?
    от Ушаков Николай в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 16.10.2007, 17:29

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •