PDA

Просмотр полной версии : CODESYS V3.5. Настройка обмена с другими устройствами (Modbus, ОВЕН, OPC и др.)



Страницы : 1 [2] 3 4 5 6

Евгений Кислов
19.05.2018, 22:16
1. Надо заметить, что в мониторинге конфигуратора задач время отображется в микросекундах.
2. В значительном числе случаев дефолтного времени (20 мс) для задачи пользовательского кода вполне хватает.
Но если внезапно нет - то можно порекомендовать задавать его как (среднее время цикла в мониторинге, переведенное в мс * 1.25)
3. В CODESYS 3.5 вытесняющая многозадачность. Все циклы так или иначе отработают полностью. Так что "маленькое" время цикла в значительном числе случаев действительно не критично.

P.S. - на всякий случай: мс = миллисекунды (не микро)

Dmitro
20.05.2018, 08:49
Спасибо!
То есть теоретически можно поставить обновление и 1 мс, и СПК будет работать нормально.
Не совсем правда понятно, если любой цикл (рабочей программы/обмена РС485/визуализации) прервется на половине своей работы, "вытеснится" другой задачей...

Евгений Кислов
20.05.2018, 09:43
То есть теоретически можно поставить обновление и 1 мс, и СПК будет работать нормально.

Нет, 1 мс - плохое решение. Начать следует с 20 мс. Далее можно смотреть по среднему времени реального цикла - если не укладывается, то повысить.


Не совсем правда понятно, если любой цикл (рабочей программы/обмена РС485/визуализации) прервется на половине своей работы, "вытеснится" другой задачей...

Представьте: вы 3 часа писали код, потом вам надоело (глаза устали), и вы решили сходить немного прогуляться. Теперь вы никогда не вернетесь домой и не допишите код?
Наверное, нет (вернетесь и допишите).

ПЛК выполняет задачи не последовательно одну за другой, а небольшими фрагментами (т.е. задачи постоянно переключаются). Время цикла и приоритет определяют, сколько единиц времени будет отдано той или иной задачи.

В вашем случае достаточно поставить время цикла MainTask = 20 мс (тогда обмен будет идти нормально), а дальше в коде выполнять необходимые операции с нужной частотой, используя таймеры (см. библиотеку Standard).

Vladimir777
20.05.2018, 20:31
Добрый вечер!

Первый раз пишу обмен по Modbus на Codesys 3.5, читал вот это краткое руководство - https://akytec.de/en/blog/modbus_kommunikationseinstellungen
Есть СПК 107, конвертер Com<->Ethernet ЕТ-485 и Scada, которая вне проекта, в качестве отладки взял RapidScada.
Нужно управлять СПК107 со стороны SCADA по Modbus TCP.
Вопросы:
1. В CDS один из Com-портов выделил под Modbus, его делать Master или Slave (Modbus_COM -> Modbus_Serial_Device)? По логике слейва достаточно, опрашивать СПК будет SCADA.
2. Конвертер в этом случае должен быть мастером сети? В объекте Modbus_Serial_Device параметр Unit ID - это адрес СПК?
3. Для передачи REAL значений в Modbus_Serial_Device на вкладке I/O Mapping нужно использовать <имя_переменной>.WordArray?
4. Что еще почитать про обмен по Модбас, особенно когда используется конвертер, как у меня?

Заранее спасибо!

Евгений Кислов
20.05.2018, 20:34
Добрый вечер.

1. Да, Modbus Serial Device.
2. Да.
3, 4. Вам поможет этот документ:
https://ftp.owen.ru/CoDeSys3/11_Documentation/01_SPK/SPK_OPC_SCADA_v.1.1.pdf

В нем описывается, как опросить СПК через OPC. Настройка со стороны SCADA будет примерно такой же.

Vladimir777
21.05.2018, 17:01
Добрый вечер.

1. Да, Modbus Serial Device.
2. Да.
3, 4. Вам поможет этот документ:
https://ftp.owen.ru/CoDeSys3/11_Documentation/01_SPK/SPK_OPC_SCADA_v.1.1.pdf

В нем описывается, как опросить СПК через OPC. Настройка со стороны SCADA будет примерно такой же.

Добрый день!

Спасибо, с чтением более-менее, а запись командой 6 (Write Single Register) не работает.

37356

На скрине две переменные, V0 и V1, объявлены обычно:


VAR_GLOBAL
V0:WORD;
END_VAR

PROGRAM PLC_PRG
VAR
V1:WORD;
END_VAR


Со стороны Скады пакеты такие:
V0:
Отправка (12): 00 00 00 00 00 06 01 06 00 00 00 64
Приём (7/7): 00 00 00 00 00 06 01
Приём (5/5): 06 00 00 00 64

V1:
Отправка (12): 00 00 00 00 00 06 01 06 00 01 00 C8
Приём (7/7): 00 00 00 00 00 06 01
Приём (5/5): 06 00 01 00 C8

Если их распарсить, то все выглядит прилично, но в CDS ничего не меняется.

Почему не работает, как думаете?

Евгений Кислов
21.05.2018, 17:42
А что должно меняться в CDS? Вы значение записываемой переменной меняете?

Vladimir777
21.05.2018, 18:25
А что должно меняться в CDS? Вы значение записываемой переменной меняете?

Ну да, я ожидаю, что V0 и V1 примут переданные значения. А разве не так должно быть?

Евгений Кислов
21.05.2018, 19:26
Ваш конвертер умеет Modbus TCP в RTU преобразовывать?

Желательно еще просниффить обмен со стороны RS-485.

В настройках слэйва в CDS стоит галочка Таймаут?

Vladimir777
21.05.2018, 19:40
Логи выглядят странно. По идее, команда записи одного регистра занимает 8 байт.
У вас - 7, и первый байт какой-то странный (я так понимаю у вас адрес слэйва 1, а не 6).
Попробуйте для эксперимента в качестве мастера использовать какой-нибудь OPC-сервер (например, от ОВЕН или Insat).

Ну я ровно этой же скадой писал в МУ110-224.16Р, кондей Митсубиси и еще какую-то штуковину крайний раз, только шлюз был MOXA.

Пользуюсь вот этим парсером:

http://modbus.rapidscada.net/

Адрес слейва у меня 1, все верно, 6 - код команды Modbus.

Попробовал командой 16:

V0:
Отправка (15): 00 00 00 00 00 09 01 10 00 00 00 01 02 00 64
Приём (7/7): 00 00 00 00 00 06 01
Приём (5/5): 10 00 00 00 01

V1:
Отправка (15): 00 00 00 00 00 09 01 10 00 01 00 01 02 00 64
Приём (7/7): 00 00 00 00 00 06 01
Приём (5/5): 10 00 01 00 01

Результат такой же - в проекте переменные V0 и V1 не меняются.

Вообще, в CDS отладка или логи по этому поводу есть какие-нибудь? Скада-то мне показывает что происходит с ее стороны, а вот из CDS я ничего не вижу.

Евгений Кислов
21.05.2018, 19:42
Я отредактировал свой пост выше, ответьте про галочку, пожалуйста.

Со стороны CDS логов нет. Нужно прослушивать линию связи (например, подключить к порту АС4 и запустить какую-нибудь программу-терминал)

Vladimir777
21.05.2018, 20:32
Ваш конвертер умеет Modbus TCP в RTU преобразовывать?

Желательно еще просниффить обмен со стороны RS-485.

В настройках слэйва в CDS стоит галочка Таймаут?

Ну конвертер этим и занимается, на стороне RS-485 RTU, а дальше - TCP, пакеты которые я присылал со стороны скады, то есть это TCP.

Галочка стоит, значение 2000.

Евгений Кислов
21.05.2018, 20:37
Галочку надо снять. Если она стоит, то после 2000 мс (или другого указанного значения) без получения команд от мастера - контроллер обнуляет значения регистров.

Vladimir777
21.05.2018, 20:55
Галочку надо снять. Если она стоит, то после 2000 мс (или другого указанного значения) без получения команд от мастера - контроллер обнуляет значения регистров.

Отлично, спасибо! Вещь крайне неочевидная, надо ее в мануалы добавить. CDS продолжает удивлять =)

Vladimir777
21.05.2018, 23:21
Евгений Кислов
Наверное последний вопрос, и самый каверзный - про REAL.
Сделал UNION как в мануале:


TYPE Real2Word :
UNION
Value:REAL;
WordArray:ARRAY [0..1] OF WORD;
END_UNION
END_TYPE

Соответственно, в Модбас смотрят переменные типа:
Application.System.Regulators.P.Value.WordArray[0]
Application.System.Regulators.P.Value.WordArray[1]

В скаде при чтении отображаются корректные значения, как в CDS, если это две двухбайтовых переменных, то есть для значения "100" будет:
Байт 0 = 0
Байт 1 = 17096

Но если я делаю в скаде одно четырехбайтовое значение float, то получаю ерунду.

Понятно, что это проблемы скады, и тем не менее, мне нужно в документации дать таблицу адресов, как все это корректно указать?

Аналогично с записью REAL, для значения "100" просто пишет в нулевой байт 100, в первый не пишет ничего - это для 2*ushort.
Для 1*float путает байты:
Байт 0 = 17096
Байт 1 = 0
Если изменить порядок следования, то в пишет в Байт 0 ерунду.

Евгений Кислов
22.05.2018, 07:01
Для начала попробуйте поменять Application.System.Regulators.P.Value.WordArray[0] и Application.System.Regulators.P.Value.WordArray[1] местами.

Т.е.

Application.System.Regulators.P.Value.WordArray[1]
Application.System.Regulators.P.Value.WordArray[0]

Если это не поможет - то, возможно, для вашей SCADA надо менять местами не регистры (WORD), а байты (BYTE).
Самый простой способ определить правильный порядок - записываете из SCADA в СПК значение типа REAL (например, 11.22). Смотрите, какой у него порядок байт.

После этого объявляете два экземпляра UNION.


TYPE Real2SCADA :
UNION
Value:REAL
ByteArray:ARRAY [0..3] OF BYTE;
Modbus: ARRAY [0..1] OF WORD;
END_UNION
END_TYPE

В одном из них задаете REAL, и копируете байты из него в другой UNION, при этом меняя их порядок на тот, который нужен SCADA. После этого привязываете к регистрам слэйва WORD из второго UNION.

nsarychev
24.05.2018, 13:40
Добрый день комрады! Есть такая проблема, к одному modbus порту на СПК207 подключено несколько слейвов(блок управления кранами). А вопрос у меня следующего плана, как исключить такой модуль из опроса, если один из них вышел из строя?

Евгений Кислов
24.05.2018, 13:42
Добрый день комрады! Есть такая проблема, к одному modbus порту на СПК207 подключено несколько слейвов(блок управления кранами). А вопрос у меня следующего плана, как исключить такой модуль из опроса, если один из них вышел из строя?

Добрый день. В проекте используются шаблоны модулей Mx110?

nsarychev
24.05.2018, 13:48
Добрый день. В проекте используются шаблоны модулей Mx110?

Нет, устройство стороннего производителя. Подключены как modbus slave, com-port.

Евгений Кислов
24.05.2018, 13:51
Нет, устройство стороннего производителя. Подключены как modbus slave, com-port.

Тогда можно в настройках ПЛК (компонент Device) поставить галочку Enable Diagnosis for device.

37426

После этого в коде программы можно отключить опрос устройства следующим образом:


Modbus_Slave_COM_Port.Enable := FALSE;

где Modbus_Slave_COM_Port - имя нужного slave-устройства в дереве проекта.

Для возобновления опроса, соответственно, нужно присвоить переменной значение TRUE.

nsarychev
24.05.2018, 14:01
Поэтому от вас был вопрос "В проекте используются шаблоны модулей Mx110?". Тогда да, кроме блоков BCV-1-01(блок управления кранами), есть еще модули входов и выходов Мх110(сидят на другом порту), и шаблоны я использую.

Евгений Кислов
24.05.2018, 14:11
Поэтому от вас был вопрос "В проекте используются шаблоны модулей Mx110?". Тогда да, кроме блоков BCV-1-01(блок управления кранами), есть еще модули входов и выходов Мх110(сидят на другом порту), и шаблоны я использую.

Тогда есть следующие варианты:

1. Реализовать опрос вашего устройства в режиме RISING_EDGE (по команде из программы).
2. Отказаться от шаблонов и реализовать опрос модулей Mx110 через стандартные компоненты Modbus_Slave_COM_Port.

nsarychev
24.05.2018, 14:31
Тогда есть следующие варианты:

1. Реализовать опрос вашего устройства в режиме RISING_EDGE (по команде из программы).
2. Отказаться от шаблонов и реализовать опрос модулей Mx110 через стандартные компоненты Modbus_Slave_COM_Port.

Вас понял, спасибо!

Второй вариант мне ближе, буду его реализовывать.

С Уважением Н. Сарычев.

nsarychev
24.05.2018, 14:40
Тогда можно в настройках ПЛК (компонент Device) поставить галочку Enable Diagnosis for device.

37426

После этого в коде программы можно отключить опрос устройства следующим образом:



где Modbus_Slave_COM_Port - имя нужного slave-устройства в дереве проекта.

Для возобновления опроса, соответственно, нужно присвоить переменной значение TRUE.

Прошу обратить внимание, что попытка использовать такой подход совместно с шаблонами Мх110 приведет к исключению в программе.

Я всетаки попробовал :) Прошу обратить внимание, что попытка использовать такой подход совместно с шаблонами Мх110 приведет к исключению в программе. Все вроде работает:confused: А какого рода исключение в программе?

Сергей_m
09.07.2018, 16:05
подскажите начинающему , программисту и разработчику с вашими плк и спк ,когда идет связь по протоколу modbus rtu не нужен спец. кабель закупать для связи между этими устройствами ,как у siemens (сиреневый кабель profibus).Т.е я так понимаю достаточно обычного кабеля с жилами 1,5 мм2 и установкой оконечного сопротивления R=120om))


все коллеги вопрос отпал сам собой из первой документации по протоколу modbus ))) Для линий связи RS-485 необходимо использовать экранированный кабель
с витой парой, предназначенный для промышленного интерфейса
RS-485 с волновым сопротивлением 120 Ом(например, КИПЭВ)

БелУрал
30.08.2018, 03:27
Здравствуйте, товарищи знатоки.

Есть СПК110. К нему по RS-485 подключены: ТРМ-136, МВ1108А, и МК110-8ДН.4Р. С последними двумя проблем нет - использую шаблоны, обмен по протоколу ОВЕН работает. Как быть с ТРМ-136? Пытался разобраться на найденном примере с СПК207 и ТРМ212, но сходу не осилил. То есть правильные сетевые настройки и перечень параметров ТРМ-136 у меня есть, но не хватает опыта этим воспользоваться. Может быть, есть более близкий пример?

Подскажите, куда копать. Надо считывать текущие измеренные значения с входов.

Евгений Кислов
30.08.2018, 06:52
Здравствуйте, товарищи знатоки.

