PDA

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



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

Евгений Кислов
16.11.2020, 17:25
С опроса шлюза другим мастером, чтобы удостовериться в том, что там и правда не нули.

Максим Ульянов
16.11.2020, 17:30
через собственный вебитерфейс видно что там не нули)

Евгений Кислов
16.11.2020, 18:01
Вопрос же не в том, что отображается в web-интерфейсе - а в том, что лежит в регистрах Modbus.

Максим Ульянов
16.11.2020, 18:08
там отображается в web-интерфейсе - то что лежит в регистрах Modbus. но мысль вашу понял завтра попробую заглянуть на него с другой стороны

Gatling
19.11.2020, 23:29
Всем добрый вечер. Нужно осуществить подключение сканера штрихкодов посредством Ethernet IP к ПЛК 210. Столкнулся с проблемой. При создании в проекте раздела Ethernet, и последующего добавления устройства Ethernet IP Scanner, и далее девайся, после уточнения все айпи адресов и прочего, запускаю онлайн и в разделе Ethernet IP Scanner оранжевый статус и сообщение "Лицензия некорректна или отсутствует; запущен демо-режим. Как это исправить? И собственно вопрос, из-за данного сообщения может не получиться обнаружить сканер?

Евгений Кислов
20.11.2020, 09:18
Всем добрый вечер. Нужно осуществить подключение сканера штрихкодов посредством Ethernet IP к ПЛК 210. Столкнулся с проблемой. При создании в проекте раздела Ethernet, и последующего добавления устройства Ethernet IP Scanner, и далее девайся, после уточнения все айпи адресов и прочего, запускаю онлайн и в разделе Ethernet IP Scanner оранжевый статус и сообщение "Лицензия некорректна или отсутствует; запущен демо-режим. Как это исправить? И собственно вопрос, из-за данного сообщения может не получиться обнаружить сканер?

Добрый день.
Наши контроллеры не содержат лицензию для протокола EtherNet/IP - собственно, об этом и говорит сообщение.
На Github есть библиотека - можете попробовать настроить обмен через нее:
https://github.com/NothinRandom/CoDeSys_EIP

VladGC
20.11.2020, 10:39
Добрый день.
Наши контроллеры не содержат лицензию для протокола EtherNet/IP - собственно, об этом и говорит сообщение.
На Github есть библиотека - можете попробовать настроить обмен через нее:
https://github.com/NothinRandom/CoDeSys_EIP
Добрый день!
А в теории, как можно добавлять лицензии, если что то понадобится?
Вот так?: Либо цифровой ключ либо usb
https://www.codesys.com/the-system/licensing.html

Евгений Кислов
20.11.2020, 11:00
Добрый день!
А в теории, как можно добавлять лицензии, если что то понадобится?
Вот так?: Либо цифровой ключ либо usb
https://www.codesys.com/the-system/licensing.html

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

Gatling
23.11.2020, 14:01
Добрый день.
Наши контроллеры не содержат лицензию для протокола EtherNet/IP - собственно, об этом и говорит сообщение.
На Github есть библиотека - можете попробовать настроить обмен через нее:
https://github.com/NothinRandom/CoDeSys_EIP

Там библиотека под контроллеры Allen Bradley. А если купить лицензию на использование протокола Ethernet/IP в Codesys, возможно будет настроить обмен со сканером через ПЛК 210?

Евгений Кислов
23.11.2020, 14:09
Там библиотека под контроллеры Allen Bradley. А если купить лицензию на использование протокола Ethernet/IP в Codesys, возможно будет настроить обмен со сканером через ПЛК 210?

Вы можете и так проверить, подходит ли она вам - без лицензии доступен триальный период - полчаса с момента запуска CODESYS.

Gatling
23.11.2020, 14:51
Вы можете и так проверить, подходит ли она вам - без лицензии доступен триальный период - полчаса с момента запуска CODESYS.

Т.е. при статусе "Лицензия некорректна или отсутствует; запущен демо-режим" Этот раздел полностью функционирует? Просто у меня он не находит сканер, хотя все адреса корректно указаны.

Евгений Кислов
23.11.2020, 14:53
Т.е. при статусе "Лицензия некорректна или отсутствует; запущен демо-режим" Этот раздел полностью функционирует? Просто у меня он не находит сканер, хотя все адреса корректно указаны.

Да, все верно.
Перезагрузите контроллер, чтобы отсчет времени демо-режима начался заново.

Евгений Кислов
24.11.2020, 14:50
Добрый день!
А в теории, как можно добавлять лицензии, если что то понадобится?
Вот так?: Либо цифровой ключ либо usb
https://www.codesys.com/the-system/licensing.html

Я уточнил - использование доп. лицензируемых компонентов в данный момент у нас не поддерживается.

fatlortroll
11.12.2020, 14:32
Для ModbusTCP_Slave при привязке переменной к %QWx (Modbus Input Registers) нет возможности изменить её "снаружи" по интерфейсу, а при привязке к %IWx (Modbus Holding Registers) нет возможности менять переменную из программы.

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

CoDeSys V3.5 SP14 Patch 3+ (32bit)
СПК107 version 3.5.14.34
OwenTargets v 3.5.14.3010

Евгений Кислов
11.12.2020, 14:33
Для ModbusTCP_Slave при привязке переменной к %QWx (Modbus Input Registers) нет возможности изменить её "снаружи" по интерфейсу, а при привязке к %IWx (Modbus Holding Registers) нет возможности менять переменную из программы.

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

CoDeSys V3.5 SP14 Patch 3+ (32bit)
СПК107 version 3.5.14.34
OwenTargets v 3.5.14.3010

Используйте MB_TcpSlave из библиотеки OwenCommunication - там можно менять holding-регистры из программы контроллера.

fatlortroll
11.12.2020, 14:41
Спасибо. В общем, как я понял, поставляемые с CoDeSys "стандартные" библиотеки лучше не использовать. Что-ж, будем строить велосипеды.

Cs-Cs
11.12.2020, 16:28
fatlortroll Не совсем так. Стандартные - они на то и стандартные, что заточены на "натыркать мышкой, и всё заработает для стандартной задачи".
Я так, как Евгений советует, вообще ИП320ую подключал на днях, баловался. Тоже через OCL, и с панелью у меня как раз двойной обмен и получился: ПЛК - Slave, панель - Master. ПЛК на панель передаёт данные измерений, а от панели получает инфу о нажатиях кнопок.

RV9WFJ
12.12.2020, 05:46
Спасибо. В общем, как я понял, поставляемые с CoDeSys "стандартные" библиотеки лучше не использовать. Что-ж, будем строить велосипеды.
Стандартные они на то и стандартные, что стандарт соблюдают. Вы сначала посмотрите что там в стандарте ModBus на счет записи. А потом про велосипеды вспоминайте.

SemAndr
16.12.2020, 10:31
Добрый день. Заметил интересную особенность. Если мы перебрасываем данные с одного порта на другой и при этом никак не работаем с ними в программе, то физически данные не уходят на второй порт, в программе изменения отображаются, а по факту данные не изменяются. Например, на одном порту у нас своя сеть опрашиваемых устройств, нам необходимо с ними работать, и дополнительно, обеспечить чтение данных верхней АСУ. Некоторые данные мы не модифицируем и не обрабатываем, а просто настраиваем переменные из одного порта в другой. В этом случае по второму порту необработанные данные никак изменяться не будут.

Евгений Кислов
16.12.2020, 10:44
Добрый день. Заметил интересную особенность. Если мы перебрасываем данные с одного порта на другой и при этом никак не работаем с ними в программе, то физически данные не уходят на второй порт, в программе изменения отображаются, а по факту данные не изменяются. Например, на одном порту у нас своя сеть опрашиваемых устройств, нам необходимо с ними работать, и дополнительно, обеспечить чтение данных верхней АСУ. Некоторые данные мы не модифицируем и не обрабатываем, а просто настраиваем переменные из одного порта в другой. В этом случае по второму порту необработанные данные никак изменяться не будут.

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

SemAndr
16.12.2020, 11:33
Добрый день.
Использовать контроллер в качестве шлюза между полевыми устройствами и системной верхнего уровня, безусловно, можно.
Что происходит в вашем конкретно случае - нельзя сказать, не видя проекта.

Архив проекта больше 50 Мб. Не получается подгрузить. Скинул на Ядиск. ССылка - https://yadi.sk/d/zhDl8C3-GX5_NA. Данные берутся с M7051_2A14. Выдаются наружу 27 слово. Сейчас сделал в главной программе записывание переменной, а уже записанную переменную складываю в выходной буфер. До этого в выходной буфер писал переменную, которая считывалась с M7051_2A14.

Евгений Кислов
16.12.2020, 11:50
Архив проекта больше 50 Мб. Не получается подгрузить. Скинул на Ядиск. ССылка - https://yadi.sk/d/zhDl8C3-GX5_NA. Данные берутся с M7051_2A14. Выдаются наружу 27 слово. Сейчас сделал в главной программе записывание переменной, а уже записанную переменную складываю в выходной буфер. До этого в выходной буфер писал переменную, которая считывалась с M7051_2A14.

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

SemAndr
16.12.2020, 11:56
Для начала на вкладке, где вы привязываете переменные к слэйву (Modbus_Serial_Output) для параметра Всегда обновлять переменные установите значение Вкл. 2 (всегда в задаче цикла шины).

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

Алексей Караваев
11.01.2021, 16:05
Всем доброго времени суток. Есть небольшая проблема, нужно управлять сервоприводами от ПЛК 210, на сервоприводах есть протокол PROFINET, на ПЛК вроде как нет и не предвидится, выше поднималась подобная проблема пользователем "Gatling", только там протокол был Ethernet IP. Вопрос, можно ли на родном, отечественном ПЛК 210 завести PROFINET (не важно каким способом, купить лицензию, воспользоваться сторонними библиотеками, написать свои библиотеки). Или сразу не мучатся, пойти и купить забугорный ПЛК, у которого на борту будут все протоколы.

Алексей Караваев
11.01.2021, 16:13
И речь идет не об одной единственной установке, а о серийном применении в металлобрабатывающих станках.

capzap
11.01.2021, 16:19
И речь идет не об одной единственной установке, а о серийном применении в металлобрабатывающих станках.

тогда шлюз anybus с модбас на профинет

melky
11.01.2021, 17:10
и ценник превратится в забугорный вариант.... смысл ?

Как вариант посмотреть среди нашекитайских вариантов, возможно есть с наличием каплеров в линейке...

полазил от нефик делать, и что-то не наблюдаю ПЛК с ProfiNet, походу это только Семен да ЖЕ практикуют...
У одних товарищей увидел модуль ProfiNet IO но он только в единственном лице к процу ставится и всего ан 128 точек вода вывода.

Кстати если речь о станках, то какой тут к черту преобразователь с Modbus ???

Inarus
12.01.2021, 17:03
Здравствуйте, помогите пожалуйста разобраться:
Codesys3.5SP11patch5hotfix4
СПК110 (М01)
Таргеты и библиотеки все стоят, программы пишу, работают

Тут пришлось поставить модуль МУ110-32Р, собираю программу на CFC, а в библиотеке нет функционального блока MY110_32R_outs.

Все переустановил, вплоть до кодесис. Не помогает, все функциональные блоки есть, кроме 32Р. Даже отдельно устанавливал только его. не появляется в списке и все.

Вопрос: у модуля на 32 релейных выхода в принципе нет функционального блока? Или я что-то не так делаю?

Евгений Кислов
12.01.2021, 17:17
Здравствуйте, помогите пожалуйста разобраться:
Codesys3.5SP11patch5hotfix4
СПК110 (М01)
Таргеты и библиотеки все стоят, программы пишу, работают

Тут пришлось поставить модуль МУ110-32Р, собираю программу на CFC, а в библиотеке нет функционального блока MY110_32R_outs.

Все переустановил, вплоть до кодесис. Не помогает, все функциональные блоки есть, кроме 32Р. Даже отдельно устанавливал только его. не появляется в списке и все.

Вопрос: у модуля на 32 релейных выхода в принципе нет функционального блока? Или я что-то не так делаю?

Добрый день.
Вы пишите об очень старом способе опроса, который на современных контроллерах просто не нужен.
Сейчас все настраивается гораздо проще и без функциональных блоков - прямо через дерево проекта:
https://youtu.be/77fdfnfdJME

Inarus
12.01.2021, 17:42
Евгений, благодарю за ссылку на ролик. И все же вопрос для тех, кто привык по старинке, есть шансы получить этот функциональный блок или надо изучать новые способы опроса с ручным вписыванием всех переменных?

На всякий случай, прикладываю скриншот того, что я имею ввиду. 52988

Евгений Кислов
12.01.2021, 17:43
Евгений, благодарю за ссылку на ролик. И все же вопрос для тех, кто привык по старинке, есть шансы получить этот функциональный блок или надо изучать новые способы опроса с ручным вписыванием всех переменных?

На всякий случай, прикладываю скриншот того, что я имею ввиду. 52988

Нет, шансов нет - в свое время блок не был разработан, и библиотека уже давно является неактуальной.
Можно использовать UniWrite (на скрине внизу) - с помощью него можно отправить произвольный запрос на запись.

stskr
13.01.2021, 07:29
Есть проблема с чтением части регистров Slave-устройства по каналу Modbus RTU Master в ПЛК.
Часть регистров читается корректно, а вместо части значений нули.
Существует ли простой способ записать коммуникацию по Modbus RTU в лог?
Хочу понять, что происходит.

Евгений Кислов
13.01.2021, 08:34
Есть проблема с чтением части регистров Slave-устройства по каналу Modbus RTU Master в ПЛК.
Часть регистров читается корректно, а вместо части значений нули.
Существует ли простой способ записать коммуникацию по Modbus RTU в лог?
Хочу понять, что происходит.

Такой возможности нет, нужно либо подключиться к линии связи сниффером, либо для отладки подключать слэйв к ПК и запускать на нем ПО, которое может работать как Modbus Master и показывает логи (обычно используется OPC-сервер).

stskr
14.01.2021, 06:04
Запустил Modbus Slave на ПК - обрывов связи не наблюдается, а вот при общении с устройством периодически проскакивают обрывы связи.
Видимо, нужно запускать сниффер.

MechMan
09.03.2021, 12:45
Евгений, добрый день. Посоветуйте что делать. codesys 3.5. sp16, raspberry 3, rs485 на ch340, скорость 9600, none,8,1. 2 устройства на линии. Не хотят работать одновременно. Одно отключаешь (в проекте), другое работает нормально, все равно какое. Написал опрос на питоне, все работает нормально, без провалов, все читается. Посмотрел осцилографом форму сигналов - выглядит все хорошо.

Евгений Кислов
09.03.2021, 12:53
Евгений, добрый день. Посоветуйте что делать. codesys 3.5. sp16, raspberry 3, rs485 на ch340, скорость 9600, none,8,1. 2 устройства на линии. Не хотят работать одновременно. Одно отключаешь (в проекте), другое работает нормально, все равно какое. Написал опрос на питоне, все работает нормально, без провалов, все читается. Посмотрел осцилографом форму сигналов - выглядит все хорошо.

Добрый день.
Я в данном случае могу посоветовать только переходить на наши контроллеры. =)

MechMan
09.03.2021, 13:06
Жаль. Надеялся обойтись малой кровью ;) вот начнете i2c поддерживать и универсальные gpio - можно и к вам ;)

Евгений Кислов
09.03.2021, 13:14
Жаль. Надеялся обойтись малой кровью ;) вот начнете i2c поддерживать и универсальные gpio - можно и к вам ;)

