Добрый день! Не могу понять, что происходит с макросом INT MAX10? Всегда макрос работал, а теперь что? Или у меня с симуляцией что-то не так?
Вид для печати
Добрый день! Не могу понять, что происходит с макросом INT MAX10? Всегда макрос работал, а теперь что? Или у меня с симуляцией что-то не так?
Изначальный макрос, насколько я понимаю и как утверждает ТС, выполнен правильно(как и было задумано), просто ТС не понимает как он работает(алгоритм работы). Если это чужой макрос можно обратится к автору или тому кто осведомлён по этому вопросу. Всё равно не до конца понятно, как можно было использовать макрос, в алгоритме работы которого не до конца разобрался, короче, надо начать сначала, надеюсь суть понятна?!
И по решению конкретной задачи хотелось спросить: диапазон сравниваемых значений какой, он более значения "268435455"(28 бит) или нет?
Это я к тому, чтобы можно было метку(4 бита) добавить в значения на каждом входе, затем отсортировать в порядке возрастания(убывания) значений, если не ошибаюсь, "капзап" предлагал макрос сортировки и останется посмотреть метку у наибольшего(наименьшего) значения, в метке содержится номер входа на который подано это значение, всё! Это я один из вариантов решения предлагаю, но для окончательного решения нужны уточнения от ТС.
Вот совсем другой, принципиальный(без учёта модификации ПР) вариант решения:
Вложение 62209
Вложение 62210
Такие вещи наверное проще теперь на ST сделать (есть конечно проблема с тем, что это будет функция и выход только один - но можно также выделить несколько бит в выходном значении под номер входа)
Вы шутите? Макрос выгружен из менеджера компонентов и он не находит максимальное int
Мой чем не устраивает, Вам шашечки или ехать?
Вот даже макрос состряпал, находит большее из 16 и номер входа показывает, вроде даже превосходит ваши хотелки?!
Так он ещё и на порядок проще вашего "монстра", можете же Вы находить худшее из худшего к тому же и неработающее!
Короче, проверяйте:
Вложение 62227
Вложение 62228
Совсем забыл, в отличии от вашего, мой макрос можно и легко расширить, до пределов диапазона, практически ничего не меняя: расширить мультиплексор на входе(поставить 2-3 экземпляра имеющегося макроса, короче, сколько понадобится) и изменить пару значений, в настройках счётчика и константе, всё!
Если два и более максимальных значения, будет показывать номер входа с меньшим порядковым номером!
MAX10 в базе существует в двух версиях
собственно MAX10.tpl
и MAX10_old.tpl
MAX10_old - работает, а в новом MAX10 что-то пошло не так!
Функция:
function Max: udint;
var_input
IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8 : udint;
end_var
var
num : udint := 1;
end_var
Max := IN1;
num := 1;
if IN2 > Max then Max := IN2; num := 2; end_if;
if IN3 > Max then Max := IN3; num := 3; end_if;
if IN4 > Max then Max := IN4; num := 4; end_if;
if IN5 > Max then Max := IN5; num := 5; end_if;
if IN6 > Max then Max := IN6; num := 6; end_if;
if IN7 > Max then Max := IN7; num := 7; end_if;
if IN8 > Max then Max := IN8; num := 8; end_if;
Max.28 := num.0;
Max.29 := num.1;
Max.30 := num.2;
Max.31 := num.3;
end_function
А как надо(в идеале), чтобы на соответствующем выходе по очереди появлялись номера входов с наибольшими значениями, если их более одного?
Сложновато, можно так вырезать метку(4 старших бита):
Вложение 62243
Если Вы говорите, что на ST это просто, сделайте так, что бы при наличии нескольких входов с максимальными значениями их номера выводились одной строкой начиная с самого маленького порядкового номера входа, например, если все входа имеют одинаковое значение, строка будет так выглядеть: "12345678", тем более для восьми значений(одноразрядных) хватает диапазона типа данных(DINT), понятно объяснил?
Примерно как-то так:
Вложение 62279
Вложение 62280
Вложение 62281
Вложение 62306
Я к тому, что Вы сами это сказали!
Могу и в качестве разделителя нолик поставить:
Вложение 62282
Вложение 62283
Только тогда меньшее количество входов можно будет записать до переполнения.
Вот, немного текущий макрос поправил(были небольшие косяки):
Вложение 64805
Замечаний и предложений не так много, но работы хватит:
1. Перегруппировать макросы, примеры:
CLOCK_WEEK расположен в Дата и время, а его аналог ClockWeek_ - в Доп. функциях
CycleTime - в разделе Общие, а его аналог TIME CYCLE - Таймеры и счетчики
Так же, например B_SEL я бы перенес из раздела Общие в Дискретные преобразователи
2. Используемый макрос SEL_FLOAT заменить на штатную функцию fSel, а сам макрос можно и убрать из базы
3. В макросах, которые светятся желтым заменить связи на линию задержки
4. Ну и, я бы все макросы температурных датчиков вынес в отдельную группу
Денисов Максим Сергеевич у вас там есть макрос, который с битами работает с 1-ого бита вместо 0-ого. Со слов Ревака Юрия макрос делался для ТРМ1032(33) или около. Вот зачем подобные макросы без проверки попадают в Logic ? я понимаю, что какие-то полезны, но они ведь должны удовлетворять логике работы непосредственно для ОЛ, а не пиленные под какие-то там ТРМы...
Я говорил про конкретную задачу, что её проще на ST сделать
А код для этой виртуальной задачи такой (в одной функции выводится значение, а в другой - счётчик номера входов):
Код:function Max: udint;
var_input
IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8 : udint;
end_var
var
Count : udint := 1;
end_var
Max := IN1;
Count := 1;
if IN2 > Max then Max := IN2; Count := 2;
elsif IN2 = Max then Count:=Count*10+2;
end_if;
if IN3 > Max then Max := IN3; Count := 3;
elsif IN3 = Max then Count:=Count*10+3;
end_if;
if IN4 > Max then Max := IN4; Count := 4;
elsif IN4 = Max then Count:=Count*10+4;
end_if;
if IN5 > Max then Max := IN5; Count := 5;
elsif IN5 = Max then Count:=Count*10+5;
end_if;
if IN6 > Max then Max := IN6; Count := 6;
elsif IN6 = Max then Count:=Count*10+6;
end_if;
if IN7 > Max then Max := IN7; Count := 7;
elsif IN7 = Max then Count:=Count*10+7;
end_if;
if IN8 > Max then Max := IN8; Count := 8;
elsif IN8 = Max then Count:=Count*10+8;
end_if;
end_function
Вот смотрю эту картинку:
Вложение 62299
Мне всё понятно!
А смотрю вашу писанину, мне вообще ничего не понятно, зачем Вы пишите, то что пишите, в смысле, что это проще? Это же не соответствует действительности!
Я всё прекрасно понимаю, что Вы выражаете своё мнение или для Вас проще, тогда это нужно уточнять! Боюсь со мной многие согласятся!
Вот мой вариант с разделителем между номерами входов в виде нолика и не переусердствуете с количеством максимумов, чтобы переменная(тип данных) не переполнялась.
Вложение 62300
И, вашу нижнюю(на картинке) функцию(с номерами максимумов) не нашёл, Вы, наверно забыли выложить.
Боюсь про понятность ФБД в таких типах задач вы сильно преувеличиваете, но это моё мнение, и я не боюсь, что многие со мной согласятся.
Сколько программных циклов занимает просмотр входных значений и передача результата на выход? Кстати в качестве генератора можно попробовать использовать элемент НЕ с обратной связью.
Функция с номерами входов имеет тот-же код, с перестановкой местами Max и Count в заголовке. Жаль конечно, что ST в OL не поддерживает передачу параметров по ссылке (IN_OUT).
Вы, что действительно не понимаете в чём разница? Я же написал "мне"! Если бы я этого не обозначил, боюсь моё утверждение стало бы неправдивым, как и ваше! Вы в принципе понимаете смысл Вами написанного? Даже если найдётся всего один человек во Вселенной, знакомый с ОЛ, но не знакомый с ST, то ваше утверждение будет неправдивым! Считайте меня этим человеком, этого достаточно!
Да ладно, не заводитесь, это действительно было только моё личное мнение - я всегда использую FBD (а если точнее, то CFC), как язык основной программы - мне на нём проще сделать общую компоновку, он проще в отладке и при внесении изменений. Функциональные блоки (макросы, функции и т.п.) тоже на FBD. Но есть такие моменты, когда я сходу мог бы написать вариант решения на ST (или другом текстовом языке), но из-за отсутствия его поддержки в системе бывает трачу кучу времени на пляски с FBD.
Вообще, возможность использовать разные языки при программировании ПЛК сильно облегчает жизнь, поэтому я, например, очень рад, что в OL появился хотя-бы такой вариант ST.
Сергей0308 не важно вам или кому-то другому легче, но во многих вещах текстовый вариант кода будет многократно лаконичнее и меньше... Особенно если все потроха спрятаны от глаз прошивкой (ну или языком). Простой пример скажем копирование массива (В ОЛ нет их к сожалению но может со временем появятся)....
Например в ST по указателям циклом, а если бы функционал был заложен в прошивку то как в языках Array.Copy(исходный, индекс, получатель, индекс, количество) а дальше прошивка занимается.
Попробуйте в FBD например 4 байта перетрусить местами на новые места, а это могла быть всего одна строчка, если бы поддерживалось на уровне firmware прибора например...
Ну или один квадратик без кучи FBD внутри....
Ну еще пример проще. fSEL - раньше это был целый макрос, сейчас функция в прошивке.
Вот Вам функцию, переставляет местами ворды в двойном слове:
Вложение 62307
Всё элементарно, до проще не бывает!
Аналогично можно и байты в ворде переставить!
Сергей0308 байты, а не слова, соответственно добавится еще FBD, вместо того, чтобы такие вещи добавить в прошивку ПР и FBD бы выглядел примерно так, на один вход подаем что надо, на второй вход к примеру "4321" и на выходе получим переставленное именно в этом порядке...
Ну или в рамках ПР научить это делать галочками не только для мастера наконец, но и для слейва.... :)
Я же написал, хорошо повторюсь, в ворде переставить местами байты можно аналогично как на моей картинке, только измените константу для сдвига с "16" на "8", всё! Надеюсь как разбить двойное слово на два слова Вы сообразите?!
Вот Вы говорите, что не пользуйтесь ПР от Овена, Вы купите и попользуйтесь и тогда, если будут какие вопросы и спросите, зачем выдумывать несуществующие проблемы, у ПР есть перестановка байт и слов и с этим у меня никогда проблем не возникало! Тем более я Вам нарисовал как переставить слова и байты!
Вложение 62309
Вложение 62310
Вложение 62311
Даже так:
Вложение 62312
https://disk.yandex.ru/d/J58fo9rg44EtNg
Сергей0308 кто вам сказал, что я не пользуюсь ПР от Овена? я такого не говорил :) тем более один висит в котельной а другой на столе....
Я про другое говорю, как бы просто это не выглядело на картинках, в ST и тем более в С это выглядит гораздо компактнее и некоторые вещи могли быть заложены в прошивку на уровне железа, а в базе это выглядело бы как обертка как тот же TON, TOF, AND, PUTBIT и так далее и занимало бы гораздо меньше места без необходимости выстраивать кучу элементов и создавать макросы на достаточно простые вещи...
И пора бы Овену избавляться от хлама в виде счетчика например, в который нельзя записать уставку добавив в справку замену.
Загрузите старую программу - оп-па, покраснел элемент - внизу - "Смотри туда-то как его заменить"...
Надо освобождать прошивку от хлама, который оставлен для какой-то там совместимости, учитывая, что сама программа друг с другом фиг совместима вниз....
з.ы. это просто мое мнение, может быть когда-нибудь дойдет до (цензура :) ) программеров...
Вот разобрал и собрал, на регистры и байты, переставляй не хочу)))Вложение 62313
Байты конечно условные, но правильные, проверено.
Даже можно в REAL переставлять, только сначала умножить на 10, 100, 1000 и конвертировать. Потом обратно, также.
Но на ST это намного проще)
ЗЫ Ну вот, пока рисовал, Сергей уже всё выложил)
Да, десятки раз на форуме этот вопрос обсуждали, как разбить на байты и собрать обратно:
Вложение 62314
Боюсь, даже медведь, если присутствовал на форуме, во всём бы разобрался!
Сергей0308, тут в другом проблема, в полученном REAL по сети, с переставленными байтами (регистрами), байты таким способом уже не переставишь, если ПР слейв.
Тут уже указатели нужны и ST, а так же наличие переменных типа BYTE.
Например число -3.388945e+025, если перевести в целочисленное будет 0, а SHR и SHL с флоатом не работают.
А реально это 123.4568 с переставленными регистрами.
ТРМ-ы, модули ввода-выхода, ПЧ и датчики от Овена не могут быть мастером, тогда у вас мастером ПЛК должен выступать, короче, вам повезло, всё сделаете по красоте на ST! Не может же сеть без мастера работать!
ну и посчитайте количество ваших художеств? дело совсем не в байтах, словах и их перестановках, а в том, что таких элементарных вещей не заложили в потроха...
Это называется хотите быть лучше лого, зелио и прочего - делайте лучше... :)
Так как порядок байт не стандартизирован на уровне протокола, то в слейве любой порядок правильный, разрулирование возможных проблем совместимости разных приборов(приборов разных фирм) возложено на мастера сети, так что это в принципе не проблема слейва, почему разумные аргументы до вас никак не доходят?!
Сергей, мастер один, а слейвов может быть много и разных производителей, что тогда делать?
Вот в FIProg сделано ,что менять можно последовательность и в мастере и слейве..для разных типов данных
Если учитель в группе общается с иностранными учениками, то как правило, в жизни ученики переводят , что им сказал учитель(мастер), а не мастер для каждого ученика переходит на разные языки...Имхо, так естественней.
rovkiWirenBoard сейчас мутят подобные решения (я писал пост про их датчики, они выдали мне к нему комментарии), обещая даже ремаппинг регистров под себя (чтобы собрать свою карту регистров в нужном порядке без пропусков).Цитата:
Вот в FIProg сделано ,что менять можно последовательность и в мастере и слейве..для разных типов данных
Я бы хотел, чтобы ОВЕН эти идеи взял себе на заметку.
Сергей0308 в мире масса систем, где проще в слейве, ПР или ПЛК изменить порядок сетевых переменных, чем в этих системах написать скрипты для перестановки. Мир к сожалению не ограничен MasterScada или OwenOPC... поверьте, указанные галочки для slave режима ДОЛЖНЫ работать аналогично мастеру, многим станет легче....Цитата:
Так как порядок байт не стандартизирован на уровне протокола, то в слейве любой порядок правильный, разрулирование возможных проблем совместимости разных приборов(приборов разных фирм) возложено на мастера сети, так что это в принципе не проблема слейва, почему разумные аргументы до вас никак не доходят?!
Cs-Cs поддерживаю, с разработчиком RapidScada вышел аналогичный разговор по поводу Modbus слейва, нет возможности собрать свою карту, наличие пропусков, так как сделано отражение на данные, которые нужны не все.
Я с вами не соглашусь, мне проще одну программу иметь и в ней всё настраивать, чем для ПЛК своя программа, для сенсорной панели своя, надо всё заранее предусмотреть, так как изменив одну, придётся и вторую менять!
Для каких случаев вы такое предлагаете? Если Вы изначально всё делаете, не задав правильный порядок чередования байт у вас и не будет работать! Мне принципиально не ясно, для чего этот сыр-бор, чтобы переделывать уже существующие системы, когда нет проекта для ПЛК? Мне всегда не нравилось, когда борются не с болезнью, а её симптомами, типа человек заболел, простудился у него поднялась высокая температура, чтобы её сбить, мы его в прорубь опускаем!
че как маленькие, есть прекрасный инструмент в виде текстового ЯП. Пользуйтесь им, чтоб выполнить сложные математические решения. Квадраты ни кто не трогает, получается на них и хорошо. Что же касается разношерстных слейвов, ну не выставляйте в конфигурации чтение реалов, поставте два слова и крутите ими как хочется,. хоть байты меняйте хоть слова, хоть не трогайте.
ЗЫ к проекту рисунок прилагается Вложение 62320