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

S7-1200 не корректная работа условия?

ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)
Ответить
Аватара пользователя

Автор темы
M3f
не первый раз у нас
не первый раз у нас
Сообщения: 377
Зарегистрирован: 31 янв 2017, 11:08
Имя: Николай
Благодарил (а): 8 раз
Поблагодарили: 116 раз

S7-1200 не корректная работа условия?

Сообщение M3f »

Имеем:
1. TIA Portal Professional V17;
2. S7-1200 firmware 4.5.0.

При использовании такого алгоритма:

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

"OPC_GDB".GA_CO := DWORD_TO_REAL("Modbus_GDB".EL3020.Comp1);
IF "OPC_GDB".GA_CO <= 0.0 THEN
  "OPC_GDB".GA_CO := 0.0;
END_IF;
, если значение переменной "OPC_GDB".GA_CO отрицательное, то иногда (раз в несколько минут) в переменной "OPC_GDB".GA_CO остается это отрицательное значение (остается на цикл или чуть больше, отследил только через Скаду, чтением данной переменной каждые 500 мс), хотя оно должно всегда перезаписываться на 0 (ноль).

При замене выше описанного алгоритма на:

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

IF DWORD_TO_REAL("Modbus_GDB".EL3020.Comp1) <= 0.0 THEN
  "OPC_GDB".GA_CO := 0.0;
ELSE
  "OPC_GDB".GA_CO := DWORD_TO_REAL("Modbus_GDB".EL3020.Comp1);
END_IF;
, значение переменной "OPC_GDB".GA_CO уже никогда не становится меньше 0 (нуля).
Сразу скажу, больше нигде в программе записи в данную переменную нет, DB-шки где лежат переменные не оптимизированные.

Вопрос. Это нормальное поведение ПЛК? Кто-нибудь сталкивался с таким? Обнаружил такое поведение сразу для нескольких переменных.
P.S. После заливки программы на чистый ПЛК, его пару раз прогружали через "only changes", прогрузить через "rebuild all" и проверить глюк ли это или баг пока нет возможности, так как установка в работе.
EPLAN Electric P8 Professional+ 2.7 HF1 11496 | TIA Portal Professional V17 Upd1 | Creo Parametric 4.0 M070

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3558
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 253 раза

S7-1200 не корректная работа условия?

Сообщение Михайло »

У меня бывало плохо прогружался код SCL, тоже нифига не понимал, что происходит. Вроде код загружен, а ничего не изменилось. И так по несколько раз подряд: меняешь код, а ничего не меняется, при этом в онлайн лампочка зеленая напротив блока. Но в основном такое явление не наблюдается, очень и очень редкое. Кажется в некоторые моменты ТИА впадает в маразм ступор. У меня TIA v15.1.
Аватара пользователя

Автор темы
M3f
не первый раз у нас
не первый раз у нас
Сообщения: 377
Зарегистрирован: 31 янв 2017, 11:08
Имя: Николай
Благодарил (а): 8 раз
Поблагодарили: 116 раз

S7-1200 не корректная работа условия?

Сообщение M3f »

Михайло, да бывают глюки, но у меня они были сразу видны во время наладки или отладки программы. А тут все работает, блоки прогружены, код есть, переменная обнуляется. Заметить в ПЛК этот "подарок" вообще не реально. Я случайно выявил эту проблему после нескольких дней уже рабочей установки.
А "самый цимес" в том, что эти значения очень критичны и за отрицательные значения, которые участвуют в дальнейших расчетах, заказчик бы выплачивал очень приличные штрафы.
P.S. Как вы решали проблему? "Rebuild all" и перезаливка?
EPLAN Electric P8 Professional+ 2.7 HF1 11496 | TIA Portal Professional V17 Upd1 | Creo Parametric 4.0 M070

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3558
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 253 раза

S7-1200 не корректная работа условия?

Сообщение Михайло »

M3f писал(а): 19 фев 2022, 22:02 P.S. Как вы решали проблему? "Rebuild all" и перезаливка?
Видимо само решалось на следующий день или как-то так. То есть перезапуск ТИА?..

В вашем случае еще может быть тонкость сравнения REAL-переменных. Знаете проблему сравнения вещественных чисел? В несовременных языках программирования нельзя сравнивать 0.5 = 1/2. Такое сравнение даст результат False.

Современные языки имеют в свое ассортименте сущность типа inf и eps (бесконечно большая и бесконечно малая величина)... Я еще не понял, SCL в этом плане современен или нет.

Хотя в вашем случае вроде все чисто, но я боюсь, что какой-то нюанс сравнения вещественных чисел срабатывает...
Аватара пользователя