А для каких задач вам это требуется?

Dmitrij_
09.03.2021, 13:24
Контроллер СПК110.
Необходимо получать текстовые команды по RS232. На основании примеров нестандартных протоколов реализовал программку получения команды и выдачу ответа.
На ПК через терминал отправляю команду ">test", контроллер дает ответ. Работает не всегда стабильно. СПК может не всегда выдавать ответ.
Правильно ли использование циклического выполнения алгоритма, либо необходимо начинать чтение из порта по какому либо прерыванию.
Ссылка на проект: https://disk.yandex.ru/d/Iv0OlIpqrjnlvw
Прошу дать коментарии, как лучше принимать команды по RS232.

Евгений Кислов
09.03.2021, 14:23
Контроллер СПК110.
Необходимо получать текстовые команды по RS232. На основании примеров нестандартных протоколов реализовал программку получения команды и выдачу ответа.
На ПК через терминал отправляю команду ">test", контроллер дает ответ. Работает не всегда стабильно. СПК может не всегда выдавать ответ.
Правильно ли использование циклического выполнения алгоритма, либо необходимо начинать чтение из порта по какому либо прерыванию.
Ссылка на проект: https://disk.yandex.ru/d/Iv0OlIpqrjnlvw
Прошу дать коментарии, как лучше принимать команды по RS232.

Для начала:
У вас fb_PROTOCOL запускается от fb_COMcontrol.xDone - а этот выход только на один цикл активируется.
Используйте fb_COMcontrol.xActive.

Dmitrij_
10.03.2021, 07:51
Для начала:
Используйте fb_COMcontrol.xActive.

Не совсем понятно как формировать данный сигнал. В fb_COMcontrol и в "Реализация нестандартных протоколов" его формирование не описано.

Евгений Кислов
10.03.2021, 07:54
Не совсем понятно как формировать данный сигнал. В fb_COMcontrol и в "Реализация нестандартных протоколов" его формирование не описано.

Его не надо формировать - он просто есть.
Вы можете доступ по TeamViewer предоставить?

Dmitrij_
10.03.2021, 08:35
Его не надо формировать - он просто есть.
Вы можете доступ по TeamViewer предоставить?

Если использую fb_COMcontrol.xActive то он всегда False.
доступ по TeamViewer на данный момент не могу предоставить.

Евгений Кислов
10.03.2021, 08:36
Если использую fb_COMcontrol.xActive то он всегда False.
доступ по TeamViewer на данный момент не могу предоставить.

Это может быть только в том случае, если порт еще не открыт.
Без TeamViewer помочь вам будет затруднительно.

MechMan
10.03.2021, 10:15
Не хотят работать одновременно. Одно отключаешь (в проекте), другое работает нормально, все равно какое.
Евгений, удалось победить эту проблему. Оказалось что для канала с 20 регистрами период 100ms слишком мало при скорости 9600. Помогло установить для каждого канала период опроса 200-300мс.
Видимо я не правильно понимаю очередь обработки запросов к шине в CODESYS. Где это можно почитать?

Евгений Кислов
10.03.2021, 10:41
Евгений, удалось победить эту проблему. Оказалось что для канала с 20 регистрами период 100ms слишком мало при скорости 9600. Помогло установить для каждого канала период опроса 200-300мс.
Видимо я не правильно понимаю очередь обработки запросов к шине в CODESYS. Где это можно почитать?

К сожалению, нигде.
Все, что есть - вот этот рисунок из справки:
https://help.codesys.com/webapp/_mod_buscycle_task;product=core_modbus_configurati on_editor;version=3.5.16.0

Dmitrij_
10.03.2021, 12:50
Это может быть только в том случае, если порт еще не открыт.

Флаг успешного открытия порта fb_COMcontrol.xDone перешел в true, следовательно порт открылся.
И всё же, в ФБ из примеров переменная fb_COMcontrol.xActive отсутствует и не объявлена как выходная, и откуда она возьмет значение не понятно.

Евгений Кислов
10.03.2021, 12:55
Флаг успешного открытия порта fb_COMcontrol.xDone перешел в true, следовательно порт открылся.
И всё же, в ФБ из примеров переменная fb_COMcontrol.xActive отсутствует и не объявлена как выходная, и откуда она возьмет значение не понятно.

А, вы используете ФБ прямо из примера.
Лучше вместо него использовать одноименный ФБ из библиотеки OwenCommunication - у него этот выход есть.
https://owen.ru/forum/showthread.php?t=31816

Aleksey1408
11.03.2021, 22:53
Добрый день. Пытаюсь осуществить связь между ТРМ251 и СПК110 используя библиотеку OwenNet. Запись ограничения максимальной мощности и минимальной мощности осуществляется с помощью ФБ Owen_Set_Real, тип данных REAL_FRM.FIX_BIN. Проблема в том что дробные значения мощности записываются нормально, т.е. 50.1 или 23.9, а целые значения мощности не записываются, функциональный блок выдает код ошибки 5 - Неверно задано положение десятичной точки (при фиксированной точке). При этом чтение данных с помощью ФБ Owen_Get_Real осуществляется нормально при любых значениях. С моей точки зрения в ФБ Owen_Set_Real есть ошибка, но код закрытый. Пожалуйста протестируйте ФБ ФБ Owen_Set_Real с типом данных REAL_FRM.FIX_BIN и исправьте ошибку.

Евгений Кислов
12.03.2021, 04:39
Добрый день. Пытаюсь осуществить связь между ТРМ251 и СПК110 используя библиотеку OwenNet. Запись ограничения максимальной мощности и минимальной мощности осуществляется с помощью ФБ Owen_Set_Real, тип данных REAL_FRM.FIX_BIN. Проблема в том что дробные значения мощности записываются нормально, т.е. 50.1 или 23.9, а целые значения мощности не записываются, функциональный блок выдает код ошибки 5 - Неверно задано положение десятичной точки (при фиксированной точке). При этом чтение данных с помощью ФБ Owen_Get_Real осуществляется нормально при любых значениях. С моей точки зрения в ФБ Owen_Set_Real есть ошибка, но код закрытый. Пожалуйста протестируйте ФБ ФБ Owen_Set_Real с типом данных REAL_FRM.FIX_BIN и исправьте ошибку.

Добрый день.
Пожалуйста, выложите ваш проект, на котором можно будет воспроизвести проблему.
Достаточно кода опроса ТРМ - все остальное из проекта лучше убрать.

sssssaaaaabbbbb
15.03.2021, 15:24
Всем здравствуйте. В известной инструкции на странице 42 https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_OPC_v2.2.pdf не могу понять, как считать word- переменные-с ПЛК210 . В инструкции сказано, что в одном устройстве разные переменные должны быть под одним регистром, но у меня не получается так считать. Записывается понятно, но считать никак.53995

Евгений Кислов
15.03.2021, 16:27
Добрый день.
В примере регистры только для чтения - в регионе INPUT (это видно на скриншотах в документе), а доступные для записи - в HOLDING.
У вас же они вообще все в HOLDING.
Адресация регионов независимая (это разные области Modbus), поэтому адреса могут пересекаться - это нормально.

glazastik
15.03.2021, 18:21
Добрый день, если я реализовываю обмен с несколькими устройствами через библиотеку CAA SerialCom, правильно ли вызывать несколько копий одного ФБ обмена с разными устройствами? Система сама выстроит очередь обмена или так нельзя делать и надо выстраивать очередь самому?
Иными словами, есть у вас пример обмена с датчиком СЭТ-4ТМ, там реализован обмен с одним датчиком, а если я хочу добавить туда ещё датчиков?

Евгений Кислов
15.03.2021, 18:26
Добрый день, если я реализовываю обмен с несколькими устройствами через библиотеку CAA SerialCom, правильно ли вызывать несколько копий одного ФБ обмена с разными устройствами? Система сама выстроит очередь обмена или так нельзя делать и надо выстраивать очередь самому?
Иными словами, есть у вас пример обмена с датчиком СЭТ-4ТМ, там реализован обмен с одним датчиком, а если я хочу добавить туда ещё датчиков?

Добрый день.
Очередь надо выстраивать самому.

Aleksey1408
15.03.2021, 18:37
Добрый день.
Пожалуйста, выложите ваш проект, на котором можно будет воспроизвести проблему.
Достаточно кода опроса ТРМ - все остальное из проекта лучше убрать.

При попытке записи ЦЕЛЫХ значений данных в ТРМ251 для Максимальной и минимальной мощности происходит ошибка №5, при этом значения с точкой записываются нормально. Проект и скриншот с ошибкой прикрепляю.

sssssaaaaabbbbb
16.03.2021, 08:01
Спасибо!!! Все заработало

Евгений Кислов
16.03.2021, 12:23
При попытке записи ЦЕЛЫХ значений данных в ТРМ251 для Максимальной и минимальной мощности происходит ошибка №5, при этом значения с точкой записываются нормально. Проект и скриншот с ошибкой прикрепляю.

Проблема воспроизвелась.
К сожалению, оперативно устранить ее не получится.
Насколько критична для вас невозможность записи значения этих параметров без дробной части?
Уточните, пожалуйста, какие параметры (кроме 'p.min') вынуждают вас использовать протокол ОВЕН вместо Modbus.

capzap
16.03.2021, 12:34
Проблема воспроизвелась.
К сожалению, оперативно устранить ее не получится.
Насколько критична для вас невозможность записи значения этих параметров без дробной части?
Уточните, пожалуйста, какие параметры (кроме 'p.min') вынуждают вас использовать протокол ОВЕН вместо Modbus.

не думаю что это на уровне протокола происходит, в трм202 нельзя записать целочисленные в уставку меньше 10, тоже необходим хотя бы один знак после запятой по протоколу модбас

Евгений Кислов
16.03.2021, 12:38
не думаю что это на уровне протокола происходит, в трм202 нельзя записать целочисленные в уставку меньше 10, тоже необходим хотя бы один знак после запятой по протоколу модбас

Отладочной утилитой для протокола ОВЕН у нас это получилось.

capzap
16.03.2021, 12:46
Отладочной утилитой для протокола ОВЕН у нас это получилось.

ну, всмысле, по модбасу занесение целочисленных записываются?

Евгений Кислов
16.03.2021, 12:55
ну, всмысле, по модбасу занесение целочисленных записываются?

Нет, по протоколу ОВЕН. Параметр 'p.min' в принципе не доступен по Modbus.

capzap
16.03.2021, 13:29
Нет, по протоколу ОВЕН. Параметр 'p.min' в принципе не доступен по Modbus.

хорошо, а если в трм251 записать в 258 регистр 0, а после в 257 например четыре, то именно эта уставка и будет на первом шаге?

Евгений Кислов
16.03.2021, 13:33
хорошо, а если в трм251 записать в 258 регистр 0, а после в 257 например четыре, то именно эта уставка и будет на первом шаге?

Не могу прокомментировать, и у меня в данный момент нет цели тестировать этот функционал.
Вы можете задать этот вопрос в разделе ТРМ или написать запрос на support@owen.ru

Aleksey1408
18.03.2021, 12:05
Проблема воспроизвелась.
К сожалению, оперативно устранить ее не получится.
Насколько критична для вас невозможность записи значения этих параметров без дробной части?
Уточните, пожалуйста, какие параметры (кроме 'p.min') вынуждают вас использовать протокол ОВЕН вместо Modbus.
Для параметров P.min, P.max, P.nom, i.upr, i.min чтение можно осуществлять через формат с фиксированной точкой REAL_FRM.FIX_BIN, а вот запись необходимо осуществлять используя формат для целых чисел INT_FRM.UINT_FRM.
Структура формата REAL_FRM.FIX_BIN 16 битная:
0-11 - значение без точки.
12-14 бит - десятичный сдвиг точки
15 бит - знак, если 0 - то плюс, 1 - значит минуc
Примеры:
3.1=2#0001_0000_0001_1111
-3.1=2#1001_0000_0001_1111
0,300=2#0011_0001_0010_1100
Проблема крылась в том, что при записи целых положительных чисел биты 12-14 равны 0, тогда в битах 0-11 храниться целое значение. Но алгоритм работает с ошибкой, а при записи с десятичной точкой в битах 12-14 есть значения, т.е. все свелось к принудительной установке хотя бы одной точки после запятой.
Соответственно, для параметров P.min, P.max, P.nom, i.upr, i.min достаточно одной цифры после запятой, и необходимо знать знак числа.
Всем успехов :cool:
Код проверен на ТРМ251 v1.10.
Мой пример реализации ниже.


GetReal:OWEN_GET_REAL;
SetDint:OWEN_SET_DINT;

i_min: // Огр. мин. интеграла
IF pribor^[prib_name].oper.StateTask[state].isRead THEN
GetReal(
Enable:= com_active,
Addr:= com_prib.addr[prib_name],
AddrLen:=com_prib.addrlen,
Name:='i.min' ,
Index:= 16#FFFF,
RealType:= REAL_FRM.FIX_BIN,
ComHandle:= hComTrm,
TimeOut:=com_prib.TimeOut*T#1MS ,
Complete=>,
Value=> ,
wTime=> ,
Error=> );
IF GetReal.Complete OR GetReal.Error<>0 THEN
pribor^[prib_name].oper.StateTask[state].error:=SetReal.Error;
CASE GetReal.Error OF
NoError:
pribor^[prib_name].pid.i_min:=GetReal.Value;
pribor^[prib_name].oper.StateTask[state].ValReal:=GetReal.Value;
state:=StateNoError(state:=state,StateTaskPt:=ADR( pribor^[prib_name].oper.StateTask));
NACK:
state:=end_pooling;
ELSE
state:=StateNoError(state:=state,StateTaskPt:=ADR( pribor^[prib_name].oper.StateTask));
END_CASE
GetReal(Enable:=FALSE);
END_IF
ELSE
IF pribor^[prib_name].pid.i_min >-0.001 THEN
SetDint.Value:=2#0001_0000_0000_0000; // Положительное число, одна цифра после запятой
ELSE
SetDint.Value:=2#1001_0000_0000_0000; // Отрицательное число, одна цифра после запятой
END_IF
SetDint(
Enable:= com_active,
Addr:= com_prib.addr[prib_name],
AddrLen:= com_prib.addrlen,
Name:= 'i.min',
Index:= 16#FFFF,
IntType:=INT_FRM.UINT_FRM,
Value:=REAL_TO_DINT(ABS(pribor^[prib_name].pid.i_min*10)) + SetDint.Value, // Сдвиг запятой на 1 знак в право.
ComHandle:= hComTrm,
TimeOut:= com_prib.TimeOut*T#1MS,
Complete=> ,
Error=> );
IF SetDint.Complete OR SetDint.Error<>0 THEN
pribor^[prib_name].oper.StateTask[state].error:=GetDint.Error;
CASE SetReal.Error OF
NoError:
state:=StateNoError(state:=state,StateTaskPt:=ADR( pribor^[prib_name].oper.StateTask));
NACK:
state:=end_pooling;
ELSE
state:=StateNoError(state:=state,StateTaskPt:=ADR( pribor^[prib_name].oper.StateTask));
END_CASE
SetDint(Enable:=FALSE);
END_IF
END_IF

Евгений Кислов
18.03.2021, 12:14
Большое спасибо вам за пример.

borgivan
19.03.2021, 09:19
Здравствуйте, коллеги, подскажите, пожалуйста, у меня СПК107, CS3.5.14, модули подхватились отлично по шаблонам, а кастомное модбас ТСР устройство, которое я добавил, валится в ошибку постоянно (восклицательный знак мигает), вроде всё настроил нормально, но открывается соединение, тут же ошибка сокета и дисконект, судя по логам. Есть предположение, что это из-за несоответствия версий устройств кодсиса таргету ПЛК. Где скачать и как правильно установить устройства модбас тср мастер, слэйв и т.д соответствующих версий?соответствующих версий?

