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

Возможна ли непрямая адресация в VBS ?

Ответить

Автор темы
alex3110
освоился
освоился
Сообщения: 262
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 24 раза
Поблагодарили: 6 раз

Возможна ли непрямая адресация в VBS ?

Сообщение alex3110 »

Всем привет !

Нужно написать 30 одинаковых скриптов для 30 групп тегов. Каждая группа тегов состоит из 3-х уникальных внутренних тегов панели и относится к соответствующему тегу ПЛК, который будет для каждого соответствующего скрипта «входным». В скрипте необходимо производить простые арифметические и сравнительные действия.

Можно сделать 30 разных скриптов с прямой адресацией.

Но можно ли сделать только один VBS-скрипт, в котором можно было бы приме-нить непрямую адресацию и «цикл», чтобы минимизировать размер кода. Думаю, что тогда эти 30 групп тегов можно было бы по очереди вызывать и вставлять в скрипт как «входы» / «выходы».

Если не трудно, покажите, пожалуйста, как будет выглядеть конструкция такого «универсального» VBS-скрипта, или где можно найти пример.

Заранее благодарен.

Dron_Tat
здесь недавно
здесь недавно
Сообщения: 82
Зарегистрирован: 07 янв 2017, 09:12
Имя: Андрей
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Возможна ли непрямая адресация в VBS ?

Сообщение Dron_Tat »

Если я правильно понял, то:

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

Dim index
For index = 1 To 30
	SmartTags("Tag_" & index) = 0	'тут ваша логика
Next

Автор темы
alex3110
освоился
освоился
Сообщения: 262
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 24 раза
Поблагодарили: 6 раз

Возможна ли непрямая адресация в VBS ?

Сообщение alex3110 »

Спасибо за ответ, но пока не совсем понял.
Вот такие тэги :
"VAR_1_IN" ; "VAR_1.1" ; "VAR_1.2" ; "VAR_1_OUT"
"VAR_2_IN" ; "VAR_2.1" ; "VAR_2.2" ; "VAR_2_OUT"
"VAR_3_IN" ; "VAR_3.1" ; "VAR_3.2" ; "VAR_3_OUT"
………………………………………………………………
"VAR_30_IN" ; "VAR_30.1" ; "VAR_30.2" ; "VAR_30_OUT"

Тэги "VAR_**.1" ; "VAR_**.2" как входные и выходные, тоже участвуют в скрипте.

POV
корифей
корифей
Сообщения: 755
Зарегистрирован: 12 авг 2008, 11:05
Имя: Патрушев Олег Валерьевич
Страна: Россия
город/регион: г. Н.Новгород
Благодарил (а): 93 раза
Поблагодарили: 143 раза

Возможна ли непрямая адресация в VBS ?

Сообщение POV »

А просто написать функцию(скрипт) с параметрами и передать туда эти теги в качестве параметров не подойдет? Ну и 30 раз вызвать.
Была у меня похожая проблема, так и выкрутился. Очень компактно и красиво получилось.

stesl
эксперт
эксперт
Сообщения: 1002
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 87 раз
Поблагодарили: 126 раз

Возможна ли непрямая адресация в VBS ?

Сообщение stesl »

POV, приветствую, а не трудно маленький пример показать? Вы говорите по сути про функцию, которая (само понятие функция) есть почти во всех высокоуровневых языках программирования. На VBS таких задач пока не решал, и хотелось бы подсмотреть ) А потом, если что, в поиске найти ;)

Автор темы
alex3110
освоился
освоился
Сообщения: 262
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 24 раза
Поблагодарили: 6 раз

Возможна ли непрямая адресация в VBS ?

Сообщение alex3110 »

Если поконкретнее, то оставил 3 тэга и написал, что должны делать скрипты.

Тут ниже 30 раз значение тэга "VAR_*_IN" переписывается в тэг "VAR_*_OUT", только если тэг VAR_*.1 = «1»

Temp1 = SmartTags("VAR_1_IN")
If SmartTags("VAR_1.1") = 1
then SmartTags("VAR_1_OUT") = Temp1

Temp2 = SmartTags("VAR_2_IN")
If SmartTags("VAR_2.1") = 1
then SmartTags("VAR_2_OUT") = Temp2

…………………………….……….
…………………………….……….

Temp30 = SmartTags("VAR_30_IN")
If SmartTags("VAR_30.1") = 1
then SmartTags("VAR_30_OUT") = Temp30


