Не работает функция

ПЛК / Децентрализованная периферия
Ответить
Аватара пользователя
mr_Frodo
Профессионал
Сообщения: 588
Зарегистрирован: 22 июл 2016, 20:38

Не работает функция

Сообщение mr_Frodo »

Сразу оговорюсь, что не питают иллюзий, что все делаю правильно, а эта железка неправильно работает. Наоборот уверен на 100% , что где-то косячу, но не пойму где!?!
Итак собственно сама проблема...
В коде программы для CPU315 необходимо организовать выделение большего из нескольких реальных чисел. На stl сделал небольшую функцию, опробовал её в симуляторе - всё ОК! Потом осенило - а нет ли в библиотеке готовых? И нашел! То FC25 MAX - трёхвходовая функция на выходе - наибольшее из трех чисел. Вставляю в программу загружаю - нет даже выделения ее зеленым цветом в результате на выходе - ничего... Что могу делать неверно?
Вот моя подпись...

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Не работает функция

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

Прогрузил сам код функции в контроллер?
Выходное значение остается неизменным и бит двоичного результата (BR) слова состояния устанавливается в "0", если выполняется любое из следующих условий:
• переменная с назначенными параметрами имеет недопустимый тип данных
• не все переменные с назначенными параметрами имеют один и тот же тип данных
• переменная типа REAL не представляет допустимое число с плавающей точкой.
Допускается INT, DINT и REAL.

Аватара пользователя
mr_Frodo
Профессионал
Сообщения: 588
Зарегистрирован: 22 июл 2016, 20:38

Re: Не работает функция

Сообщение mr_Frodo »

Хорошо... Сделайте Вы простейший пример с данной функцией и проверьте его работу в симуляторе. 8)
Вот моя подпись...

Аватара пользователя
mr_Frodo
Профессионал
Сообщения: 588
Зарегистрирован: 22 июл 2016, 20:38

Re: Не работает функция

Сообщение mr_Frodo »

Разобрался... Вкратце полученные выводы.
В функции использовал на входе DB с реальными числами, а на выходе хотел складывать в MD50. Не вдавался в подробности перевода Хелпа по функции, но когда сделал адресацию через указатель Р#M50.0 REAL 1 функция ожила. :beer:
Вот моя подпись...

Аватара пользователя
mr_Frodo
Профессионал
Сообщения: 588
Зарегистрирован: 22 июл 2016, 20:38

Re: Не работает функция

Сообщение mr_Frodo »

Ещё одна "непонятка".
При создании в функции на LAD простейшей команды TRUNC преобразования реального числа из db не хочет на выход подставляться необходимое МD ранее используемое в проекте и имеющее символьное представление. Если я ввожу туда Адрес свободный, неиспользуемый, то вводится. Так же после сохранения такого варианта и перевода его на stl необходимый адрес подставляется без проблем! Почему?
Вот моя подпись...

Аватара пользователя
mr_Frodo
Профессионал
Сообщения: 588
Зарегистрирован: 22 июл 2016, 20:38

Re: Не работает функция

Сообщение mr_Frodo »

Вобщем, разобрался - конфликт в типе данных. В db - real, в MD - dword. Тогда непонятно почему для stl это не страшно? Данный "косяк" ( а может сделано специально) идет из импортного проекта. Непонятно почему, для чего импосранцы сделали данные с энкодера - реальными числами? Где-то загадка..
Вот моя подпись...

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Не работает функция

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

mr_Frodo писал(а):Непонятно почему, для чего импосранцы сделали данные с энкодера - реальными числами?
Ну как? Я тоже предпочитаю работать с реальными единицами: миллиметрами, градусами или даже радианами...

Аватара пользователя
mr_Frodo
Профессионал
Сообщения: 588
Зарегистрирован: 22 июл 2016, 20:38

Re: Не работает функция

Сообщение mr_Frodo »

Ну тогда почему в stl TRUNC из DB-real в MD-dword компилятор съедает, а в LAD и FBD ругается?!?
Вот моя подпись...

Аватара пользователя
mr_Frodo
Профессионал
Сообщения: 588
Зарегистрирован: 22 июл 2016, 20:38

Re: Не работает функция

Сообщение mr_Frodo »

Кстати у Вас на сайте - вирус.
Вот моя подпись...

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Не работает функция

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

mr_Frodo писал(а):Ну тогда почему в stl TRUNC из DB-real в MD-dword компилятор съедает, а в LAD и FBD ругается?!?
Язык STL в среде Step7 v5.x намного функциональнее, чем LAD и FBD. Но вообще правильнее конвертировать так: DB-real -> MD-dint.
Тип dword в данной функции неуместен, т.к. этот тип является упаковкой для 32 отдельных битов. Int/dint в отличие от word/dword хранят число.
mr_Frodo писал(а):Кстати у Вас на сайте - вирус.
Спасибо за подсказку. Проверился в нескольких онлайн-сервисах - чисто. Поищите проблему у себя.

Аватара пользователя
mr_Frodo
Профессионал
Сообщения: 588
Зарегистрирован: 22 июл 2016, 20:38