Евгений Кислов
19.03.2021, 09:27
Здравствуйте, коллеги, подскажите, пожалуйста, у меня СПК107, CS3.5.14, модули подхватились отлично по шаблонам, а кастомное модбас ТСР устройство, которое я добавил, валится в ошибку постоянно (восклицательный знак мигает), вроде всё настроил нормально, но открывается соединение, тут же ошибка сокета и дисконект, судя по логам. Есть предположение, что это из-за несоответствия версий устройств кодсиса таргету ПЛК. Где скачать и как правильно установить устройства модбас тср мастер, слэйв и т.д соответствующих версий?соответствующих версий?

Добрый день.
Скорее всего, то не связано с версией устройства.
Посмотрите код ошибки (Вид - Просмотр - Watch 1 - <имя слэйва из дерева проекта>.byModbusError) и выложите ваш проект и документацию на слэйв-устройство.

Dmitrij_
25.03.2021, 06:31
А, вы используете ФБ прямо из примера.
Лучше вместо него использовать одноименный ФБ из библиотеки OwenCommunication - у него этот выход есть.
https://owen.ru/forum/showthread.php?t=31816

Спасибо за предоставленный пример.
Прием в слейве заработал.

SemAndr
22.04.2021, 09:51
Добрый день. Столкнулся со следующей проблемой: Для обмена по ModBus использую библиотеку OwenCommunication, при перезагрузке ПЛК функциональный блок MB_SerialRequest завершается с ошибкой 12 (WRONG_PARAMETER). Однако, если не перезагружать ПЛК, а только перезалить софт и запустить программу, то все работает корректно, никаких ошибок не возникает. Куда можно копать, чтобы понять в чем проблема?

Евгений Кислов
22.04.2021, 11:01
Добрый день. Столкнулся со следующей проблемой: Для обмена по ModBus использую библиотеку OwenCommunication, при перезагрузке ПЛК функциональный блок MB_SerialRequest завершается с ошибкой 12 (WRONG_PARAMETER). Однако, если не перезагружать ПЛК, а только перезалить софт и запустить программу, то все работает корректно, никаких ошибок не возникает. Куда можно копать, чтобы понять в чем проблема?

Добрый день.
Сколько экземпляров ФБ вы используете в программе?

SemAndr
22.04.2021, 11:22
Добрый день.
Сколько экземпляров ФБ вы используете в программе?

3 экземпляра (экземпляр - это объявление переменной данного типа, верно?). Для чтения вызывается 5 раз. Первый раз 1 экземпляр, остальные 4 раза другой экземпляр. Для записи вызывается третий экземпляр (7 раз вызов происходит)

Евгений Кислов
22.04.2021, 11:34
3 экземпляра (экземпляр - это объявление переменной данного типа, верно?). Для чтения вызывается 5 раз. Первый раз 1 экземпляр, остальные 4 раза другой экземпляр. Для записи вызывается третий экземпляр (7 раз вызов происходит)

Выложите, пожалуйста, проект и пошаговое описание, как с его помощью воспроизвести эту проблему.

SemAndr
22.04.2021, 11:39
Выложите, пожалуйста, проект и пошаговое описание, как с его помощью воспроизвести эту проблему.

https://disk.yandex.ru/d/Lh3KhEVIeO9ASg - ссылка на проект.

Описание:
Записываем проект на ПЛК. Создаем загрузочное приложение. После чего перезагружаем ПЛК путем сброса питания. После загрузки общение по ModBus не происходит. Подключаемся к ПЛК из Кодесис, смотрим имя ошибки.

Далее, перезаписываем прошивку. Запускаем программу. ModBus работает корректно, никаких ошибок нет.

Евгений Кислов
22.04.2021, 11:45
https://disk.yandex.ru/d/Lh3KhEVIeO9ASg - ссылка на проект.

Описание:
Записываем проект на ПЛК. Создаем загрузочное приложение. После чего перезагружаем ПЛК путем сброса питания. После загрузки общение по ModBus не происходит. Подключаемся к ПЛК из Кодесис, смотрим имя ошибки.

Далее, перезаписываем прошивку. Запускаем программу. ModBus работает корректно, никаких ошибок нет.

Спасибо, я проверю у себя и отпишусь.

Юра54
22.04.2021, 12:40
Здравствуйте! Устанавливаю Функциональный блок actual_data для опроса ВКТ-7.
В нем используется входной параметр handle - SYSCOM.RTS_IEC_HANDLE (Дескриптор последовательного порта)
Не подскажете, где найти этот параметр или его описание?

Евгений Кислов
22.04.2021, 12:42
Здравствуйте! Устанавливаю Функциональный блок actual_data для опроса ВКТ-7.
В нем используется входной параметр handle - SYSCOM.RTS_IEC_HANDLE (Дескриптор последовательного порта)
Не подскажете, где найти этот параметр или его описание?

Добрый день.
Например, с выхода ФБ COM_CONTROL из библиотеки OwenCommunication.

Евгений Кислов
23.04.2021, 06:30
https://disk.yandex.ru/d/Lh3KhEVIeO9ASg - ссылка на проект.

Описание:
Записываем проект на ПЛК. Создаем загрузочное приложение. После чего перезагружаем ПЛК путем сброса питания. После загрузки общение по ModBus не происходит. Подключаемся к ПЛК из Кодесис, смотрим имя ошибки.

Далее, перезаписываем прошивку. Запускаем программу. ModBus работает корректно, никаких ошибок нет.

Объявите cpCharger не в RETAIN переменных, а в локальных (VAR ... END_VAR) - это решит вашу проблему.

SemAndr
23.04.2021, 07:21
Объявите cpCharger не в RETAIN переменных, а в локальных (VAR ... END_VAR) - это решит вашу проблему.

Это помогло. Спасибо! А в чем причина? Можно предположить, допустим, что значение дескриптора порта остается старым, так как переменная хранится в независимой памяти, но при инициализации она должна перезаписаться, так как инициализация ModBus производится каждый раз при запуске.

Евгений Кислов
23.04.2021, 07:23
Это помогло. Спасибо! А в чем причина? Можно предположить, допустим, что значение дескриптора порта остается старым, так как переменная хранится в независимой памяти, но при инициализации она должна перезаписаться, так как инициализация ModBus производится каждый раз при запуске.

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

Юра54
26.04.2021, 08:10
Здравствуйте! Устанавливаю Функциональный блок actual_data для опроса ВКТ-7.
В нем используется входной параметр handle - SYSCOM.RTS_IEC_HANDLE (Дескриптор последовательного порта)
Не подскажете, где найти этот параметр или его описание?

Здравствуйте!
Дескриптор успешно записывается, но дальше дело не движется - блок actual_data работать не желает (не считывает ничего с ВКТ), ошибку не выдает.
Подскажите, кто работал с ВКТ, какие там еще нюансы?

Евгений Кислов
26.04.2021, 08:16
Здравствуйте!
Дескриптор успешно записывается, но дальше дело не движется - блок actual_data работать не желает (не считывает ничего с ВКТ), ошибку не выдает.
Подскажите, кто работал с ВКТ, какие там еще нюансы?

А остальные выходы блока какие при этом имеют значения?

Юра54
26.04.2021, 08:26
А остальные выходы блока какие при этом имеют значения?

Done - False, err_code - 0, out_data и out_data_string - пусты.

Евгений Кислов
26.04.2021, 08:27
Done - False, err_code - 0, out_data и out_data_string - пусты.

А вы точно вызываете экземляр ФБ?
Выложите ваш проект.

И еще вопрос - по какому интерфейсу к контроллеру подключен счетчик?

Юра54
26.04.2021, 08:29
А вы точно вызываете экземляр ФБ?
Выложите ваш проект.

И еще вопрос - по какому интерфейсу к контроллеру подключен счетчик?

По RS232-1 подключаюсь.

Евгений Кислов
26.04.2021, 08:35
По RS232-1 подключаюсь.

Сигнал RTS на счетчик приходит?
Попробуйте сначала с ПК его опросить - у Теплокома есть OPC для этого.

VadimS
04.05.2021, 22:57
Здравствуйте. Есть вопрос по библиотеке MQTT (Stefan Robmann).
Нужна подписка на топик.
ПЛК 200.
Брокер поднят на Raspberry (Mosquitto).
К брокеру претензий нет, работает уже месяца три, все публикуется, подписывается (на стороннем софте).

Установил последнюю версию библиотеки(3.5.0.0). Вроде все понятно, заработало с первого раза, но:
1. При компиляции выдает 22 предупреждения:
[WARNING] mqtt client library, 3.5.0.0 (stefan ro&#223;mann engineering solutions): FB_MQTTClient(Строка 100, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'UINT': возможно изменение знака
Понятно, что не смертельно, но странно как-то... может я чего-то не установил ? (на библиотеки не ругается, загружается, работает).
2. Несколько раз вылетело исключение в библиотеке (с остановкой ПЛК). Вылетает не предсказуемо, может раз в пару суток.
3. При перезагрузке брокера обмен "замерзает" и самостоятельно не поднимается. Флаг ошибки и код статуса не меняются. Но если попереключать флаг подписки - обмен поднимется (костыль в виде периодического передергивания флага приладил, но это как-то... костыль короче).
4. При введении второй копии функционального блока (подписка на второй топик), через некоторое время начинает путать топики (связать с каким-либо событием не могу, наверное просто время).

Другие библиотеки пока не пробовал, особо времени нет, если это не лечится - то придется.
Допиливать эту библиотеку самостоятельно - это не по мне :).
Собственно вопрос: это только у меня такие косяки?
Может что подскажите, очень мало информации.
А код - по имеющемуся в доке примеру (IP брокера и имя топика инициализированы в описании переменных, подписка на один топик):

MQTT_POOLlevel(i_xEnable:=TRUE,i_sBrokerAddress:=M QTTBrokerAddress,i_xSubscribe:=xSubscribe_PL,i_sTo picSubscribe:=sTopicSubscribe_PL);
xError_PL := MQTT_POOLlevel.q_xError;
udiState_PL := MQTT_POOLlevel.q_udiState;
sLastReceivedMessage_PL:=MQTT_POOLlevel.q_sLastRec eivedMessage;
HCSR04data := STRING_TO_WORD (sLastReceivedMessage_PL);

Спасибо.

Максим Ульянов
05.05.2021, 13:36
Коллеги добрый день...Прошу помощи с функциями и адресами регистров модбаса (OwenCommunication) 54972 какие коды функций ( я так понимаю READ_HOLDING_REGISTERS и WRITE_SINGLE_REGISTER) и какие адреса ставить на пример для регистра 38?

Евгений Кислов
05.05.2021, 13:41
какие коды функций ( я так понимаю READ_HOLDING_REGISTERS и WRITE_SINGLE_REGISTER)

Вы понимаете правильно (для записи может потребоваться WRITE_MULTIPLE_REGISTER).


и какие адреса ставить на пример для регистра 38?

Так и ставить - 38.

Максим Ульянов
05.05.2021, 13:50
я просто тогда не понимаю смысл вот это : The Modbus Communication Module supports zero-based addressing. For example, Holding Register 40002 is addressed as 0001
in a Modbus message.
The Holding Registers shown in Table 4 - Table 8 assume 4xxxx addressing. For example, Holding Register 40001 is shown as 1.
Через переводчик воообще мура какая то...


Например, регистр 40002 хранения адресуется как 0001
в сообщении Modbus.
Регистры хранения, показанные в таблице 4 - Таблица 8, предполагают адресацию 4xxxx. Например, регистр хранения 40001 отображается как 1.


чет бред какой то..

Евгений Кислов
05.05.2021, 13:53
Можете здесь почитать по этому поводу:
https://oscat.ru/?p=369

п. 1.1

VadimS
06.05.2021, 19:22
Я таки дико извиняюсь :), но вопросы по MQTT не исчезли (ну, почти).
Неужто никто не занимался подпиской?
Не, примеры в ютубе я видел... так и у меня работает...
Но вот как глубже копнешь - какая-то ерунда выходит.
С вопросом 4 вроде разобрался: этому FB похоже вообще параллельно на имя топика подписки.
Пока не ввел проверку на совпадение имени последнего принятого топика с подписываемым (????? казалось бы, какого...), приходили данные из нескольких топиков (с этого-же устройства-публикатора), какой топик раньше обновился - тот и на выходе FB.
Причем, в коде FB (банальным поиском), кроме как в описании переменных, обращения к переменной с названием топика подписки я НЕ НАШЕЛ. Может там есть косвенные обращения через указатели... хотя ко многим другим входным переменным обращения идут непосредственно по именам.
И такое ощущение, что в части подписки данная библиотека дико сырая.
Как хочется верить, что я ошибаюсь (а еще и понять бы - в чем конкретно). Если в том, что пытаюсь использовать бесплатную библиотеку, а не за 50 ойро - так и текущая задача этих денег не стоит по большому счету. Это скорее демонстрационный проект.
Больше вопросов к перспективе использования технологии в дальнейшем.
Параллельно ребята кодят MQTT под NBIoT, там тоже не всё гладко (но там и платформа другая, и средства разработки).

Евгений Кислов
06.05.2021, 20:15
Я таки дико извиняюсь :), но вопросы по MQTT не исчезли (ну, почти).
Неужто никто не занимался подпиской?
Не, примеры в ютубе я видел... так и у меня работает...
Но вот как глубже копнешь - какая-то ерунда выходит.
С вопросом 4 вроде разобрался: этому FB похоже вообще параллельно на имя топика подписки.
Пока не ввел проверку на совпадение имени последнего принятого топика с подписываемым (????? казалось бы, какого...), приходили данные из нескольких топиков (с этого-же устройства-публикатора), какой топик раньше обновился - тот и на выходе FB.
Причем, в коде FB (банальным поиском), кроме как в описании переменных, обращения к переменной с названием топика подписки я НЕ НАШЕЛ. Может там есть косвенные обращения через указатели... хотя ко многим другим входным переменным обращения идут непосредственно по именам.
И такое ощущение, что в части подписки данная библиотека дико сырая.
Как хочется верить, что я ошибаюсь (а еще и понять бы - в чем конкретно). Если в том, что пытаюсь использовать бесплатную библиотеку, а не за 50 ойро - так и текущая задача этих денег не стоит по большому счету. Это скорее демонстрационный проект.
Больше вопросов к перспективе использования технологии в дальнейшем.
Параллельно ребята кодят MQTT под NBIoT, там тоже не всё гладко (но там и платформа другая, и средства разработки).

1. У меня не воспроизводится - предупреждений нет.

55006

2. Причины могут быть разными. Можете почитать в этой теме:
https://owen.ru/forum/showthread.php?t=34719&p=355252&viewfull=1#post355252 (c этого поста и далее)

3. Я не тестировал со своим брокером, который можно перезагрузить, так что не могу дать комментариев.
Если заглянуть в исходники - думаю, не сложно будет добавить в ФБ вход типа xReset.

4. У меня не воспроизводится.
Но я использую один инстанс для подписки на множество топиков, и не понимаю, зачем поступать иначе.
https://owen.ru/forum/showthread.php?t=34719&p=355434&viewfull=1#post355434


С вопросом 4 вроде разобрался: этому FB похоже вообще параллельно на имя топика подписки.

Эта фраза звучит странно, так как без факта подписки брокер вообще не должен пересылать клиенту сообщения по данным топикам.