Автор темы
M3f
не первый раз у нас
не первый раз у нас
Сообщения: 377
Зарегистрирован: 31 янв 2017, 11:08
Имя: Николай
Благодарил (а): 8 раз
Поблагодарили: 116 раз

S7-1200 не корректная работа условия?

Сообщение M3f »

Михайло, да, про нюанс при сравнении чисел с плавающей точкой знаю. Если проблема в сравнении, тогда не понятно почему во втором варианте нет этой проблемы.
EPLAN Electric P8 Professional+ 2.7 HF1 11496 | TIA Portal Professional V17 Upd1 | Creo Parametric 4.0 M070
Аватара пользователя

megavolt86
эксперт
эксперт
Сообщения: 1172
Зарегистрирован: 14 ноя 2013, 20:35
Имя: Анатолий Сергеевич
Страна: Россия
город/регион: Башкортостан
Благодарил (а): 13 раз
Поблагодарили: 65 раз

S7-1200 не корректная работа условия?

Сообщение megavolt86 »

Михайло писал(а): 19 фев 2022, 22:09 При использовании такого алгоритма
Я вотсейчас принципильно не пишу в одну и ту же переменную в одном цикле из нескольких мест (наобжигался в свое время)...
Я бы попробовал читать из дб модбас в темповую переменную, а потом уже по условию писать в конечный дб.
:ext_secret:

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3558
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 253 раза

S7-1200 не корректная работа условия?

Сообщение Михайло »

megavolt86, аа, ну да, точно! Как же я не подумал!

M3f, панель оператора может считать значение из ПЛК прям посреди между строчками: после первого присвоения, но до обнуления. Происходит это редко, ибо попасть трудно в этот момент. Сделайте как пишет megavolt86. Сделайте все, лишь бы в цикле программы было одно присвоение в конечный тег.
Аватара пользователя

Nicolayy
освоился
освоился
Сообщения: 280
Зарегистрирован: 14 фев 2014, 11:55
Имя: Николай
Страна: Россия
Благодарил (а): 9 раз
Поблагодарили: 64 раза

S7-1200 не корректная работа условия?

Сообщение Nicolayy »

M3f, попробуйте использовать для "OPC_GDB".GA_CO тип не Real, а LReal (тип по умолчанию для чисел с плавающей точкой в Step7).
Или еще можно попробовать сравнивать не с числом 0.0 (которое как раз типом LReal является), а с другой переменной типа Real, равной нулю.
Но вообще, конечно, странная история. Напоминает как в C++ постоянно возникают косяки у тех, кто использует тип float, а не double...

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

S7-1200 не корректная работа условия?

Сообщение stesl »

M3f писал(а): 19 фев 2022, 19:10 "OPC_GDB".GA_CO := DWORD_TO_REAL("Modbus_GDB".EL3020.Comp1);
"OPC_GDB".GA_CO что это? Тоже DB? Зачем преобразование?
Аватара пользователя

Nicolayy
освоился
освоился
Сообщения: 280
Зарегистрирован: 14 фев 2014, 11:55
Имя: Николай
Страна: Россия
Благодарил (а): 9 раз
Поблагодарили: 64 раза

S7-1200 не корректная работа условия?

Сообщение Nicolayy »

stesl, очевидно, что "OPC_GDB".GA_CO -- это переменная типа Real, а "Modbus_GDB".EL3020.Comp1 -- переменная типа DWord. Целое число преобразуется в число с плавающей точкой. Хотя DWORD_TO_REAL можно не писать, тогда это преобразование всё равно произойдет, просто в неявном виде

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

S7-1200 не корректная работа условия?

Сообщение stesl »

Всё что я сейчас напишу - относится сугубо к классике ) Если эти постулаты опрокинуты в 1200 и ТИА, то прошу простить.
Nicolayy писал(а): 22 фев 2022, 08:49 Хотя DWORD_TO_REAL можно не писать, тогда это преобразование всё равно произойдет, просто в неявном виде
Не произойдет. Такое преобразование относится к явным функциям преобразования

С точки зрения компилятора SCL все числовые значения в DB (не BOOL и BYTE разумеется) хранятся в форматах WORD или DWORD соответственно. Поэтому если нам нужно взять из DB какой то REAL, для операций с ним - то обязательно нужно преобразовать DWORD_TO_REAL(DB1.DD0). Равно как после и положить - DB1.DD0 := REAL_TO_DWORD(AnyReal)
А вот при присвоении переменной одного DB другому - такое преобразование не нужно.