Re: Не работает функция

Сообщение mr_Frodo »

По поводу вируса- серфинг проводил андроид устройством. Нажал пальцем случайно по какой-то ссылке и он загрузил приложение для андроида, которое антивирус определил как зловред. Так что дело Ваше...
Вот моя подпись...

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Не работает функция

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

Ссылка-то какая?

Аватара пользователя
mr_Frodo
Профессионал
Сообщения: 588
Зарегистрирован: 22 июл 2016, 20:38

Re: Не работает функция

Сообщение mr_Frodo »

Не засек. Наверное случайно коснулся какого-то баннера рекламного... Больше пробовать не хочу, а на Windows всю рекламу adblock удаляет, не вижу...
Вот моя подпись...

Аватара пользователя
mr_Frodo
Профессионал
Сообщения: 588
Зарегистрирован: 22 июл 2016, 20:38

Re: Не работает функция

Сообщение mr_Frodo »

Столкнулся с таким "неудобством" Stepa" (уже не первый раз). В вышеописанных примерах причина была такая же.
Использую в коде счётчик S_CU (счёт вверх). Все числовые переменные у него типа WORD. На сбросном входе R установлен компаратор на равенство значений. Смысл таков, что когда счётчик доходит до определённого значения счёта то автоматически обнуляется при срабатывании компаратора. В качестве выходной переменной использовал меркерное слово. Его же сравниваю в компараторе. Всё работает, НО.... Пока это меркерное слово не имело символьного представления всё было хорошо, но для удобочитаемости надо же по феншую сохранить его в списке символов. Вот тут и вылезло неудобство... Если я MW сохраняю как символ INT - ругается счётчик (он выплёвывает значение WORD). Если я делаю из него WORD - верещит компаратор (ему на входе нужен INT).
Перевожу представление кода в STL, редактирую это слово с сохранением хоть в INT, хоть в WORD. Компилятор не ругается %)
Сохраняю и перевожу вид в графическое представления - ХРЕН! Остаётся в STL. :beer:
Для себя вижу несколько решений:
либо 1. Оставить MW без сохранения в таблице символов.
либо 2. Из счетчика забирать в MW WORD. Добавить пром оператор MOVE из одного MW WORD в другое MW INT. Использовать в компараторе MW INT.
либо 3. Сохранить MW любым типом и оставить нетворк в виде STL.
У кого какие ещё соображения на это?
Вот моя подпись...

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Не работает функция

Сообщение Автоматизатор »

Не считаю себя крутым спецом в программировании S7-300 и Step7 соответственно, но у меня сложилось такое впечатление, что встроенные таймеры и счетчики - ущербные, неполноценные, работают странно. Поэтому я их не использую.

Использую системные функции. Они, мне кажется, работают гораздо корректнее.

Еще попадалось такое мнение: все счетчики и таймеры делать самому из подручных средств (с использованием математики, внутренних таймеров, системных бит и пр.). Достоинство: можно реализовать на любом контроллере, понятно работает, работает так, как тебе надо. Делаю таким образом счетчики выполненных циклов (формата DINT), счетчики моточасов и пр.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Не работает функция

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

Да, с конвертацией типов и адекватностью функций в старом Степ7 не все в порядке... Есть еще вариант - перейти на ТИА Портал, тут с этим все отлично. :)

Я бы использовал MOVE для конвертации типа WORD->INT.

Аватара пользователя
mr_Frodo
Профессионал
Сообщения: 588
Зарегистрирован: 22 июл 2016, 20:38

Re: Не работает функция

Сообщение mr_Frodo »

Коллеги, спасибо за мнение!
Я тоже сначала использовал свой счётчик, но при вводе нескольких операторов Степ начинает ругаться на превышение длины нетворка LAD. Я конечно его посылаю, но некоторые линии уже не даёт нарисовать, как если бы их рисовать при небольшой длине цепи нетворка LAD. Тоже такой кракозябр присутствует... Вот решил попробовать родной счётчик и результат не обрадовал ))))) хоть и размер участка кода становится компактней.
По поводу пРОтала... Я даже боюсь думать о его использовании на 300 и 400-х контроллерах, пока жисть не заставит в принудительном порядке и на нашу контору свалится 1000 контроллер. Хотя временами испытываю с трудом преодолимое желание сесть позаниматься с ним. Были попытки, но робкие.
Вот моя подпись...

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Не работает функция

Сообщение Автоматизатор »

Михайло писал(а):перейти на ТИА Портал, тут с этим все отлично
Меня немного напрягает неявное преобразование типов. Не верю я в корректность работы компилятора (программистов).
mr_Frodo писал(а):теп начинает ругаться на превышение длины нетворка LAD
Стараюсь разбивать на такие сегменты, которые входят на один экран монитора. Чтобы не листать.

Геннадий
Дилетант
Сообщения: 13
Зарегистрирован: 06 сен 2017, 13:42

Re: Не работает функция

Сообщение Геннадий »

mrFrodo, а если так:
Option -> Customize -> LAD/FBD и снять галочку Type Check of Addresses
Это чтобы word/int не различал...

Ответить