VadimS
07.05.2021, 00:11
Евгений, спасибо!
Есть, с чем поразбираться. Как минимум у других работает :).

Карбофос
08.05.2021, 13:52
Здравствуйте! Можно ли как-то настроить на СПК1хх и ПЛК2хх клиент OpenVPN? Чтобы при наличии интернета он мог соединяться с сервером.
Если нет, может кто посоветовать не сильно дорогое решение с функцией OpenVPN клиента, через которое можно подключить СПК к удаленному серверу для диспетчеризации по ethernet? По 2/3/4G?

ASo
08.05.2021, 15:34
Роутер с OpenVPN.

Евгений Кислов
08.05.2021, 15:53
Здравствуйте! Можно ли как-то настроить на СПК1хх и ПЛК2хх клиент OpenVPN? Чтобы при наличии интернета он мог соединяться с сервером.
Если нет, может кто посоветовать не сильно дорогое решение с функцией OpenVPN клиента, через которое можно подключить СПК к удаленному серверу для диспетчеризации по ethernet? По 2/3/4G?

В последней прошивке для СПК OpenVPN доступен:
https://owen.ru/forum/showthread.php?t=33954&p=351532&viewfull=1#post351532

Для ПЛК2хх прошивка с OpenVPN в настоящий момент на этапе доработки и тестирования.

TemD
28.05.2021, 11:17
Приветствую, форумчане!
Столкнулся с банальной проблемой - Как организовать реализацию Modbus TCP Master в среде CodeSys 3.5?
Много где есть упоминание, но я не нашёл ни одной инструкции по реализации данного протокола.
Если есть у кого инструкции или пример реализации прошу поделиться опытом =)

Максим Ульянов
02.06.2021, 15:51
Доброго дня Коллеги! разбираюсь с ФБ MB_TcpRequest... с чтением вопросов нет,все хорошо...При записи fbWriteRequest "виснет" и перестает реагировать на внешние раздражители...При этом запись происходит( смотрю через веб интерфейс железки), fbWriteRequest.xError сразу устанавливается в TRUE, попробовал выставить tTimeout :=T#1000MS,usiRetry :=10 ,результат тотже...При записи в тот же регистр допустим программой TIK Modscan не каких проблем нет...Прошу помощи...


fbWriteRequest.eError возвращает код 52 ( ILLEGAL_DATA_VALUE Некорректное значение в поле данных) чтобы это могло значить?

Евгений Кислов
02.06.2021, 16:22
Доброго дня Коллеги! разбираюсь с ФБ MB_TcpRequest... с чтением вопросов нет,все хорошо...При записи fbWriteRequest "виснет" и перестает реагировать на внешние раздражители...При этом запись происходит( смотрю через веб интерфейс железки), fbWriteRequest.xError сразу устанавливается в TRUE, попробовал выставить tTimeout :=T#1000MS,usiRetry :=10 ,результат тотже...При записи в тот же регистр допустим программой TIK Modscan не каких проблем нет...Прошу помощи...

Добрый день.
Что вы называете "fbWriteRequest"?
Как мне воспроизвести вашу проблему на своем оборудовании?



fbWriteRequest.eError возвращает код 52 ( ILLEGAL_DATA_VALUE Некорректное значение в поле данных) чтобы это могло значить?

Это значит, что в ответ на запрос slave-устройство вернуло ответ с кодом ошибки 03.
В спецификации Modbus описано, в каких случаях он должен возвращаться (например, если вы пытаетесь считать со слэйва 0 или >125 регистров)
В некоторых случаях slave-устройства возвращают этот код в неописанных спецификацией случаях - например, когда записываемое значение выходит за допустимый диапазон параметра.

Максим Ульянов
02.06.2021, 16:32
Что вы называете "fbWriteRequest"? ФБ из OwenCommunication
Как мне воспроизвести вашу проблему на своем оборудовании? наверное только через удаленный доступ ...ШЛЮЗ ПРОТОКОЛА MODBUS MD-CCM18A/N думаю оч редкая железка




Это значит, что в ответ на запрос slave-устройство вернуло ответ с кодом ошибки 03.
В спецификации Modbus описано, в каких случаях он должен возвращаться (например, если вы пытаетесь считать со слэйва 0 или >125 регистров) естественно более 125 ...( 64фанкрйла Х 32 регистра= 2048 как минимум...)
В некоторых случаях slave-устройства возвращают этот код в неописанных спецификацией случаях - например, когда записываемое значение выходит за допустимый диапазон параметра. Нет не выходит...

capzap
02.06.2021, 16:40
естественно более 125 ...( 64фанкрйла Х 32 регистра= 2048 как минимум...)

так по спецификации в посылке указывается сколько байт передать 55397(N), максимальное значение у типа данных байт 255, поэтому принято передавать не больше 125 регистров, которые в байтах равны 250-и

Максим Ульянов
02.06.2021, 16:44
так мне более 2х байт за раз не нужно..и не пытаюсь даже..

Евгений Кислов
02.06.2021, 16:45
Что вы называете "fbWriteRequest"? ФБ из OwenCommunication

В OwenCommunication нет ФБ с таким названием.

Насчет числа регистров вам уже ответили выше.

Максим Ульянов
02.06.2021, 16:50
В OwenCommunication нет ФБ с таким названием.


все по вашему уроку)) https://youtu.be/mxEESSRKGpU?list=LL


так чего делать то..?

55398

или я чегото не понимаю..

Евгений Кислов
02.06.2021, 17:01
все по вашему уроку)) https://youtu.be/mxEESSRKGpU?list=LL


так чего делать то..?

Для начала можно провести тест со стандартными компонентами Modbus, добавляемыми через дерево проекта.

Максим Ульянов
03.06.2021, 13:24
Для начала можно провести тест со стандартными компонентами Modbus, добавляемыми через дерево проекта.

Доброго дня Евгений,попробовал стандартными компонентами Modbus, добавляемыми через дерево проекта....даже прочитать не удается...55402

capzap
03.06.2021, 13:25
Unit-ID = 255 ? Точно в документации именно так описывается

Евгений Кислов
03.06.2021, 13:32
Доброго дня Евгений,попробовал стандартными компонентами Modbus, добавляемыми через дерево проекта....даже прочитать не удается...55402

Теперь попробуйте опросить ваш прибор с ПК каким-нибудь Modbus TCP Master'ом (например, MasterOPC Universal Modbus Server).

Максим Ульянов
03.06.2021, 13:34
пробовал...TIK Modscan и читает и пишет без проблем

Евгений Кислов
03.06.2021, 13:34
это вопрос или утверждение?

Это совет.

Максим Ульянов
03.06.2021, 13:36
Unit-ID = 255 ? Точно в документации именно так описывается

это вопрос или утверждение?

Максим Ульянов
03.06.2021, 13:36
Это совет.

извините ,не вам)

Максим Ульянов
03.06.2021, 14:44
Продолжим....в MasterOPC Universal Modbus Server не каких проблем нет)55409...что делать дальше?

Евгений Кислов
03.06.2021, 14:46
Продолжим....в MasterOPC Universal Modbus Server не каких проблем нет)55409...что делать дальше?

Теперь выкладывайте проект для CODESYS с настройкой через дерево проекта и конфигурацию OPC.

Максим Ульянов
03.06.2021, 14:56
Теперь выкладывайте проект для CODESYS с настройкой через дерево проекта и конфигурацию OPC.

https://cloud.mail.ru/public/Dvnc/sonUTuQty

Евгений Кислов
03.06.2021, 16:36
У вас в OPC включен режим Modbus RTU Over TCP.
Жаль, что вы раньше нигде не упоминали, что вам нужен именно он.

55413

Стандартные драйвера CODESYS такой функционал не поддерживают, поэтому, естественно, обмена в этом случае не будет.

В библиотеке такой режим поддержан. Вот только у вас он не включен...


xIsRtuOverTcpMode := FALSE,

Присвойте этому входу значение TRUE.

Максим Ульянов
03.06.2021, 17:03
Проверил и приношу свои извинения , этот режим Modbus RTU Over TCP ВЫКЛЮЧЕН....еще раз перезалил файлы..
как так получилось что отправил вам конфигурацию OPC со включенным режимом честно не понимаю...
все работает когда он выключен ( вернее работает OPC)

https://cloud.mail.ru/public/Dvnc/sonUTuQty

Максим Ульянов
12.07.2021, 09:58
55973559745597555976
Евгений,доброго времени...снова приходится просить вашей помощи..есть ряд модбасных железок подключенных через шлюз TGW735 (https://www.icpdas.com/en/product/tGW-735), посмотрите пожалуйста правильно я добавил все компоненты...
я снова не понимаю в чем дело ,сторонним софтом все читается через этот шлюз...при чтении с панели все вроде ок ,не каких ошибок...но получаем нули

Евгений Кислов
12.07.2021, 10:09
55973559745597555976
Евгений,доброго времени...снова приходится просить вашей помощи..есть ряд модбасных железок подключенных через шлюз TGW735 (https://www.icpdas.com/en/product/tGW-735), посмотрите пожалуйста правильно я добавил все компоненты...
я снова не понимаю в чем дело ,сторонним софтом все читается через этот шлюз...при чтении с панели все вроде ок ,не каких ошибок...но получаем нули

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

Максим Ульянов
12.07.2021, 11:27
559805598155982

вот пожалуйста

Евгений Кислов
12.07.2021, 12:08
559805598155982

вот пожалуйста

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

Максим Ульянов
12.07.2021, 12:14
ок, будем пробовать..

krollcbas
13.08.2021, 08:39
Доброе утро!

ПЛК210. SP14. OwenCommunication, Float

Не выходит пока организовать нормальную IN_OUT или чтение/запись функцию.
В примере дано отдельно описание на чтение и отдельно запись.
И то и то хорошо работает, а вот когда я начинаю и читать и писать, имею проблемы

Пробовал разделить через BLINK по 200мс, то чтение, то запись. Работает, когда угадываю промежуток, но скажем так себе решение.
Пробовал сделать через блок с входами IN_OUT, выбивает в исключение иногда


IF OUT1_old<>OUT1 OR OUT2_old<>OUT2 THEN
IN:=OCL.WORD2_TO_REAL(awSlaveData[OUT1], awSlaveData[OUT2], FALSE);
END_IF;

IF IN_old<>IN THEN
FB (rInput :=IN, wOutput1 => awSlaveData[OUT2], wOutput2 => awSlaveData[OUT1]);
END_IF;

IN_old:=IN;
OUT1_old:=OUT1;
OUT2_old:=OUT2;


Для чего вообще нужно: например SP(REAL) вы ее пишете как с панели, так можете записать в нее и из кода.
Регистры должны обновиться, а в случае изменения регистров, должна измениться связанная с ними переменная

В конфигураторе ПЛК110 переменные именно так и работают.
Как это сделать корректно в Codesys 3.5 SP14?

Евгений Кислов
13.08.2021, 08:42
Доброе утро!

ПЛК210. SP14. OwenCommunication, Float

Не выходит пока организовать нормальную IN_OUT или чтение/запись функцию.
В примере дано отдельно описание на чтение и отдельно запись.
И то и то хорошо работает, а вот когда я начинаю и читать и писать, имею проблемы

Пробовал разделить через BLINK по 200мс, то чтение, то запись. Работает, когда угадываю промежуток, но скажем так себе решение.
Пробовал сделать через блок с входами IN_OUT, выбивает в исключение иногда


Для чего вообще нужно: например SP(REAL) вы ее пишете как с панели, так можете записать в нее и из кода.
Регистры должны обновиться, а в случае изменения регистров, должна измениться связанная с ними переменная

В конфигураторе ПЛК110 переменные именно так и работают.
Как это сделать корректно в Codesys 3.5 SP14?

Добрый день.

Производите запись в awSlaveData событийно, а не каждый цикл ПЛК - тогда проблем не будет.

Максим Ульянов
18.08.2021, 10:58
Доброго дня )вопрос : не могу в документации найти..стандартный компонент Modbus TCP Master ( через дерево объектов) может содержать до 100 запросов....а сколько я могу вычитать за один запрос?

Евгений Кислов
18.08.2021, 11:01
Доброго дня )вопрос : не могу в документации найти..стандартный компонент Modbus TCP Master ( через дерево объектов) может содержать до 100 запросов....а сколько я могу вычитать за один запрос?

Добрый день.
Согласно спецификации протокола Modbus - до 125 регистров в запросе чтения.
У конкретного slave-устройства могут быть свои ограничения по этому поводу.

Максим Ульянов
19.08.2021, 04:55
Доброго времени Коллеги) итак : MB_TcpRequest отказывается работать (HANDLE_INVALID,10,Некорректное значение дескриптора интерфейса) хотя дескриптор получает от TcpClient....Через опс сервер ,проблем нет,если добавляю через дерево устройств как модбас слейв тоже читается без проблем...56612

Евгений Кислов
19.08.2021, 06:24
Доброго времени Коллеги) итак : MB_TcpRequest отказывается работать (HANDLE_INVALID,10,Некорректное значение дескриптора интерфейса) хотя дескриптор получает от TcpClient....Через опс сервер ,проблем нет,если добавляю через дерево устройств как модбас слейв тоже читается без проблем...56612

Добрый день.
Удалите из проекта весь код, кроме вызовов фб TCP_Client и MB_TcpRequest.
Если после этого проблема сохранится - выкладывайте этот проект.

Максим Ульянов
19.08.2021, 07:37
Добрый день.
Удалите из проекта весь код, кроме вызовов фб TCP_Client и MB_TcpRequest.
Если после этого проблема сохранится - выкладывайте этот проект.

Вот весь "Код")) удалил все...

IF EnableRead THEN
CASE ReadState OF
STATE_MB_RD.CONNECTING:
fbTcpClient
(
xEnable := TRUE ,
tTimeout := T#5S,
sIpAddr := '192.168.0.7',
uiPort :=502
);
IF fbTcpClient.xActive THEN
fbReadRequest (xExecute := TRUE);
ReadState := STATE_MB_RD.READ;
ELSIF fbTcpClient.xError THEN
fbTcpClient(xEnable := FALSE);
ReadState := STATE_MB_RD.CONNECTING;
END_IF
STATE_MB_RD.READ:
fbReadRequest
(
xExecute:=TRUE,
tTimeout:=T#5S,
usiRetry:=5,
hConnection:=fbTcpClient.hConnection,
xIsRtuOverTcpMode:=FALSE,
usiUnitId:=1,
eFuncCode:=OCL.MB_FC.READ_INPUT_REGISTERS,
uiDataAddr:=1,
uiDataCount:=32,
pData:=ADR (DatafORFANK),
szSize:=SIZEOF (DatafORFANK)
);
EnableRead:=FALSE;
ReadState := STATE_MB_RD.CONNECTING;
END_CASE
END_IF

Евгений Кислов
19.08.2021, 08:02
Поправил ошибки (выделил исправления жирным).



IF EnableRead THEN

CASE ReadState OF

STATE_MB_RD.CONNECTING:

fbTcpClient
(
xEnable := TRUE ,
tTimeout := T#5S,
sIpAddr := '192.168.0.7',
uiPort :=502
);

IF fbTcpClient.xActive THEN

fbReadRequest (xExecute := FALSE);
ReadState := STATE_MB_RD.READ;

ELSIF fbTcpClient.xError THEN

fbTcpClient(xEnable := FALSE);
ReadState := STATE_MB_RD.CONNECTING;

END_IF

STATE_MB_RD.READ:

fbReadRequest
(
xExecute:=TRUE,
tTimeout:=T#5S,
usiRetry:=5,
hConnection:=fbTcpClient.hConnection,
xIsRtuOverTcpMode:=FALSE,
usiUnitId:=1,
eFuncCode:=OCL.MB_FC.READ_INPUT_REGISTERS,
uiDataAddr:=1,
uiDataCount:=32,
pData:=ADR (DatafORFANK),
szSize:=SIZEOF (DatafORFANK)
);

IF fbReadRequest.xDone OR fbReadRequest.xError THEN

EnableRead:=FALSE;
ReadState := STATE_MB_RD.CONNECTING;

END_IF

END_CASE

END_IF


56613

Максим Ульянов
19.08.2021, 08:12
Поправил ошибки (выделил исправления жирным).



IF EnableRead THEN

CASE ReadState OF

STATE_MB_RD.CONNECTING:

fbTcpClient
(
xEnable := TRUE ,
tTimeout := T#5S,
sIpAddr := '192.168.0.7',
uiPort :=502
);

IF fbTcpClient.xActive THEN

fbReadRequest (xExecute := FALSE);
ReadState := STATE_MB_RD.READ;

ELSIF fbTcpClient.xError THEN

fbTcpClient(xEnable := FALSE);
ReadState := STATE_MB_RD.CONNECTING;

END_IF

STATE_MB_RD.READ:

fbReadRequest
(
xExecute:=TRUE,
tTimeout:=T#5S,
usiRetry:=5,
hConnection:=fbTcpClient.hConnection,
xIsRtuOverTcpMode:=FALSE,
usiUnitId:=1,
eFuncCode:=OCL.MB_FC.READ_INPUT_REGISTERS,
uiDataAddr:=1,
uiDataCount:=32,
pData:=ADR (DatafORFANK),
szSize:=SIZEOF (DatafORFANK)
);

IF fbReadRequest.xDone OR fbReadRequest.xError THEN

EnableRead:=FALSE;
ReadState := STATE_MB_RD.CONNECTING;

END_IF

END_CASE

END_IF


56613
Да спасибо вам огромное ,я сам тоже самое написал только чуть по другому ,но тоже заработало

Максим Ульянов
19.08.2021, 19:07
Итак целый день коту под хвост... промучился со связкой кривых китайских шлюзов и OCL.TCP_Client; OCL.MB_TcpRequest;не удалось вычитать данные как хотелось ,( но если добавить на чтение через стандартные слейв тсп то не каких проблем с ними нет...решил читать данные с них добавив стандартными в дерево устройств, и управлять чтением через триггерную переменную....теперь вопрос...данные читаются все супер,но как ее сбросить и тем самым отключив опрос слейва?))

Евгений Кислов
19.08.2021, 19:12
Итак целый день коту под хвост... промучился со связкой кривых китайских шлюзов и OCL.TCP_Client; OCL.MB_TcpRequest;не удалось вычитать данные как хотелось ,( но если добавить на чтение через стандартные слейв тсп то не каких проблем с ними нет...решил читать данные с них добавив стандартными в дерево устройств, и управлять чтением через триггерную переменную....теперь вопрос...данные читаются все супер,но как ее сбросить и тем самым отключив опрос слейва?))

При использование триггерной переменной - опрос однократно выполняется по ее переднему фронту.
Чтобы сбросить эту переменную - присвойте ей в коде значение FALSE.

Максим Ульянов
19.08.2021, 19:21
При использование триггерной переменной - опрос однократно выполняется по ее переднему фронту.
Чтобы сбросить эту переменную - присвойте ей в коде значение FALSE.

наверное я что то не так понял..до того как триггерная переменная стала TRUE данная шина вообще не была активна,а при изменении на FALSE ,шина должна остаться активной? и она все равно будет поддерживать соединение со слейвом?

Евгений Кислов
19.08.2021, 19:24
наверное я что то не так понял..до того как триггерная переменная стала TRUE данная шина вообще не была активна,а при изменении на FALSE ,шина должна остаться активной? и она все равно будет поддерживать соединение со слейвом?

TCP-соединение, вероятно, будет поддерживаться вообще всегда, а запросы по нему будут отправляться только по переднему фронту триггерной переменной.
Управлять опросом можно через системные переменные.
См. п. 4.6:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v2.1.pdf

Максим Ульянов
19.08.2021, 19:37
выбора особа там нет..

Максим Ульянов
27.08.2021, 07:57
Продолжаю мучить OwenCommunication... Если в цикле одна пара фб OCL.TCP_Client и OCL.MB_TcpRequest то все работает без проблем ...При добавление еще одной или более пар данных функций данные актуальны только после сброса...на чтобы посмотреть ,чтобы сделать?

Евгений Кислов
27.08.2021, 08:04
При добавление еще одной или более пар данных функций данные актуальны только после сброса...

Поясните, что вы подразумеваете под этой фразой.

Максим Ульянов
27.08.2021, 08:24
Поясните, что вы подразумеваете под этой фразой.


fbTon3(IN :=TRUE, PT := T#2S);//(IN должно становится TRUE после выполнения всего вложеного кода ,НО становится TRUE сразу
fbr_trig3(CLK:=fbTon3.Q);
IF fbr_trig3.Q THEN
fbTon3(IN :=FALSE);
ReadWorksErrorsFank:=TRUE;
END_IF;
IF ReadWorksErrorsFank THEN
CASE eState1 OF
STATE_MB1.CONNECTING:
fbTcpClient1
(
xEnable := TRUE ,
tTimeout := T#5S,
sIpAddr := '192.168.0.6',
uiPort :=502
);
IF fbTcpClient1.xActive THEN
fbWRRequest1 (xExecute := FALSE);
eState1 := STATE_MB1.WR;
ELSIF fbTcpClient1.xError THEN
fbTcpClient1(xEnable := FALSE);
eState1 := STATE_MB1.CONNECTING;
END_IF
STATE_MB1.WR:
fbWRRequest1
(
xExecute :=TRUE,
tTimeout :=T#1500MS,
usiRetry :=5,
hConnection := fbTcpClient1.hConnection,
xIsRtuOverTcpMode :=FALSE,
usiUnitId :=1,
eFuncCode :=OCL.MB_FC.READ_INPUT_REGISTERS,
uiDataAddr:=24, // Начальный регистр
uiDataCount:=8,// колво регистров в запросе
pData:=ADR (awReadData),
szSize:=SIZEOF (awReadData)
);
ErrorsFank1.Errors_Fan_WORD[0]:=awReadData[0];
ErrorsFank1.Errors_Fan_WORD[1]:=awReadData[1];
ErrorsFank1.Errors_Fan_WORD[2]:=awReadData[2];
ErrorsFank1.Errors_Fan_WORD[3]:=awReadData[3];
WorksFank1.Works_Fan_WORD[0]:=awReadData[4];
WorksFank1.Works_Fan_WORD[1]:=awReadData[5];
WorksFank1.Works_Fan_WORD[2]:=awReadData[6];
WorksFank1.Works_Fan_WORD[3]:=awReadData[7];
IF fbWRRequest1.xDone THEN
fbWRRequest1 (xExecute := FALSE);
fbTcpClient1(xEnable := FALSE);
eState1 := STATE_MB1.CONNECTING1;
ELSE
eState1 := STATE_MB1.CONNECTING;
END_IF
STATE_MB1.CONNECTING1:
fbTcpClient2
(
xEnable := TRUE ,
tTimeout := T#5S,
sIpAddr := '192.168.0.7',
uiPort :=502
);
IF fbTcpClient2.xActive THEN
fbWRRequest2 (xExecute := FALSE);
eState1 := STATE_MB1.WR1;
ELSIF fbTcpClient2.xError THEN
fbTcpClient2(xEnable := FALSE);
eState1 := STATE_MB1.CONNECTING1;
END_IF
STATE_MB1.WR1:
fbWRRequest2
(
xExecute :=TRUE,
tTimeout :=T#1500MS,
usiRetry :=5,
hConnection := fbTcpClient2.hConnection,
xIsRtuOverTcpMode :=FALSE,
usiUnitId :=1,
eFuncCode :=OCL.MB_FC.READ_INPUT_REGISTERS,
uiDataAddr:=24, // Начальный регистр
uiDataCount:=8,// колво регистров в запросе
pData:=ADR (awReadData),
szSize:=SIZEOF (awReadData)
);
ErrorsFank2.Errors_Fan_WORD_1[0]:=awReadData[0];
ErrorsFank2.Errors_Fan_WORD_1[1]:=awReadData[1];
ErrorsFank2.Errors_Fan_WORD_1[2]:=awReadData[2];
ErrorsFank2.Errors_Fan_WORD_1[3]:=awReadData[3];
WorksFank2.Works_Fan_WORD_1[0]:=awReadData[4];
WorksFank2.Works_Fan_WORD_1[1]:=awReadData[5];
WorksFank2.Works_Fan_WORD_1[2]:=awReadData[6];
WorksFank2.Works_Fan_WORD_1[3]:=awReadData[7];

IF fbWRRequest2.xDone THEN
fbWRRequest2 (xExecute := FALSE);
fbTcpClient2(xEnable := FALSE);
eState1 := STATE_MB1.CONNECTING2;
ELSE
eState1 := STATE_MB1.CONNECTING1;
END_IF
STATE_MB1.CONNECTING2:
fbTcpClient3
(
xEnable := TRUE ,
tTimeout := T#5S,
sIpAddr := '192.168.0.8',
uiPort :=502
);
IF fbTcpClient3.xActive THEN
fbWRRequest3 (xExecute := FALSE);
eState1 := STATE_MB1.WR2;
ELSIF fbTcpClient3.xError THEN
fbTcpClient3(xEnable := FALSE);
eState1 := STATE_MB1.CONNECTING2;
END_IF
STATE_MB1.WR2:
fbWRRequest3
(
xExecute :=TRUE,
tTimeout :=T#1500MS,
usiRetry :=5,
hConnection := fbTcpClient3.hConnection,
xIsRtuOverTcpMode :=FALSE,
usiUnitId :=1,
eFuncCode :=OCL.MB_FC.READ_INPUT_REGISTERS,
uiDataAddr:=24, // Начальный регистр
uiDataCount:=8,// колво регистров в запросе
pData:=ADR (awReadData),
szSize:=SIZEOF (awReadData)
);
ErrorsFank3.Errors_Fan_WORD_2[0]:=awReadData[0];
ErrorsFank3.Errors_Fan_WORD_2[1]:=awReadData[1];
ErrorsFank3.Errors_Fan_WORD_2[2]:=awReadData[2];
ErrorsFank3.Errors_Fan_WORD_2[3]:=awReadData[3];
WorksFank3.Works_Fan_WORD_2[0]:=awReadData[4];
WorksFank3.Works_Fan_WORD_2[1]:=awReadData[5];
WorksFank3.Works_Fan_WORD_2[2]:=awReadData[6];
WorksFank3.Works_Fan_WORD_2[3]:=awReadData[7];

IF fbWRRequest3.xDone THEN
fbWRRequest3 (xExecute := FALSE);
fbTcpClient3(xEnable := FALSE);
ReadWorksErrorsFank:=FALSE;
fbTon3(IN :=FALSE);
ELSE
eState1 := STATE_MB1.CONNECTING2;
END_IF
END_CASE
END_IF


Если закоментировать блоки STATE_MB1.CONNECTING1 (с переносом END_IF,END_CASE,END_IF в конец STATE_MB1.WR) и ниже то блок STATE_MB1.CONNECTING и STATE_MB1.WR работает исправно,если выполняются все 6 блоков то данные актуальны только при один раз после сброса ,далее значения не меняются

Евгений Кислов
27.08.2021, 08:31
Покажите в STATE_MB1.WR2 строку кода, с помощью которой вы возвращаетесь в STATE_MB1.CONNECTING.

Максим Ульянов
27.08.2021, 08:50
Покажите в STATE_MB1.WR2 строку кода, с помощью которой вы возвращаетесь в STATE_MB1.CONNECTING.

IF fbWRRequest3.xDone THEN
fbWRRequest3 (xExecute := FALSE);
fbTcpClient3(xEnable := FALSE);
ReadWorksErrorsFank:=FALSE;
fbTon3(IN :=FALSE);
ELSE
eState1 := STATE_MB1.CONNECTING2;
END_IF


при удачном завершении MB1.WR2 ждем следующей сработки таймера либо возвращаемся на MB1.CONNECTING2

Евгений Кислов
27.08.2021, 08:52
IF fbWRRequest3.xDone THEN
fbWRRequest3 (xExecute := FALSE);
fbTcpClient3(xEnable := FALSE);
ReadWorksErrorsFank:=FALSE;
fbTon3(IN :=FALSE);
ELSE
eState1 := STATE_MB1.CONNECTING2;
END_IF


при удачном завершении MB1.WR2 ждем следующей сработки таймера либо возвращаемся на MB1.CONNECTING2

И что произойдет при следующей "сработке таймера"?
Кто изменит значение переменной eState1?

Максим Ульянов
27.08.2021, 09:55
Действительно..чет я не понимаю похоже..но при следующей сработке таймера все начинается с начала .. ,в крайнем случае переменная состояний меняется от 1 до 6 при каждой сработке таймера..

Евгений Кислов
27.08.2021, 10:04
Действительно..чет я не понимаю похоже..но при следующей сработке таймера все начинается с начала .. ,в крайнем случае переменная состояний меняется от 1 до 6 при каждой сработке таймера..

Тогда вам надо разобраться - за счёт чего это происходит.

Максим Ульянов
27.08.2021, 10:30
Но смотрите ,если я сокращаю до одного коннекта и одного чтения то все работает..

Евгений Кислов
27.08.2021, 10:34
Но смотрите ,если я сокращаю до одного коннекта и одного чтения то все работает..

Меня это не удивляет - потому что там есть возвращение на начальный шаг:



...
ELSE
eState1 := STATE_MB1.CONNECTING;
END_IF



Покажите в STATE_MB1.WR2 строку кода, с помощью которой вы возвращаетесь в STATE_MB1.CONNECTING.

Максим Ульянов
27.08.2021, 19:47
Меня это не удивляет - потому что там есть возвращение на начальный шаг:



...
ELSE
eState1 := STATE_MB1.CONNECTING;
END_IF


Евгений,Огромное спасибо ВАМ ) Все заработало

Максим Ульянов
05.09.2021, 11:54
Итак продолжу хождение по мукам ..из за особенностей шлюза не получилось работать с ним стандартными средствами ,работаю с помощью Овен Комуникейшен..Получается Следующие ..Чтение двух регистров -Около секунды ,Запись двух регистров до десяти секунд,Получается как то не очень хорошо..Скажу сразу До этого опыта с подобными железками у меня не было ,по этому вопрос к опытным товарищам : Это вообще нормально? Хотя работая с этой железкой через стандартные средства - насколько помню запись была моментальной..

Евгений Кислов
06.09.2021, 06:21
Итак продолжу хождение по мукам ..из за особенностей шлюза не получилось работать с ним стандартными средствами ,работаю с помощью Овен Комуникейшен..Получается Следующие ..Чтение двух регистров -Около секунды ,Запись двух регистров до десяти секунд,Получается как то не очень хорошо..Скажу сразу До этого опыта с подобными железками у меня не было ,по этому вопрос к опытным товарищам : Это вообще нормально? Хотя работая с этой железкой через стандартные средства - насколько помню запись была моментальной..

Если через стандартные средства запись была "моментальной", то такого же быстродействия можно добиться и через OwenCommunication.