Есть СПК110. К нему по RS-485 подключены: ТРМ-136, МВ1108А, и МК110-8ДН.4Р. С последними двумя проблем нет - использую шаблоны, обмен по протоколу ОВЕН работает. Как быть с ТРМ-136? Пытался разобраться на найденном примере с СПК207 и ТРМ212, но сходу не осилил. То есть правильные сетевые настройки и перечень параметров ТРМ-136 у меня есть, но не хватает опыта этим воспользоваться. Может быть, есть более близкий пример?

Подскажите, куда копать. Надо считывать текущие измеренные значения с входов.

Добрый день.
Наши шаблоны Mx110 (http://www.owen.ru/forum/showthread.php?t=27889) работают по протоколу Modbus RTU. ТРМ136 также поддерживает этот протокол, поэтому смотреть пример с ТРМ212 не надо - там используется протокол ОВЕН.
Посмотрите документ СПК. Modbus (ссылка в подписи) - там приведен пример опроса устройства по Modbus через стандартный элемент Modbus Slave (добавляется также, как шаблоны модулей).
Если есть возможность, свяжитесь со мной по skype - я помогу с настройкой.

БелУрал
30.08.2018, 16:37
Спасибо, пойду читать. Мысль вроде бы ясна (пока).

БелУрал
02.09.2018, 11:53
Здравствуйте, Евгений.

Изучив документ "СПК. Modbus", попробовал считать параметр со входа ТРМ136 с помощью объединения и с помощью указателя, использовал поочередно функцию чтения 3 и 4.
Результат во всех случаях почти одинаковый - связь есть, переменная типа WORD, отвечающая за положение десятичной точки, имеет значение 1, переменная типа WORD, отвечающая за текущее значение температуры, имеет значение, соответствующее реальной температуре в данный момент (например 1652 при 165,2 градусах) , а значение переменной типа REAL, которое должно бы выражаться числом с плавающей десятичной точкой, выглядит примерно так: -7,351374Е-36.
Цифры и знаки "-" меняются при изменении функции чтения и способа преобразования.

Подозреваю, дело в какой-то простой мелочи, которой я не знаю. Пример бы мне, как в букваре только подробнее :)

Евгений Кислов
02.09.2018, 12:26
Добрый день.
Вероятно, нужно поменять порядок регистров.
На примере с объединением: у вас к каналам последовательно привязаны переменные awModbusReal[0] и awModbusReal[1].
Поменяйте их местами - чтобы awModbusReal[1] стало первым (или наоборот - в зависимости от того, как вы их привязали сейчас).

БелУрал
02.09.2018, 14:29
Уже пробовал. Об этом написано на стр.64 в "SPK_Modbus_v1.1"

БелУрал
02.09.2018, 14:32
Не может ли дело быть в особенностях ТРМ-136 ? Там каждому каналу отведено пять регистров а я, получается использую только два первых.

Евгений Кислов
02.09.2018, 14:35
Не может ли дело быть в особенностях ТРМ-136 ? Там каждому каналу отведено пять регистров а я, получается использую только два первых.

В смысле, два первых? Значение с плавающей точкой хранится в двух последних регистрах канала ТРМ. Например, для канала 1 - это регистры 3-4, для канала 2 -регистры 8-9 и так далее.

БелУрал
02.09.2018, 14:59
Да, было такое подозрение. Пробовал считывать 0х0003 "значение температуры float ст. слово" и 0х0004 "значение температуры float мл. слово".
Сейчас два первых: 0х0000 "положение десятичной точки" и 0х0001 "значение температуры int"
Не помогло.

БелУрал
02.09.2018, 15:01
Чувствую, что ерунду какую-то простейшую не вижу, я ведь не программист.

БелУрал
02.09.2018, 15:09
Может быть, подскажите где прочесть кусок справочника/учебника по вопросу преобразования WORD в REAL
У меня есть книга И.В. Петрова по контроллерам, но там не нашел.

Евгений Кислов
02.09.2018, 15:11
У вас skype есть?

БелУрал
02.09.2018, 15:18
Нет..
эл. почта, WhatsApp, телефон.
Здесь можно писать контактные данные?

Евгений Кислов
02.09.2018, 15:20
Нет..
эл. почта, WhatsApp, телефон.
Здесь можно писать контактные данные?

Напишите мне в личные сообщения (нажав на мой профиль) ваш телефон и во сколько с вами завтра можно будет связаться.
Установите на ПК TeamViewer: https://www.teamviewer.com/ru/

S.A.D.
12.09.2018, 14:21
Доброго времени суток. Знает ли кто-нибудь способы заставить работать СПК с HTTP запросами? Есть сервер на backend'e с REST API и информацией в JSON формате. Нужно подружить с ним СПК. Сейчас с этим проблем нет, т.к. АРМ написан на .NET, но пришла идея заменить виндовый АРМ на СПК (типа дешевле и можно одним зайцем убить и АРМ, и ПЛК). Но нагуглить варианты как заставить СПК работать с http запросами и SQLite пока не получается.

В качестве обходного пути можно на сервере, конечно поднять MQTT, т.к. библиотека MQTT под codesys v3 есть, но не хотелось бы.

Евгений Кислов
12.09.2018, 17:29
Добрый день.
Есть пример от 3S:
https://store.codesys.com/http-client-example.html#Product%20Description

Собственно, там же доступна для приобретения уже готовая библиотека:
https://store.codesys.com/json-http-client-library.html

tehnik464
05.11.2018, 10:12
Добрый день.
На объекте стоит ОВЕН СПК 105, модули расширения 110-е и частотные преобразователи Industrial Systems iG5A. Собственно, вопрос - как их завести с СПК105 по modbus? Пробовал 4-мя способами:

1) добавление Slave-устройства к мастеру Modbus, и далее задание каналов чтения/записи. Ошибка "Шина, возможно, не запущена. Данные не актуальны". Высвечивается красный треугольник напротив слейв-устройства по истечении таймаута;

2) Через библиотеку modulsowenlib, блоки ComConn и UniRead. Блок ComConn включает порт с заданными параметрами (на выходе Done появляется True), блок UniRead "не читает" устройство, по истечении времени timeout выдает ошибку 255 (превышение времени ожидания, как я понимаю);

3) Через библиотеку MODBUS и ComService, блок ComService не включает ком-порт, на выходе не появляется True;

4) Комбинированный метод. В качестве ФБ открытия порта использовал ComConn, в качестве "читающего" ФБ использовал MB_RD_HOLD_REGS (а также MB_RD_INP_REGS) из библиотеки MODBUS. В обоих случаях чтение как будто бы происходит, но за три цикла программы получается следующее: а) флаг Complete=1, ошибка exeption=255, какие-то значения появляются в буфере; б) флаг Complete=0, значения в буфере изменились на другие, счетчик bytecnt=8; в) флаг Complete=0, значения в буфере не изменились, счетчик bytecnt=4; затем повтор с пункта а). Причем, ошибка 255 "привязана" к циклу программы, а не к таймауту ответа. Цикл ставил от 20 до 1000 мс, поведение одинаковое.


Настройки портов проверил, все совпадает. Линия не длинная, 1м от щита до частотника, подключался напрямую, без других устройств в сети. Среда программирования - Codesys 3.5 SP5 Patch 5. Единственное что смущает, что в мануале по частотникам в параметрах modbus прописан параметр "sum check - 2 byte", такого нет в настройках СПК.

При настройке руководствовался интуицией зачеркнуто следующими документами:
- СПК. Настройка обмена по Modbus. Руководство для начинающих и продвинутых пользователей. Версия_ 1.1
- SV-iG5A User Manual.
Благодарен заранее за любую помощь.

Евгений Кислов
05.11.2018, 10:39
Добрый день.
1. Какой номер COM-порта и сетевые настройки выставили в CODESYS?
2. Модули Mx110 опрашиваются успешно?
3. Пробовали опрашивать iG5A с ПК? (OPC-сервером или modbus-тестером)

tehnik464
05.11.2018, 12:42
1) Если настраивать как устройство Modbus_COM, то:
COM-порт: 2
Скорость передачи: 9600
Четность: NONE
Информационные биты: 8
Стоповые биты: 2
Таймаут отклика: 1000
Время между фреймами: 50
"галочка" авто перезапуск соединения

Если через ФБ ComConn, то:
Enable: TRUE
PortNum: 2
PortBaudrate: 9600
PortParity: 0
PortStopBits: 3
PortByteSize: 8
Port_ModeOn: FALSE
Port_CloseOn: FALSE

Ставил или так, или так, то есть либо активен был ФБ и я отключал устройство Modbus Master, либо наоборот.

2)Насчет модулей не могу на данный момент сказать, они находятся удаленно (на крыше), завтра смогу их сконфигурировать только и посмотреть.

3)Нет, не сталкивался еще с подобными задачами. Под рукой есть переходник китайский RS485 на CH340. Типа такого http://www.5v.ru/usb-rs485-m1.htm. Он подойдет в качестве тестера? И какие программы для этого предназначены?

Евгений Кислов
05.11.2018, 12:52
Из программ, например, подойдет наш OPC-сервер:
https://www.owen.ru/product/new_opc_server

tehnik464
06.11.2018, 10:22
Добрый день.
1. Какой номер COM-порта и сетевые настройки выставили в CODESYS?
2. Модули Mx110 опрашиваются успешно?
3. Пробовали опрашивать iG5A с ПК? (OPC-сервером или modbus-тестером)

Из программ, например, подойдет наш OPC-сервер:
https://www.owen.ru/product/new_opc_server

2. Модули расширения завелись без проблем.
3. Спасибо за программу, очень помогла. Довольна простая в использовании, без инструкций настроил опрос по modbus. Забыл поменять количество стоп-бит (оставил равным 1) и частотник "ожил".

Производитель не указал, что количество стоп-бит это настраиваемый параметр, а не жестко прописанный, как в мануале по настройке обмена по modbus. Так что инструкцию в топку, а листы параметров оставим себе. Хотя до этого вроде пробовал ставить разные сетевые настройки в СПК, но заработало только сейчас.


Благодарю за помощь. Вопрос закрыт.

paskov
29.11.2018, 18:43
Может кто-нибудь знает, как получить информацию о состоянии Modbus Slave устройства? Например, доступ к переменной m_deviceState. (Смотри изображение)
Когда вылетает линия Modbus, то xError отображает ошибку, но только в момент его опроса. А в остальное время, пока Master опрашивает другие устройства, xError - False.
Можно ли как-то узнать - красным или зеленым подсвечен конкретный slave в дереве устройств?40109

Foton6
24.12.2018, 14:13
Здравствуйте!
Подскажите пожалуйста как в CodeSys 3.5 давать широковещательные команды (modbus RTU)?
Modbus работает, настроил slave устройства с заданными адресами все ОК. Но вот широковещательный "0" адрес
устройства задать нельзя, в поле выбора адреса можно задать любые адреса начиная с 1, а не с 0.
В сети планируется 20-40+ устройств с синхронным запуском и остановом, так как устройства это мои платы с моей прошивкой
я могу ОГОГО каких костылей накрутить, но правильней то дать широковещательную команду, но как???
P.S.
Я с этой средой работаю впервые и никак не найду на каком форуме "правильнее" задавать вопросы по CodeSys (Raspberry использую)?
Тут я так понимаю Codesys обсуждается больше в связке с ПЛК фиры Овен?

Евгений Кислов
24.12.2018, 14:28
Все верно - Modbus через конфигурацию не поддерживает Broadcast.
Нужно использовать библиотеки для CODESYS (либо с готовой реализацией Modbus, либо написать свою на базе CAA SerialCom или SysCom).
Применительно к Raspberry - можно вообще реализовать опрос за пределами CODESYS, на базе какой-нибудь готовой linux-библиотеки (libmobus и т.д.) - если это будет вам удобнее.


Тут я так понимаю Codesys обсуждается больше в связке с ПЛК фиры Овен?

Да, на форуме компании ОВЕН использование CODESYS обсуждается только применительно к контроллерам ОВЕН.


Я с этой средой работаю впервые и никак не найду на каком форуме "правильнее" задавать вопросы по CodeSys (Raspberry использую)?

https://forum.codesys.com/viewforum.php?f=21&sid=ab2fa6afc2c1aed6630ed115a7821a2c

Foton6
24.12.2018, 14:54
Все верно - Modbus через конфигурацию не поддерживает Broadcast. - эх...
Спасибо! Так же Ваш документ по визуализации оказался очень полезен, спасибо))))

forum.codesys.com - я пробовал на нем регистрироваться, письмо с активацией не приходит в ответ.

RV9WFJ
31.12.2018, 10:11
Спасибо за Ваш труд Евгений,

В документации SPK_Sockets_v.1.0 нашел ошибку описания типа хендела буфера:40623, проверил она перекочевала в версию 2.

Евгений, если не сложно, раскройте поподробнее тему работы с библиотекой CAA SegBufMan. И вообще на сколько есть смысл с ней заморачиваться если я раз в секунду качаю через ModBus RTU через TCP (самописный клиент) 80 байт и с помощью MemCopy планирую размещать их сразу в подготовленную структуру. Что-то мне подсказывает, что я зря трачу время на изучение путем научного тыка библиотеки CAA SegBufMan так как все равно планирую копировать этот буфер.

Евгений Кислов
31.12.2018, 10:46
А в чем ошибка? Какой тип там должен быть?
Я не вижу особого смысла использования буфера в вашем случае (ради экономии на копировании 80 байт).

Адлан
04.01.2019, 11:02
С Новым Годом, со всеми соответствующими (добрыми) пожеланиями! Пытаюсь подружить МВ110-4ТД с СПК107. Считая себя скорее электриком, чем программистом, попытался обойти примеры с указателями - я их (надеюсь, пока) не понимаю. Сделал так: в пустой DWORD добавил старший регистр, сдвинул влево на 16, и добавил младший. Преобразовал это в REAL. Все было хорошо, но вес до (примерно) 100 кг взвешивает нормально, а дальнейшие - примерно вполовину. То есть, если загружаю 70 кг, столько же и вижу, а если загружаю 150, вижу (примерно, опять же) 120. Может ли это быть связано с неправильным преобразованием типов? Сегодня переделал с использованием UNION, но попробовать не смогу до понедельника - объект далеко. Потом, на объекте, если вдруг пойдет не так, не смогу переделать - стоя, в шуме, пыли, без интернета - стар я уже для таких подвигов...
Исходя из того, что МВ110-4ТД производится не "производителем слейв-модулей, который - ввиду отсутствия в модбас стандарта на передачу float... (далее по тексту)", а тем же ОВЕНом, что и СПК107, должен же быть какой-то однозначный способ прочитать данные из модуля в СПК - без всевозможных "перепробуйте варианты"?

Евгений Кислов
04.01.2019, 11:56
Исходя из того, что МВ110-4ТД производится не "производителем слейв-модулей, который - ввиду отсутствия в модбас стандарта на передачу REAL... (далее по тексту)", а тем же ОВЕНом, что и СПК107, должен же быть какой-то однозначный способ прочитать данные из модуля в СПК - без всевозможных "перепробуйте варианты"?

