Есть еще глобальные данные и указатели можно подать на вход блока
Вид для печати
Да,забыл сказать-данная конструкция в ST должна работать в цикле
IF ...
ELSIF ...;
ELSIF ...;
TON1(IN:=(NoP AND bi0_trig) OR (NoP AND bi1_trig),PT:=T#1s);
END_IF;
поэтому, когда я делал так:
то как раз после этого выход таймера и оставался в TRUE.
Конструкция замечательно работает в CFC за счет буковки R:D , но совсем не хочет работать в ST(во всяком случае у меня)
Все-разобрался:).
YuriBel так вот же, еще дополнитеьные входы будут необходимы.
Просто когда заметил, что при всем FB отъедается память не как в Owen Logic, удивился. Если бы прога предназначалась для ПЛК100, может и не парился бы, а так планировал ее на ПЛК63 запускать, а в доках прочел, что всего 448 байт под retain отводится и упс....
Переписал библиотеку с переносом параметров выхода в VAR_IN_OUT. В результате переменные, цепляющиеся на входы переносим в retain а саму библиотеку нет. Съело 937 байт.
Я не пойму, тут такая же дырка, как и с загрузкой библиотек в принципе ? при Компиляции CodeSys компилирует все библиотеки, вне зависимости, сколько поставленно в проект по факту ?
Сейчас начну вычищать лишние библы, чтобы проверить.
Так и есть, бл.... слов нет, целиком библиотеки подключать нельзя, или может быть можно и живьем в приборе реально будет заниматься меньше памяти.
Можно как-то контролировать сколько памяти реально использовано в ПЛК ?
Удалил все библиотеки из oscat кроме одной используемой, и получил честные 97 байт. (96 на переписанной библиотеке с 6-ью экземплярами и + 1 добавленная переменная)
Вопрос по циклу программы - в КДС в онлайн режиме можно посмотреть реальное время выполнения цикла программы ?
Засекундомерьте:1-2 мс с небольшой прогой на ПЛК110-60.Код:VAR
prevScanTime, delta: TIME;
END_VAR
delta := TIME() - prevScanTime;
prevScanTime := TIME();
Yegor то есть только программным костылем ? Какого-нить меню в самом КДС не предусмотрено чтобы посмотреть ?
capzap вы про эту статистику из Информации о проекте ? или еще какую-то ?
Нажав кнопку ‘Статистика’ (Statistics), вы получите статистическую информацию о проекте. Она
включает число POU, типов данных, локальных и глобальных переменных.
а слово конфигуратор Вы прочитали в моем посте, это там же где и про модуль button
capzap а, понял, спасибо. Поиграюсь с ним, чтобы разобраться.
Только если я правильно понял, информацию по нему надо в документации на ПЛК смотреть а не в доках по КДС.
А, нашел в доках по КДС.... буду разбираться.
Это кому как :)
http://www.owen.ru/catalog/51162335
последний пункт для скачивания
Всем добрый день.
Можно ли установить на компьютер клиента CodeSys HMI без установки
самой CodeSys?
Можно.
Правда были разговоры, что надо поставить целиком весь комплект, а потом выборочно компоненты удалить, чтобы Gateway остался.
Вопрос по Modbus. Если ошибаюсь поправьте. Проблема заключается в том, что в сети предполагается шлюз Modbus - SNMP, который может выступать как мастером так и слейвом, но мастером ему быть предпочтительнее, так как он будет мониторить оборудование с которым ПЛК будет работать постольку поскольку. ПЛК же будет собирать данные с датчиков, так же должен читать некоторые данные с указанного оборудования по modbus и передавать все это шлюзу. Либо шлюз будет забирать сам.
В случае, если ПЛК будет слейвом, он же не сможет читать данные с других слейвов в сети ? Или есть возможность читать и писать через порт при помощи Modbus.lib будучи слейвом ? (сижу вот с ней разбираюсь потихоньку)
ModBus.lib только для RTU.
Для работы по Ethernet она не подойдет.
Так то и по какому интерфейсу должен быть мастером и слейвом. Я запутался...
Николаев Андрей именно RTU и рассматривается.
шлюз Modbus RTU - SNMP предполагается делать мастером сети.
Сможет ли ПЛК, будучи слейвом читать данные с других слейв устройств через библиотеку Modbus.lib открыв порт или ПЛК в любом случае должен быть мастером ?
Да, скорее всего к ПЛК еще будут подключены модули ввода-вывода типа МК110 и другие с аналоговыми входами.
В общем как правильно будет построить сеть в данном случае ?
Шлюз так же может быть и слейвом, но предпочтительнее, если это возможно в такой связке, чтобы он был все-таки мастером.
Почему Modbus.lib только для RTU ? в документации по ней вроде и ASCII тоже участвует, или оно не так как надо работает ?
Шлюз, это дополнительное устройство в сети некой америкосовской фирмы. Необходим из-за системы диспетчеризации у заказчика. Они могут работать только по SNMP
Две простых вещи:
Если не хотите проблем, то мастер в сети должен быть один.
Без мастера в сети никакого обмена не будет.Слейвы между собой общаться не умеют.
Отсюда делайте выводы, какая будет сеть.
YuriBel В примерах для ПЛК100 - запись INT и REAL сам ПЛК не обозначен ни как мастер ни как слейв. Только работа с библиотеками и портом.
Интересно то, что на com_num при запуске примера выдается красным *** INVALID: 0 ***
Все-таки необходимо назначать в конфигурации ПЛК, что он Мастер Modbus даже для данного примера ? И при этом так же в конфигураторе надо обозначать все слейвы ?
Реально рабочие примеры есть вообще, а то сложно что-то понять, когда что-то не так сделано.
Получилось управлять выходами МК110 при помощи Modbus.lib, при этом я не делал ПЛК ни мастером ни слейвом в конфигурации. Получается можно сделать ПЛК слейвом для другого мастера и при этом управлять другим слейвом. По идее, другого устройства под руками нет к сожалению.
Ну такпри использовании библиотеки конфигурация и не нужна.Цитата:
Получилось управлять выходами МК110 при помощи Modbus.lib, при этом я не делал ПЛК ни мастером ни слейвом в конфигурации
Т.к. у ПЛК два порта, то можно один использовать для мастера, а второй для слейва и программно обмениваться данными между ними.
Мухи отдельно, котлеты отдельно, в смысле конфигурация сама по себе, бублиотека сама по себе.
А вообще меня всегда удивляет упорное желание людей браться за сложные вещи, не попробовав делать простые.
Начинайте с простых вещей, если с ними не получается решить задачу в принципе, беритесь за сложные. С конфигурацией работать проще, чем с библиотекой, и поработав с ней, а заодно прочитав, как работает Модбас, можно понять, что и как нужно делать. И если на практике окажется, что не получается с конфигурацией добиться нужной скорости работы, то это повод браться за библиотеку, а если скорость приемлема, то можно все оставить на конфигурации.
И поверьте, сделать, пусть самый простой, пример самому иногда бывает намного полезнее, чем посмотреть чужой работоспособный. Набитые шишки - это на самом деле полезный багаж.
petera На ПЛК100 вроде один порт 485, какой второй ?
YuriBel Через конфигурацию можно настроить Modbus устройства сторонних производителей ? Меня не интересуют устройства ОВЕН как таковые. Точнее то, что будет висеть из Овена и может быть настроено через конфигурацию, потребует однозначного определения ПЛК как мастера. Мне же мастером необходим Шлюз стороннего производителя. При этом мне необходимо получать от стороннего оборудования в ПЛК один или два параметра чтобы ими потом управлять с ПЛК.
Через конфигурацию ничего кроме самого контроллера настроить нельзя.
В контроллере через конфигурацию организовываются элементы Мастер и Слейв. Мастер имеет Права, Сдлейв имеет Обязанности. Слейв имеет адрес и некоторый набор битов и регистров и обязан по команде Мастера на чтение или запись этих битов и регистров выполнять требуемые действия. Мастер соответственно выдает запросы разным Слейвам и принимает от них ответы. Соответственно нужно один раз и навсегда понять, что в сети Модбас не может быть двух Мастеров. Потому что, если два Мастера одновременно отправят запрос на один и тот же Слейв, и один Мастер получит ответ, предназначавшийся другому Мастеру, то начнется БАРДАК. Поэтому вашу задачу нужно решать путем разделения на две сети - в одной ПЛК будет Мастером и будет опрашивать блоки (абсолютно все равно, Овеновские или нет, важно чтобы все они работали на одной версии модбас с одинаковыми настройками обмена), а по другой сети ПЛК будет Слейвом и будет отвечать на запросы Мастера, которым в этой сети будет тот самый шлюз. Все это скорее всего можно реализовать через конфигурацию, а можно, если очень хочется, через библиотеку. Но сначала нужно четко понять, что в одной сети одно устройство не может быть "чуть-чуть беременным", оно или Мастер или Cлейв. Поэтому я осмелюсь посоветовать разобраться сначала с отдельными блоками через конфигурацию, и только если там будут явные проблемы, браться за библиотеку.
А вообще было бы легче давать советы, понимая "масштаб бедствия". Сколько блоков, сколько у них регистров, насколько часто их нужно опрашивать, будет ли HMI панель, что на ней нужно отображать, и т.д.
:) жесть, чует мое сердце, еще долго будет молодой человек мозг всем тут рвать.
По библиотеке modbus.lib она написана только для мастера, подобной бибки для слейва в свободном доступе не существует. Сам протокол стандартный, поэтому его будут понимать все устройства поддерживающие его
capzap ой буду :)
YuriBel панелей не будет в принципе. Блока нет в наличии, чтобы проверять. (имею ввиду Шлюз, 20 с лишним килорублей мне из своего кармана жалко) :)
Я собственно почему и пытаюсь научиться работать через библиотеку, а не через конфигуратор, потому что не знаю, что там и как. У меня просто нет этих данных и когда будут неизвестно.
Неадекватное поведение элементов библиотеки Modbus.lib
MB_RD_COILS и MB_RD_HOLD_REGS.
Первый при опросе в цикле читает 0 (тут на Exeption 1), 8, 5 байт (параметр ByteCnt), второй 2, 8, 7
Почему при не меняющихся входных параметрах FB так себя ведет ? Ведь такого не должно быть...
Читаем здесь в чем отличие коилсов от регистров http://ru.wikipedia.org/wiki/Modbus
либо формулируйте правильно вопрос
capzap я говорю не об отличиях этих функций, а о том, что сами по себе функции упорно выполняют циклическую работу.
Выход Complete сообщает, что операция завершена (то есть произвели чтение), ByteCnt сообщает сколько байт прочел.
Так вот эти функции не выполняют однократную операцию, а работают почму-то циклом. Например чтение регистров читает 2 байта, потом 8 байт, потом 7 байт.
Вопрос - ПОЧЕМУ она себя так ведет?, ведь когда на входах мы прописали читать Адресс Х, начальный адрес (регист) Y, количество байт Z - должна прочитать один раз и заткнуться, ну либо читать каждый цикл НО ОДНО количество переменных, с одного адреса, с одного регистра (смещения), и строго одно указанное количество байт.
Нет ? или я опять что-то не понимаю ?
amn, думаю, что преобразователь дополнительный это уже будет крайней мерой.
Видео слабо, но скринами сейчас сделаю.
Три шага выполнения чтения регистров. На третьем шаге в ячейку [4] попадает состояние выходов МК110, потом прыгает еще и в ячейку [1] и на втором шаге, когда ByteCnt = 8 все убивается и так по кругу, если убрать r_trig и просто разрешить работу.
То есть не один раз какое-то значение получаем из МК а постоянно меняющиеся значения, одно из которых мое. я уже не говорю, что параметр Quantity = 1 и я его не меняю.
Либо в описалове на библиотеку что-то не рассказано, либо ее поведение полный неадекват.
Вообще при работе с последовательным портом надо быть готовым к тому, что сообщение будет разбито на несколько кусков. Уж не знаю, как это учитывается в библиотеке.
Yegor при чтении 1-ого байта (ячеек) ? офигеть, он что на три куска бьет чтение одной ячейки ? параметр quantity у FB.
Предположим FB разбил чтение на три куска. 2 байта, 8 и 7. Но почему тогда функция пишет это в массив (а функции массив дали из 256 байт) всегда с начала и не делает приращения ?
capzap да, обмен есть. через FB MB_WR_SNG_COIL прекрасно передается изменение выходов МК, запись 0 или 1 на нужные выход. Выхода вкл/выкл.
При чтении FB регистров на трерьем шаге я вижу в [4] значения выходов.
Но то, что он делает это циклом мне непонятно.
Видно, что в ячейке [0] появляется 16 - вероятно адрес слейва.
в ячейке [3] появляется 50 - видимо адрес регистра 0х32
Я бы понял, если бы FB в массив возвращал полный ответ от устройства
Адрес устройства, функция, данные, контрольная сумма но он несет явную ахинею, которую трудно понять...
Вы хоть имеете представление для чего вход En нужен, блок будет работать пока на этот вход подается ИСТИНА, в Вашем случае это один цикл, за это время обмена с устройством не может происходить. В то же время на вход Enable совсем не требуется подавать постоянно ИСТИНА, там как раз хватит запуска через фронтальный триггер
capzap сути проблемы это не меняет, буфер заполняется не от [0] до [Х] за один шаг (до complete = 1), а несколько раз начиная с [0] разным количеством байт.
Прошу помощи специалистов.
На панель СП270 требуется вывести текущее значение из таймера (Timer.ET) в виде строки типа "3s150ms" (а ещё лучше вообще без ms). Как преобразовать время во что-то удобоваримое для вывода (не применяя массив)?
П.С. Контроллер ПЛК 100, забыла написать)))
Формат time подразумевает хранение времени, выраженном в миллисекундах, поэтому если сначала преобразовать формат времени, ну например, к формату DWord, а затем разделить целочисленным делением на 1000, то получится количество секунд. Его и выводите на здоровье.
Приветствую! Пишу с помощью библиотеки SysLibFile данные в файл CSV, подскажите как сделать перевод записи на след. строку, $0d+$0a не помогает, получается какая-то ерунда.
VAR
CR:STRING:='$00D';
LF:STRING:='$0d0a'
END_VAR
PerevodStroki:=CONCAT(CR,LF);
SysFileWrite(f, ADR(PerevodStroki), SIZEOF(PerevodStroki));