Присел сегодня поковыряться с ентой проблемкой. Побаловался с симулятором. Живой ПЛК
CP1L-EM пока недоступен.
Ниже представлю процесс ковыряний и выводы.
Итак, я хотел получить честную отработку функции ABS() внутри FB в таком выражении
Код:
out := ABS(REAL_TO_UINT(in * 10,0));
Функция ABS() в таком выражении не работает. Да и чего я хотел, Преобразую REAL в UINT (он и так без знака должен быть), а сверху еще и функцию ABS() накручиваю. В общем понадеялся на автопреобразования типов видимо... Когда писал это для CJ2M не обратил внимание на излишества в выражении, а CJ2M проглотил и (что интересно) исполнил ПРАВИЛЬНО! А CP1L-EM тот же код принял без проблем, но исполнил НЕ ПРАВИЛЬНО!
Далее решил попробовать избавиться от функции ABS() в надежде, что функция REAL_TO_UINT() избавит меня от знака.
Код:
out := REAL_TO_UINT(in * 10,0);
Хрен то там. Всё по прежнему. Знак проходит насквозь FB с таким выражением.
Попытка номер три (включил мозг). Поменял местами функции ABS() и REAL_TO_UINT() в выражении.
Код:
out := REAL_TO_UINT(ABS(in) * 10,0);
Чудо произошло именно в этот момент. Всё сработало ПРАВИЛЬНО.
Картинка Итога (проект ковыряний приложил тоже)
Вложение:
pic1.JPG
Понимаю, что сам запутал CP1L. Но ведь CJ2M меня правильно понял...
Короче, имейте ввиду.
На следующей неделе командировка. Будут испытания на живом CP1L.
Надеюсь всё подтвердится и больше я нигде не накосячил )