СергейНовосиб
13.09.2021, 06:18
Все привет!
У меня задача: к одному порту подключены два устройства с разными настройками RS, а именно количество стоповых битов, у одного 1, у другого 2. изменить их нет возможности.
Пытаюсь с помощью библиотеки OWEN Communication Library организовать чтение, но не нашел описание применения этой библиотеки.
Подскажите, как мне это реализовать.

Евгений Кислов
13.09.2021, 06:39
Все привет!
У меня задача: к одному порту подключены два устройства с разными настройками RS, а именно количество стоповых битов, у одного 1, у другого 2. изменить их нет возможности.
Пытаюсь с помощью библиотеки OWEN Communication Library организовать чтение, но не нашел описание применения этой библиотеки.
Подскажите, как мне это реализовать.

Добрый день.
Описание библиотеки:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v2.1.pdf

Пример использования: https://youtu.be/8HdrbW9blsk

В вашем случае перед началом сеанса опроса конкретного устройства необходимо закрывать COM-порт (вызывать экземпляр COM_CONTROL с xEnable := FALSE) и открывать его заново с новыми настройками.

ShivA
13.09.2021, 20:19
Доброго дня! OPC server опрашивает счетчик электроэнергии. Как передать показания в СПК?
Спасибо заранее.

Евгений Кислов
13.09.2021, 20:22
Доброго дня! OPC server опрашивает счетчик электроэнергии. Как передать показания в СПК?
Спасибо заранее.

Добрый день.
О каком именно OPC и счетчике речь?

ShivA
14.09.2021, 07:53
Добрый день.
О каком именно OPC и счетчике речь?

OPC - Multi-Protocol MasterOPC Server, счетчик - ПСЧ-4ТМ.05МД.

Евгений Кислов
14.09.2021, 08:11
OPC - Multi-Protocol MasterOPC Server, счетчик - ПСЧ-4ТМ.05МД.

Multi-Protocol MasterOPC Server поддерживает написание собственных скриптов - так что в теории должна быть возможность передать полученные от счетчика данные по другому протоколу, который поддерживает СПК (например, Modbus).
По особенностям реализации - лучше уточнить в этой теме:
https://owen.ru/forum/showthread.php?t=11081&page=97

СергейНовосиб
15.09.2021, 06:34
Все привет!
У меня задача: к одному порту подключены два устройства с разными настройками RS, а именно количество стоповых битов, у одного 1, у другого 2. изменить их нет возможности.
Пытаюсь с помощью библиотеки OWEN Communication Library организовать чтение, но не нашел описание применения этой библиотеки.
Подскажите, как мне это реализовать.

Подключил один прибор через эту библиотеку как на видео. Читает не правильно. Хотя через стандартный порт Codesys все читало правильно. переменная Temper_V1_E должна быть 92,3С
56996

Евгений Кислов
15.09.2021, 06:48
Подключил один прибор через эту библиотеку как на видео. Читает не правильно. Хотя через стандартный порт Codesys все читало правильно. переменная Temper_V1_E должна быть 92,3С
56996

Читает, конечно, правильно.
В функции WORD2_TO_REAL на wInput1 заведите первый элемент массива, а на wInput2 - нулевой (т.е. поменяйте порядок регистров).

СергейНовосиб
15.09.2021, 06:57
Решил. Надо было поменять на входе блока WORD2_TO_REAL местами переменные Temper_V1[0] и Temper_V1[1].
Чем отличается последовательность данных REAL при чтении через эту библиотеку и средствами CS?

Евгений Кислов
15.09.2021, 07:03
Решил. Надо было поменять на входе блока WORD2_TO_REAL местами переменные Temper_V1[0] и Temper_V1[1].
Чем отличается последовательность данных REAL при чтении через эту библиотеку и средствами CS?

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

СергейНовосиб
15.09.2021, 11:55
Наконец по отдельности научился читать данные с обоих устройств.
Но когда сделал, что бы по очереди шел опрос с разными настройками порта, то у меня работает только кто первый при запуске программы сработал, те настройки порта и остаются.
Почему у меня не меняются настройки порта?
570045700557006

Евгений Кислов
15.09.2021, 12:02
Наконец по отдельности научился читать данные с обоих устройств.
Но когда сделал, что бы по очереди шел опрос с разными настройками порта, то у меня работает только кто первый при запуске программы сработал, те настройки порта и остаются.
Почему у меня не меняются настройки порта?
570045700557006

Выложите ваш проект.

СергейНовосиб
15.09.2021, 12:52
Отправил на почту

СергейНовосиб
17.09.2021, 04:48
Настроил чтение данных с обоих устройств.
Но с одного устройства, при чтении регистров функцией 02, почему-то состояние в программе отображается или FALSE или <Значение выражения не может быть найдено.>.
Следующий по списку регистр, как положено FALSE или TRUE. Что может быть не так?
57028

Евгений Кислов
17.09.2021, 06:20
Настроил чтение данных с обоих устройств.
Но с одного устройства, при чтении регистров функцией 02, почему-то состояние в программе отображается или FALSE или <Значение выражения не может быть найдено.>.
Следующий по списку регистр, как положено FALSE или TRUE. Что может быть не так?
57028

В протоколе Modbus биты передаются в виде битовой маски, где конкретный "coil" или, как в вашем случае, "discrete input" занимает именно 1 бит.
В CODESYS тип BOOL занимает 8 бит, из которых значимым является только младший.
Если каким-то образом изменяются другие биты переменной типа BOOL - то отладчик понимает, что что-то пошло не так (<Значение выражения не может быть найдено>).

Вам нужно под указателем разместить массив переменных типа BYTE (а не BOOL), и уже из них извлекать отдельные биты (и если нужно - копировать их в BOOL-переменные).

СергейНовосиб
17.09.2021, 07:27
Я что-то совсем запутался, как организован регистр для функции 02.
Программой Modbus Poll данные читаю правильно, номера регистров и значения соответствуют спецификации производителя.
Я в программе читаю с контроллера массив в 234 регистра Discrete Input.
Регистры с адресом 2 и 9 у меня индикация с контроллера состояния вентилятора и насоса. При это на 1 регистре считывается значение 2, когда включается насос.
Регистры с адресом 97, 98, 99 должны быть в значении 1 (TRUE), а читает нули.

Евгений Кислов
17.09.2021, 07:42
Я что-то совсем запутался

Давайте по TeamViewer посмотрим?

СергейНовосиб
17.09.2021, 07:43
Вот что читает Modbus Poll
57030

а это Codesys
57031

СергейНовосиб
17.09.2021, 07:48
отправил в личку

Евгений Кислов
17.09.2021, 07:50
По скриншотам видно, что и Modbus Poll, и Codesys показывают одно и то же - просто в разной форме.

57032 57033 57034

wildwind1978
18.09.2021, 19:07
Здравствуйте, Коллеги! Может кто знает, как создавать собственные шаблоны для Modbus устройств? Очень удобно если, например, используешь ПЧ в нескольких проектах. Не нужно набирать по несколько раз. Заранее спасибо

Cs-Cs
19.09.2021, 18:19
Здравствуйте, Коллеги! Может кто знает, как создавать собственные шаблоны для Modbus устройств? Очень удобно если, например, используешь ПЧ в нескольких проектах. Не нужно набирать по несколько раз. Заранее спасибо
Я копипащу из проекта в проект просто. Ctrl-C / Ctrl-V

jury_yamal
24.09.2021, 16:05
Добрый день.
Как в ПЛК 210-01 Настроить Modbus TCP Slave стандартными средствами, так как это реализовано в модулях ввода МВ210-101. То есть чтобы чтение/запись в регистр хранения было доступно и из самого ПЛК и с ПК.
Возможно вопрос уже много раз обсуждался, но поиском не найду.
P.S. В каких случаях используется чекбокс наложения регистров в настройках Modbus TCP Slave.

Евгений Кислов
24.09.2021, 16:40
Добрый день.
Как в ПЛК 210-01 Настроить Modbus TCP Slave стандартными средствами, так как это реализовано в модулях ввода МВ210-101. То есть чтобы чтение/запись в регистр хранения было доступно и из самого ПЛК и с ПК.
Возможно вопрос уже много раз обсуждался, но поиском не найду.
P.S. В каких случаях используется чекбокс наложения регистров в настройках Modbus TCP Slave.

Добрый день.
Варианта два:

1. Использовать библиотеку
https://youtu.be/l-oWDtOzBJg

2. Обновить прошивку и использовать новый функционал стандартного компонента:
https://owen.ru/forum/showthread.php?t=33976&p=364822&viewfull=1#post364822
https://youtu.be/Q3hqQlqcESo?t=5456



P.S. В каких случаях используется чекбокс наложения регистров в настройках Modbus TCP Slave.

В случае установки галочки Наложение областей данных регистров временного хранения и ввода при считывании master устройством holding регистров контроллера будут возвращаться значения соответствующих (совпадающих по номерам) input регистров.

jury_yamal
25.09.2021, 13:11
Спасибо Евгений.
Еще один вопрос, а как поступали до этого?. Заводили две переменные? Не могу понять логику. Есть ли пример обмена изменение переменной из двух мест?

Евгений Кислов
25.09.2021, 13:43
Спасибо Евгений.
Еще один вопрос, а как поступали до этого?. Заводили две переменные? Не могу понять логику. Есть ли пример обмена изменение переменной из двух мест?

До этого - использовали библиотеку.

geotime
29.09.2021, 20:22
Добрый день.
Обновил ПЛК 210 и среду разработки до версии CODESYS 3.5 SP 16 с сайта.
После этого не могу прочитать не одну переменную с Slave ModbusTCP используя OPC сервер ОВЕН. Все время ошибка 10.
Создал новый проект. Всего с одной переменной в слейве - то же самое. Куда копать? Переменная всегда в 0. Не меняется при попытке изменить из Codesys. В SP14 таких проблем не замечал.

Евгений Кислов
29.09.2021, 20:36
Добрый день.
Обновил ПЛК 210 и среду разработки до версии CODESYS 3.5 SP 16 с сайта.
После этого не могу прочитать не одну переменную с Slave ModbusTCP используя OPC сервер ОВЕН. Все время ошибка 10.
Создал новый проект. Всего с одной переменной в слейве - то же самое. Куда копать? Переменная всегда в 0. Не меняется при попытке изменить из Codesys. В SP14 таких проблем не замечал.

Добрый день.
Выложите ваш проект и конфигурацию OPC.

geotime
29.09.2021, 21:10
в архиве проект из codesys и конфигурация из opc57214
Причем это повторяется и на виртуальном контролере win 3.
в предыдущих примерах неправильно были указаны регистры и ip, поправил но это ничего не дало.

Евгений Кислов
30.09.2021, 06:29
в архиве проект из codesys и конфигурация из opc57214
Причем это повторяется и на виртуальном контролере win 3.
в предыдущих примерах неправильно были указаны регистры и ip, поправил но это ничего не дало.

У вас в OPC задан адрес (Unit ID) = 1, а начиная с SP16 ModbusTCP Slave Device отвечает только на запросы с Unit ID = 0 или 255.
Установите в OPC адрес 255 (0 задать в нашем OPC не получится).

jury_yamal
10.10.2021, 11:18
Добрый день.
Никак не могу разобраться с обменом по Modbus. Прочитал форум / примеры не могу понять как заставить работать обмен как мне надо (видать что-то упускаю из виду).
Допустим есть некая переменная уставки iSpFlow:Int:=20 с начальным значением 20. Задача менять уставку из кода программы (по каким либо условиям), из веб визуализации (TCP)
и по сети Modbus (485) в случаях больших расстояний (=>100 м).
Вторая задача включать /отключать ,менять настройки аналогового входа в модулях МВ 210-101. Получается только если не завязывать на одну структуру чтение и запись входа.
Допустим используя только одну структуру типа ANALOG_SENSOR_SETTING для чтения и записи.
Пытаюсь все сделать на стандартных компонентах и с использованием шаблонов овен для модуля мв210-101 в SP16.
И последний самый нубский вопрос. Во многих примерах используется булевая переменная для выполнения однократных действий (запись настроек/ чтение по переднему фронту) есть ли в CODESYS переменная типа BOOL с авто сбросом (на 1 цикл ПЛК) или как выглядит FB или код.

Евгений Кислов
10.10.2021, 14:53
Добрый день.
Никак не могу разобраться с обменом по Modbus. Прочитал форум / примеры не могу понять как заставить работать обмен как мне надо (видать что-то упускаю из виду).
Допустим есть некая переменная уставки iSpFlow:Int:=20 с начальным значением 20. Задача менять уставку из кода программы (по каким либо условиям), из веб визуализации (TCP)
и по сети Modbus (485) в случаях больших расстояний (=>100 м).
Вторая задача включать /отключать ,менять настройки аналогового входа в модулях МВ 210-101. Получается только если не завязывать на одну структуру чтение и запись входа.
Допустим используя только одну структуру типа ANALOG_SENSOR_SETTING для чтения и записи.
Пытаюсь все сделать на стандартных компонентах и с использованием шаблонов овен для модуля мв210-101 в SP16.
И последний самый нубский вопрос. Во многих примерах используется булевая переменная для выполнения однократных действий (запись настроек/ чтение по переднему фронту) есть ли в CODESYS переменная типа BOOL с авто сбросом (на 1 цикл ПЛК) или как выглядит FB или код.

Добрый день.

1. Посмотрите этот пример (он для TCP, но для RTU принцип аналогичен):
https://youtu.be/Q3hqQlqcESo?t=5501

2. Так не получится - в любом случае потребуется как минимум два экземпляра структуры (отдельно для чтения и записи).

3. Переменных с автосбросом нет - обычно используют блоки R_TRIG / F_TRIG (они генерируют единичный импульс по переднему / заднему фронту входной BOOL-переменной).

jury_yamal
10.10.2021, 19:45
Добрый вечер.
По п.1 - смотрел еще в прошлый раз (сообщение#673). В том- то и дело что не могу понять зачем заводить 3 переменные для изменения одного значения (одну для чтения внутри плк rPLC, одну для записи по сети wPLC и еще одну булевую для записи значения из плк в слейв. Поэтому и написал что что-то не понимаю -упускаю из виду. Возможно это связанно с атомарностью данных? Почему допустим нельзя в программе просто записать значение в переменную привязанную к слейву. Если в данный момент слейв не менял переменную? Не понимаю.

По п.2 - Спасибо принял к сведению.

По п.3 Про триггеры знал. Я имел ввиду как у вас в примере- вы взводите переменную в TRUE где-то в конце кода , а потом проверяете (в следующем цикле )равна ли она true и если равна записываете в слейв и сбрасываете. То есть это в любом случае делать самому? И последнее в в веб визуализации есть переменные которые становятся в TRUE на один цикл? (нажатие кнопки? или обрабатывать в программе)
С уважением Юрий.

Евгений Кислов
10.10.2021, 20:32
Почему допустим нельзя в программе просто записать значение в переменную привязанную к слейву.

"Просто" - это как?
В примере, действительно, 3 переменных:
- фактическое значение в слэйве (wSlave)
- значение, подготовленное для записи в слэйв со стороны ПЛК (wPlc)
- команда записи

Какая из них вам кажется излишней?



То есть это в любом случае делать самому?

Или так, или через триггеры.


И последнее в в веб визуализации есть переменные которые становятся в TRUE на один цикл? (нажатие кнопки? или обрабатывать в программе)

У кнопок есть параметр Нажатие - привязанная к нему переменная принимает TRUE на время зажатия кнопки.
Обычно эту переменную в программе обрабатывают через R_TRIG / F_TRIG для генерации единичного импульса в момент нажатия / отжатия.

jury_yamal
11.10.2021, 07:24
Спасибо Евгений за ответы.
Но по пункту один все равно недопонимание.
Как я понимаю:
пусть переменную в слейве мы считываем с неким периодом, если надо то пишем в нее . На данном этапе зачем нам флаг записи?
то же самое из ПЛК.
Единственно зачем по мне нужен флаг записи- это если мы начали читать допустим по сети и в этот момент изнутри кода в ПЛК мы пытаемся записать в эту переменную новое значение.
Тогда при отсутствии блокировок или отложенной записи данные будут неоднозначные. Больше не могу придумать зачем 3 переменные.

по п.3. Вопрос возник из за того что этот флаг записи надо постоянно взводить и сбрасывать для последующей записи (когда она понадобится).

Евгений Кислов
11.10.2021, 07:28
пусть переменную в слейве мы считываем с неким периодом, если надо то пишем в нее . На данном этапе зачем нам флаг записи?

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

jury_yamal
11.10.2021, 15:36
Я же говорю про недопонимание свое.
Если мы записали в память по некому адресу переменную, зачем нам каждый цикл в нее что-то записывать (если данные не менялись)?
Считывать в каждом цикле проблем нет.
В программе для PC мы же не ставим флаги записи (в рамках одного потока). Отсюда и недопонимание.

Евгений Кислов
11.10.2021, 16:18
Если мы записали в память по некому адресу переменную, зачем нам каждый цикл в нее что-то записывать (если данные не менялись)?

Все правильно - записывать каждый цикл незачем. Разумно записать значение один раз в нужный момент времени.
Как вы предлагает это сделать без флага записи в ПЛК, который ориентирован на циклическое исполнение своих задач?


В программе для PC мы же не ставим флаги записи (в рамках одного потока).

Не соглашусь - это зависит от конкретной программы.
В некоторых точно так же используются флаги.

jury_yamal
12.10.2021, 19:50
Спасибо еще раз за ответы.
Надо просто принять это как данность и двигаться дальше.:)