Добрый день.
Такой способ есть - использовать для опроса готовые шаблоны:
http://www.owen.ru/forum/showthread.php?t=27889

Адлан
04.01.2019, 12:04
Благодарю, Евгений!
Качаю пакет - не знал, что он есть...
А мой корявый способ преобразования может привести к тому, что показания похожи на правильные, но нелинейны? Или это только на практике попробовать?

Евгений Кислов
04.01.2019, 12:30
Благодарю, Евгений!
Качаю пакет - не знал, что он есть...
А мой корявый способ преобразования может привести к тому, что показания похожи на правильные, но нелинейны? Или это только на практике попробовать?

Да, только на практике.

RV9WFJ
05.01.2019, 17:01
А в чем ошибка? Какой тип там должен быть?
Да пожалуй я погорячился. Действительно правильно.
Опрос я реализовал, появился новый вопрос. Связь плохая (GSM), периодически приходят ошибки... связь падает. Как реализовать закрытие сокета? Подойдет ли функция SysSockClose() из библиотеки SysSocket или у них хенделы разные? Пока я в обработке ошибок вставил переход на шаг CLOSE и в нем пытаюсь закрыть через

CLIENT_STATE.CLOSE: // закрываем TCP-клиента
fbTcpClient
(
xEnable:= FALSE,
ipAddr:= stIpServer,
uiPort:= uiPortServer,
);

IF NOT fbTcpClient.xActive THEN
eState:= CLIENT_STATE.CREATE;
END_IF
Но складывается ощущение, что этот код нерабочий.

Евгений Кислов
05.01.2019, 18:02
SysSocketClose тут, по идее, избыточен. Проверить работу кода легко - в узле Debug можно посмотреть число используемых хэндлов.
После закрытия сокета оно должно стать на 1 меньше.

RV9WFJ
06.01.2019, 18:22
Что-то автоматом TcpClient соединение не восстанавливает на СПК207. SysSockClose кстати пробовал, тоже не работает. Видимо придется все таки на SysSocket делать по старинке, и самое тревожное, ощущение такое, что работа с сокетами зависает в СПК207 на уровне операционки при плохой связи. 40680

Евгений Кислов
06.01.2019, 20:37
Вы на СПК1хх [М01] можете это протестировать? Мы отправили информацию в 3S после вашего первого обращения по этому поводу - судя по баг-трекеру, они исправляли похожие проблемы в SP11 (т.е. на новых СПК они проявляться не должны).

40681

40682

keysansa
01.02.2019, 00:36
Добрый день.
Есть проект, он у меня первый на ПЛК ОВЕН, в составе СПК107 (без Ethernet) и двух устройств Мх110 (DI/DO, только DO). Связь по Modbus (38400).

Система получает входной сигнал с датчика, и по очереди включает 1 из 8 выходов по таймерам. Времена работы таймеров 1.5-3.4 сек (т.е. критичны десятые секунд).

Все работает, данные отправляются и получаются. Но все медленно и вот почему:
1. Вижу 3-4 промаргивания индикатора обмена на первом модуле
2. Вижу 2-3 промаргивания на втором
3. Судя по всему отрабатывается цикл основной программы (изменял его от 100 до 500мс, пропорционально изменяется время паузы в обмене)
4. Снова 3-4 промаргивания на первом
5. Снова 2-3 промаргивания на втором

Получается, ввод/вывод обновляется не раз в 100мс (время цикла программы), а в районе одной секунды и не регулярно. Для того, что бы добиться примерно 100мс отклика пришлось узнать среднее время отработки программы (10-12мс) и установить время цикла в минимальное значение (15-20мс). Только тогда система примерно стала укладываться в допуски (а то даже пропускала 500 мс импульс от датчика, пришлось на время разбора опрашивать счетчик, а не вход).

Можно ли как-то настроить, что бы обмен производился непрерывно и "в фоне"?

PS. CodeSys 3.5 драйверы Мх110 3.5.4 (видел более свежие, но при попытке скачать с сайта - ошибка, ftp.owen.ru не отвечает).

Евгений Кислов
01.02.2019, 10:02
Сеанс обмена с каждым устройством занимает несколько циклов. Кроме того, некоторые шаблоны опрашивают модуль несколькими запросами (например, для модулей МК маски входов и выходов читаются отдельно).
Так что вынесение обмена по Modbus в задачу с минимальным временем цикла (10-20 мс) - совершенно правильный подход.

keysansa
01.02.2019, 16:04
Сеанс обмена с каждым устройством занимает несколько циклов. Кроме того, некоторые шаблоны опрашивают модуль несколькими запросами (например, для модулей МК маски входов и выходов читаются отдельно).
Так что вынесение обмена по Modbus в задачу с минимальным временем цикла (10-20 мс) - совершенно правильный подход.
Спасибо.
У меня вся задача, к счастью в 10-12мс уложилась.
Понятно, что вопрос не к вам, но настроечку "асинхронный обмен" очень хотелось бы увидеть. Лаг так будет гораздо меньше, хотя и логика "Читаем вход-считаем-пишем выход" будет нарушена.

ЗЫ. В целом очень понравилась CodeSys 3.5. Все легко, понятно и очень помогли Ваши материалы в тонких случаях. Спасибо вам за труд, надеюсь, будем сотрудничать )