Теперь как сделать один универсальный скрипт со счётчиком циклов и подстановкой тэгов "VAR_*_IN" ; "VAR_*_OUT" ; «VAR_*.1» ?

Dron_Tat
здесь недавно
здесь недавно
Сообщения: 82
Зарегистрирован: 07 янв 2017, 09:12
Имя: Андрей
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Возможна ли непрямая адресация в VBS ?

Сообщение Dron_Tat »

alex3110 писал(а): 15 авг 2020, 18:10 "VAR_1_IN" ; "VAR_1.1" ; "VAR_1.2" ; "VAR_1_OUT"
"VAR_2_IN" ; "VAR_2.1" ; "VAR_2.2" ; "VAR_2_OUT"
"VAR_3_IN" ; "VAR_3.1" ; "VAR_3.2" ; "VAR_3_OUT"
………………………………………………………………
"VAR_30_IN" ; "VAR_30.1" ; "VAR_30.2" ; "VAR_30_OUT"

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

Function Test(ByVal id)
Dim num1, num2, num3, result
num1 = SmartTags("VAR_"& id & "_IN")
num2 = SmartTags("VAR_"& id & ".1")
num3 = SmartTags("VAR_"& id & ".2")

result = num1 * num2 + num3
SmartTags("VAR_"& id & "_OUT") = result

Test = result
End Function
Потом вызываете Test(1), Test(2), Test(3).
Upd. Не увидел Вашего сообщения, но сути не меняет

Автор темы
alex3110
освоился
освоился
Сообщения: 262
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 24 раза
Поблагодарили: 6 раз

Возможна ли непрямая адресация в VBS ?

Сообщение alex3110 »

Если я правильно понял, то сначала создаётся подпрограмма "Test", которая потом будет вызываться те же 30 раз, но только аргументы будут в ней указаны через "id" ?

Если так, то по размеру кода получится, наверное, то же самое.
А "цикл" тут можно будет вставить ?
С ним бы как раз всё и получилось максимально компактно.
Аватара пользователя

petr2off
эксперт
эксперт
Сообщения: 1602
Зарегистрирован: 06 янв 2016, 19:45
Имя: Петров В.Л.
Страна: Россия
город/регион: Красноярск
Благодарил (а): 69 раз
Поблагодарили: 185 раз

Возможна ли непрямая адресация в VBS ?

Сообщение petr2off »

По размеру кода будет не то же самое. Будет размер кода функции + 30 вызовов этой функции. Собственно это одна из причин (не основная правда), почему функции используют - экономия кода

Reinard
здесь недавно
здесь недавно
Сообщения: 40
Зарегистрирован: 26 фев 2018, 19:41
Имя: Евгений
Благодарил (а): 1 раз
Поблагодарили: 3 раза

Возможна ли непрямая адресация в VBS ?

Сообщение Reinard »

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

Dim i, name1, name2, name3

For i = 1 To 30
	name1="Var_" & i & "_in"
	name2="Var_" & i & "_out"
	name3="Var_" & i	
	If HMIRuntime.Tags(name2).Read=1 Then
		HMIRuntime.Tags(name3).Write HMIRuntime.Tags(name1).Read
	End If
Next
А так разве не будет работать? Просто в небольшом цикле все прокрутится.

stesl
эксперт
эксперт
Сообщения: 1002
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 87 раз
Поблагодарили: 126 раз

Возможна ли непрямая адресация в VBS ?

Сообщение stesl »

Reinard писал(а): 17 авг 2020, 14:01 HMIRuntime.Tags(name3).Write HMIRuntime.Tags(name1).Read
Если синтаксис позволяет так написать, то можно и так задачу решить. Но все таки применение ф-ции - признак хорошего стиля ;)
Позволю себе скорректировать код Dron_Tat

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

Function Test(ByVal id)
Dim num1, num2, num3
num1 = SmartTags("VAR_"& id & "_IN")
num2 = SmartTags("VAR_"& id & ".1")
num3 = SmartTags("VAR_"& id & ".2")

Test = num1 * num2 + num3
End Function

Dim i

For i = 1 To 30
	SmartTags("VAR_"& i & "_OUT") = Test (i)
Next
Согласен, тот же ... в другой руке, но весь функционал у Вас теперь в функции. Можно там что то и поменять, можно еще где то воспользоваться. Надеюсь правильно оформил вызов функции, и правильно понял принцип ее оформления в VBS. А главное - надеюсь, что саму задачу понял ))) Ну где, если что править функционал, я уже высказался.