Смущает то, что без такого преобразования - классика просто бы и не скомпилила текст...

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

IF "OPC_GDB".GA_CO <= 0.0 THEN
Аватара пользователя

Nicolayy
освоился
освоился
Сообщения: 280
Зарегистрирован: 14 фев 2014, 11:55
Имя: Николай
Страна: Россия
Благодарил (а): 9 раз
Поблагодарили: 64 раза

S7-1200 не корректная работа условия?

Сообщение Nicolayy »

stesl писал(а): 22 фев 2022, 10:17 Не произойдет. Такое преобразование относится к явным функциям преобразования
Это ошибочное утверждение. Вы можете это сами легко проверить. Создайте DB с неоптимизированным доступом. Создайте в нем переменные:

var1 Real DB1.DBD0
var2 DWord DB1.DBD4

Напишите такие строки кода:

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

var2 := 10;
%DB1.DBD0 := %DB1.DBD4;
и Вы увидете, что переменной var1 будет присвоено значение 10.0

Но! Если Вы напишите так:

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

%DB1.DBD0 := 10.0;
, то компилятор отругается Вам на то, что не умеет в неявном виде преобразовывать LReal в DWord.
stesl писал(а): 22 фев 2022, 10:17 С точки зрения компилятора SCL все числовые значения в DB (не BOOL и BYTE разумеется) хранятся в форматах WORD или DWORD
А Вы не путайте формат и тип данных. Есть двойное слово, а есть целочисленный тип данных DWord. Это не одно и тоже.
И еще: тип данных Real - это тоже двойное слово. Но, однако, компилятор умеет делать неявное преобразование LReal в Real каждый раз, когда Вы хотите присвоить какое-то значение переменной типа Real.
Последний раз редактировалось Nicolayy 22 фев 2022, 12:05, всего редактировалось 1 раз.

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

S7-1200 не корректная работа условия?

Сообщение stesl »

Nicolayy писал(а): 22 фев 2022, 11:58 А Вы не путайте формат и тип данных
Я не путаю, цепляться необязательно )
Nicolayy писал(а): 22 фев 2022, 11:58 Создайте DB с неоптимизированным доступом.
Понятия не имею, что такое DB с неоптимизированным доступом ) Равно как и с оптимизированным. Если это штучки ТИА, то я умываю руки, уже сказал об этом.
Еще не понимаю как
Nicolayy писал(а): 22 фев 2022, 11:58 преобразовывать LReal в DWord
То есть 8 байт впихнуть в 4. Если речь о Long Real

И напоследок
Nicolayy писал(а): 22 фев 2022, 11:58 Это ошибочное утверждение.
Это не мое утверждение, а информация из альманаха Ганса Христиана Берегера )
НО, касательно классики.

В общем, я так понимаю все прояснилось. В ТИА все немного поменялось относительно классики.
Аватара пользователя

Nicolayy
освоился
освоился
Сообщения: 280
Зарегистрирован: 14 фев 2014, 11:55
Имя: Николай
Страна: Россия
Благодарил (а): 9 раз
Поблагодарили: 64 раза

S7-1200 не корректная работа условия?

Сообщение Nicolayy »

stesl писал(а): 22 фев 2022, 12:04 В ТИА все немного поменялось относительно классики.
Да. И поменялось далеко не в лучшую сторону.

Отправлено спустя 3 минуты 19 секунд:
stesl писал(а): 22 фев 2022, 12:04 Понятия не имею, что такое DB с неоптимизированным доступом ) Равно как и с оптимизированным.
Оптимизированный доступ - это такая штука, когда у переменных внутри DB нет адресов, т.е. они хранятся где-то неизвестно где. Соответственно, к ним нельзя обращаться по адресам. Кому-то в Siemens'e просто не сиделось спокойно, и вот они придумали такое. Слава богу, что это вредное нововведение можно отключить (пока еще можно...)

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

S7-1200 не корректная работа условия?

Сообщение stesl »

Nicolayy писал(а): 22 фев 2022, 12:10 это такая штука, когда у переменных внутри DB нет адресов
Можно даже сказать - это такая шутка ))) Я понял, спасибо, Николай за краткий ликбез
Аватара пользователя

Автор темы
M3f
не первый раз у нас
не первый раз у нас
Сообщения: 377
Зарегистрирован: 31 янв 2017, 11:08
Имя: Николай
Благодарил (а): 8 раз
Поблагодарили: 116 раз

S7-1200 не корректная работа условия?

Сообщение M3f »

