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

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

  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.

Похожие темы

  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

Ваши права

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