PDA

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



professorlab
09.05.2021, 20:27
Здравствуйте! история такая,Есть программа для ПЛК 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. Помогите пожалуйста. Неделю уже мучаюсь ничего сделать не могу.

Cs-Cs
11.05.2021, 17:28
Во-первых, не понятно что такое за "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].

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

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

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

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

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

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


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


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

saii
20.04.2022, 19:02
Есть человек, который мне объяснить зачем это и как это работает/должно работать?

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

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

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

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

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


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


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

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

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

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

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

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

Все. Пора домой.
Всем - добра. Евгению - привет.

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

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

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

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

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

Почему вы упорно пишите в раздел Codesys 2.3, с вопросами по Codesys 3.5. Вам уже ведь несколько раз писали, спрашивайте в соответствующем разделе.