Nicolayy писал(а): 22 фев 2022, 00:01 M3f, попробуйте использовать для "OPC_GDB".GA_CO тип не Real, а LReal (тип по умолчанию для чисел с плавающей точкой в Step7).
Или еще можно попробовать сравнивать не с числом 0.0 (которое как раз типом LReal является), а с другой переменной типа Real, равной нулю.
Но вообще, конечно, странная история. Напоминает как в C++ постоянно возникают косяки у тех, кто использует тип float, а не double...
На работающей установке вряд ли получится перебить в Скаде на тип LReal, только для проверки. Как появится возможность, закину проект на тестовый ПЛК с аналогичной прошивкой.
Как писал выше, думаю, что дело не в сравнении с 0 (нулем), так как по второму варианту были бы тоже проблемы.
Пока хочется верить, как писал Михайло, что Скада действительно иногда выдергивала значения из переменной до перезаписи на 0 (ноль). Хотя вероятность на это должна быть очень мала.

P.S. Преобразование в моем случае, действительно можно было не делать, это старая привычка.
EPLAN Electric P8 Professional+ 2.7 HF1 11496 | TIA Portal Professional V17 Upd1 | Creo Parametric 4.0 M070

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

S7-1200 не корректная работа условия?

Сообщение stesl »

M3f писал(а): 22 фев 2022, 12:30 P.S. Преобразование в моем случае, действительно можно было не делать, это старая привычка.
Любопытно, будет ли разница - без него...
Аватара пользователя

Nicolayy
освоился
освоился
Сообщения: 280
Зарегистрирован: 14 фев 2014, 11:55
Имя: Николай
Страна: Россия
Благодарил (а): 9 раз
Поблагодарили: 64 раза

S7-1200 не корректная работа условия?

Сообщение Nicolayy »

stesl писал(а): 22 фев 2022, 12:27 Можно даже сказать - это такая шутка )))
Да, да. Совершенно верно. А насчет вот этих неявных преобразований Вы понимаете, до чего они дошли: они дошли до того, что простая пересылка двойных слов приводит ко всяким ненужным преобразованиям. Ну, вот я Вам привёл пример:

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

// var1 Real DB1.DBD0
// var2 DWord DB1.DBD4

var2 := 10;
%DB1.DBD0 := %DB1.DBD4; // 10 --> 10.0 --> %DB1.DBD0 
Но если написать по-другому, то всё работает как надо:

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

// var1 Real DB1.DBD0
// var2 DWord DB1.DBD4

var2 := 10;
%DB1.DBW0 := %DB1.DBW4; 
%DB1.DBW2 := %DB1.DBW6; 
Т.е. компилятор не понимает, какой там тип данных в DB1.DBW0 и DB1.DBW2 и никаких преобразований (которые делать никто вообще-то и не просил его) не производит. Вот так приходится выкручиваться из-за сименовского навязчивого сервиса...

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

S7-1200 не корректная работа условия?

Сообщение stesl »

Nicolayy писал(а): 22 фев 2022, 12:54 Т.е. компилятор не понимает, какой там тип данных
Мда... А ведь принято было ругать Simatic за эти массовые строки преобразования в коде ))) Народ услышан? ))
Я сперва тоже дергался, но как то быстро понял, что строгий контроль за типами данных это хорошо. Оставалось только заставить себя "видеть в голове" код уже со всеми этими преобразованиями ) Чтобы не жать кнопку компиляции по 50 раз
Аватара пользователя

Nicolayy
освоился
освоился
Сообщения: 280
Зарегистрирован: 14 фев 2014, 11:55
Имя: Николай
Страна: Россия
Благодарил (а): 9 раз
Поблагодарили: 64 раза

S7-1200 не корректная работа условия?

Сообщение Nicolayy »

stesl писал(а): 22 фев 2022, 13:43 Народ услышан? ))
Ага! А еще народ постоянно жаловался на старый Step7, почему, мол, дистрибутивы такие маленькие - меньше 50 GB, это ж несерьезно! Неужто массивы трёхмерной графики и тонны текстур во всяких там их новых GTA и т.п. занимают больше, чем (ВНИМАНИЕ!) среда разработки программ для ПЛК и панелей оператора? Непорядок! И к тому же еще и не тормозит, и не глючит ничего - срочно всё переделать на последних версиях .Net Framework, чтоб оперативку по полной забить, чтоб всё тормозило как следует. "Да, и почему вообще 32-битные версии дистрибутивов еще существуют в природе?", - вопрошал народ. И Siemens успешно решил все эти проблемы благодаря TIA Portal'у! Какие молодцы!
)))))))
Ответить

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