Автор темы
alex3110
освоился
освоился
Сообщения: 262
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 24 раза
Поблагодарили: 6 раз

Возможна ли непрямая адресация в VBS ?

Сообщение alex3110 »

А тут
stesl писал(а): 18 авг 2020, 03:22
Dim i

For i = 1 To 30
SmartTags("VAR_"& i & "_OUT") = Test (i)
Next
при вызове функции "Test" (и соответственно, во всех других местах) точно должен стоять параметр (i) вместо id ?

Ведь при создании функции "Test" использовался параметр id .

stesl
эксперт
эксперт
Сообщения: 1002
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 87 раз
Поблагодарили: 126 раз

Возможна ли непрямая адресация в VBS ?

Сообщение stesl »

alex3110 писал(а): 18 авг 2020, 14:17 Ведь при создании функции "Test" использовался параметр id .
Мне стоило переменную цикла обозвать х )
Смотрите - есть два типа передачи параметра в ф-цию (и не только в нее) - по значению и по ссылке. Тут мы передаем по значению, т.е. в начале запуска куска кода "Test" происходит id = i. При этом id у нас локальна, и процессор помнит ее ровно столько времени, сколько идёт выполнение этой ф-ции. После чего наглухо забывает о ней. До последующего вызова.
Второй момент - i то у нас никак не меняется. Работаем с id. Это в отличии от передачи параметра по ссылке. Но уже не буду о нем в рамках этой задачи )

Автор темы
alex3110
освоился
освоился
Сообщения: 262
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 24 раза
Поблагодарили: 6 раз

Возможна ли непрямая адресация в VBS ?

Сообщение alex3110 »

Т.е. всё равно, что будет вместо "i" ?
Хоть "a", хоть "b", хоть "f", хоть *craziest_pinguim" - всё равно функция "Test" воспримет это и вставит вместо своего "id" при вычислениях ?
А может быть у такой функции, например, не один индексный параметр, а 2, 3 ?
Тогда как она разберётся куда какой подставлять ?

stesl
эксперт
эксперт
Сообщения: 1002
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 87 раз
Поблагодарили: 126 раз

Возможна ли непрямая адресация в VBS ?

Сообщение stesl »

alex3110 писал(а): 18 авг 2020, 21:41 Т.е. всё равно, что будет вместо "i" ?
Ну началось )
Правила создания имен переменных очень одинаковы во всех языках. Главное чтоб не с цифры начиналось и не было спецсимволов и пробелов. Ну и нельзя использовать служебные слова. For, например не получится. For1 - пожалуйста.
Но я понимаю суть вопроса - да, мы передаем значение, а под каким оно будет именем - без разницы.
alex3110 писал(а): 18 авг 2020, 21:41 А может быть у такой функции, например, не один индексный параметр, а 2, 3 ?
Тогда как она разберётся куда какой подставлять ?
Вот поэтому я и просил в этой ветке каких то примеров ) Тут уже вариации, в зависимости от языка. VBS примечателен тем, что он пофигически относится к типу переменных. Определяет тип, при первом присвоении переменной значения.
Но чаще всего передача делается по тому порядку следования, в котором переменные перечислены в определении ф-ции:

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

Function Test (First, Second)
.....
y = Test (x1, x2)
А к примеру на Pascal это будет выглядеть так:

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

Function Test (First:integer, Second:real):boolean;
......
var x1:real;
x2:integer;
y:boolean;
y := Test (x1,x2);
И тут Вас постигнет неудача. Уже на этапе компиляции. Попробуйте догадаться почему ;)

Автор темы
alex3110
освоился
освоился
Сообщения: 262
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 24 раза
Поблагодарили: 6 раз

Возможна ли непрямая адресация в VBS ?

Сообщение alex3110 »

stesl писал(а): 19 авг 2020, 01:18 И тут Вас постигнет неудача. Уже на этапе компиляции. Попробуйте догадаться почему ;)
Нет уж, благодарствуйте. Иначе весь мой мозык повзрывается. :-) А он мне ещё пригодится.
Ну Ок. Спасибо за экскурс в пофигистический VBS. Не думал, что он такой :)
Буду уже че-нить начинать творить.

stesl
эксперт
эксперт
Сообщения: 1002
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 87 раз
Поблагодарили: 126 раз

Возможна ли непрямая адресация в VBS ?