keysansa
03.02.2019, 20:08
Сегодня опять проблемы ( Не выдерживает система даже 0.2 сек.
Поменял кабель на экранированный (была просто витая пара, расстояние 1.5м со всеми изгибами).
Нет результата.
Время отработки программы не изменилось. 10..12 мс
Пемонтажил систему, вместо Mx110 поставил B&R CP0291 с модулями IO (куплен на другой проект), настроил ему Modbus Slave. По Modus - только параметры и ручное управление/визуализация.
Посмотрим.

firelion
05.02.2019, 09:18
Здравствуйте! В использовании есть МВ110-8А и СПК207. К МВ110 подключены два датчика температуры(через Конфигуратор 110 была проверенна их работоспособность). Задача: Вывести на экран СПК207 показания датчиков. Попробовал сделать по примеру: https://www.owen.ru/uploads/34-37_annaev_41.pdf но после добавления устройства "Modbus_Master_COM_Port" вылетает 468 ошибок. Может кто знает, что с этим делать.410564105641057

Зинько Владислав
05.02.2019, 10:17
Здравствуйте! В использовании есть МВ110-8А и СПК207. К МВ110 подключены два датчика температуры(через Конфигуратор 110 была проверенна их работоспособность). Задача: Вывести на экран СПК207 показания датчиков. Попробовал сделать по примеру: https://www.owen.ru/uploads/34-37_annaev_41.pdf но после добавления устройства "Modbus_Master_COM_Port" вылетает 468 ошибок. Может кто знает, что с этим делать.410564105641057

Добрый день!

1. В какой версии Codesys работаете?
Для корректно работы необходим Codesys SP5 Patch5.

2. Версии добавляемых устройств (ModbusMaster и т.д.) ставили согласно указанному в Вашем посте документу?
Перейдите к добавленному Modbus_Master_COM_Port на вкладку "Информация" и выложите скриншот, пожалуйста.

RV9WFJ
12.02.2019, 20:34
Пытаюсь как обычно опрашивать с СПК110[М01] ПЧВ1 через COM1, библиотека ModBus.lib выдает ошибку 16#FB. В описании такой ошибки нет, где посмотреть что не так?

Евгений Кислов
13.02.2019, 06:57
Может быть, 16#FD? Такая ошибка вернется, если в ответе слэйва есть код ошибки Modbus (ILLEGAL_DATA_ADDRESS и т.п.).

RV9WFJ
14.02.2019, 10:19
Может быть, 16#FD? Такая ошибка вернется, если в ответе слэйва есть код ошибки Modbus (ILLEGAL_DATA_ADDRESS и т.п.).41204Нет, в том то и дело, что FB выдает.

Евгений Кислов
14.02.2019, 10:25
Тогда это значит, что во втором байте буфера находится значение 16#FB.
Это может произойти в одном из двух случаев:

1. ПЧВ действительно присылает ответ с таким кодом ошибки.
2. Кто-то некорректно работает с буфером (или пользовательский код, или сама библиотека).

Отправьте архив вашего проекта и конфигурацию ПЧВ на support@owen.ru - мы исследуем этот вопрос.

i`m
14.02.2019, 13:58
Здравствуйте, уважаемые форумчане! Слёзно прошу у Вас помощи в освоении протокола modbus. Сразу хочу выразить несказанную благодарность инженерам из компании ОВЕН за реализацию шаблонов для переферийных модулей и ПЧВ. Ваш труд максимально упростил задачу для начинающих "автоматизаторов", низкий Вам поклон. Однако у меня остались вопросы по опросу датчиков расхода по этому протоколу, хоть я и честно прочитал указанные в шапке руководства "от корки до корки". В частности мне не ясен механизм привязки к каналам. Ведь канал представляет из себя массив типа word, а в примере(который показался наиболее мне подходящем, переменная байтового массива). В общем я приложу в сообщение паспорт счётчика с картой регистров и архив "проекта" с прг опроса этих счётчиков в надежде на Вашу помощь.
За сим откланиваюсь, с пожеланиями Вам всем здоровья!
P.S. Версия Codesys 3.5 sp5 patch5.

Евгений Кислов
14.02.2019, 15:28
41204Нет, в том то и дело, что FB выдает.

Мы посмотрели проект.

1. Вам следует обновить библиотеку Modbus до версии 3.5.4.3 и использовать СomService 3.5.4.2 (впрочем, у вас в проекте по-моему именно его исходник).
2. Вам следует корректно задать настройки порта - через перечисления.

См. на скриншоте: получили корректный хэндл, Exception = 0, считали корректное слово состояния (3).

41221

RV9WFJ
15.02.2019, 08:07
Спасибо Евгений, смена версии библиотеки действительно помогла. Сейчас все работает.

Евгений Кислов
15.02.2019, 09:52
Здравствуйте, уважаемые форумчане! Слёзно прошу у Вас помощи в освоении протокола modbus. Сразу хочу выразить несказанную благодарность инженерам из компании ОВЕН за реализацию шаблонов для переферийных модулей и ПЧВ. Ваш труд максимально упростил задачу для начинающих "автоматизаторов", низкий Вам поклон. Однако у меня остались вопросы по опросу датчиков расхода по этому протоколу, хоть я и честно прочитал указанные в шапке руководства "от корки до корки". В частности мне не ясен механизм привязки к каналам. Ведь канал представляет из себя массив типа word, а в примере(который показался наиболее мне подходящем, переменная байтового массива). В общем я приложу в сообщение паспорт счётчика с картой регистров и архив "проекта" с прг опроса этих счётчиков в надежде на Вашу помощь.
За сим откланиваюсь, с пожеланиями Вам всем здоровья!
P.S. Версия Codesys 3.5 sp5 patch5.

Добрый день.

1. Вы работаете с портом COM3 одновременно и через библиотеку, и через конфигурацию - так делать нельзя.
В вашем случае лучше оставить только конфигурацию.

2. Вы настроили датчики расхода, поменяв им адреса и тип четности на те, которые указываете в конфигурации?

3. Вы считываете значения из регистров 0 и 1 и, видимо, пытаетесь конвертировать их в REAL - но судя по карте регистров в этих регистрах лежит статус датчика и регистр ошибок, которые имеют тип WORD.

Если есть возможность, свяжитесь со мной по skype (когда датчики будут подключены к СПК и будет возможность удаленного доступа через TeamViewer) - я постараюсь вам помочь.

i`m
16.02.2019, 10:14
Добрый день.

1. Вы работаете с портом COM3 одновременно и через библиотеку, и через конфигурацию - так делать нельзя.
В вашем случае лучше оставить только конфигурацию.

2. Вы настроили датчики расхода, поменяв им адреса и тип четности на те, которые указываете в конфигурации?

3. Вы считываете значения из регистров 0 и 1 и, видимо, пытаетесь конвертировать их в REAL - но судя по карте регистров в этих регистрах лежит статус датчика и регистр ошибок, которые имеют тип WORD.

Если есть возможность, свяжитесь со мной по skype (когда датчики будут подключены к СПК и будет возможность удаленного доступа через TeamViewer) - я постараюсь вам помочь.

От всего сердца благодарю Вас Евгений за поддержку и предложенную Вами помощь! Непременно попытаюсь с Вами связаться как только выполню все ваши указания.

АнтоN
01.03.2019, 16:34
Здравствуйте!
Имеется оборудование: датчик загазованности + сигнализатор СТМ30М-10ДЦ от "АналитПрибора", контроллер СПК110.
Требуется передать показание уровня загазованности на СПК по Modbus RTU.
Связь с СТМ устанавливается, значение передать не удаётся - отображается значение 0.00.
Считаю, что ошибки в правильности настроек каналов СТМа и опроса регистров, но и в коде тоже не исключаю))
Преобразование ВОРД_РЕАЛ делал на основании примера из данной темы (запись #72)
Архив проекта примера, своего проекта и карту регистров сигнализатора СТМ30М-10ДЦ прилагаю.

Евгений Кислов
04.03.2019, 07:11
Добрый день.
Word_Real тут не поможет, поскольку значение в приборе хранится не в формате IEEE 754, а в своем собственном.
Впрочем, он хотя бы документирован.

Прикладываю пример, как преобразовать набор полученных байт в REAL.
Тестировал на примере из руководства.
Чтобы проверить на реальных данных - нужно заменить везде abyTestData на uStmData.abyData.
Возможно, придется изменить порядок привязки вордов в модбасе или порядок считанных байт.

Если будут вопросы - то напишите в skype, пожалуйста.

trejer
12.03.2019, 13:03
Здравствуйте.
Соединил СПК107м1 (ModBus RS485 master) и S7-200 (CPU215-2) (slev).
При остановке и перезапуске S7-200, СПК не возобновляет обмен.
Галочку "Автоперезапуск соединения" установил. Пробовал установить "Таймаут ответа" 65000 мс - не помогает.
Помогает только перезапуск СПК (выключением питания или из кодесиса).
И это я ещё второй S7-200 не подключал.

Подскажите, как сделать так, что бы при отключении питания на S7-200 сеть не "обваливалась"?

Евгений Кислов
12.03.2019, 13:17
Здравствуйте.
Соединил СПК107м1 (ModBus RS485 master) и S7-200 (CPU215-2) (slev).
При остановке и перезапуске S7-200, СПК не возобновляет обмен.
Галочку "Автоперезапуск соединения" установил. Пробовал установить "Таймаут ответа" 65000 мс - не помогает.
Помогает только перезапуск СПК (выключением питания или из кодесиса).
И это я ещё второй S7-200 не подключал.

Подскажите, как сделать так, что бы при отключении питания на S7-200 сеть не "обваливалась"?

Добрый день.
Какая версия компонента Modbus Master?

trejer
12.03.2019, 13:21
Имя: Modbus Master, COM Port
Производитель: 3S - Smart Software Solutions GmbH
Группы: Мастер Modbus Serial
Тип: 90
ID: 0000 0002
Версия: 3.5.7.0
Номер модели: -
Описание: A device that works as a Modbus Master on a serial COM Port of a Windows PC.

Евгений Кислов
12.03.2019, 13:32
Имя: Modbus Master, COM Port
Производитель: 3S - Smart Software Solutions GmbH
Группы: Мастер Modbus Serial
Тип: 90
ID: 0000 0002
Версия: 3.5.7.0
Номер модели: -
Описание: A device that works as a Modbus Master on a serial COM Port of a Windows PC.

Именно в этой версии галочка автореконнекта не работает.
Для СПК1хх [М01] следует использовать CODESYS V3.5 SP11 Patch 5 Hotfix 4 и Modbus Master версии 3.5.11.20.

trejer
12.03.2019, 14:54
Именно в этой версии галочка автореконнекта не работает.
Для СПК1хх [М01] следует использовать CODESYS V3.5 SP11 Patch 5 Hotfix 4 и Modbus Master версии 3.5.11.20.

Евгений огромное спасибо!!!

жекон
10.04.2019, 09:15
День добрый!Есть возможность перекинуть STRING из ПЛК100 в СПК110(мастер)?

Ильнур Гибадуллин
10.04.2019, 09:59
День добрый!Есть возможность перекинуть STRING из ПЛК100 в СПК110(мастер)?

Добрый день!

Пример настройки обмена ПЛК110 [M02] (Slave) и СПК110 [M01] (Master) по протоколу Modbus RTU доступен для скачивания по ссылке (https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/06_Plc110/Example_SpkModbusRtuMaster_3511v1.zip). По Modbus TCP - здесь (https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/06_Plc110/Example_SpkModbusTcpMaster_3511v1.zip). Если используются другие контроллеры, то в проектах следует изменить таргет-устройства на соответствующие. Документ с описанием работы примеров доступен по ссылке (https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_ExamplesWithPlc110m02_v.2.0.pdf).

Другие примеры настроек обмена доступны на странице CODESYS V3 в разделе Примеры (ссылка (https://www.owen.ru/product/codesys_v3/example_of_work)).

жекон
10.04.2019, 10:18
Все понял, спасибо за наводку

жекон
10.04.2019, 12:07
Все работает, в программе все отображается нормально42174 а на экране иероглифы 42175 пробовал менять на WSTRING еще хуже

Евгений Кислов
10.04.2019, 12:16
Надо STRING конвертировать в WSTRING, и уже WSTRING привязывать в визуализации.
Функция конверсии есть в библиотеке OwenStringUtils (функция CP1251_TO_UNICODE):
https://www.owen.ru/forum/showthread.php?t=25981

жекон
10.04.2019, 12:42
С бибкой заработало, спасибо

kot.shrodingera
11.04.2019, 15:13
Помогите с Modbus RTU Slave на СПК207. Добавил Modbus COM, указал номер порта 3 (как я понимаю это COM2 указанный на корпусе), скорость 9600, без чётности, 8 бит, 1 стоп-бит. Добавил Modbus Serial Device. Указал ID 1. Привязал к %QW64 переменную-счётчик, увеличивается раз в секунду. Подключаю к компьютеру через преобразователь, выставляю такие же параметры. Отправляю запрос на чтение одного регистра с адресом 0 (01 03 00 00 00 01 84 0a), Ответ всегда возвращает 0 (01 03 02 00 00 b8 44). Хотя в СПК значения меняются.
Может ли это быть из-за того, что таргет на СПК версии 3.5.4.26 (последний на сайте), а версия Modbus Serial Device 3.5.5.0 (другой выбрать не могу, галочку показать устаревшие версии ставил)

Ильнур Гибадуллин
11.04.2019, 15:54
Помогите с Modbus RTU Slave на СПК207. Добавил Modbus COM, указал номер порта 3 (как я понимаю это COM2 указанный на корпусе), скорость 9600, без чётности, 8 бит, 1 стоп-бит. Добавил Modbus Serial Device. Указал ID 1. Привязал к %QW64 переменную-счётчик, увеличивается раз в секунду. Подключаю к компьютеру через преобразователь, выставляю такие же параметры. Отправляю запрос на чтение одного регистра с адресом 0 (01 03 00 00 00 01 84 0a), Ответ всегда возвращает 0 (01 03 02 00 00 b8 44). Хотя в СПК значения меняются.
Может ли это быть из-за того, что таргет на СПК версии 3.5.4.26 (последний на сайте), а версия Modbus Serial Device 3.5.5.0 (другой выбрать не могу, галочку показать устаревшие версии ставил)

Добрый день!

Опрос входных регистров, куда Вы привязали переменную счетчика происходит функцией 4. Судя по запросу, опрос Вы ведете функцией 3.

kot.shrodingera
11.04.2019, 17:00
Добрый день!

Опрос входных регистров, куда Вы привязали переменную счетчика происходит функцией 4. Судя по запросу, опрос Вы ведете функцией 3.

Спасибо большое, с этим я напутал. Тогда ещё два вопроса. Можно ли в holding регистре хранить значение внутренней переменной? Если я пытаюсь это сделать пишет предупреждение

Modbus_Serial_Device [Device: Modbus_COM]: 'Application.PLC_PRG.counter' - не корректный объект для присваивания
И значение переменной не меняется, остаётся нулём, хотя должно каждую секунду увеличиваться.
И второе, не получается настроить TCP Master. Добавил Ethernet, добавил Modbus TCP Master, в него добавил Modbus TCP Slave. Указал IP (у меня настройки по умолчанию, комп 10.0.6.1, СПК 10.0.6.10), указал номер слейва (1), Добавил канал (код 3, адрес 0, длина 1). Но при запуске ничего не считывается. На компьютере не видно запросов к слейву, в Codesys у Slave оранжевый треугольник и пишет "Шина не запущена. Данные значения, возможно, неактуальны"

Евгений Кислов
12.04.2019, 07:46
1. Holding-регистры не могут изменяться из кода программы - только со стороны мастера. Такова особенность реализации стандартного слэйва в CODESYS.
Можно использовать библиотеку Modbus Slave - в ней таких ограничений нет.

2. Вы в настройках Modbus TCP Master поставили галочку Автоподключение?
Вообще, сложно что-то сказать, не видя проекта.

kot.shrodingera
15.04.2019, 05:00
Спасибо за ответы. Про TCP Master проблема оказалась в брандмауэре Windows 10, он блокировал 502 порт, как я понял

Николай2
21.04.2019, 18:29
Добрый вечер.
С сайта Овен скачал библиотеку *библиотеки CDS2.3_3.5 для работы с ПЧВ* там внутри файл *SPK_PCV_v4.export* а как им воспользоваться в проекте не понял,точнее как этотфайл засунуть в проект?

Евгений Кислов
21.04.2019, 19:08
Добрый вечер.

1. Выделить узел Application.
2. Вкладка Проект - Импорт - указать путь к файлу - поставить все галочки.

Но, возможно, проще будет воспользоваться шаблонами (версия шаблонов должна соответствовать версии CODESYS):
https://www.owen.ru/product/codesys_v3/libraries
https://www.youtube.com/watch?v=ybvDMV-1MQ8

Николай2
21.04.2019, 21:22
Спасибо попробую.

Николай2
21.04.2019, 21:26
Спасибо попробую.
Я так понимаю нужно поднять версию Codesys до 11.4 как минимум?
Я пока пользовался 10.3

Евгений Кислов
21.04.2019, 21:28
Спасибо попробую.
Я так понимаю нужно поднять версию Codesys до 11.4 как минимум?
Я пока пользовался 10.3

Требуемая версия CODESYS и шаблонов зависит от контроллера.
Для СПК207 и старых СПК1хх (без Ethernet) - следует использовать CDS 3.5.5.5 и шаблоны 3.5.4.13, для СПК1хх [М01] - CDS 3.5.11.5 и шаблоны 3.5.11.4.

Николай2
22.04.2019, 20:30
Требуемая версия CODESYS и шаблонов зависит от контроллера.
Для СПК207 и старых СПК1хх (без Ethernet) - следует использовать CDS 3.5.5.5 и шаблоны 3.5.4.13, для СПК1хх [М01] - CDS 3.5.11.5 и шаблоны 3.5.11.4.

Спасибо, библиотеки всунул, поместились.
У меня СПК старый, попробую с старенькими шаблонами.
Спасибо ещё раз.

viktor1980
24.04.2019, 09:11
Добрый день. Возник вопрос при работе с библиотекой Modbus. Используем СПК 107 м01 и МВ110-8А.
Написали код в точности как в руководстве по Модбас, за исключением используемого порта. При включении СПК и модуля МВ связь между ними не устанавливается. Срины настроек модуля и отображаемой инфы при подключении к СПК прикладываю.
Подскажите, что не так я делаю и что нужно исправить.
42425
42426
42427

Ильнур Гибадуллин
24.04.2019, 09:35
Добрый день. Возник вопрос при работе с библиотекой Modbus. Используем СПК 107 м01 и МВ110-8А.
Написали код в точности как в руководстве по Модбас, за исключением используемого порта. При включении СПК и модуля МВ связь между ними не устанавливается. Срины настроек модуля и отображаемой инфы при подключении к СПК прикладываю.
Подскажите, что не так я делаю и что нужно исправить.
42425
42426
42427

Добрый день, Виктор!

Документ разрабатывался еще для старых линеек СПК. В новой линейке СПК1xx с интерфейсом Ethernet нумерация физических портов и нумерация CODESYS совпадает. Другими словами, если используете физический COM1 (RS-485-1), то и в CODESYS указываете 1 и так далее. В старых линейках приходилось к номеру порту прибавлять единицу.

Мы продублировали информацию о соответствии портов на тыльной стороне контроллера и во вкладке Информация в таргет-устройстве.

42435

Документ, посвященный протоколу Modbus в CODESYS V3.5 будет полностью переделан в этом году.

P.S. Обратите внимание, что пример создан для опроса модуля МВ110-8А. У Вас - МВ110-8АС и карта регистров Modbus для модуля уже другая.

42434

viktor1980
24.04.2019, 09:42
На самом деле по поводу номеров портов я в курсе. Возможно в проекте отправил с неправильным номером, поскольку начал уже играться с ними когда увидел, что связи нет. В реальности у меня модуль подключен к СОМ3 и соответственно в программе указывал Settings_COM3.sPort := 3;
К сожалению вложение открыть не удалось ((. Единственное, что не пробовал уменьшать скорость (сейчас настроено на 115200).

Ильнур Гибадуллин
24.04.2019, 09:52
На самом деле по поводу номеров портов я в курсе. Возможно в проекте отправил с неправильным номером, поскольку начал уже играться с ними когда увидел, что связи нет. В реальности у меня модуль подключен к СОМ3 и соответственно в программе указывал Settings_COM3.sPort := 3;
К сожалению вложение открыть не удалось ((. Единственное, что не пробовал уменьшать скорость (сейчас настроено на 115200).

Проверьте, на модуле стоит перемычка для сброса на заводские сетевые настройки?

Перезагружали модуль после настройки в Конфигураторе M110?

viktor1980
24.04.2019, 15:05
Со связью разобрался. К сожалению причина собственная невнимательность (не создал задачу для программы). Но сейчас пытаюсь разобраться с чтением (на примере первого входа) подаваемого напряжения. В таблице Г.3 руководства указаны три разных адреса регистра для первого канала(1 - 0х100, 2 - 0х108, 3 - 0х120, 0х121, 0х122) для чтения измеренного значения. Какой из них необходимо использовать для получения значения с первого канала? В программе пробовал подставлять все из этих значений - итог, читается только "0". Для наглядности приведу код программы.
Объявленные переменные:

VAR
COM_Service_Com3: ComService.COM_SERVICE; // ФБ настройки и открытия порта COM3
Settings_COM3: ComService.COM_SETTINGS; // Структура настроек порта COM3
SettingsEX_COM3: ComService.COM_SETTINGSex; // Структура расширенных настроек порта COM3

MV110_8A: ModBus.MB_RD_INPUTS; // ФБ опроса модуля МВ110-8АC MB_RD_HOLD_REGS

rMV110_8A_input1: REAL; // Показания входа 1 модуля МВ110-8АC
wMV110_8A_input1_status: WORD; // Код ошибки измерения входа 1
wsMV110_8A_input1_status: WSTRING; // Статус измерения входа 1

abyBuffer: ARRAY [0..255] OF BYTE; // Буфер ФБ опроса модуля МВ110-8АC
abyMV110_8A_data: ARRAY [0..255] OF BYTE; // Буфер данных, считанных с модуля МВ110-8АC

_2WORD_TO_REAL: Word_Real; // Экземпляр объединения для преобразования двух WORD в REAL
END_VAR
И собственно сама программа:

// [1] настраиваем COM-port
Settings_COM3.sPort := 3;
Settings_COM3.byStopBits := 1;
Settings_COM3.byParity := 0;
Settings_COM3.ulBaudrate := 115200;
Settings_COM3.ulTimeout := 0;
Settings_COM3.ulBufferSize := 0;

SettingsEX_COM3.byByteSize := 8;

// [2] открываем COM-port
COM_Service_Com3
(
Enable := TRUE,
Settings := Settings_COM3,
Sets_EX := SettingsEX_COM3,
Task := ComService.OPEN_TSK
);

// [3] запускаем ФБ опроса модуля МВ110-8А
MV110_8A
(
Enable := COM_Service_Com3.Ready,
Mode := ModBus.MB_RTU,
DevAddr := 1,
FirstAddr := 16#100,
Quantity := 1,
ComHandle := COM_Service_Com3.Handle,
TimeOut := T#45MS,
Buffer := abyBuffer,
);

// [4] если ФБ опроса модуля завершил работу
IF MV110_8A.Complete THEN
IF MV110_8A.Exception =0 THEN
// байты 0 и 1 содержат статус измерения входа 1
// склеиваем их в WORD и декодируем в текстовое сообщение
wMV110_8A_input1_status := BYTE_TO_WORD(abyMV110_8A_data[1]) OR SHL(BYTE_TO_WORD(abyMV110_8A_data[0]), 8);
wsMV110_8A_input1_status := Mx110Assistant.MvStatusToWstring(wMV110_8A_input1_ status);

// байты 4-7 содержат значение на входе 1 с плавающей точкой.
// переставляем байты местами и преобразуем в REAL
_2WORD_TO_REAL.abyBytes[3] := abyMV110_8A_data[4];
_2WORD_TO_REAL.abyBytes[2] := abyMV110_8A_data[5];
_2WORD_TO_REAL.abyBytes[1] := abyMV110_8A_data[6];
_2WORD_TO_REAL.abyBytes[0] := abyMV110_8A_data[7];

rMV110_8A_input1 := _2WORD_TO_REAL.rReal;
END_IF

// завершаем опрос модуля МВ110-8А
MV110_8A(Enable := FALSE, Buffer := abyBuffer);
END_IF

Ильнур Гибадуллин
24.04.2019, 21:57
Со связью разобрался. К сожалению причина собственная невнимательность (не создал задачу для программы). Но сейчас пытаюсь разобраться с чтением (на примере первого входа) подаваемого напряжения. В таблице Г.3 руководства указаны три разных адреса регистра для первого канала(1 - 0х100, 2 - 0х108, 3 - 0х120, 0х121, 0х122) для чтения измеренного значения. Какой из них необходимо использовать для получения значения с первого канала? В программе пробовал подставлять все из этих значений - итог, читается только "0". Для наглядности приведу код программы.
Объявленные переменные:

VAR
COM_Service_Com3: ComService.COM_SERVICE; // ФБ настройки и открытия порта COM3
Settings_COM3: ComService.COM_SETTINGS; // Структура настроек порта COM3
SettingsEX_COM3: ComService.COM_SETTINGSex; // Структура расширенных настроек порта COM3

MV110_8A: ModBus.MB_RD_INPUTS; // ФБ опроса модуля МВ110-8АC MB_RD_HOLD_REGS

rMV110_8A_input1: REAL; // Показания входа 1 модуля МВ110-8АC
wMV110_8A_input1_status: WORD; // Код ошибки измерения входа 1
wsMV110_8A_input1_status: WSTRING; // Статус измерения входа 1

abyBuffer: ARRAY [0..255] OF BYTE; // Буфер ФБ опроса модуля МВ110-8АC
abyMV110_8A_data: ARRAY [0..255] OF BYTE; // Буфер данных, считанных с модуля МВ110-8АC

_2WORD_TO_REAL: Word_Real; // Экземпляр объединения для преобразования двух WORD в REAL
END_VAR
И собственно сама программа:

// [1] настраиваем COM-port
Settings_COM3.sPort := 3;
Settings_COM3.byStopBits := 1;
Settings_COM3.byParity := 0;
Settings_COM3.ulBaudrate := 115200;
Settings_COM3.ulTimeout := 0;
Settings_COM3.ulBufferSize := 0;

SettingsEX_COM3.byByteSize := 8;

// [2] открываем COM-port
COM_Service_Com3
(
Enable := TRUE,
Settings := Settings_COM3,
Sets_EX := SettingsEX_COM3,
Task := ComService.OPEN_TSK
);

// [3] запускаем ФБ опроса модуля МВ110-8А
MV110_8A
(
Enable := COM_Service_Com3.Ready,
Mode := ModBus.MB_RTU,
DevAddr := 1,
FirstAddr := 16#100,
Quantity := 1,
ComHandle := COM_Service_Com3.Handle,
TimeOut := T#45MS,
Buffer := abyBuffer,
);

// [4] если ФБ опроса модуля завершил работу
IF MV110_8A.Complete THEN
IF MV110_8A.Exception =0 THEN
// байты 0 и 1 содержат статус измерения входа 1
// склеиваем их в WORD и декодируем в текстовое сообщение
wMV110_8A_input1_status := BYTE_TO_WORD(abyMV110_8A_data[1]) OR SHL(BYTE_TO_WORD(abyMV110_8A_data[0]), 8);
wsMV110_8A_input1_status := Mx110Assistant.MvStatusToWstring(wMV110_8A_input1_ status);

// байты 4-7 содержат значение на входе 1 с плавающей точкой.
// переставляем байты местами и преобразуем в REAL
_2WORD_TO_REAL.abyBytes[3] := abyMV110_8A_data[4];
_2WORD_TO_REAL.abyBytes[2] := abyMV110_8A_data[5];
_2WORD_TO_REAL.abyBytes[1] := abyMV110_8A_data[6];
_2WORD_TO_REAL.abyBytes[0] := abyMV110_8A_data[7];

rMV110_8A_input1 := _2WORD_TO_REAL.rReal;
END_IF

// завершаем опрос модуля МВ110-8А
MV110_8A(Enable := FALSE, Buffer := abyBuffer);
END_IF

Все три регистра позволяют считывать значение с первого канала.

Вы "0" видите где? В буфере какие-нибудь данные получаете?

Не вижу у Вас в коде копирование буфера ФБ в пользовательский буфер, чтобы далее его распарсить.

Евгений Кислов
13.05.2019, 14:08
Добрый день.
С сегодняшнего дня доступны шаблоны Mx210 для CODESYS V3.5:
https://www.owen.ru/forum/showthread.php?t=31176

tegs
17.07.2019, 07:23
Доброе утро! Должен ли при работе по нестандартному протоколу (CAA_Serialcom) мигать светодиод СОМ? При настройке Modbus в конфигураторе моргает и работает. А при использовании библиотеки порт показывает что открывает (COM.Open) и даже операция Read завершается успешно без ошибок, но ответ всегда нулевой.

Евгений Кислов
17.07.2019, 07:32
Доброе утро! Должен ли при работе по нестандартному протоколу (CAA_Serialcom) мигать светодиод СОМ? При настройке Modbus в конфигураторе моргает и работает. А при использовании библиотеки порт показывает что открывает (COM.Open) и даже операция Read завершается успешно без ошибок, но ответ всегда нулевой.

Добрый день. Да, должен.
CAA.Read читает данные из буфера COM-порта - т.е. с точки зрения ФБ считывание нулей это не ошибка, а просто текущее положение дел.
Вы, возможно, однократно его вызываете?
Надо в цикле вызывать до тех пор, пока не будут получены нужные данные или не истечет таймаут (таймаут, кстати, лучше считать через собственный таймер - вход udiTimeout не работает адекватно, насколько я помню).

tegs
17.07.2019, 07:47
Добрый день. Да, должен.
CAA.Read читает данные из буфера COM-порта - т.е. с точки зрения ФБ считывание нулей это не ошибка, а просто текущее положение дел.
Вы, возможно, однократно его вызываете?
Надо в цикле вызывать до тех пор, пока не будут получены нужные данные или не истечет таймаут (таймаут, кстати, лучше считать через собственный таймер - вход udiTimeout не работает адекватно, насколько я помню).

у меня чтение в цикле. другое дело что вызов Write не вызывает свечения светодиода, такое ощущение что он ничего не записывает на шине. Я экспериментировал с номером порта, поидее у СПК105 всего два порта RS232 - 1 и RS485 - 2. Я пробовал и 2 и 1 и 0 и даже 3. таймаут у меня сделан собственным таймером. Вообще код почти полностью повторяет код примера "Нестандартные протоколы". В случае неверного подключения А и В могут быть такие результаты?

Евгений Кислов
17.07.2019, 07:50
Да, могут. Для СПК105 - у порта RS-485 в CODESYS номер 2, у RS-232 - номер 3.

Sijey
06.08.2019, 19:00
Здравствуйте.
Подскажите как правильно организовать сеть, а именно:
ТРМ202(RS485) + СПК110+ СПК107. Требуется управлять и опрашивать входа каждым СПК.
Как лучше сделать? СПК110 опрашивает ТРМ202, а СПК107 опрашивает СПК110 и записывает данные в ТРМ через него?

Евгений Кислов
06.08.2019, 19:08
Добрый день.
Да, так можно сделать.

Евгений Кислов
07.08.2019, 08:44
Добрый день, коллеги.

Документ CODESYS V3.5. Настройка обмена с верхним уровнем обновлен до версии 2.1.
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_OPC_v2.1.pdf

Внесенные изменения:

1. Добавлен пример работы по OPC UA
2. Отредактирован пример обмена с OwenCloud - после вчерашнего обновления (https://owen.ru/forum/showthread.php?t=31665&p=311338&viewfull=1#post311338) сервиса контроллеры с CODESYS V3.5
можно подключать как автоопределяемые устройства. В этом случае импорт переменных в облако происходит автоматически.

43938

Ампер
15.08.2019, 12:00
Добрый день. Подскажите пожалуйста возможно ли настроить передачу данных от трансмиттера к СПК? Описание трансмиттера https://www.mt.com/dam/product_organizations/industry/Load_Cells/Downloads/Transmitter/ACT350/act350analog/datssheets/30327488_DS_ACT350_RU.pdf

Евгений Кислов
15.08.2019, 12:18
Добрый день.
Судя по описанию - нет, указанные протоколы не поддерживаются.

Евгений Кислов
03.09.2019, 10:38
Добрый день, коллеги.
Мы выпустили библиотеку OwenCommunication.
Она позволяет настроить обмен по Modbus и реализовывать нестандартные протоколы.
Более подробная информация тут:
https://owen.ru/forum/showthread.php?t=31816

Документ CODESYS V3.5. Протокол Modbus (https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v2.0.pdf) обновлен до версии 2.0.

Евгений Кислов
08.09.2019, 10:01
Хотелось бы увидеть пошаговую инструкцию или видео для воспроизведения проблемы.

Евгений Кислов
08.09.2019, 11:11
Тип обоих переменных - INT?
Какие у них названия?

alexx751
08.09.2019, 12:20
Мне показалось или у capzap ПЛК210?

alexx751
08.09.2019, 12:45
Вы где-то писали "ПЛК210"?

Евгений Кислов
09.09.2019, 07:25
Вы после обновления конфигурации в контроллере в браузере страницу рефрешите?

Евгений Кислов
09.09.2019, 07:57
Да, вполне.
Спасибо за инфу, будем разбираться.

GoodLuck
09.10.2019, 15:06
Добрый день!

Для чтения данных с тепловычислителя ВЗЛЕТ ТСРВ-026М использую ФБ MB_RD_INP_REGS (библиотека Modbus 3.5.4.2).
Требуется прочитать данные с регистра 0xC140 (49472). Но вход FirstAddr (ФБ MB_RD_INP_REGS) позволяет вводить число не более 32767, хотя тип указан WORD.

Как быть? Использую контроллер СПК110 М01.

Евгений Кислов
09.10.2019, 15:15
Версию 3.5.4.3 попробуйте - в ней, насколько помню, как раз эту проблему решили:
https://ftp.owen.ru/CoDeSys3/04_Library/02_Manual_installation/03_Modbus-master/3.5.4.3/modbus_v3.5.4.3.compiled-library

GoodLuck
09.10.2019, 15:34
Версию 3.5.4.3 попробуйте - в ней, насколько помню, как раз эту проблему решили:
https://ftp.owen.ru/CoDeSys3/04_Library/02_Manual_installation/03_Modbus-master/3.5.4.3/modbus_v3.5.4.3.compiled-library

Спасибо, помогло!

Евгений Кислов
27.11.2019, 06:47
Добрый день, коллеги.
Мы выпустили обновленную версию пакета шаблонов модулей Mx210 для CODESYS V3 - 3.5.11.6.
Она включает в себя новые шаблоны для модулей:

МВ210-212
МВ210-214
МУ210-402
МУ210-403
МЭ210-701


Скачать обновленный пакет шаблонов: Mx210Templates_v3.5.11.6.package (https://ftp.owen.ru/CoDeSys3/04_Library/05_3.5.11.5/01_Components/Mx210Templates_v3.5.11.6.package)

Внимание! Шаблоны не поддерживают команду контекстного меню Update Device (Обновить устройство).

Арт84
02.12.2019, 13:19
Добрый день,
Кто-нибудь настраивал работу СПК207 и SCADA CIMPLICITY 4.0 по протоколу Modbus TCP/IP?

sem9n
25.12.2019, 15:45
Добрый день. Есть ли какие-то готовые шаблоны для опроса устройства МВА8? Если нет, существуют ли какие-то способы опроса при использовании Raspberry PI в качестве контроллера?

Евгений Кислов
25.12.2019, 15:49
Добрый день. Есть ли какие-то готовые шаблоны для опроса устройства МВА8? Если нет, существуют ли какие-то способы опроса при использовании Raspberry PI в качестве контроллера?

Добрый день.
По идее, шаблон для МВ110-8А должен подойти (у него с МВА8 совпадают карты регистров, насколько я помню).

Sergeba
05.01.2020, 18:13
Здравствуйте, у меня на ПЛК304 реализован проект для сети Modbus. В работу подключено две подсети на 15 и 29 устройств соответственно. Реализовывал через стандартную конфигурацию, но данная реализация "еле дышит"... в основном проблема с отваливанием устройств - как следствие пропуск управляющих сигналов. Под руку попался старенький ПЛК110 - перенёс проект на него с использованием "универсального диспетчера" на основе библиотеки Modbus - всё работает на порядок стабильнее. Решил попробовать реализовать проект на библиотеке Modbus для ПЛК304, но из за отсутствия диспетчера возникли проблемы. По отдельности устройства опрашиваются без проблем и ошибок, но стоит включить в работу два подобных устройства - начинаются сыпаться ошибки 255. Как организовать диспетчиризацию модулей Modbus?

Евгений Кислов
05.01.2020, 18:30
Добрый день.
Посмотрите здесь п. 6.4:
https://ftp.owen.ru/CoDeSys3/11_Documentation/01_SPK/SPK_Modbus_v.1.1.pdf

Там показано, как организовать опрос нескольких устройств через библиотеку.

Sergeba
05.01.2020, 20:47
Добрый день.
Посмотрите здесь п. 6.4:
https://ftp.owen.ru/CoDeSys3/11_Documentation/01_SPK/SPK_Modbus_v.1.1.pdf

Там показано, как организовать опрос нескольких устройств через библиотеку.

Спасибо за совет. Разбираюсь с инструкцией. По ходу чтения появились вопросы.
1. Можно ли использовать один буфер для приёма данных для всех модулей чтения? Ведь, на сколько я понял (у меня так и реализовано по сигналу CMPL) опрос следующего начинается по завершению предыдущего, т.е. я могу в этот момент забирать данные, а дальше этот же буфер использует следующий модуль.
2. На странице 126 идёт описание работы программы, приведённой на стр 125. В конце программы используется завершение опрос модуля - это не описано в описании. Я это не использую - смотрел пример описания библиотеки - там нигде нет "завершения опроса", что за буффер используется для этого abyBuffer? И для чего?
3. Нужно ли в каждом модуле формировать свой сигнал CMPL? Или достаточно объявить в глобальных переменных CMPL и применять её для всех модулей по мере завершения опроса?

Евгений Кислов
05.01.2020, 21:00
1. Можно.
2. Блок выполняется по фронту на входе Enable, поэтому после окончания сеанса опроса на вход Enable присваивается FALSE (чтобы при следующем присвоении входу значения TRUE был получен передний фронт). abyBuffer в данном вызове нужен только по той причине, что переменная Buffer является входом-выходом (VAR_IN_OUT) - и ей всегда что-то должно присваиваться при вызове ФБ. Вообще, для вашего случая лучше смотреть на пример со стр. 128.
3. Я не очень понимаю, что вы называете "CMPL".

Sergeba
05.01.2020, 21:25
3. Я не очень понимаю, что вы называете "CMPL".

Я делаю Complete=>CMPL, CMPL - глобальная переменная получается доступна в основной программе и проще обрабатывать на таймерах опроса - когда много модулей, использую так: если время опроса пришло, проверяю, не занят ли другой модуль - ждём, пока освободиться.
Добавил завершение опроса - ошибок не стало...Спасибо.

Рано радовался... Функция 03 заманала... Опрашиваю отдельное устройство - всё ОК, как подключаю несколько то читает, то ошибка 253, то 255... Не пойму в чём дело. 255 - ошибка тайм-аута - пробовал увеличить - ноль реакции.

Sergeba
05.01.2020, 23:15
Вообще, для вашего случая лучше смотреть на пример со стр. 128.


В инструкции используется оператор CASE, получается период опроса модулей ничем не обусловлен, только готовностью.
У меня каждому модулю соответствует свой таймер - могу задать каждому модулю период опроса. Этот же таймер формирует модулю сигнал Enable, при условии что Complete у всех модулей равен TRUE, т.е. в данный момент никто линию не занимает, модули завершили обмен.
Я использую таймеры - выставляю флаг начала опроса и одновременно проверяю общий Complete.

Sergeba
06.01.2020, 14:06
Я правильно понимаю, что если Тайм-Аут устройства 30мс, программный цикл 5мс, то я физически не могу опросить 1 устройство из 30 на линии не быстрее, в среднем, через 1050мс... Как в этом случае работает опрос через конфигуратор, если я заведомо задаю малый период для модуля?

Всё оказалось хуже, чем расчёт... Тайм-Аут проходит без ошибок 10мс, но опрос получился почти 4 секунды!!!

Непонятный косяк ещё с COM-портами. COM5 - тайм-аут 10мс - без проблем - ошибок нет (на нём 29 модулей), COM2 - тайм-аут в среднем 40мс - функция 03 постоянно с ошибками, увеличение тайм-аута не помогает... При уменьшении тайм-аута другие функции тоже начинают "сыпаться".

SlavikP
14.01.2020, 14:51
Читаю через конфигурацию данные из стороннего прибора, modbus-rtu. Иногда (редко, но бывает) гдето чтото подвисает, и данные не обновляются (автоперезапуск стоит, не помогает).
В Codesys2.3 был доступен статус соединения (ошибка или нет) и код последней ошибки. Здесь я чтото ничего подобного не вижу.
Как сейчас правильно узнавать статус обмена по modbus?

Евгений Кислов
14.01.2020, 14:53
Читаю через конфигурацию данные из стороннего прибора, modbus-rtu. Иногда (редко, но бывает) гдето чтото подвисает, и данные не обновляются (автоперезапуск стоит, не помогает).
В Codesys2.3 был доступен статус соединения (ошибка или нет) и код последней ошибки. Здесь я чтото ничего подобного не вижу.
Как сейчас правильно узнавать статус обмена по modbus?

П. 4.6, переменная byModbusError:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v2.0.pdf

Sergeba
19.01.2020, 20:07
П. 4.6, переменная byModbusError:

Ещё вопрос, в CDS2.3 у ФБ опроса модулей была переменная Read (* активен режим чтения, запрос уже отправлен *). В CDS3 такой не нахожу...

Евгений Кислов
19.01.2020, 20:16
Ещё вопрос, в CDS2.3 у ФБ опроса модулей была переменная Read (* активен режим чтения, запрос уже отправлен *). В CDS3 такой не нахожу...

Опишите, пожалуйста, более подробно - о чем речь и зачем это нужно.

Sergeba
19.01.2020, 21:20
Опишите, пожалуйста, более подробно - о чем речь и зачем это нужно.

Хочу попробовать перенести проект "Универсальный диспетчер (https://owen.ru/forum/showthread.php?t=25112&p=219399&viewfull=1#post219399)" из CDS2.3
В тексте программы используется обращение к этой переменной во время начала опроса модуля


Mdl.pDisp^.ReadInpRegs(Enable := NOT Mdl.pDisp^.ReadInpRegs.Read,
Mode := MB_RTU,
DevAddr := Mdl.Base.Adress,
FirstAddr := StartRegister+8,
Quantity:=RegisterCount, (*количество регистров*)
ComHandle := Mdl.pDisp^.Settings.Port,
TimeOut := Mdl.Base.TimeOut,
Buffer:= Mdl.pDisp^.ReciveBuffer);

Евгений Кислов
20.01.2020, 06:25
Тогда это вопрос к автору проекта "Универсальный диспетчер" - каким именно образом формируется данная переменная.

Sergeba
20.01.2020, 09:54
Тогда это вопрос к автору проекта "Универсальный диспетчер" - каким именно образом формируется данная переменная.

Почему к автору? Эта переменная присутствует в описании библиотеки Modbus для CDS2.1, а в CDS3 она из описания пропала... Вот:


FUNCTION_BLOCK MB_RD_INP_REGS
VAR_INPUT
Enable: BOOL; (* разрешение работы блока *)
Mode: MB_MODE; (* Serial Transmission Mode of MODBUS networks *)
DevAddr: BYTE (1..247); (* адрес подчиненного устройства в сети MODBUS *)
FirstAddr: WORD; (* начальный адрес регистра *)
Quantity: BYTE (1..125); (* количество регистров для чтенеия *)
ComHandle:DWORD; (* дескриптор последовательного порта библиотеки SysLibCom *)
TimeOut: TIME; (* время тайм-аута [мс] - макс. задержка на обработку запроса *)
END_VAR
VAR_IN_OUT
Buffer: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
END_VAR
VAR_OUTPUT
Complete: BOOL; (* если = TRUE, то обмен завершен *)
Exception: BYTE; (* исключения протокола MODBUS или 0хFF - таймаут *)
ByteCnt: BYTE; (* размер прочитанного блока данных, байт *)
END_VAR
VAR
RxData: MB_UNI_IO; (* функциональный блок чтения данных *)
Read: BOOL; (* активен режим чтения, запрос уже отправлен *)
END_VAR
VAR CONSTANT
EXC_DE: BYTE := 16#FD; (* INPUT DATA ERROR *)
END_VAR

Евгений Кислов
20.01.2020, 11:01
Это локальная переменная ФБ - она не предназначена для использования за пределами блока.
Каким образом она участвует в логике диспетчера - вопрос к его автору.

Sergeba
20.01.2020, 11:49
Это локальная переменная ФБ - она не предназначена для использования за пределами блока.
Каким образом она участвует в логике диспетчера - вопрос к его автору.

Я обратил на это внимание... Но в CDS2.1 локальные оказывается тоже доступны... В описании диспетчера автор пишет:

"Дело в том, что от момента активации экземпляра ФБ (передний фронт
переменной Enable) до момента завершения его работы (установка переменной Complete в
True) порт COM1 занят. Поэтому активация другого экземплярного блока в этот момент
для этого же порта приведен к коллизии сети. Это означает, что необходимо реализовать
механизм диспетчеризации обращений к порту. "

Евгений Кислов
20.01.2020, 12:08
Я обратил на это внимание... Но в CDS2.1 локальные оказывается тоже доступны... В описании диспетчера автор пишет:

"Дело в том, что от момента активации экземпляра ФБ (передний фронт
переменной Enable) до момента завершения его работы (установка переменной Complete в
True) порт COM1 занят. Поэтому активация другого экземплярного блока в этот момент
для этого же порта приведен к коллизии сети. Это означает, что необходимо реализовать
механизм диспетчеризации обращений к порту. "

Тогда для стандартных компонентов аналогом является переменная xBusy.
Или вы про библиотеку Modbus? Там такого флага нет - его придется самому формировать в коде программы.

Спорягин Кирилл
20.01.2020, 12:23
Я обратил на это внимание... Но в CDS2.1 локальные оказывается тоже доступны... В описании диспетчера автор пишет:

"Дело в том, что от момента активации экземпляра ФБ (передний фронт
переменной Enable) до момента завершения его работы (установка переменной Complete в
True) порт COM1 занят. Поэтому активация другого экземплярного блока в этот момент
для этого же порта приведен к коллизии сети. Это означает, что необходимо реализовать
механизм диспетчеризации обращений к порту. "

В CDS3 локальные тоже доступны. Только помощник не предлагает их при вводе. Но если самому прописать, то скомпилируется.
Подразумевается, что если пользователь создал переменную локальной, то ее не нужно использовать вне блока.
По смыслу Read, конечно, должна быть выходной переменной.
Скорее всего в CDS3, есть другая по названию, но аналогичная по смыслу.

Спорягин Кирилл
20.01.2020, 12:25
Я обратил на это внимание... Но в CDS2.1 локальные оказывается тоже доступны... В описании диспетчера автор пишет:

"Дело в том, что от момента активации экземпляра ФБ (передний фронт
переменной Enable) до момента завершения его работы (установка переменной Complete в
True) порт COM1 занят. Поэтому активация другого экземплярного блока в этот момент
для этого же порта приведен к коллизии сети. Это означает, что необходимо реализовать
механизм диспетчеризации обращений к порту. "

Перепишите, поделитесь. Будет интересно посмотреть.

SlavikP
17.03.2020, 08:54
Пользуясь случаем хочу поблагодарить разработчиков библиотеки OwenCommunication.
Настраивается логично. Работает чОтко и ясно.

Евгений Кислов
17.03.2020, 09:21
Пользуясь случаем хочу поблагодарить разработчиков библиотеки OwenCommunication.
Настраивается логично. Работает чОтко и ясно.

Cпасибо, я им передам. )

Serex
21.03.2020, 15:31
Это здесь можно обсудить шаблоны модулей Мх110

При использовании шаблона 3.5.4.13 не получается изменить в модуле аварийные значения выходов.
Тему про это создал: https://owen.ru/forum/showthread.php?t=32983

Были замечания по этому вопросу? Может быть там что-то не работает?

Cs-Cs
03.04.2020, 21:37
Можно и я тупой вопрос задам - по тому, как в CDS3.5 (СПК1хх) сделать такой же быстрый опрос Мх110, как на ПЛК110 был?
Я использую библиотеки-шаблоны для Мх110. Скорость опроса отслеживаю по светодиодам на модулях. Модулей - 8 штук (один - аналоговый ввод, другие - дискретные IO) - светодиод RS-485 мигает последовательно на каждом модуле подряд (так, как я их в CDS в проект забил).
На ПЛК110, где надо все переменные модулей вносить вручную, я на опрос каждой ставил 10-15 ms - и светодиоды RS-485 на модулях дико мерцали бесконечно.
Чего я делаю не так? Уже и задачу, в которой опрос идёт, нафигачил по 5 ms, и всякие задержки между фреймами поубирал - всё равно медленно опрос идёт.
Может быть забить на шаблоны и нафигачить опрос модулей вручную, через Modbus Slave Device? И там задать время опроса для каждого регистра мелкое?

UPDAT. Блин! Да! Переписал просто на опрос регистров по 10 мсек - всё летает на ура прям! Получается, что не всегда шаблоны хороши?

Евгений Кислов
03.04.2020, 21:41
Получается, что не всегда шаблоны хороши?

Преимущество шаблонов - удобство, а не скорость опроса.

Cs-Cs
03.04.2020, 21:46
Понял! Спасибо, буду знать! А то я на них купился сразу =)

СергейНовосиб
16.04.2020, 10:50
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v2.0.pdf[/QUOTE]
Рисунок 4.5.3 не соответствует CS 3.5.14, есть расхождения. Есть или когда будет соответствующий документ на данную версию?

Евгений Кислов
16.04.2020, 11:27
Рисунок 4.5.3 не соответствует CS 3.5.14, есть расхождения. Есть или когда будет соответствующий документ на данную версию?

В чем именно несоответствие и расхождения?

СергейНовосиб
16.04.2020, 11:36
В документе 48479, а реально 48480
За что отвечает "Изменить параметры операционной системы" и как связан этот IP-адрес с адресом в конфигураторе СПК?

Евгений Кислов
16.04.2020, 11:55
Вы в документе ссылаетесь на описание компонента Modbus TCP Slave, а на скриншоте из CODESYS показываете компонент Ethernet.


За что отвечает "Изменить параметры операционной системы" и как связан этот IP-адрес с адресом в конфигураторе СПК?

48482

СергейНовосиб
16.04.2020, 12:10
Извиняюсь, накасячил.:(
Как я понял из примечания, что если я в конфигураторе сменю IP адрес, то по MODBUS-TCP не смогу подключиться, так как здесь останется старый?
Или все будет нормально?

СергейНовосиб
16.04.2020, 12:15
А что за восклицательный знак красный? Что он означает?
48484

Евгений Кислов
16.04.2020, 12:20
Он означает то, что реальные настройки (которые вы задали в конфигураторе) отличаются от тех, которые "запомнил" компонент.
Но в целом - это не должно влиять на работу компонента.

Tacio
07.05.2020, 12:27
Имеется ПЛК210 с подключёнными к нему модулями МВ210 без использования шаблонов. Состояние связи с модулями оцениваю по флагу xError соответствующего ModbusTCPSlave и по значению ComState этого же FB.
Если из любого модуля вытащить ethernet кабель, то флаг xError почти постоянно висит в значении FALSE, а значение ComState прыгает между CONNECTING, SOCKET_ERR, может ещё какими и в том числе на один или несколько циклов становится CONNECTED. Конечно, можно написать фильтр, но хотелось бы, чтобы CONNECTED не проскакивало.

Евгений Кислов
07.05.2020, 12:34
Имеется ПЛК210 с подключёнными к нему модулями МВ210 без использования шаблонов. Состояние связи с модулями оцениваю по флагу xError соответствующего ModbusTCPSlave и по значению ComState этого же FB.
Если из любого модуля вытащить ethernet кабель, то флаг xError почти постоянно висит в значении FALSE, а значение ComState прыгает между CONNECTING, SOCKET_ERR, может ещё какими и в том числе на один или несколько циклов становится CONNECTED. Конечно, можно написать фильтр, но хотелось бы, чтобы CONNECTED не проскакивало.

Существующее поведение вряд ли будет исправлено.
Можно поставить вопрос по-другому - а зачем вам значение ComState?
На xError должны генерироваться единичные импульсы при каждом отсутствии ответа от слэйва.

Tacio
07.05.2020, 13:18
Можно поставить вопрос по-другому - а зачем вам значение ComState?
Я по значению ComState отслеживаю состояние связи с модулем, чтобы соответствующим образом реагировать на её отсутствие. По сути: если (xError = TRUE) OR (ComState <> CONNECTED), то считаю, что связь модулем пропала.

Евгений Кислов
07.05.2020, 13:29
Я по значению ComState отслеживаю состояние связи с модулем, чтобы соответствующим образом реагировать на её отсутствие. По сути: если (xError = TRUE) OR (ComState <> CONNECTED), то считаю, что связь модулем пропала.

Я отслеживал по byModbusError.
Посмотрите видео на эту тему - возможно, в чем-то поможет:
https://youtu.be/IFUN4cYskRI

Tacio
07.05.2020, 13:53
Да, спасибо, помогло.

Teinrus
08.05.2020, 20:02
Проблема такая. плк 210 подключен к мв210 при подключении в СS показывает что связь установлена но показания с датчика не отображает. так же не могу подключиться по LAn порту к нему (мв210) только по COM-синхронизация происходит показания видны. В чем проблема подскажите?

Евгений Кислов
08.05.2020, 20:10
Проблема такая. плк 210 подключен к мв210 при подключении в СS показывает что связь установлена но показания с датчика не отображает. так же не могу подключиться по LAn порту к нему (мв210) только по COM-синхронизация происходит показания видны. В чем проблема подскажите?

Выложите скриншоты из CODESYS и из конфигуратора модуля, пожалуйста (сетевые настройки).

Teinrus
12.05.2020, 15:55
489954899648997

Евгений Кислов
12.05.2020, 16:19
1. Покажите скриншотом объявление переменной, которая привязана к каналу значения входа.
2. В коде программы нет случаем записи в эту переменную?
3. Вы редактировали настройки задач проекта?

Teinrus
14.05.2020, 11:38
Да я ее по проекту перезаписал.

Teinrus
14.05.2020, 11:40
97 это шлюз а 95 DNS

Карбофос
28.05.2020, 15:50
Приветствую!

СПК107. На новом объекте есть задача среди прочего опрашивать сторонний контроллер (Siemens S7-1200) по протоколу Modbus-TCP, но люди, что поставляют шкаф на Сименсе порадовали информацией, что как-то пытались подружить контроллеры Овен и Сименс, но сколько не бились, ничего не вышло. Какой именно был Овен неизвестно.
Оборудования пока на руках нет. У кого-нибудь была подобная практика? Были проблемы при попытке их связать?

Влад0000
03.06.2020, 21:20
Всем Привет Помогите подключить ПЛК100 к весовому терминалу ТВ-014.
Новичок

melky
03.06.2020, 22:43
Влад0000, https://www.tenso-m.ru/pdf/re/re_tv_014_c_17.pdf - оно ?

Примеры программ с нестандартными протоколами и вперед писать обмен.

Влад0000
04.06.2020, 13:22
У вас пример для обмена не будет, может кто уже делал проверенный вариант.

N.Vladimir
10.06.2020, 15:20
Коллеги, как опросить в Codesys 3.5, в ASCII режиме устройство.
Управление реализуется командами, синтаксис - Код_пробел_Команда.
К примеру: <1234 Set 1>
Сориентируйте пожалуйста, как это делается, возможно ссылка на пример.

Ссылка на лист инструкции:
https://yadi.sk/d/kZUyH9vPqzbz4g

Евгений Кислов
10.06.2020, 16:17
Коллеги, как опросить в Codesys 3.5, в ASCII режиме устройство.
Управление реализуется командами, синтаксис - Код_пробел_Команда.
К примеру: <1234 Set 1>
Сориентируйте пожалуйста, как это делается, возможно ссылка на пример.

Ссылка на лист инструкции:
https://yadi.sk/d/kZUyH9vPqzbz4g

Вот пример реализации обмена по строковому протоколу:
https://youtu.be/uH3hnXmc0fw

ShivA
24.06.2020, 18:36
Здравствуйте.... Пытаюсь опросить ТРМ202, не выходит. СПК107->RS485->ModBus_RTU->ТРМ202. С какой стороны подступиться? Шаблонов, естественно, Овен для сего девайса не выпустил.

Евгений Кислов
24.06.2020, 18:55
Здравствуйте.... Пытаюсь опросить ТРМ202, не выходит. СПК107->RS485->ModBus_RTU->ТРМ202. С какой стороны подступиться? Шаблонов, естественно, Овен для сего девайса не выпустил.

Добрый день.
Что именно не выходит и в чем это проявляется?
Выложите скриншоты со всеми настройками, пожалуйста.

ShivA
24.06.2020, 20:46
Добрый день.
Что именно не выходит и в чем это проявляется?
Выложите скриншоты со всеми настройками, пожалуйста.

да собственно и выкладывать нечего, все стандартно..... com-порт, настройки проверены, другой девайс, ПЧВ1, подключенный по шаблону, справно работает.... в случае с ТРМ2 шаблона не имею и пытаюсь подключить как: "Modbus Slave com port" из библиотеки 3S с добавлением в шаблон соответствующих каналов для опроса переменных. при компиляции ошибок не выдает. при запуске на выполнение, состояние ТРМ202: - "не запущено" в том случае если каналы не добавлены, и с каналами: - "ошибка шины"..... других путей пока я не знаю....

Евгений Кислов
24.06.2020, 20:49
да собственно и выкладывать нечего, все стандартно..... com-порт, настройки проверены, другой девайс, ПЧВ1, подключенный по шаблону, справно работает.... в случае с ТРМ2 шаблона не имею и пытаюсь подключить как: "Modbus Slave com port" из библиотеки 3S с добавлением в шаблон соответствующих каналов для опроса переменных. при компиляции ошибок не выдает. при запуске на выполнение, состояние ТРМ202: - "не запущено" в том случае если каналы не добавлены, и с каналами: - "ошибка шины"..... других путей пока я не знаю....

Нужно выложить:

1. Скриншот с настройками COM-порта
2. Скриншот с настроками каналов опроса

В ТРМ выбран протокол Modbus? (по умолчанию там используется протокол ОВЕН)

ShivA
24.06.2020, 21:03
4982349824
Нужно выложить:

1. Скриншот с настройками COM-порта
2. Скриншот с настроками каналов опроса

В ТРМ выбран протокол Modbus? (по умолчанию там используется протокол ОВЕН)

да, в ТРМ202 протокол Modbus RTU

Евгений Кислов
24.06.2020, 21:10
1. ТРМ202 не может работать с 1 стоп битом по Modbus RTU:

49825

2. Нельзя считать "половинку" float - надо указать Длина = 2.

ShivA
24.06.2020, 21:14
1. ТРМ202 не может работать с 1 стоп битом по Modbus RTU:

49825

2. Нельзя считать "половинку" float - надо указать Длина = 2.

спасибо, поправлю

turkish945
03.07.2020, 00:41
Всем добра!

ПЛК210, подключены к нему по rs485 два датчика: ПВТ10 и ПВТ100, но он их почему-то не видит... Через АС4 с компа вижу нормально, вот скрин из конфигуратора ПВТ100:
50024

Настройки в проекте.
порт rs485 (второй):
50025

modbus master:
50026

modbus slave:
50027

канал modbus slave:
50028

Во время выполнения пишет "шина не запущена" и выдает ошибку каждую секунду по таймауту:
50029

что я делаю не так?

Евгений Кислов
03.07.2020, 06:34
Добрый день.

По скриншотам - все настроено корректно.

1. Вы перезагружали ПВТ после изменения настроек?
2. Какой цикл задачи у MainTask?
3. Проверьте физический уровень, пожалуйста - к тому ли порту ПЛК подключили кабель, не перепутаны ли A и B и т.д.

turkish945
03.07.2020, 09:20
Добрый день.

По скриншотам - все настроено корректно.

1. Вы перезагружали ПВТ после изменения настроек?
2. Какой цикл задачи у MainTask?
3. Проверьте физический уровень, пожалуйста - к тому ли порту ПЛК подключили кабель, не перепутаны ли A и B и т.д.

1. Уже не помню, перезагружал ли, но через конфигуратор же подключаюсь, он же ничем не отличается? Достаточно питание передернуть?
2. Цикл maintask 20 мс.
3. Проверю. Уже сам думаю на это....

Евгений Кислов
03.07.2020, 09:23
После изменения настроек через конфигуратор обязательно перезагрузить ПВТ по питанию - я это имел в виду.

turkish945
04.07.2020, 20:36
Добрый день.

По скриншотам - все настроено корректно.

1. Вы перезагружали ПВТ после изменения настроек?
2. Какой цикл задачи у MainTask?
3. Проверьте физический уровень, пожалуйста - к тому ли порту ПЛК подключили кабель, не перепутаны ли A и B и т.д.
Перезагрузил, физику проверил - все правильно, попробовал даже со второго порта на первый перевесить - не помогло. Не подключается все равно :(

Что делать?

Евгений Кислов
04.07.2020, 21:04
Что делать?

1. Попробуйте в узле LeftSide переключить бит управления подтяжкой RS-485.
2. Выложите ваш проект, пожалуйста.

Cs-Cs
04.07.2020, 21:53
turkish945 А ты наш шлейф физически проверял? Что будет если наплевать на него и подключить датчик на кусок витой пары, например?
Сразу тогда будет понятно про железо или софт

turkish945
05.07.2020, 10:59
turkish945 А ты наш шлейф физически проверял? Что будет если наплевать на него и подключить датчик на кусок витой пары, например?
Сразу тогда будет понятно про железо или софт

еше не проверял, вот как раз сегодня хочу проверить, у меня куски КИПЭВ остались.

turkish945
05.07.2020, 11:05
1. Попробуйте в узле LeftSide переключить бит управления подтяжкой RS-485.
2. Выложите ваш проект, пожалуйста.

подтяжку попробовал - не помогло. Попробую шлейф заменить, если не поможет - выложу проект.

turkish945
05.07.2020, 14:27
Все, нашел проблему. Это мой косяк :)

Решил проверить шлейф и обнаружил, что одно из устройств, которое на нем висит - не подключено, соответственно в этом месте линия разорвана, соединил - заработало.

Но теперь не считывается значение. Возможно я что-то не так делаю - первый раз RS485 без шаблонов настраиваю...

В докуме к устройству написано:
Прибор поддерживает выполнение функций ModBus:
03 – чтение значений из нескольких регистров хранения;
06 – запись значения в один регистр хранения.

и далее табличка, в которой для параметра "измеренное значение температуры" указан номер первого регистра hex 0х0102.
У слейва настроил канал:
50054

почему-то выдает значение 0. Температура при этом точно не 0 :)
Да и через конфигуратор смотрел, там все нормально отображается....

Евгений Кислов
05.07.2020, 14:37
почему-то выдает значение 0.

Выложите, пожалуйста, скриншот, на котором это будет видно.

turkish945
05.07.2020, 19:03
Выложите, пожалуйста, скриншот, на котором это будет видно.

50056
вроде все видно

Евгений Кислов
05.07.2020, 19:13
50056
вроде все видно

Внизу справа - настройка Всегда обновлять переменные - надо поставить Вкл. 2 (в задаче цикла шины).

turkish945
05.07.2020, 23:03
Внизу справа - настройка Всегда обновлять переменные - надо поставить Вкл. 2 (в задаче цикла шины).

да, теперь работает, спасибо!

а в чем суть этой настройки? И где этот цикл шины? В конфигураторе задач я такой не нашел...

И еще вопрос: как определить, что произошло считывание? Там температура считывается значением х100, мне надо его поделить на 100 соответственно. Если я буду это делать по xDone слейва, будет как надо работать? То есть xDone = true только один цикл?

Евгений Кислов
06.07.2020, 06:48
а в чем суть этой настройки? И где этот цикл шины? В конфигураторе задач я такой не нашел...

См. п. 4 здесь:
https://ftp.owen.ru/CoDeSys3/98_Books/CodesysTaskManagment.pdf


И еще вопрос: как определить, что произошло считывание? Там температура считывается значением х100, мне надо его поделить на 100 соответственно. Если я буду это делать по xDone слейва, будет как надо работать? То есть xDone = true только один цикл?

Проще это делать в цикле, а не по каким-то условиям.
Это совершенно не ресурсоемкая операция, и нет смысла на ней экономить.

turkish945
06.07.2020, 14:08
Проще это делать в цикле, а не по каким-то условиям.
Это совершенно не ресурсоемкая операция, и нет смысла на ней экономить.

я и имел в виду, что буду делать в maintask, просто в цикле проверять этот флаг, если считано - делить полученное значение на 100.

Евгений Кислов
06.07.2020, 14:13
я и имел в виду, что буду делать в maintask, просто в цикле проверять этот флаг, если считано - делить полученное значение на 100.

Можно так. Можно просто делить на 100 каждый цикл.

prophet
03.08.2020, 11:58
Добрый день,

использую контроллер PLC210-03-CS, прошивка plc210 1.2.0415.1822, Codesys V3.5 SP14 Patch 3, OwenTargets 3.5.14.3003
установлены шаблоны для устройств Mx210 - Mx210Templates_v3.5.11.6

Настроен обмен через Modbus TCP Master с использованием шаблонов устройств.
Оконечное устройство MВ210-101 не подключено к шине.

Ожидаемое поведение:
после определения что устройство не отвечает, для устройства устанавливается флаг ошибки, по каждому из каналов устанавливается статус "Нет связи с модулем" (FIELDBUS_ERROR), и не меняется до успешного установления связи с модулем и получения актуальных данных.

Фактическое поведение:
после определения, что устройство не отвечает, устанавливается флаг ошибки, устанавливается статус "Нет связи с модулем", но при повторных попытках подключения, флаг ошибки на некоторое время сбрасывается, а статус устанавливается в значение NO_ERROR.

Таким образом, в программе может возникнуть ситуация использования некорректных данных получаемых, например, с аналогового входа. Какие могут быть способы устранения данной проблемы?

Евгений Кислов
03.08.2020, 12:04
Добрый день.

Посмотрите это видео:
https://youtu.be/IFUN4cYskRI

Оно несколько на другую тему, но созданные в его рамках флаги можно использовать и при валидации данных, полученных от модуля (например, перед копированием значений переменных, привязанных к каналам, в другие переменные программы).

prophet
03.08.2020, 16:58
Оно несколько на другую тему, но созданные в его рамках флаги можно использовать и при валидации данных, полученных от модуля (например, перед копированием значений переменных, привязанных к каналам, в другие переменные программы).

Понял, спасибо.
Вопрос возник в связи с тем, что библиотеки по связи с модулями МВ110, по другому генерируют флаг тревоги, там он не сбрасывается при попытке повторной установки связи.

Евгений Кислов
03.08.2020, 17:13
Понял, спасибо.
Вопрос возник в связи с тем, что библиотеки по связи с модулями МВ110, по другому генерируют флаг тревоги, там он не сбрасывается при попытке повторной установки связи.

Вероятно, потому что там просто отправляется следующий запрос, а в TCP еще происходит попытка реконнекта.

Карбофос
22.09.2020, 16:32
Здравствуйте!

Есть несколько устройств, подключенных к СПК107 по RS-485 не по шаблону. Мне необходимо, чтобы при отказе или отключении устройства загоралась условная лампочка. Как определить статус устройства? Тут, на скриншоте ничего не подходит (например xError только мигает, мне нужно чтобы стабильно отображалась онорма лили ошибка):
51120

Евгений Кислов
22.09.2020, 16:55
Здравствуйте!

Есть несколько устройств, подключенных к СПК107 по RS-485 не по шаблону. Мне необходимо, чтобы при отказе или отключении устройства загоралась условная лампочка. Как определить статус устройства? Тут, на скриншоте ничего не подходит (например xError только мигает, мне нужно чтобы стабильно отображалась онорма лили ошибка):
51120

Добрый день.
Посмотрите это видео:
https://youtu.be/IFUN4cYskRI

GoodLuck
22.09.2020, 16:57
Здравствуйте!

Есть несколько устройств, подключенных к СПК107 по RS-485 не по шаблону. Мне необходимо, чтобы при отказе или отключении устройства загоралась условная лампочка. Как определить статус устройства? Тут, на скриншоте ничего не подходит (например xError только мигает, мне нужно чтобы стабильно отображалась онорма лили ошибка):
51120

Можно написать такой алгоритм: если xError мигает, допустим, минуту (или меньше), значит, связи нет.

Евгений Кислов
11.10.2020, 19:03
Всем привет. Реализовываю обмен данными между ПЛК 210 и панелью сп310 через TCP IP, но когда загружаю проект в панель, любой, даже не касающийся данного проекта, панель отказывается нажимать на переключатели и вообще выполнять какие-либо действия, просто происходит звук нажатия, после которого тапнуть по экрану представляется возможным через сек. 5, хотелось бы узнать, что не так делаю. Собственно всю настойку и пробный вариант из видео 11 о таком методе обмена тоже пробовал, и такая же история.

Добрый день.
Судя по описанию - у вас панель является мастером, и вы некорректно настроили обмен (указали адреса отсутствующих в ПЛК регистров и т.д.).
Рекомендую начать с примера:
https://ftp.owen.ru/SP300/01_Examples/primer_nastroika_obmena_s_plk_na_codesys_3.5.zip

Gatling
12.10.2020, 18:39
Спасибо, буду пробовать!

x2shadow
19.10.2020, 10:41
Здравствуйте, использую библиотеку OwenCommunication 3.5.11.3 на СПК107[М01] для связи по протоколу Modbus RTU с OPC сервером.
СПК - Master, OPC - Slave.
В проекте отправляется несколько запросов. Первые три отправляются и получают ответ, на 4-м запросе выставляется флаг xBusy в TRUE и не проходит. Все последующие запросы игнорируются.
Подскажите в чем может быть проблема?
Если нужно могу приложить все файлы, но сразу скажу, что проект громоздкий, в нем используется самописная библиотека.
CodeSYS 3.5 SP14 Patch 3, таргет-файл 3.5.14.30

Евгений Кислов
19.10.2020, 14:03
Здравствуйте, использую библиотеку OwenCommunication 3.5.11.3 на СПК107[М01] для связи по протоколу Modbus RTU с OPC сервером.
СПК - Master, OPC - Slave.
В проекте отправляется несколько запросов. Первые три отправляются и получают ответ, на 4-м запросе выставляется флаг xBusy в TRUE и не проходит. Все последующие запросы игнорируются.
Подскажите в чем может быть проблема?
Если нужно могу приложить все файлы, но сразу скажу, что проект громоздкий, в нем используется самописная библиотека.
CodeSYS 3.5 SP14 Patch 3, таргет-файл 3.5.14.30

Добрый день.
Уберите, пожалуйста, из проекта все, что не касается обмена с OPC и выложите его.
Также приложите конфигурацию OPC.

elan
19.10.2020, 23:07
Здравствуйте.
К ПЛК210 планируется подключение газоанализаторов Бинар-2Д по модбасу.
Естественно, протокол (https://www.gazoanalizators.ru/tech/binar-2d-re.pdf) у них свой. Можете помочь с написанием модуля опроса?

x2shadow
20.10.2020, 03:13
Добрый день!
Постарался убрать по максиму, но лишнее все же осталось.
Прикладываю архив проекта и конфигурацию OPC.

Евгений Кислов
20.10.2020, 08:07
Здравствуйте.
К ПЛК210 планируется подключение газоанализаторов Бинар-2Д по модбасу.
Естественно, протокол (https://www.gazoanalizators.ru/tech/binar-2d-re.pdf) у них свой. Можете помочь с написанием модуля опроса?

Добрый день.
Проще всего будет использовать библиотеку OwenCommunication.
https://ftp.owen.ru/CoDeSys3/04_Library/05_3.5.11.5/02_Libraries/OwenCommunication_v3.5.11.3.compiled-library

Вот пример, на который можно ориентироваться (в нем показывается, как опросить устройство по протоколу DCON - это тоже простой строковый протокол):
https://youtu.be/uH3hnXmc0fw

Евгений Кислов
20.10.2020, 08:30
Добрый день!
Постарался убрать по максиму, но лишнее все же осталось.
Прикладываю архив проекта и конфигурацию OPC.

Из-за количества оберток разобраться в коде довольно трудно, но, кажется, у вас в пределах цикла ПЛК производится несколько вызовов экземпляра OCL.MB_SerialRequest с разными аргументами.
Так делать нельзя - нужно дождаться завершения одной транзакции и только после этого переходить к следующей.
ФБ библиотеки работают асинхронно.

51453

x2shadow
21.10.2020, 02:19
Из-за количества оберток разобраться в коде довольно трудно, но, кажется, у вас в пределах цикла ПЛК производится несколько вызовов экземпляра OCL.MB_SerialRequest с разными аргументами.
Так делать нельзя - нужно дождаться завершения одной транзакции и только после этого переходить к следующей.
ФБ библиотеки работают асинхронно.

51453

Код достался мне, скажем так, по наследству :) Он действительно написан не очень очевидно, тем не менее, спасибо большое, вы натолкнули меня на верную мысль.
Я дописал код так, чтобы каждый запрос сначала вернул xDone, а только потом уже идет следующий вызов запроса.
51468

yurya
25.10.2020, 13:36
Добрый день.
Codesys OPC Server v 3 в MasterScada добавляется.
Но при попытке вставить переменные получаю ошибку как на стр. 32 руководства
«CODESYS V3.5 Настройка связи с верхним уровнем». Рекомендованного в руководстве файла OPC.bat нет.
Подскажите, в чем проблема?

Евгений Кислов
25.10.2020, 13:38
Добрый день.
Codesys OPC Server v 3 в MasterScada добавляется.
Но при попытке вставить переменные получаю ошибку как на стр. 32 руководства
«CODESYS V3.5 Настройка связи с верхним уровнем». Рекомендованного в руководстве файла OPC.bat нет.
Подскажите, в чем проблема?

Добрый день.
Какой контроллер вы используете и какой пакет таргет-файлов для него устанавливали?

yurya
25.10.2020, 13:47
СПК110, пакет 3.5.11.5004.

Евгений Кислов
25.10.2020, 14:23
СПК110, пакет 3.5.11.5004.

Откройте .package архиватором, в папке Component 21 находятся два файла для OPC сервера.
Скопируйте их в директорию установки OPC сервера, перезаписав существующие файлы.
После этого потребуется перезапустить OPC и SCADA.

yurya
25.10.2020, 15:41
Откройте .package архиватором, в папке Component 21 находятся два файла для OPC сервера.
Скопируйте их в директорию установки OPC сервера, перезаписав существующие файлы.
После этого потребуется перезапустить OPC и SCADA.

Заработало. Спасибо.

Максим Ульянов
05.11.2020, 13:31
Коллеги ,доброго времени, глупый вопрос : есть огромная куча слайв MODBUS устройств,подключенные через 3х портовые IP шлюзы...Нажмите на изображение для увеличения. 51736
ipadres-адрес шлюза,надеюсь ?
Unit-ID - это адрес непосредственно слайв MODBUS устройства ?
но у шлюза несколько портов..пусть будет три..Где это прописать?
как быть с тем что слайв MODBUS устройства на одном шлюзе до 60 ? нужно создать копии с одинаковым IP адресом но разными Unit-ID?

Евгений Кислов
05.11.2020, 14:03
Коллеги ,доброго времени, глупый вопрос : есть огромная куча слайв MODBUS устройств,подключенные через 3х портовые IP шлюзы...Нажмите на изображение для увеличения. 51736
ipadres-адрес шлюза,надеюсь ?
Unit-ID - это адрес непосредственно слайв MODBUS устройства ?
но у шлюза несколько портов..пусть будет три..Где это прописать?
как быть с тем что слайв MODBUS устройства на одном шлюзе до 60 ? нужно создать копии с одинаковым IP адресом но разными Unit-ID?

Добрый день.
Напишите подробнее о принципе работы ваших шлюзов, пожалуйста.
И укажите модель.

Максим Ульянов
05.11.2020, 14:17
шлюз : tGW 735 ,3х портовый ,на каждом порту от 4 до 10 устройств ...соответственно нужно вычитывать и иногда записывать в определенные регистры
и самое неприятное ,шлюзы MD-CCM18A/N там до 60 устройств..но я так понял все они в одном адресном пространстве и для них необходимо только создать каналы , давайте я вам руководства по нему на почту скину ,может что подскажите...в открытом доступе что то найти по нему сложно

Евгений Кислов
05.11.2020, 14:25
Так у вас tGW 735 или MD-CCM18A/N? Или MD-CCM18A подключены к tGW 735?

Максим Ульянов
05.11.2020, 14:37
и то и другое естественно через коммутатор по езернету

Евгений Кислов
05.11.2020, 14:41
С tGW 735 все понятно - там каждому COM-порту соответствует TCP-порт (502, 503, 504) - на каждый порт нужно в CODESYS добавлять компонент Modbus TCP Slave и указывать там соответствующий порт.
У MD-CCM18A/N - тоже самое, но порт, как я понимаю, один.
Далее под Modbus TCP Slave надо добавлять Modbus Slave COM Port - и вот там указываются Slave ID.
Посмотрите второй скриншот в этом посте:
https://owen.ru/forum/showthread.php?t=28167&p=338820&viewfull=1#post338820

В рамках разных Modbus TCP Slave могут быть добавлены слэйвы с совпадающими ID - это нормально.

Максим Ульянов
05.11.2020, 14:53
С tGW 735 все понятно - там каждому COM-порту соответствует TCP-порт (502, 503, 504) - на каждый порт нужно в CODESYS добавлять компонент Modbus TCP Slave и указывать там соответствующий порт.
У MD-CCM18A/N - тоже самое, но порт, как я понимаю, один.
Далее под Modbus TCP Slave надо добавлять Modbus Slave COM Port - и вот там указываются Slave ID.
Посмотрите второй скриншот в этом посте:
https://owen.ru/forum/showthread.php?t=28167&p=338820&viewfull=1#post338820

В рамках разных Modbus TCP Slave могут быть добавлены слэйвы с совпадающими ID - это нормально.

вот за это вам ОГРОМНОЕ СПАСИБО) только вот среда не позволяет добавить к TCP Slave устройство COM Slave...
51737

Максим Ульянов
05.11.2020, 15:10
нашел..огромное спасибо

Максим Ульянов
06.11.2020, 10:36
Коллеги еще вопрос ...читаю документацию по настройке Модбас Слейв до 100 каналов на одно устройство...у Меня на шлюзе MD-CCM18A/N будет больше каналов ... 51768
могу ли я создать несколько экземпляров Слейв устройств с одинаковым Unit ID ? вернее будет ли это работать?)

Евгений Кислов
06.11.2020, 10:37
Коллеги еще вопрос ...читаю документацию по настройке Модбас Слейв до 100 каналов на одно устройство...у Меня на шлюзе MD-CCM18A/N будет больше каналов ... 51768
могу ли я создать несколько экземпляров Слейв устройств с одинаковым Unit ID ? вернее будет ли это работать?)

Это зависит от того, поддерживает ли ваш шлюз несколько одновременных соединений для одного TCP-порта.

Максим Ульянов
06.11.2020, 11:02
а есть какая то возможность настройки нескольких экземпляров Слейв устройств с одинаковым Unit ID опроса по очереди ?

Евгений Кислов
06.11.2020, 11:15
а есть какая то возможность настройки нескольких экземпляров Слейв устройств с одинаковым Unit ID опроса по очереди ?

Через дерево проекта это будет сложно сделать - но можно через библиотеку OwenCommunication.
Библиотека и документация выложены на нашем сайте (ссылки в подписи).

Максим Ульянов
06.11.2020, 12:47
51769
тоесть этим блоком можно вычитать за раз 65000 регистров?

Евгений Кислов
06.11.2020, 12:55
51769
тоесть этим блоком можно вычитать за раз 65000 регистров?

Этот блок используется, когда вам нужно настроить контроллер в режиме Modbus TCP Slave.
В вашем случае требуется MB_TcpRequest - чтобы отправлять запросы по протоколу Modbus TCP в режиме мастера.

Максим Ульянов
06.11.2020, 13:11
В вашем случае требуется MB_TcpRequest - чтобы отправлять запросы по протоколу Modbus TCP в режиме мастера.

а можно чуть подробнее ? То есть мы запускаем этот блок по какому то сигналу , второй третий блоки ( к примеру) тоже по разным сигналам в разное время..
или я совсем не так понимаю?

Евгений Кислов
06.11.2020, 13:15
а можно чуть подробнее ? То есть мы запускаем этот блок по какому то сигналу , второй третий блоки ( к примеру) тоже по разным сигналам в разное время..
или я совсем не так понимаю?

Вы понимаете правильно. Каждый блок имеет выходы xDone и xError, сигнализирующие об успешном или неуспешном завершении его работы.
Подробнее - в примерах документа и здесь:
https://youtu.be/mxEESSRKGpU

Максим Ульянов
06.11.2020, 14:22
еще вопрос ..А сколько регистров я могу вычитать используя MB_TcpRequest,какие есть ограничения?

Евгений Кислов
06.11.2020, 14:31
еще вопрос ..А сколько регистров я могу вычитать используя MB_TcpRequest,какие есть ограничения?

Ограничение Modbus - не более 125 регистров в запросе чтения.

Yaroslav_22
07.11.2020, 15:43
Здравствуйте,
не могу понять как вытащить REAl значение на СПК107 из ПР200:
ПР200 Slave
Старший байт вперед (2-1-4-3)
адрес переменной 513

СПК107 Master
функц. чтения 03
адрес 0х0201, 2 слова
x1,x2- 2 два слова с MB сети
Xd: DWORD;
pt: POINTER TO REAL;
real_m:REAl;

Xd:=SHL(x1,15) or x2;
pt:ADR(Xd);
real_m := pt^;

какие то данные получаю, но все не то

Что не так?

Евгений Кислов
07.11.2020, 16:06
Добрый день.
См. здесь.
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v2.0.pdf

п. 5.8.4

capzap
07.11.2020, 16:17
какие то данные получаю, но все не то

Что не так?

наверное потому что смещать надо на 16 битное число, а не на 15 разрядов

Yaroslav_22
07.11.2020, 16:36
Спасибо заработало
только в ПР отключил галочку "старший байт вперед" и в FB поменял местами переменные x1-x2->x2-x1

Yaroslav_22
07.11.2020, 16:37
наверное потому что смещать надо на 16 битное число, а не на 15 разрядов

не дает 16 ставить

capzap
07.11.2020, 17:00
не дает 16 ставить

а SHL(WORD_TO_DWORD(x1) ,16) + x2; дает?

Евгений Кислов
12.11.2020, 11:42
Обновили шаблоны Mx110 до версии 3.5.11.5 - добавили шаблоны датчиков и грядущих моделей ТРМ.
https://owen.ru/forum/showthread.php?t=27889&p=343030&viewfull=1#post343030

Максим Ульянов
16.11.2020, 16:51
Итак коллеги прошу помощи ..пытаюсь вычитывать данные со шлюза MD - CCM18 A/N через MB_TcpRequest ,в отладчике видно что соединение устанавливается..но читаются только нули...

Максим Ульянов
16.11.2020, 16:56
с чего начать поиски проблемы?