Stan_1
23.10.2021, 19:28
Добрый вечер!

Подскажите, плз. Создал Modbus TCP Slave на контролере ПЛК-210.
57659

Все сегменты переменных настроены с адреса 0x0000. Длина массива Holding 20 значений, Input 100 значений.

Отправляю команду: \x00\x01\x00\x00\x00\x06\x01\x04\x00\x00\x00\x0A. Дешифровка:
0001 Transaction identifier 0x0001 (1)
0000 Protocol identifier 0 = MODBUS protocol
0006 Length 0x0006 (6)
01 Unit identifier 0x01 (1)
04 Function code 0x04 (4) - Read Input Registers
0000 Starting address Physical: 0x0000 (0) Logical: 0x0001 (1)
000A Quantity 0x000A (10)

Получаю ответ: 0001 0000 0003 0184 03 Дешифровка:
0001 Transaction identifier 0x0001 (1)
0000 Protocol identifier 0 = MODBUS protocol
0003 Length 0x0003 (3)
01 Unit identifier 0x01 (1)
84 Error code 0x80 + 0x04 (4) - Read Input Registers
03 Exception code [03] ILLEGAL DATA VALUE

Я пробовал менять код функции (3 или 4), адрес (0, 1, 0x1000), пробовал менять число байт для чтения (0, 1, 2, 10, 20). Ничего не помогает.

Еще я менял Slave ID в запросе (предполагая, что при отсутствии TCP Slave ID=2, 3 и так далее, ответ должен быть другой). Но ответ точно такой же. Вообще есть ощущение, что это не ответ слейва, а некий универсальный ответ ПЛК, который считает, что в системе не настроен ни один Slave.

С чем может быть связана проблема?

Евгений Кислов
23.10.2021, 20:14
Добрый день.

Выложите, пожалуйста, проект, на котором я смогу воспроизвести эту ситуацию.

Stan_1
23.10.2021, 21:27
Выложите, пожалуйста, проект, на котором я смогу воспроизвести эту ситуацию.

Кажется, это моя ошибка. Я использовал команду echo -e '\x00\x01\x00\x00\x00\x06\x01\x04\x00\x00\x00\x0A' | nc -q 1 192.168.100.32 502 | xxd

Как оказалось, echo добавляет \x0A (перевод строки), и это ломало запрос. Заменил на printf '\x00\x01\x00\x00\x00\x06\x01\x04\x00\x00\x00\x0A' | nc -q 1 192.168.100.32 502 | xxd и ответ от TCP Slave стал поступать.

Но ответ пустой :( Хотя в самой среде CODESYS вижу, что массив регистров заполняется, и в поле uiClientsConnection вижу подключение мастера.

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

57660

57661

Евгений Кислов
23.10.2021, 21:32
Вы используете функцию 04 - Read Inputs Registers - а на скрине показываете область Holding-регистров.
Да, это неочевидно, но в стандартном слэйве CODESYS термином "inputs" называются holding-регистры, а "outputs" - input-регистры.

Stan_1
23.10.2021, 22:12
Вы используете функцию 04 - Read Inputs Registers - а на скрине показываете область Holding-регистров.
Да, это неочевидно, но в стандартном слэйве CODESYS термином "inputs" называются holding-регистры, а "outputs" - input-регистры.

Да, Вы правы. Получилось. Но не могли бы немного объяснить, я в замешательстве :(

Есть две области: Input registers и Output Registers. Я полагал, что первые читаются функцией 03, вторые - 04. Я связывал переменные с Inputs (который read only, что мне и надо), и пробовал их читать функциями 03 и 04. Всегда были нули. Сейчас, после Вашего письма, добавил переменную в Output Registers, и могу прочитать ее как функцией 03, так и 04.

И вот тут я перестаю понимать смысл регистров разного типа и функций разного типа. Не могли пояснить и поправить фокус? :)

Евгений Кислов
23.10.2021, 22:32
Inputs - это holding-регистры, читаются функцией 03, доступны для записи (вы работает в версии SP14 Patch 3 - в ней эти регистры могут быть изменены только со стороны мастера, но не из программы самого ПЛК).
Outputs - это input-регистры, читаются функцией 04.

У вас, видимо, сейчас значения переменных в обоих областях совпадают - я могу только так объяснить наблюдаемый вами эффект.

Могу порекомендовать посмотреть наш недавний вебинар по Modbus в CODESYS V3.5 - там разобраны практически все нюансы, которые могут встретиться:
https://youtu.be/Q3hqQlqcESo

Про слэйв - с 01:20:30.

Stan_1
24.10.2021, 00:18
Inputs - это holding-регистры, читаются функцией 03, доступны для записи (вы работает в версии SP14 Patch 3 - в ней эти регистры могут быть изменены только со стороны мастера, но не из программы самого ПЛК).
Outputs - это input-регистры, читаются функцией 04.

У вас, видимо, сейчас значения переменных в обоих областях совпадают - я могу только так объяснить наблюдаемый вами эффект.

Могу порекомендовать посмотреть наш недавний вебинар по Modbus в CODESYS V3.5 - там разобраны практически все нюансы, которые могут встретиться:
https://youtu.be/Q3hqQlqcESo

Да, Вы правы. Это из-за пересечения областей. Сейчас развел адресные пространства, и вроде бы все работает, как ожидалось :) Спасибо большое!

ivydy
27.10.2021, 10:40
Здравствуйте. имеем ПЛК200(slave) связан с панелью Weintek(master) по Modbus TCP. Нужно считать/передать несколько длинных массивов, начинающихся с разных адресов, то есть скажем:
- 300 элементов, расположенных по адресу 10000-10299;
- 400 элементов, расположенных по адресу 11000-11399;
- 500 элементов, расположенных по адресу 12000-12499 и тд;
Как это лучше и побыстрее сделать? Можно ли передать массив одной записью, не хочется передавать каждый элемент массива по одному.

Евгений Кислов
27.10.2021, 10:59
Здравствуйте. имеем ПЛК200(slave) связан с панелью Weintek(master) по Modbus TCP. Нужно считать/передать несколько длинных массивов, начинающихся с разных адресов, то есть скажем:
- 300 элементов, расположенных по адресу 10000-10299;
- 400 элементов, расположенных по адресу 11000-11399;
- 500 элементов, расположенных по адресу 12000-12499 и тд;
Как это лучше и побыстрее сделать? Можно ли передать массив одной записью, не хочется передавать каждый элемент массива по одному.

Добрый день.
Да, можно - Weintek должен поддерживать групповые запросы.

А почему вы используете Modbus TCP, а не OPC UA? Или у вас MT8xxxiP?

ivydy
27.10.2021, 11:25
Добрый день.
Да, можно - Weintek должен поддерживать групповые запросы.

А почему вы используете Modbus TCP, а не OPC UA? Или у вас MT8xxxiP?

да, панель MT8071iP (только я не понял при чем здесь это? Разве данная панель не поддерживает OPC UA? Но тем не менее мне все равно нужно использовать модбас по ТехЗаданию). То что панель поддерживает групповые запросы, я знаю. Вопрос скорее в том, как эту передачу данных прописать в Codesys v3.5? Нужно обязательно использовать блоки OwenCommunication или можно как-то обойтись стандартными средствами конфигурирования модбасса? Столкнулся впервые и с овеном и с кодезисом, поэтому пока еще сильно "плаваю" в этом вопросе.Если есть какие-нибудь примеры или образцы, то был бы благодарен

Евгений Кислов
27.10.2021, 11:37
да, панель MT8071iP. То что панель поддерживает групповые запросы, я знаю. Вопрос скорее в том, как эту передачу данных прописать в Codesys v3.5? Нужно обязательно использовать блоки OwenCommunication или можно как-то обойтись стандартными средствами конфигурирования модбасса? Столкнулся впервые и с овеном и с кодезисом, поэтому пока еще сильно "плаваю" в этом вопросе.Если есть какие-нибудь примеры или образцы, то был бы благодарен

Это зависит от требуемого числа регистров в слэйве - стандартные средства поддерживают до 4096 регистров в слэйве, и их адреса будут идти подряд (и можно задать начальный адрес, если необходимо - например, 10000).
Мне кажется, вам проще будет использовать OwenCommunication.
Мы вчера как раз показывали подобный пример на вебинаре:
https://youtu.be/Cv9kxIT1eOA?t=4546

