У вас в слэйве всего 2 input-регистра, а опрашивать в панели вы пытаетесь 10.
Настройте в панели двух регистров - тогда всё будет работать корректно.
Так я же 10 сделал только после того как 2 не получилось. Так стоп, а почему при смене адреса входных регистров с %QW0 на %QW2 у меня не работало? Я пробовал опрашивать 3х2-3х4 регистры. Я ж говорил что множество вариантов пробовал.
Так вот значит в чем беда, в КДС2.3 хоть и не существующие регистры опрашивай, он из них существующие покажет а остальные нет. А тут и не говорит об ошибке никакой.
Спасибо за помощь!!! Большущее!
Всех приветствую. При вводе в переменную типа Риал ввожу значение 12.04 отображает в программе 12. А пид регулятор только Риал принимает. Хотелось бы до сотых повысить точность, можно такого добиться.
И еще вопрос по PFW регистрам в панели в них как писать и с них считывать. Потому что например Уставку на панели задать. Наверное тоже копированием регистров.
в розовое поле, где отображается просто 12 ткните ЛКМ на треугольник, что там показывает?
ЗЫ и да, начните читать хоть немного документацию и пользоваться подсказками, например нажмите на кружок с буквой i на скрине, он приведет Вас к нужному месту Вашего вопроса Вложение 60909
Добрый день.
Есть СПК 110, Создаю проект "стандартный" проект в CodeSys v 3.5 sp5 patch 5. Подключение к ПЛК происходит без проблем, добавляю MODBUS, Modbus Master, COM Port - возникает ошибка Вложение 61077 "[ERROR] Без имени2: Modbus_Master_COM_Port [Device: Modbus_COM]: C0046: Идентификатор 'IoDrvModbus.IoDrvModbusComPort' не задан" . Версия таргет-файла 3.5.4.26 . Помогите разобраться с проблемой.
Вкладка "Информация" : Вложение 61078
ПКМ на каждый компонент Modbus в дереве проекта - Обновить устройство - выбрать подходящую версию.
Как понять, какая версия подходящая - см. Приложение А (стр. 191), столбец 3.5.4.30:
https://ftp.owen.ru/CoDeSys3/11_Docu...odbus_v3.0.pdf
Не нашел "выбрать подходящую версию" Вложение 61079
Спасибо, при добавлении модулей ввыода-вывода возникает другая ошибка - ------ Компиляция : Приложение: Device.Application -------
типизировать код...
[WARNING] Без имени5: C0200: Отсутствует разрешение для заполнителя CmpCodeMeter
[ERROR] Без имени5: MV110_16D_DN [Device: Modbus_COM: Modbus_Master_COM_Port]: C0077: Неизвестный тип: 'Mx110_Drivers.Mv110_16DdnDriver'
Компиляция завершена -- 1 ошибок, 1 предупреждений
Вложение 61080
Опять не ту версию выбираете.
Установите этот пакет:
https://ftp.owen.ru/CoDeSys3/04_Libr...5.4.13.package
Удалите из дерева проекта шаблон, который уже добавили.
Добавьте заново, на этот раз выбрав версию 3.5.4.13.
Спасибо огромное, вроде все работает. А подскажите, это я изначально что-то не так делал, или эти "танцы с бубном" это обычная ситуация при работе с codesys? Вроде на сайте выбирал нужный ПЛК, очень понравилось что под конкретную модель весь необходимый софт предлагается, а по факту ставишь его и нужно еще на форум обратится.
Привет. Подскажите, как правильно поступить.
На шине ModBus висит 5 устройств. Из 4-х нужно постоянно читать данные. А из 5-го их нужно читать только при открытом экране визуализации 'display05'.
Первые 4 устройства у меня в дереве проекта привязаны к соответствующим переменным и читаются автоматически. Тут все норм.
А как задать условия чтения 5-го устройства? Я хочу, чтобы это устройство НЕ читалось, при других экранах визуализации, кроме экрана 'display05'.
Код:IF find(VisuElems.CURRENTVISU, 'display05') = 1 THEN // Проверяем текущий экран визуализации (проверяем равенство строковых переменных)
// Как обратиться к устройству ModBus №5 (читать регистр № 36) только в этом месте, не мешая другим устройствам?
END_IF
Если обмен настроен через дерево проекта - то так:
https://owen.ru/forum/showthread.php...l=1#post304649
Спасибо. Так работает нормально.
Скажите, а есть ли способ посчитать количество ушедших/пришедших пакетов по шине ModBus для одного из устройств (конкретного)?
https://ftp.owen.ru/CoDeSys3/11_Docu...odbus_v3.0.pdf
См. п. 4.6 - системные переменные компонентов Modbus Slave COM Port и Modbus TCP Slave
С помощью xDone можно определить число принятых корректных пакетов.
С помощью xError и byModbusError можно определить число принятых пакетов с кодами ошибок и число запросов, оставшихся без ответа.
Сложив эти три числа - получим число отправленных пакетов.
Подсчет, соответственно, потребуется организовать самостоятельно в коде программы.
Здравствуйте. Опять есть вопрос по обмену. Подскажите как быть.
В цикле постоянно читаются 7 параметров из одного устройства (пакетное чтение командой modbus-04).
Эти 7 параметров выводятся на дисплей для контроля в режиме реального времени.
На дисплее есть 7 полей для ввода новых значений любого из параметров.
Также есть 7 кнопок "Записать в устройство", каждая из которых должна записать одиночной командой только соответствующий из параметров.
Что нужно подвесить на кнопку (событие OnMouseClick), чтобы нажатие на нее вызвало отправку одиночного пакета modbus (одиночная запись командой modbus-06).
Евгений, в приведенных вами ответах не нашел нужного.
Тут привязка к конкретному экрану визуализации. Полезная штука, но это не то.
Тут статистика по конкретному устройству целиком. Полезно, но это не то.
Подскажите как быть.
Спасибо.
К кнопке достаточно привязать BOOL-переменную, которая будет привязана к триггеру вашего канала записи.Цитата:
Что нужно подвесить на кнопку (событие OnMouseClick), чтобы нажатие на нее вызвало отправку одиночного пакета modbus (одиночная запись командой modbus-06)
По нажатию на кнопку нужно генерировать в ней единичный импульс.
См. стр. 39 и далее, параметр "Триггер"
https://ftp.owen.ru/CoDeSys3/11_Docu...odbus_v3.0.pdf
Спасибо. Вроде разобрался.
В этом slave-устройстве имеется 1 канал для пакетного чтения и 7 каналов для индивидуальной записи.
А переменная xTrigger будет действовать на все 7 каналов записи одновременно? Т.е. нажатие на кнопку произведет сразу 7 индивидуальных записей?
(Я не нашел переменную xTrigger на каждый канал записи. Переменная есть только на всё устройство.)
Для того, что-бы получить переменные xTrigger для каждого из каналов, я клонировал мое slave-устройство.
Вложение 61356
И в каждом клоне описал свой индивидуальный канал записи. Тогда у каждого устройства (читай: у каждого канала записи) теперь есть своя переменная xTrigger.
Эту переменную (generator01cloneX.xTrigger) и привязал к кнопке
Всё работает, но есть проблемы:
Компилятор ругается на дублирование адресов slave-устройств-клонов. Это не ошибка, а предупреждение. Работать можно.
Пропадает наглядность проекта в IDE.
Костыль... Ёпта!
Вам не нужно клонировать устройство.
Забудьте вообще про xTrigger - в вашем случае он не нужен.
Перейдите на вкладку соотнесения входов-выходов - там будут каналы триггеров для каждого канала типа Передний фронт.
Привяжите к каждому триггерному каналу свою переменную.
Ссылку на руководство я уже выше привел.
Вложение 61357 Вложение 61358
Привет.
Подключил датчик и хочу забрать от него параметр из регистра Modbus.
Как правильно привязать переменную (тип WORD)?
Туда, где показано зеленым или красным? Зачем там два таких поля? В чем разница? (см. рисунок)
Вложение 61535
Добрый день.
В вашем случае - разницы нет.
Разница была бы, если бы вы читали одним запросом несколько регистров - тогда в верхнем поле вы могли бы привязать массив вордов (он представялет собой все регистры ответа), а при его раскрытии - привязать переменные к отдельным вордам (если, например, вас из ответа интересуют значения только конкретных регистров).
Спасибо за ответ.
Подскажите, будет ли работать сл. метод:
1. Есть структура sensorsRAW. В нее попадают сырые значения от десяти датчиков из сети ModBus.
2. Есть "Конверсия единиц CODESYS3.5" В которой эти сырые значения преобразуются масштабированием и смещением (соответствующие коэффициенты K и B)Код:rPressurePatm_RAW: REAL := 0.0; // Давление в атмосфере, кПа ABS (необработанное значение)
rPressurePvac_RAW: REAL := 0.0; // Давление вакуума (готовность вакуума), кПа ABS (необработанное значение)
...
3. Есть структура sensors. В ней должны лежать уже конвертированные величины от этих десяти датчиков.
Но почему-то во второй структуре (sensors) числа не меняются. Может нельзя вставлять функцию .Convert (.Reverse) прямо вот так в структуру?Код:rPressurePatm: REAL := ExchangePressurePatm.Convert(PLC_PRG.stSensorsRaw.rPressurePatm_RAW) ; // Давление в атмосфере, кПа ABS
rPressurePvac: REAL := ExchangePressurePvac.Convert(PLC_PRG.stSensorsRaw.rPressurePvac_RAW); // Давление вакуума (готовность вакуума), кПа ABS
...
Может .Convert (.Reverse) нужно вставлять в основной код программы?
Выложите простейший проект, на котором можно воспроизвести описанную ситуацию.
Вот проект.
Там только 2 датчика.
Они читаются через ModBus, конвертируются.
proj001.project
Я думаю, что функцию преобразования .Convert и .Reverse нельзя вставлять тупо в структуру. Их надо вызывать в PLC_PRG.
В выложенном проекте Unit Conversion не используется в принципе.
И что важнее - Unit Conversion выполняется только в контексте визуализации, так что для вашего случая (масшатабирование одной переменной программы и запись этого значения в другую) - этот функционал не подойдет.
Это почему?.. Преобразования ExchangePressure из Unit Conversion должны ложиться в структуру sensors.
И я думал, что теперь, в основной программе где-бы я не использовал переменные этой структуры, то они всегда будут уже преобразованы.Код:TYPE sensors :STRUCT
rPressurePatm: REAL := ExchangePressurePatm.Convert(PLC_PRG.stSensorsRaw.wPressurePatm_RAW) ; // Давление в атмосфере, кПа ABS
rPressurePvac: REAL := ExchangePressurePvac.Convert(PLC_PRG.stSensorsRaw.wPressurePvac_RAW); // Давление вакуума, кПа ABS
END_STRUCT
END_TYPE
Это учебный проект.
В рабочем проекте у меня 3 параллельные многошаговые задачи. И там много где внезапно (независимо друг от друга) вычитывается значение этих преобразованных величин.
Ладно, Евгений - забудьте. Просто я думал, что .Convert (.Reverse) можно вписывать прямо вот так в структуру. Но оно работает только в основном цикле программы.
Сейчас я это проверю...
Вы думали неправильно.
Код, который вы написали, выполняется только при инициализации переменных после загрузки проекта.
Да. Халява не прошла. :)
Спасибо за разъяснения.
Подскажите, а как заставить ModBud принимать значение в регистре не WORD, а INT? (см. рисунок)
У меня прилетает значение от датчика целое от -10000 до 10000. И когда датчик отдаст значение -314, то оно будет недостоверным.
Вложение 61539
Подскажите, как получить переменные из DB S7-300? Здесь чувак показывает что это возможно но не делится как он это сделал
В видео показано, как использовать приложение на node-red в качестве шлюза протоколов между S7-300 (протокол S7) и Raspberry Pi с CODESYS (протокол OPC UA).
По node-red много статей и видео в интернете - найти информацию должно быть несложно.
К наших контроллерам это никак не относится.