Сразу оговорюсь, что не питают иллюзий, что все делаю правильно, а эта железка неправильно работает. Наоборот уверен на 100% , что где-то косячу, но не пойму где!?!
Итак собственно сама проблема...
В коде программы для CPU315 необходимо организовать выделение большего из нескольких реальных чисел. На stl сделал небольшую функцию, опробовал её в симуляторе - всё ОК! Потом осенило - а нет ли в библиотеке готовых? И нашел! То FC25 MAX - трёхвходовая функция на выходе - наибольшее из трех чисел. Вставляю в программу загружаю - нет даже выделения ее зеленым цветом в результате на выходе - ничего... Что могу делать неверно?
Не работает функция
Не работает функция
Вот моя подпись...
Re: Не работает функция
Прогрузил сам код функции в контроллер?
Допускается INT, DINT и REAL.Выходное значение остается неизменным и бит двоичного результата (BR) слова состояния устанавливается в "0", если выполняется любое из следующих условий:
• переменная с назначенными параметрами имеет недопустимый тип данных
• не все переменные с назначенными параметрами имеют один и тот же тип данных
• переменная типа REAL не представляет допустимое число с плавающей точкой.
Re: Не работает функция
Хорошо... Сделайте Вы простейший пример с данной функцией и проверьте его работу в симуляторе.
Вот моя подпись...
Re: Не работает функция
Разобрался... Вкратце полученные выводы.
В функции использовал на входе DB с реальными числами, а на выходе хотел складывать в MD50. Не вдавался в подробности перевода Хелпа по функции, но когда сделал адресацию через указатель Р#M50.0 REAL 1 функция ожила.
В функции использовал на входе DB с реальными числами, а на выходе хотел складывать в MD50. Не вдавался в подробности перевода Хелпа по функции, но когда сделал адресацию через указатель Р#M50.0 REAL 1 функция ожила.
Вот моя подпись...
Re: Не работает функция
Ещё одна "непонятка".
При создании в функции на LAD простейшей команды TRUNC преобразования реального числа из db не хочет на выход подставляться необходимое МD ранее используемое в проекте и имеющее символьное представление. Если я ввожу туда Адрес свободный, неиспользуемый, то вводится. Так же после сохранения такого варианта и перевода его на stl необходимый адрес подставляется без проблем! Почему?
При создании в функции на LAD простейшей команды TRUNC преобразования реального числа из db не хочет на выход подставляться необходимое МD ранее используемое в проекте и имеющее символьное представление. Если я ввожу туда Адрес свободный, неиспользуемый, то вводится. Так же после сохранения такого варианта и перевода его на stl необходимый адрес подставляется без проблем! Почему?
Вот моя подпись...
Re: Не работает функция
Вобщем, разобрался - конфликт в типе данных. В db - real, в MD - dword. Тогда непонятно почему для stl это не страшно? Данный "косяк" ( а может сделано специально) идет из импортного проекта. Непонятно почему, для чего импосранцы сделали данные с энкодера - реальными числами? Где-то загадка..
Вот моя подпись...
Re: Не работает функция
Ну как? Я тоже предпочитаю работать с реальными единицами: миллиметрами, градусами или даже радианами...mr_Frodo писал(а):Непонятно почему, для чего импосранцы сделали данные с энкодера - реальными числами?
Re: Не работает функция
Ну тогда почему в stl TRUNC из DB-real в MD-dword компилятор съедает, а в LAD и FBD ругается?!?
Вот моя подпись...
Re: Не работает функция
Язык STL в среде Step7 v5.x намного функциональнее, чем LAD и FBD. Но вообще правильнее конвертировать так: DB-real -> MD-dint.mr_Frodo писал(а):Ну тогда почему в stl TRUNC из DB-real в MD-dword компилятор съедает, а в LAD и FBD ругается?!?
Тип dword в данной функции неуместен, т.к. этот тип является упаковкой для 32 отдельных битов. Int/dint в отличие от word/dword хранят число.
Спасибо за подсказку. Проверился в нескольких онлайн-сервисах - чисто. Поищите проблему у себя.mr_Frodo писал(а):Кстати у Вас на сайте - вирус.
Re: Не работает функция
По поводу вируса- серфинг проводил андроид устройством. Нажал пальцем случайно по какой-то ссылке и он загрузил приложение для андроида, которое антивирус определил как зловред. Так что дело Ваше...
Вот моя подпись...
Re: Не работает функция
Ссылка-то какая?
Re: Не работает функция
Не засек. Наверное случайно коснулся какого-то баннера рекламного... Больше пробовать не хочу, а на Windows всю рекламу adblock удаляет, не вижу...
Вот моя подпись...
Re: Не работает функция
Столкнулся с таким "неудобством" Stepa" (уже не первый раз). В вышеописанных примерах причина была такая же.
Использую в коде счётчик S_CU (счёт вверх). Все числовые переменные у него типа WORD. На сбросном входе R установлен компаратор на равенство значений. Смысл таков, что когда счётчик доходит до определённого значения счёта то автоматически обнуляется при срабатывании компаратора. В качестве выходной переменной использовал меркерное слово. Его же сравниваю в компараторе. Всё работает, НО.... Пока это меркерное слово не имело символьного представления всё было хорошо, но для удобочитаемости надо же по феншую сохранить его в списке символов. Вот тут и вылезло неудобство... Если я MW сохраняю как символ INT - ругается счётчик (он выплёвывает значение WORD). Если я делаю из него WORD - верещит компаратор (ему на входе нужен INT).
Перевожу представление кода в STL, редактирую это слово с сохранением хоть в INT, хоть в WORD. Компилятор не ругается
Сохраняю и перевожу вид в графическое представления - ХРЕН! Остаётся в STL.
Для себя вижу несколько решений:
либо 1. Оставить MW без сохранения в таблице символов.
либо 2. Из счетчика забирать в MW WORD. Добавить пром оператор MOVE из одного MW WORD в другое MW INT. Использовать в компараторе MW INT.
либо 3. Сохранить MW любым типом и оставить нетворк в виде STL.
У кого какие ещё соображения на это?
Использую в коде счётчик S_CU (счёт вверх). Все числовые переменные у него типа WORD. На сбросном входе R установлен компаратор на равенство значений. Смысл таков, что когда счётчик доходит до определённого значения счёта то автоматически обнуляется при срабатывании компаратора. В качестве выходной переменной использовал меркерное слово. Его же сравниваю в компараторе. Всё работает, НО.... Пока это меркерное слово не имело символьного представления всё было хорошо, но для удобочитаемости надо же по феншую сохранить его в списке символов. Вот тут и вылезло неудобство... Если я MW сохраняю как символ INT - ругается счётчик (он выплёвывает значение WORD). Если я делаю из него WORD - верещит компаратор (ему на входе нужен INT).
Перевожу представление кода в STL, редактирую это слово с сохранением хоть в INT, хоть в WORD. Компилятор не ругается
Сохраняю и перевожу вид в графическое представления - ХРЕН! Остаётся в STL.
Для себя вижу несколько решений:
либо 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), счетчики моточасов и пр.
Использую системные функции. Они, мне кажется, работают гораздо корректнее.
Еще попадалось такое мнение: все счетчики и таймеры делать самому из подручных средств (с использованием математики, внутренних таймеров, системных бит и пр.). Достоинство: можно реализовать на любом контроллере, понятно работает, работает так, как тебе надо. Делаю таким образом счетчики выполненных циклов (формата DINT), счетчики моточасов и пр.
Re: Не работает функция
Да, с конвертацией типов и адекватностью функций в старом Степ7 не все в порядке... Есть еще вариант - перейти на ТИА Портал, тут с этим все отлично.
Я бы использовал MOVE для конвертации типа WORD->INT.
Я бы использовал MOVE для конвертации типа WORD->INT.
Re: Не работает функция
Коллеги, спасибо за мнение!
Я тоже сначала использовал свой счётчик, но при вводе нескольких операторов Степ начинает ругаться на превышение длины нетворка LAD. Я конечно его посылаю, но некоторые линии уже не даёт нарисовать, как если бы их рисовать при небольшой длине цепи нетворка LAD. Тоже такой кракозябр присутствует... Вот решил попробовать родной счётчик и результат не обрадовал ))))) хоть и размер участка кода становится компактней.
По поводу пРОтала... Я даже боюсь думать о его использовании на 300 и 400-х контроллерах, пока жисть не заставит в принудительном порядке и на нашу контору свалится 1000 контроллер. Хотя временами испытываю с трудом преодолимое желание сесть позаниматься с ним. Были попытки, но робкие.
Я тоже сначала использовал свой счётчик, но при вводе нескольких операторов Степ начинает ругаться на превышение длины нетворка LAD. Я конечно его посылаю, но некоторые линии уже не даёт нарисовать, как если бы их рисовать при небольшой длине цепи нетворка LAD. Тоже такой кракозябр присутствует... Вот решил попробовать родной счётчик и результат не обрадовал ))))) хоть и размер участка кода становится компактней.
По поводу пРОтала... Я даже боюсь думать о его использовании на 300 и 400-х контроллерах, пока жисть не заставит в принудительном порядке и на нашу контору свалится 1000 контроллер. Хотя временами испытываю с трудом преодолимое желание сесть позаниматься с ним. Были попытки, но робкие.
Вот моя подпись...
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: Не работает функция
Меня немного напрягает неявное преобразование типов. Не верю я в корректность работы компилятора (программистов).Михайло писал(а):перейти на ТИА Портал, тут с этим все отлично
Стараюсь разбивать на такие сегменты, которые входят на один экран монитора. Чтобы не листать.mr_Frodo писал(а):теп начинает ругаться на превышение длины нетворка LAD
Re: Не работает функция
mrFrodo, а если так:
Option -> Customize -> LAD/FBD и снять галочку Type Check of Addresses
Это чтобы word/int не различал...
Option -> Customize -> LAD/FBD и снять галочку Type Check of Addresses
Это чтобы word/int не различал...