Доброго дня, уважаемые форумчане.
Разбираюсь с чужим кодом, возник, возможно, глупый вопрос.
Есть проект в классическом Step 7 V5.5 SP4 HF11 для контролллера Siemens CPU 414-3.
В проекте есть FB c объявленной TEMP секцией, размер секции 14 байт, 0 бит, из диалога свойств этой секции. Адрес последней переменной типа word 12.0
И есть код из FB который делает вот так:
A "VC010".Service_S.Oper
= L 15.7
То есть, в моем понимании код использует данные за пределами объявленной области временных переменных.
Вопрос : так вообще можно/приемлемо делать?? Например, во всем известном С, так делать очень опасно
Заранее благодарен.
- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Использование TEMP данных
Модератор: Глоб.модераторы
-
- новенький
- Сообщения: 1
- Зарегистрирован: 29 дек 2021, 20:05
- Имя: Денис
-
- частый гость
- Сообщения: 462
- Зарегистрирован: 31 июл 2010, 09:12
- Имя: Павел
- Страна: РФ
- Благодарил (а): 10 раз
- Поблагодарили: 17 раз
Использование TEMP данных
Я тоже видел нечто подобное в Step7 коде от наших поставщиков. Аналогия с Си полностью корректна: такие художества типа работают, пока в один прекрасный момент жареный петух не клюнет. Если рассуждать логически, проблемы с вашим L15.7 могут возникнуть в следующих случаях:
- После записи в L15.7 код данного FB вызывает другие FB/FC. Если они модифицируют стек, то могут изменить значение L15.7
- После записи в L15.7 идет вызов прерывания, которое изменяет стэк по-своему, с теми же последствиями (здесь я не уверен, возможно прерывания используют отдельный стэк)
- В программе производятся изменения выше в иерархии вызовов (в тех OB/FC/FB, которые вызывают ваш FB): увеличивается размер TEMP области. В результате L15.7 может оказаться вне максимального размера стэка и при операции =L15.7 ОС контроллера задиагностирует ошибку и может остановить выполнение программы
-
- не первый раз у нас
- Сообщения: 325
- Зарегистрирован: 17 июн 2016, 14:18
- Имя: Максим
- Благодарил (а): 7 раз
- Поблагодарили: 118 раз
Использование TEMP данных
Это не ошибка, а скорее всего, результат автоматического преобразования кода из FBD или LAD в STL.
Вот пример преобразования кода блока FB, где переменные Temp вообще не задекларированы. Возможно Ваш блок, или его часть, изначально была написана не на STL.
Вот пример преобразования кода блока FB, где переменные Temp вообще не задекларированы. Возможно Ваш блок, или его часть, изначально была написана не на STL.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- частый гость
- Сообщения: 462
- Зарегистрирован: 31 июл 2010, 09:12
- Имя: Павел
- Страна: РФ
- Благодарил (а): 10 раз
- Поблагодарили: 17 раз
Использование TEMP данных
Вот ведь, век живи - век учись. Я поэкспериментировал и оказалось, что список TEMP действительно не имеет особого значения. Есть значение "Local Data" (контекстное меню FB/FC "Object properties..." Вкладка "General - Part 2" "Local Data"), и это фактически размер стека, нужного для вызова. Как только добавляешь в текст программы адрес, скажем L15.7, значение Local Data увеличивается, чтобы стек этот адрес покрывал, и никаких проблем быть не должно.
Стало быть, мое предыдущее сообщение в этой ветке некорректно.