Stan_1
30.10.2021, 19:38
Подскажите, а существует ли библиотека для CODESYS для управления электрокарнизами? Насколько я понял, они не поддерживают MODBUS, и им нужно передвать команды на чистом RS485 с калькуляцией CRC. Примерно так (https://github.com/chuanjiangwong/RS485/blob/665bc856cff307b876acc519dcc02d17ec1dec1d/app/rs485d/src/device/curtain/doya/doya.c).

И я что-то не могу понять, как подступиться. Здесь поиском не нашел тему, либо не те ключевые слова использую :(

Евгений Кислов
30.10.2021, 19:55
Подскажите, а существует ли библиотека для CODESYS для управления электрокарнизами? Насколько я понял, они не поддерживают MODBUS, и им нужно передвать команды на чистом RS485 с калькуляцией CRC. Примерно так (https://github.com/chuanjiangwong/RS485/blob/665bc856cff307b876acc519dcc02d17ec1dec1d/app/rs485d/src/device/curtain/doya/doya.c).

И я что-то не могу понять, как подступиться. Здесь поиском не нашел тему, либо не те ключевые слова использую :(

Вы можете использовать библиотеку OwenCommunication и самостоятельно реализовать протокол этих электрокарнизов.
Блок UNM_SerialRequest позволяет отправить по RS-485 произвольный набор байт.
https://youtu.be/uH3hnXmc0fw

Stan_1
30.10.2021, 20:11
Вы можете использовать библиотеку OwenCommunication и самостоятельно реализовать протокол этих электрокарнизов.
Блок UNM_SerialRequest позволяет отправить по RS-485 произвольный набор байт.
https://youtu.be/uH3hnXmc0fw

Но нужен отдельный порт RS485? Сочетать на одном порту Modbus и собственную реализацию команд не получиться?

Евгений Кислов
30.10.2021, 20:26
Но нужен отдельный порт RS485? Сочетать на одном порту Modbus и собственную реализацию команд не получиться?

Сочетать получится, но в нормальных ситуациях так не делают.

Stan_1
30.10.2021, 21:23
Сочетать получится, но в нормальных ситуациях так не делают.

Ну да :) Нелогично совершенно. Но ставить отдельный контроллер на пару штор тоже не вариант. Можно через Raspberry собрать переходник. Подумаю про такой вариант, ИМХО, это недорого. Его опрашивать можно по Modbus TCP, а там уже простейшая логика.

wildwind1978
12.11.2021, 12:03
Все доброго времени суток.
Случилось поработать с контроллером КРМ фирмы Lovato. У них первый регистр ModBus начинается с адреса -1 и занимает 2 слова. Как его вычитать средствами CodeSys 3.5 без использования библиотек?
СПК107 Codesys 3.5 SP16.

Буду благодарен за ответ.

Евгений Кислов
12.11.2021, 12:08
Все доброго времени суток.
Случилось поработать с контроллером КРМ фирмы Lovato. У них первый регистр ModBus начинается с адреса -1 и занимает 2 слова. Как его вычитать средствами CodeSys 3.5 без использования библиотек?
СПК107 Codesys 3.5 SP16.

Буду благодарен за ответ.

Добрый день.
В спецификации Modbus указано, что адреса регистров принадлежат диапазону 0...65535.

57909

Если выложите документацию на ваш ПЛК - посмотрим, что это может означать.

keysansa
13.11.2021, 17:42
Добрый день.
В спецификации Modbus указано, что адреса регистров принадлежат диапазону 0...65535.

При этом, в документации, которую вы привели, "DataBlock" нумеруется с 1. К вам нет претензий, вы правы, но индексация в Modbus - далеко не прозрачна.

melky
13.11.2021, 17:58
keysansa там все прозрачно, есть физический адрес и логический (+1) а вот как в доках производитель укажет, не всегда явно пишут с какого адреса нумерация.

keysansa
13.11.2021, 18:35
keysansa там все прозрачно, есть физический адрес и логический (+1) а вот как в доках производитель укажет, не всегда явно пишут с какого адреса нумерация.

Да, производители указывают, с какого адреса у них нумерация. Но стандарт зачем тогда? И по моему - это не прозрачно.
ЗЫ. Адрес с 0, данные с 1... Это не прозрачно, это "индусы" ) Особенно в верхнем составе.
ЗЫЫ. Адрес с 0, но производитель решил не с 0, а с 4.
ЗЫЫЫ. Я еще раз перечитал ваше сообщение. "есть физизический адрес и логический".
Совсем стало не понятно. При опросе по шине Modbus, следует использовать какой? Физический или логический?

ASo
13.11.2021, 18:38
Читайте внимательно стандарт, там все описано.
Регистры нумеруются с 1, адреса с 0. Зачем так сделано? Не знаю.

melky
13.11.2021, 19:10
keysansa вы не поняли, стандарт прозрачен, путаницу вносят производители, указывая то физический адрес, то логический как первый в карте регистров своих устройств.

keysansa
13.11.2021, 19:21
Читайте внимательно стандарт, там все описано.
Регистры нумеруются с 1, адреса с 0. Зачем так сделано? Не знаю.

Я прочитал и не раз. Поэтому и пишу, что не прозрачно.

keysansa
13.11.2021, 19:24
keysansa вы не поняли, стандарт прозрачен, путаницу вносят производители, указывая то физический адрес, то логический как первый в карте регистров своих устройств.

Я согласен, что производители вносят путаницу смещением. Но мне не понятно, что в части Modbus является физическим, а что логическим адресом, которые отличатся 1,2,3,4. Я так понимаю, что физический адрес переменной - это адрес памяти устройства, где хранится переменная, доступная обмену по Modbus по ее логическому адресу в таблицах. Но тогда у их смещения могут быть более одной страницы памяти, а никак не +1..4...

Евгений Кислов
13.11.2021, 19:48
Коллеги, если кто-то хочет продолжить дискуссию чисто о Modbus (не применительно к конкретной ситуации с ПЛК, программируемыми в CODESYS V3.5) - создайте отдельную тему в курилке (https://owen.ru/forum/forumdisplay.php?f=6), пожалуйста.

P.S. - про нюансы адресации с конкретными примерами можно почитать здесь (https://ftp.owen.ru/CoDeSys3/98_Books/ModbusTips.pdf) (п. 1.1).

M.Juanito
28.11.2021, 17:44
Добрый день.
Честно пытался найти на форуме ответ, но по "запросу" передний фронт (rising edge) ничего подходящего не нашел.

В проект подлкючено несколько slave устройст. Естественно они орашиваются значительно дольше, чем идет цикл программы.
Я хочу записывать значение в регистр слева, только если оно было изменено и по триггру "передний фронт".

Вопрос:

Если у меня цикле программы будет такая конструкция:

IF A<>B THEN
wNewValue:=B; //переменная привязанная к каналу
xWriteValue:=TRUE; // триггерная переменная
xWriteValue:=FALSE;
END_IF;

слейв заметит этот "передний фронт"? :)
или надо держать триггер в TRUE и ждать когда значение регистра изменится и только потом сбразывать в FALSE?


наверное есть какое то более надженое решение?

Евгений Кислов
28.11.2021, 18:27
слейв заметит этот "передний фронт"?

Нет, не заметит.


или надо держать триггер в TRUE и ждать когда значение регистра изменится и только потом сбразывать в FALSE?

При подобном подходе в некоторых конкретных ситуациях могут возникнуть проблемы: например, записываемое в слэйв значение выходит за допустимый диапазон.
В результате слэйв не будет его обрабатывать, значение в регистре останется прежним и триггер навсегда зависнет в TRUE.


наверное есть какое то более надженое решение?

Есть типовое решение - использовать ФБ R_TRIG из библиотеки Standard для генерации переднего фронта команды записи.
Чтобы говорить про "надежность" - для начала нужно определить ее критерии.

M.Juanito
28.11.2021, 18:52
Есть типовое решение - использовать ФБ R_TRIG из библиотеки Standard для генерации переднего фронта команды записи.

ага. спасибо.

я правильно понял, что после того как R_TRIG отработает, можно будет сразу скинуть тригерную переменную?



IF A<>B THEN
wNewValue:=B; //переменная привязанная к каналу

RTRIGInst(CLK:= TRUE);
xWriteValue := RTRIGInst.Q;
xWriteValue:=FALSE;

END_IF;

Евгений Кислов
28.11.2021, 19:15
Нет, вы поняли неправильно.



IF A <> B THEN
wNewValue := B; //переменная привязанная к каналу
END_IF

RTRIGInst(CLK:= (A <> B), Q => xWriteValue);


Пояснение - передача значений переменных, привязанных к каналам, в коммуникационный драйвер происходит после выполнения цикла задачи, к которой привязана программа.
"Промежуточные" значения (которые переменная принимает до окончания цикла) не учитываются.
В обоих ваших примерах, которые выложены выше, переменная xWriteValue к концу цикла будет иметь значение FALSE - и коммуникационный драйвер "увидит" только его.

M.Juanito
29.11.2021, 12:39
Спасибо!

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

Евгений Кислов
29.11.2021, 13:11
Спасибо!

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

Для изучения какого именно вопроса?

M.Juanito
29.11.2021, 18:46
Для изучения какого именно вопроса?
Написание программ для плк в codesys для обмена данными с другими устройствами по modbus

Евгений Кислов
29.11.2021, 19:33
Написание программ для плк в codesys для обмена данными с другими устройствами по modbus

Начать можно с этого:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v2.2.pdf

Ильнур
15.12.2021, 15:38
Добрый день!
Пытаюсь наладить связь с MasterOPC Universal Modbus Server по руководству (стр.33 )в начале темы.Не получается. ПЛК 210-03. Куда копать, что посмотреть?

Евгений Кислов
15.12.2021, 15:47
Добрый день!
Пытаюсь наладить связь с MasterOPC Universal Modbus Server по руководству (стр.33 )в начале темы.Не получается. ПЛК 210-03. Куда копать, что посмотреть?

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

Ильнур
15.12.2021, 18:47
С соединением с ModbusOPC получилось. Есть рабочий вариант по соединению 2 ПЛК по ModbusTCP?

Евгений Кислов
15.12.2021, 19:01
С соединением с ModbusOPC получилось. Есть рабочий вариант по соединению 2 ПЛК по ModbusTCP?

В документации отдельно описаны настройки для мастера и слэйва:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v2.2.pdf

Конкретного примера нет, потому что для двух ПЛК есть более удобные способы настройки обмена - например, сетевые переменные.

stt149
07.02.2022, 16:23
Здравствуйте!
В "Настройках обмена по протоколу modbus codesys v3.5" Есть фраза "Общее кол-во экземпляров ФБ.... в проекте не должно превышать 10"
Подскажите, с чем это связано и можно ли обойти?

Евгений Кислов
07.02.2022, 16:31
Здравствуйте!
В "Настройках обмена по протоколу modbus codesys v3.5" Есть фраза "Общее кол-во экземпляров ФБ.... в проекте не должно превышать 10"
Подскажите, с чем это связано и можно ли обойти?

Добрый день.
Это связано с ограничениям в системных библиотеках CODESYS.

Обойти в явном виде это нельзя, но можно в пределах одного COM-порта обойтись всего двумя экземплярами: один на открытие порта (COM_Control), второй - для обмена через него (например, MB_SerialRequest).

stt149
07.02.2022, 19:48
... обойти в явном виде это нельзя, но можно в пределах одного COM-порта обойтись всего двумя экземплярами: один на открытие порта (COM_Control), второй - для обмена через него (например, MB_SerialRequest).

Допустим, возьмём экземпляр MB_SerialReques.
Адреса слейвов, коды функций, значения для получения/отправки и т.п. это всё задаётся через переменные, привязанные к этому экземпляру, а дальше экземпляр как-то запускается и происходит обмен. Потом изменяем значения переменных и заново запускаем экземпляр.
Я правильно Вас понял?

Евгений Кислов
07.02.2022, 20:06
Допустим, возьмём экземпляр MB_SerialReques.
Адреса слейвов, коды функций, значения для получения/отправки и т.п. это всё задаётся через переменные, привязанные к этому экземпляру, а дальше экземпляр как-то запускается и происходит обмен. Потом изменяем значения переменных и заново запускаем экземпляр.
Я правильно Вас понял?

Да, совершенно верно.

Belletein
08.02.2022, 07:50
Добрый день. Прошу помощи с настройкой ПЛК200-02. При попытке считать данные по modbus TCP OPC-сервер возвращает ошибку 10. Порты ПЛК соединены в сеть LAN,по 502 порту идёт опрос модулей МВ210, по 503 устройство MOdbus Slave для подключения к сенсорной панели.
59177

Евгений Кислов
08.02.2022, 08:11
Добрый день. Прошу помощи с настройкой ПЛК200-02. При попытке считать данные по modbus TCP OPC-сервер возвращает ошибку 10. Порты ПЛК соединены в сеть LAN,по 502 порту идёт опрос модулей МВ210, по 503 устройство MOdbus Slave для подключения к сенсорной панели.
59177

Добрый день.
https://owen.ru/forum/showthread.php?t=28167&p=373724&viewfull=1#post373724

stt149
24.02.2022, 15:06
Здравствуйте!
Возможно плохо искал и где-то есть ответ.
Можно ли одновременно использовать библиотеку owencommunication и стандартные средства кодесис?
Owencommunication мастер на двух 485х портах - исполнительные механизмы,
стандартные средства по ethernet modbus TCP - граф. дисплей.

Возникает проблема, запускаем систему, даем задание через граф дисплей (например, частоту на ПЧ) ПЛК отрабатывает.
Но при попытке запустить исполнительные механизмы ПЛК виснет и до перезагрузки.
Но самое интересное, что вся система работала несколько дней, никаких корректив не вводилось и вдруг возникла такая проблема.
Подробнее пока не могу описать, не на объекте.
Подскажите, пожалуйста, куда копать?

kondor3000
24.02.2022, 15:12
Здравствуйте!
Возможно плохо искал и где-то есть ответ.
Можно ли одновременно использовать библиотеку owencommunication и стандартные средства кодесис?
Owencommunication мастер на двух 485х портах - исполнительные механизмы,
стандартные средства по ethernet modbus TCP - граф. дисплей.

Возникает проблема, запускаем систему, даем задание через граф дисплей (например, частоту на ПЧ) ПЛК отрабатывает.
Но при попытке запустить исполнительные механизмы ПЛК виснет и до перезагрузки.
Но самое интересное, что вся система работала несколько дней, никаких корректив не вводилось и вдруг возникла такая проблема.
Подробнее пока не могу описать, не на объекте.
Подскажите, пожалуйста, куда копать?

У меня так не работало, либо биб-ки, либо конфигурация. Работало скорее всего, пока биб-ки не запустились.

Евгений Кислов
24.02.2022, 16:00
Здравствуйте!
Возможно плохо искал и где-то есть ответ.
Можно ли одновременно использовать библиотеку owencommunication и стандартные средства кодесис?
Owencommunication мастер на двух 485х портах - исполнительные механизмы,
стандартные средства по ethernet modbus TCP - граф. дисплей.

Возникает проблема, запускаем систему, даем задание через граф дисплей (например, частоту на ПЧ) ПЛК отрабатывает.
Но при попытке запустить исполнительные механизмы ПЛК виснет и до перезагрузки.
Но самое интересное, что вся система работала несколько дней, никаких корректив не вводилось и вдруг возникла такая проблема.
Подробнее пока не могу описать, не на объекте.
Подскажите, пожалуйста, куда копать?

Добрый день.
Можно одновременно использовать библиотеку OwenCommunication и стандартные средства CODESYS - если они работают с разными интерфейсами (как в вашем случае).


ПЛК виснет

Опишите, как именно это проявляется.

Cs-Cs
24.02.2022, 16:02
stt149 Хм. У меня есть проект, где используются на СПК107:
* SysCom (до этого работало на OCL) - два интерфейса;
* Modbus TCP - один
* Modbus RTU через штатную кофигурацию (объекты в дереве проекта) - два интерфейса
Всё работает на ура. Так что-то там не то или не так.
Эээ... ещё раз (может я путано пояснил): у меня один интерфейс опрашивается только одним способом. То есть, один RS-485 опрашивается через SysCom, другой - штатно и так далее.

stt149
28.02.2022, 23:46
Добрый день.
Можно одновременно использовать библиотеку OwenCommunication и стандартные средства CODESYS - если они работают с разными интерфейсами (как в вашем случае).

Опишите, как именно это проявляется.

Проявляется погасанием среднего (из трех служебных) светодиода и отсутствием реакции у исполнителей.
Проблема происходит когда идет обращение к OCL.MB_SerialRequest.
при подключении к ПЛК наблюдаю надпись "отсутствует исходный код для данного объекта поскольку он относится к компилированной библиотеке owencommunication..." исходника нет, пробовал много всего, ничего не помогает.
При отключении ПК от ПЛК ничего не меняется.

Подскажите, что делать? куда копать?

Евгений Кислов
01.03.2022, 06:16
Проявляется погасанием среднего (из трех служебных) светодиода и отсутствием реакции у исполнителей.
Проблема происходит когда идет обращение к OCL.MB_SerialRequest.
при подключении к ПЛК наблюдаю надпись "отсутствует исходный код для данного объекта поскольку он относится к компилированной библиотеке owencommunication..." исходника нет, пробовал много всего, ничего не помогает.
При отключении ПК от ПЛК ничего не меняется.

Подскажите, что делать? куда копать?

Выложите ваш проект - я попробую воспроизвести проблему у себя и разобраться, что происходит.

Надпись появляется сразу при первом вызове ФБ MB_SerialRequest?
Какую версию библиотеки OwenCommunication вы используете?

stt149
01.03.2022, 11:49
Не сразу, только при выполнении определенного куска кода.
версия 3.5.11.5
Проект отправил на почту, тема "отсутствует исходный код owencommunication"

Евгений Кислов
01.03.2022, 11:51
Не сразу, только при выполнении определенного куска кода.
версия 3.5.11.5
Проект отправил на почту, тема "отсутствует исходный код owencommunication"

Какого именно куска?
Ваше письмо не пришло - наверное, попытались приложить проект прямо к письму.
Залейте на файлообменник и пришлите ссылку.

stt149
01.03.2022, 11:57
И сейчас не пришло?
У Вас есть мессенджер для связи, кроме skype?

Евгений Кислов
01.03.2022, 12:02
И сейчас не пришло?
У Вас есть мессенджер для связи, кроме skype?

Сейчас пришло.
Посмотрю и отпишусь.
Из мессенджеров есть еще telegram.

stt149
01.03.2022, 12:09
как туда написать?
Вдруг понадобятся комментарии к коду,

Евгений Кислов
01.03.2022, 12:11
как туда написать?
Вдруг понадобятся комментарии к коду,

Пришлите мне на почту свой телеграм - я вам напишу.

Евгений Кислов
25.03.2022, 18:31
Здравствуйте, подскажите решение. Есть переменная REAL которая меняется из визуализации, как отправить её по модбасу понятно, а как её одновременно изменять из сети и из визуализации, что б без конфликта не понятно.

Добрый день.
Контроллер - мастер или слэйв?
Каким образом "по сети" изменяется значение переменной?

Евгений Кислов
25.03.2022, 19:19
СПК слейв, а вот остальное пока загадка. Регистры мы читаем с СПК, можем в них записать. И тут конфликт. Задача: читать и изменят переменные в СПК, но они должны ещё изменяться из визуализации. Есть пробы отослал на почту.

Мастер записывает в СПК циклически или событийно?

Евгений Кислов
25.03.2022, 19:31
Вот до этого не дошли ещё, думаю по изменении будет.

Используйте прошивку с SP16 - в ней не сложно сделать это даже с помощью стандартных компонентов в дереве проекта.
См. видео: https://youtu.be/Q3hqQlqcESo?t=5491

Евгений Кислов
25.03.2022, 22:04
Спасибо, хорошее видео. А как привязать переменную xWriteToSlave к вводу с экрана СПК?59904, что бы при вводе она переключалась в TRUE? И DUT нужно создавать для каждой переменной REAL?

Перенесите переключение этой переменной в OnDialogClosed.

Евгений Кислов
26.03.2022, 08:45
Спасибо, и как всё-таки это выглядит если несколько переменных типа REAL?

По аналогии - cделать свой IF ... END_IF на каждую переменную.


К этому видео нужен пример и желательно на СПК с использованием лампочек тумблеров и вводом уставок.

Я понимаю, что практически каждый начинающий пользователь хочет, чтобы мы сделали видео по решению его конкретной задачи, с его конкретным набором лампочек и чтобы они были именно нужных ему цветов и т.д.
Но технически это довольно затруднительно.
Вместо это мы проводим для таких начинающих пользователей учебные курсы, где простым и понятным языком объясняются основы работы в CODESYS и базовые приемы, с помощью которых можно решать типовые задачи: https://owen.ru/edu

Евгений Кислов
26.03.2022, 11:31
5990659907 Так правильно?

В объединении не было смысла делать копипасту.