Не могли бы Вы объяснить как правильнее написать?
С чем может быть связан ErrorCode 60 - RESPONSE_CRC_FAIL? Ошибка возникает при попытке записи в удаленное устройство данных длинной свыше 30, для чтения и записи используется блок OCL.MB_SerialRequest, eFuncCode - OCL.MB_FC.WRITE_MULTIPLE_REGISTERS.
Различные варианты Tameout пробовал выставлять. В какую сторону стоит копать? Не хотелось бы разбивать данные на две записи, тем более набора данных длиной свыше 50 не планируется.
С чем может быть связан ErrorCode 60 - RESPONSE_CRC_FAIL
А на что вообще указывает эта ошибка?
С ней жить можно, но хотелось бы понять суть
Ведь если смотреть стандарт Modbus то при определении ошибки в пакете (ну того же CRC) просто повторяется запрос и инициатор запроса либо получает правильные данные, либо не получает их вообще.
Или я не прав?
Поделюсь результатами экспериментов - может кому пригодится.
На текущий момент время цикла стоит 5 мс. При этом мое фактическое время цикла в среднем 400 мкс, макс 700 мкс
Увеличение времени цикла ни до 10 ни до 20 мс. в моем случае эффекта не возымело. Ошибка возникала
А вот снижение скорости с 115200 до 57600 помогла.
При этом если на скорости 115200 затрачиваемое время на обмен занимало 35 мс. то на 57600 35-45 мс. что не ктитично и меня более чем устраивает.
Провел еще один эксперимент- уменьшил время цикла до 3 мс. при скорости 57600 время на обмен стало занимать от 27 до 33 мс. Ошибок пока не возникало.
Видимо используемый мною драйвер сервопривода не очень хорошо работает на 115200
В итоге решил остановиться на скорости 57600 c временем цикла задачи 10 мс. При таком раскладе время затрачиваемое на обмен 70 мс. всегда. Решил что так будет надежнее
Ошибок после 2-х часов работы - ни одной
Добрый день!
Есть система: панель(сп310), плк210 и модем IRZ для отправки данных. Панель является мастером и общается с плк по modbus tcp через OCL mb tcp slave. Необходимо чтобы модем опрашивал плк. Можно ли опрашивать тот же ocl slave по тем же адресам массива word`ов или необходимо добавить еще регистров(например было 0..999, а станет 0...1999)? В данный момент нет возможности испытать, т.к. все оборудование на объекте в другом городе.
Добрый день.
Можно.
В менеджере библиотек потребуется изменить значение параметра библиотеки, определяющего максимальное число одновременных подключений к слэйву.
Вложение 66596
Подскажите к порту подключено 2 устройства к чему или к кому обращаться что бы узнать код ошибки или ошибку, если одно устройство отвалится или запрос отправляет не тот?
Подскажите, как при помощи xDone можно определить число принятых корректных пакетов?
Я настроил и подключил прибор МВ110-226-16д к своему ПЛК. Программа заточена на чтение 1 раз в секунду из МВ110. И она действительно так работает. Лампочка на МВ110 подмигивает 1 раз в секунду.
Задача, которая должна словить количества принятых корректных пакетов запускается 50 раз в секунду.
Я вижу:
Вложение 66671
Я слежу на xDone. Он всегда поднят. wCount3 увеличивается на 50 за 1 секунду. wCount4 не увеличивается.
Я слежу за xBusy. Он всегда опущен. wCount1 не увеличивается. wCount2 увеличивается на 50 за 1 секунду.
Может я неправильно настроил параметр "Всегда обновлять переменные: ВКЛ.2 (всегда в задаче цикла шины)"?
По скриншоту непонятно, как настроен обмен.
Выложите ваш проект - посмотрим, что происходит.
Вот: Вложение 66672
Обмен настроен через стандартный компонент Modbus Slave Com Port.
Изначальная задача: "посчитать количество ушедших/пришедших пакетов по шине ModBus для одного из устройств".
См. пример:
https://owen.ru/forum/showthread.php...l=1#post403643
Спасибо за пример. Я разобрался.
Этот счетчик пакетов считает пакеты всего устройства целиком.
А существует ли счетчик, который считает пакеты по каналам?
Вложение 66686
В данный момент нет, но такое пожелание зафиксировано в баг-трекере CODESYS.
Вложение 66688
Добрый день. Подскажите, в чем может быть проблема?
При компиляции выдает следующие ошибки:
------ Компиляция : Приложение: Device.Application -------
типизировать код...
генерировать код...
генерировать глобальные инициализации ...
генерировать код инициализации...
[WARNING] iodrvmodbus, 3.5.4.0 (3s - smart software solutions gmbh): UpdateSlaveFBTriggers [ModbusSlaveComPort]: C0196: Неявная конверсия из типа без знака 'UINT' в тип со знаком 'INT': возможно изменение знака
[ERROR] СПК107 SP5 P5: C0189: ';' требуется вместо 'м'
[ERROR] СПК107 SP5 P5: C0046: Идентификатор 'HandleMousedownInfoNested' не задан
[ERROR] СПК107 SP5 P5: C0009: Обнаружен недопустимый символ 'м'
[ERROR] СПК107 SP5 P5: C0189: ';' требуется вместо 'GenElemInst379'
[ERROR] СПК107 SP5 P5: Internal error in Statement: (GenElemInst379[0] := BYTE#0); : System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в ..(IndexAccessExpression ) в _3S.CoDeSys.LanguageModelManager.IndexAccessExpres sion.( ) в ..(AssignmentExpression ) в _3S.CoDeSys.LanguageModelManager.AssignmentExpress ion.( ) в ..(ExpressionStatement ) в _3S.CoDeSys.LanguageModelManager.ExpressionStateme nt.( ) в ..(SequenceStatement )
[ERROR] СПК107 SP5 P5: C0018: 'GenElemInst379[0]' is no valid assignment target
[ERROR] СПК107 SP5 P5: C0046: Идентификатор 'GenElemInst379' не задан
[ERROR] Internal error:System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в _3S.CoDeSys.LanguageModelManager.CompileContext.( Signature , Signature , CompileContext , Boolean ) в _3S.CoDeSys.LanguageModelManager.CompileContext.( Boolean ) в _3S.CoDeSys.LanguageModelManager.CompileContext.Ge nerateCodeInit(Boolean bOnlineChange, Boolean bSignatureDone, CompileContext comconRef, Signature& signGlobalImplicit, Boolean bLinkAll) в _3S.CoDeSys.LanguageModelManager.LanguageModelMana ger.(Guid , Boolean , Boolean , Boolean , IOnlineChangeDetails& , IMessage[]& , IMessage[]& )
Компиляция завершена -- 8 ошибок, 1 предупреждений : загрузка невозможна!
Добрый день.
Вы используете CODESYS V3.5 SP5 Patch 5?
Да, так как работаю СПК107 версии 5.472.
Modbus Master, COM Port Версия: 3.5.5.0
Да, использую версии 3.5.4.13
Доступ к загрузке получил, но при ее выполнении появляется следующая ошибка:
Вложение 67409
Не знаю, как поступать с Ethernet компонентом. Изначально я считал, что его настройки должны совпадать с настройками связи контроллера, но установленные в нем адрес, маска, шлюз будто бы ни на что не влияют, связь со слейвами не теряется при несовпадении их адресов. Допустим, необходимо динамически менять ip-адреса modbus tcp устройств. Дать возможность оператору устанавливать адрес и маску родительского компонента самостоятельно? Копировать туда параметры контроллера? Не трогать его вообще?
И можно ли как-то менять программно тайм-ауты и unit-id tcp устройств?
Лучше - не трогать. Этот компонент не влияет на сетевые настройки контроллера - их можно изменить в конфигураторе или (для СПК) через узел Network.Цитата:
Дать возможность оператору устанавливать адрес и маску родительского компонента самостоятельно? Копировать туда параметры контроллера? Не трогать его вообще?
Таймауты и Unit ID, насколько я понимаю, нельзя.Цитата:
Допустим, необходимо динамически менять ip-адреса modbus tcp устройств.
...
И можно ли как-то менять программно тайм-ауты и unit-id tcp устройств?
IP-адреса можно:
https://owen.ru/forum/showthread.php...l=1#post296714
Здравствуйте.
Нужно опрашивать на одном порту RS485 модули Мх110 по MODBUS и несколько устройств с самописным протоколом используя UNM_SerialRequest.
Попалась как раз не нормальная ситуация, как уже отвечали на форуме.
Как совместить опрос на одном порту по двум протоколам? Я так понимаю, нужно самому контроллировать открытие/закрытие порта и ставить блокирующие флаги, чтобы по очереди вызывался опрос устройств и модулей?
Возможно ли совместить настройку модулей Мх110 через конфигуратор и управление опросом из программы?
Делал опрос по разным протоколам, на одном порту, один RTU, другой не стандартный ( но на одной скорости 115200, четности и стоп битах, 8N1)
Проcто переключая 2 программы опроса через 300 ms, всё работало без ошибок. Опрос через биб-ки.
Иначе придётся открывать и закрывать порты, что будет очень медленно.