Сообщение stesl »

alex3110 писал(а): 19 авг 2020, 07:29 Спасибо за экскурс в пофигистический VBS
Да нормальный язык, для своих задач. Плохо только с него, наверное, начинать свой путь в программировании. Этот пофигизм с типами данных, наверняка потом сыграет злую шутку при знакомстве с тем же Си.
Да и тот же SCL для ПЛК - ну очень ревностен в этом отношении ;)

Отправлено спустя 2 минуты 35 секунд:
А ответ у "задачки" такой. Если внимательно посмотреть, то в функции мы объявили, что у первого параметра тип integer (целое), а у второго - real (вещественное, с запятой если проще). А вызываем ф-цию как? Да наоборот )

Автор темы
alex3110
освоился
освоился
Сообщения: 262
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 24 раза
Поблагодарили: 6 раз

Возможна ли непрямая адресация в VBS ?

Сообщение alex3110 »

Создал 2 скрипта :
Первый – это функция Function MainOUT (ByVal id) , где и происходят все вычисления
Второй сделан на Sub , внутри которого вызывается функция MainOUT с ин-дексом "i" и оператором "For i = 1 to <нужное мне количество раз> NEXT".

Всё работает НО есть проблема.

Внутри Function MainOUT я создал условие при котором скрипт может не доработать до конца и выходит по команде Exit
If FilterEnbl = 0 Then Exit Function

Т.е. если тут битовый тэг FilterEnbl = 0, то скрипту нет смысла работать до конца и грузить процессор панели.

У меня, к примеру, 30 датчиков. Один сломан и я для него кнопкой на панели установил FilterEnbl = 0 . И тогда скрипты для всех остальных датчиков перестают работать.
При этом на панель выдаётся системное сообщение «Ошибка. Переполнение в сценарии «Filters» в строке 12» .

Второй скрипт, который на Sub

Sub Filters()
Dim i
For i= 1 To 30
SmartTags("Main_" & i & "_OUT") =MainOUT (i)
Next

Можно ли что-то сделать, чтобы это локальное условие FilterEnbl = 0 для одного датчика не влияло на работу всех скриптов ?

Или придётся убирать его из функции Function MainOUT ?
И тогда каждому «локальному» скрипту всегда придётся отрабатывать до кон«Wi-Fi».


SmartTags("Main_" & i & "_OUT") =MainOUT (i) - это как раз и есть та 12-я строка
Последний раз редактировалось alex3110 23 авг 2020, 14:46, всего редактировалось 1 раз.

stesl
эксперт
эксперт
Сообщения: 1002
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 87 раз
Поблагодарили: 126 раз

Возможна ли непрямая адресация в VBS ?

Сообщение stesl »

alex3110, немного путано. Код в студию, только оформите его тэгами "код". Чтобы не просто по тексту он был, а был выделен. Конкретно - что там до 12 строки, включая ее

Автор темы
alex3110
освоился
освоился
Сообщения: 262
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 24 раза
Поблагодарили: 6 раз

Возможна ли непрямая адресация в VBS ?

Сообщение alex3110 »

Вот код функции MainOUT :

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

Function MainOUT(ByVal id)

Dim FilterEnbl, LogIN, DeadBand, LogOUTprev, LogOUT, HLDB, LLDB

FilterEnbl = SmartTags("Filter_" & id & "_Enbl")

If FilterEnbl = 0 Then Exit Function

LogIN = SmartTags("Log" & id & "IN")

<bla...bla...bla>

End Function

Там, где <bla...bla...bla> - всё правильно.

Например, я для датчика 1 выставил бит FilterEnbl = 0
Тогда, после запуска скрипта "Filters"

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

Sub Filters()
Dim i
For i= 1 To 30
SmartTags("Main_" & i & "_OUT") =MainOUT (i)
Next
он обратится к функции MainOUT, где ей в индекс "i" подставится "1" -ца. Т.е. функция MainOUT вызовется с id = 1, т.е. начнёт обрабатывать свой код для датчика №1.
Дойдя до условия FilterEnbl = 0 (т.к. я его выставил в "0")
If FilterEnbl = 0 Then Exit Function

произойдёт выход из функции MainOUT (1).

Я то ожидал, что выйдет и дальше пойдёт, к датчику 2, т.е. подставит MainOUT (2). Но вероятно этого не происходит, т.к. выдаётся сообщение об ошибке и глобальный скрипт не выполняется.

