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

Использование TEMP данных

ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)
Ответить

Автор темы
s7eng
новенький
новенький
Сообщения: 1
Зарегистрирован: 29 дек 2021, 20:05
Имя: Денис

Использование TEMP данных

Сообщение s7eng »

Доброго дня, уважаемые форумчане.

Разбираюсь с чужим кодом, возник, возможно, глупый вопрос.

Есть проект в классическом 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

То есть, в моем понимании код использует данные за пределами объявленной области временных переменных.
Вопрос : так вообще можно/приемлемо делать?? Например, во всем известном С, так делать очень опасно

Заранее благодарен.
Аватара пользователя

MuadDib
частый гость
частый гость
Сообщения: 462
Зарегистрирован: 31 июл 2010, 09:12
Имя: Павел
Страна: РФ
Благодарил (а): 10 раз
Поблагодарили: 17 раз

Использование TEMP данных

Сообщение MuadDib »

Я тоже видел нечто подобное в Step7 коде от наших поставщиков. Аналогия с Си полностью корректна: такие художества типа работают, пока в один прекрасный момент жареный петух не клюнет. Если рассуждать логически, проблемы с вашим L15.7 могут возникнуть в следующих случаях:
  • После записи в L15.7 код данного FB вызывает другие FB/FC. Если они модифицируют стек, то могут изменить значение L15.7
  • После записи в L15.7 идет вызов прерывания, которое изменяет стэк по-своему, с теми же последствиями (здесь я не уверен, возможно прерывания используют отдельный стэк)
  • В программе производятся изменения выше в иерархии вызовов (в тех OB/FC/FB, которые вызывают ваш FB): увеличивается размер TEMP области. В результате L15.7 может оказаться вне максимального размера стэка и при операции =L15.7 ОС контроллера задиагностирует ошибку и может остановить выполнение программы
Если ничего из вышеперечисленного у вас не происходит, лучше оставить все как есть, но отметить для себя эту проблему на будущее. В идеальном мире, конечно, надо было бы исправить найденную вами ошибку. Но в реальной жизни, с учетом качества кода от некоторых производителей, работа программы может зависеть от деликатного баланса таких вот скрытых багов. Исправление одного бага может вызвать лавину где-нибудь в другом месте.

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

Использование TEMP данных

Сообщение SMax »

Это не ошибка, а скорее всего, результат автоматического преобразования кода из FBD или LAD в STL.
Вот пример преобразования кода блока FB, где переменные Temp вообще не задекларированы.
001.png
Возможно Ваш блок, или его часть, изначально была написана не на STL.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя

MuadDib
частый гость
частый гость
Сообщения: 462
Зарегистрирован: 31 июл 2010, 09:12
Имя: Павел
Страна: РФ
Благодарил (а): 10 раз
Поблагодарили: 17 раз

Использование TEMP данных

Сообщение MuadDib »

SMax писал(а): 12 янв 2022, 10:23 Это не ошибка, а скорее всего, результат автоматического преобразования кода из FBD или LAD в STL.
Вот пример преобразования кода блока FB, где переменные Temp вообще не задекларированы.
001.png
Возможно Ваш блок, или его часть, изначально была написана не на STL.
Вот ведь, век живи - век учись. Я поэкспериментировал и оказалось, что список TEMP действительно не имеет особого значения. Есть значение "Local Data" (контекстное меню FB/FC -> "Object properties..." -> Вкладка "General - Part 2" -> "Local Data"), и это фактически размер стека, нужного для вызова. Как только добавляешь в текст программы адрес, скажем L15.7, значение Local Data увеличивается, чтобы стек этот адрес покрывал, и никаких проблем быть не должно.

Стало быть, мое предыдущее сообщение в этой ветке некорректно.
Ответить

Вернуться в «Simatic Step7»