Да мне бы хоть теорию -- какие файлы куда складывать в ФС ПЛК. Автоматизировать на минималках-то я смогу.
Вид для печати
Да мне бы хоть теорию -- какие файлы куда складывать в ФС ПЛК. Автоматизировать на минималках-то я смогу.
По вашей ссылке -- настройка Modbus RTU в CoDeSys. Может, вы другую ссылку отправить хотели?
Добрый день.
У меня в этой версии прошивки описанная проблема не воспроизводится.
См. скриншоты:
Вложение 66343 Вложение 66344
Возможно, после перевода xEnableOwenCloud в FALSE забыли обновить лог и видите прошлые сообщения?
Если нет - то пришлите в личку ваш телефон и обеспечьте удаленный доступ по AeroAdmin.
> Какой контроллер вы используете?
СПК1xx
Скопировал файлы по образцу готового проекта -- вроде всё завелось, перезагрузку переживает корректно.
Буду думать теперь над скриптом развёртывания.
Спасибо за помощь.
Вероятно, конкретно вывод в лог от gethostbyname тогда еще не отключили.
В подготавливаемой в данный момент прошивке этот вопрос будет окончательно решен (там изменится обработка уровней логирования компонента).
В данный момент я предлагаю попробовать исключить из компиляции задачу OwenCloudTask.
Подскажите где в Windows хранятся графические файлы из "ImagePool" ?
/home/root/CODESYS_WRK/PlcLogic/visu/
Поправочка -- PlcLogic/visu
Почему-то так, в CS 3.5 SP14, во всяком случае.
Добрый день.
Пытаюсь читать значения из рецептов функцией RecipeManCommands.GetRecipeValues из библиотеки Recipe_Managment.
Все получается ок но не получается прочитать данные если они хранятся в рецепте в виде WSTRING. Даже если в функцию передать массив WSTRING строк то все возвращаются крокозяблы
Вопросы:
- можно ли хранить в рецепте строки WSTRING?
- как прочитать корректно такие строки без загрузки в переменные программы всего рецепта?
Спасибо
Добрый день.
1. Можно
2. Предлагаю начать с этого:
https://youtu.be/A1WrZVJUWhY
Про GetRecipeValues примерно с 30:00 начинается.
Спасибо подробно и понятно. И отдельное спасибо за оперативный ответ
Кстати наблюдение которое удалось выяснить - через метод RecipeManCommands.GetRecipeValues удается прочитать WSTRING строку из рецепта не более 65 символов длинной. Если строка длинней то программа вываливается в исключение.
Видимо внутренние переменные метода объявлены как STRING(260).
И для преобразования длинных строк в функции RECIPE_STRING_TO_WSTRING из примера по видео пришлось явно задать длину входной и выходной переменной иначе они ограничивались 80 символами (это максимум 20 символов для преобразования в WSTRING)
Поисследую этого на досуге.Цитата:
Кстати наблюдение которое удалось выяснить - через метод RecipeManCommands.GetRecipeValues удается прочитать WSTRING строку из рецепта не более 65 символов длинной. Если строка длинней то программа вываливается в исключение.
Upd. - проверил в V3.5 SP17 Patch 3. В ней с помощью метода RecipeManCommands.GetRecipeValues в принципе не получается считать строку (STRING) длиннее 80 символов.
Да, вы поступили совершенно правильно.Цитата:
И для преобразования длинных строк в функции RECIPE_STRING_TO_WSTRING из примера по видео пришлось явно задать длину входной и выходной переменной иначе они ограничивались 80 символами (это максимум 20 символов для преобразования в WSTRING)
> не получается считать строку (STRING) длиннее 80 символов
Ну так по умолчанию в CS строка без явного указания размера интерпретируется, как 80-символьная: If a size is not defined, then 80 characters are reserved by default
Там строка возвращается по указателю.
И есть поле iStringLength, которое задает пользователь (макс. длина строк в его буфере).
В принципе - в таких случаях обычно по указателю может вернуться строка с любым количеством символов - в т.ч. и более 80.
https://content.helpme-codesys.com/e...ipeValues.html
Показательный пример:
https://content.helpme-codesys.com/e.../StrFindA.html
У функции вход типа POINTER TO STRING(255), но реально она может вычислить размер строки длиной вплоть до 32767 символов - вы можете легко в этом убедиться.
Так что POINTER TO STRING не всегда означает, что под указатель можно подложить только STRING(80) и не более - иногда это совсем не так.
А, ясно. Это я на сигнатуру не посмотрел -- думал, что строка по значению передаётся.
Подскажите как можно написать код что бы при нажатии параметры передавались в Word, НО при этом должен формироваться Бит по переднему фронту. т.е. должна быть запись в xBit i wCmdWord.
В запись Word можно сделать через CASE, а вот что бы Бит формировался не могу сообразить.
Тогда сделайте так:
Вложение 66361
Код:// в коде PLC_PRG (или другой программы)
// fbRtrig - это экземпляр R_TRIG
fbRtrig(CLK := xCmd);
// укажите нужный вам бит
wCmdWord.0 := fbRtrig.Q;
Добрый день. Подскажите, возможно ли стать клиентом OPC UA в Codesys или только в роли сервера возможно?
Так мне нужно записать в один и тот же бит с трех кнопок, т.е.:
кнопка старт/ экземпляра R_TRIG - запись в бит (переменная - %QX20.1)/ запись word (%QW11)
кнопка стоп/ экземпляра R_TRIG - запись в бит (переменная - %QX20.1)/ запись word (%QW11)
кнопка реверс/ экземпляра R_TRIG - запись в бит (переменная - %QX20.1)/ запись word (%QW11)
Привет.
Подскажите принцип срабатывания WatcDog таймера.
1. Если функциональный блок (FB) не отдал управление через определенной количество секунд, то в ПЛК летит сигнал RESET. Так?
2. Если программа (PRG) не отдала управление, то конфигуратор задач принудительно переключит ПЛК на другую программу? И так по кругу между программами? Или тоже сгенерируется сигнал Reset?
Добрый день.
См. стр. 16, п. 3:
https://ftp.owen.ru/CoDeSys3/98_Book...kManagment.pdf
Добрый день.
Подскажите, пожалуйста, по такому вопросу. Предположим, мне нужно опрашивать по TCP около двух десятков устройств. Период опроса - от одной до нескольких секунд. Объем данных, которые будут исходить из контроллера и приниматься им - несколько сотен байт максимум. Некоторые устройства - десятки байт.
1. Допустимо ли в CODESYS создать такое колличество TCP-клиентов и некоторый связанный с ними ST-парсинг, если на том контроллере будет и визуализация для отображения состояния устройств и управления ими, или это вообще не проблема
в смысле нагрузки на средний контроллер?
2. Вполне ли достаточно для этого контроллеров Owen 200 серии?
Добрый день. Может в чем то заблуждаюсь. Не так давно занимаюсь Кодесис3.5. Написал пока начало блока:
IF w09>1 THEN
Pusk_Nasos_Otop_Syst:=FALSE;
TON_2(IN:=FALSE);
ELSE
TON_2(IN:=wa11,PT:=w12,Q=>Pusk_Nasos_Otop_Syst,ET= >wa25);
END_IF
Как бы у меня Блок TON находится внутри основного блока.
FUNCTION_BLOCK Nasos_Otop_Syst
VAR_INPUT
wa11: BOOL;
w12: TIME;
w09: REAL;
END_VAR
VAR_OUTPUT
Pusk_Nasos_Otop_Syst: BOOL;
wa25: TIME;
END_VAR
VAR
TON_2: TON;
END_VAR
Как бы все работает, но никак не могу понять смысл строчки Pusk_Nasos_Otop_Syst:=FALSE; если я ее убираю:
ведь я уже написал условие , что если wa>1, то на IN в TON будет FALSE соответственно и выход должен стать фальшем, а он остается TRUE.
В CFC без проблем все делается. А вот в ST какие то подковырки. Извините если этот форум не про правильность написания и устранении ошибок, подскажите пожалуйста про такой форум.