А 12-я строка - это в скрипте "Filters" (который сделан на Sub)
SmartTags("Main_" & i & "_OUT") =MainOUT (i)

12-ая, т.к. штук 7-8 строк уже занято под служебную инфу от SIEMENS

SMax
не первый раз у нас
не первый раз у нас
Сообщения: 320
Зарегистрирован: 17 июн 2016, 14:18
Имя: Максим
Благодарил (а): 6 раз
Поблагодарили: 113 раз

Возможна ли непрямая адресация в VBS ?

Сообщение SMax »

Может так?

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

Function MainOUT(ByVal id)
Dim FilterEnbl, LogIN, DeadBand, LogOUTprev, LogOUT, HLDB, LLDB
LogIN = SmartTags("Log" & id & "IN")
<bla...bla...bla>
End Function

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

Sub Filters()
Dim i
For i= 1 To 30
FilterEnbl = SmartTags("Filter_" & i & "_Enbl")
     If FilterEnbl <> 0 Then
          SmartTags("Main_" & i & "_OUT") = MainOUT (i)
     End if
Next

Автор темы
alex3110
освоился
освоился
Сообщения: 262
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 24 раза
Поблагодарили: 6 раз

Возможна ли непрямая адресация в VBS ?

Сообщение alex3110 »

Ха, а мысль интересная. Должно получиться :-)
:ges_up: Спасибо !

stesl
эксперт
эксперт
Сообщения: 1002
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 87 раз
Поблагодарили: 126 раз

Возможна ли непрямая адресация в VBS ?

Сообщение stesl »

alex3110 писал(а): 23 авг 2020, 14:59 сообщение об ошибке и глобальный скрипт не выполняется
Всё еще непонятно. MainOUT глобальный скрипт, а Filters? Что произойдет при Exit - я не знаю, вернется ли управление снова к локальному скрипту, или просто будет выход... Однако явной ошибки я тут не вижу.
alex3110 писал(а): 23 авг 2020, 14:59 А 12-я строка - это в скрипте "Filters" (который сделан на Sub)
SmartTags("Main_" & i & "_OUT") =MainOUT (i)
А функция точно вызывается? Если все enbl будут <>0 то отрабатывает?

Автор темы
alex3110
освоился
освоился
Сообщения: 262
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 24 раза
Поблагодарили: 6 раз

Возможна ли непрямая адресация в VBS ?

Сообщение alex3110 »

Ну "глобальный" - эт я наверное, погорячился :ext_dont_ment:
Всё заработало, как и предсказывал уважаемый SMax
Только потом снова нарвался на очередную "засаду".

Для "компактизации", на экране сделал поле "I\O field" в которое, в зависимости от выбранного датчика, вывожу соответствующие значения мультиплексированного тэга MainOUT. Отдельные Main_**_OUT я вычисляю с помощью VBS-скрипта.
Т.е., если я выбрал датчик 5, то в это "I\O field" должно выводиться значение обычного тэга Main_5_OUT .
Но в это «мультиплексированное» "I\O field" это значение Main_5_OUT выводится только тогда, когда на том же экране дополнительно будет присутствовать обычное (не «мультиплексированное») "I\O field" тэга Main_5_OUT .
То же самое и в отношении всех остальных тэгов Main_1_OUT… Main_4_OUT, Main_6_OUT… Main_30_OUT.

Получается, что работать будет только так ?
Т.е. на экране, например, в другом слое, надо делать эти дополнительные поля обычных (не «мультиплексированных») тэгов ?
Ну и потом делать их все невидимыми, чтоб глаз не «мозолили».

stesl
эксперт
эксперт
Сообщения: 1002
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 87 раз
Поблагодарили: 126 раз

Возможна ли непрямая адресация в VBS ?

Сообщение stesl »

alex3110 писал(а): 28 авг 2020, 07:26 Всё заработало, как и предсказывал уважаемый SMax
Оно и в той версии должно было работать ) Но коллега, по своему, прав. Зачем копать, если можно "неудобное" ветвление вовсе из ф-ции вынести.
alex3110 писал(а): 28 авг 2020, 07:26 Получается, что работать будет только так ?
Вы же уже пошли раз, путем "ну работает же". Решение не хуже других ) Я не пойму, что за мультиплексированный тег. Если нужно, что бы в одном и том же I/O отображались разные теги - велкам в скрипты опять же.
Ответить

Вернуться в «Общие вопросы»