PDA

Просмотр полной версии : Проблема с PresetMultipleRegister (0x10 функция)



Денис_NTS
18.05.2011, 00:26
Есть проблема с записью в контроллер плк100 функцией 0х10 по ModBus TCP. Значения не записываются, если писать 0х03 то всё ок. На ModBus TCP Slave (эмулятор) всё работает на ура ,а вот плк писать не хочет. Слёзно прошу помочь...Мастером (который собственно пишет и считывает)является приложения написанное на С++. Кстати с чтением все шикарно...

Николаев Андрей
18.05.2011, 14:11
Запись области памяти в контроллере не реализована. То есть Вы можете записывать только возможный подмодуль: 2Байта, 4Байта. И, соответственно 10 команда теряет смысл.
Однако, с использованием SysLibSocket Вы можете реализовывать обмен как Вам удобно (конфигурация ПЛК при этом вообще не используется).

Денис_NTS
18.05.2011, 15:23
наконец-то я услышал это....большое вам спасибо!!! а то столько, знаете, умных - у всех всё работает.

IVM
18.05.2011, 15:28
Запись области памяти в контроллере не реализована. То есть Вы можете записывать только возможный подмодуль: 2Байта, 4Байта. И, соответственно 10 команда теряет смысл.
Однако, с использованием SysLibSocket Вы можете реализовывать обмен как Вам удобно (конфигурация ПЛК при этом вообще не используется).
При работе с ПЛК110-60 я использовал код функции 10Нex (запись регистров) и все прекрасно работало (писал за раз 5 регистров). Правда интерфейс был RS-485. Странно что эта функция не реализована для ПЛК100.

Денис_NTS
18.05.2011, 15:28
то есть я могу реализовать свой протокол средствами этой библиотеки!!!!????

Денис_NTS
18.05.2011, 15:29
А на плк 150 кто-нибудь пробовал???

IVM
18.05.2011, 15:46
то есть я могу реализовать свой протокол средствами этой библиотеки!!!!????
Сможите, но придется гору кода наворотить.

IVM
18.05.2011, 15:48
0x10 функции у ПЛК нет, имеется ввиду что сам ПЛК не может записать на другое слейв устройство несколько регистров, для этого используют вышеоуказанную библиотеку. Что же касается записи регистров в ПЛК, у которого открыта область слейва, нет ни каких проблем ни с ПЛК1**
Так проблема у товарища как раз с записью регистров в контроллер из PC (PLC - Slave), если я правильно понимаю.
Скорее всего ошибка в коде на C++.

IVM
18.05.2011, 16:04
:) так это вопрос к Андрею Николаеву, он ввел человека в заблуждение

Я уже обозначил свою позицию, что надо искать ошибку в проге на ПК, возможно адрес устройства неправильно установлен
Есть ли отклик от ПЛК в ответ на посылку PC функции с кодом 10Hex ? Если есть, то какой.

Денис_NTS
18.05.2011, 16:15
Сможите, но придется гору кода наворотить.

Он уже давно наворечен)))))

Денис_NTS
18.05.2011, 16:17
Есть ли отклик от ПЛК в ответ на посылку PC функции с кодом 10Hex ? Если есть, то какой.Отклик есть как-будто запись прошла...возвращает кол-во записанных байт

Денис_NTS
18.05.2011, 16:30
:)

Я уже обозначил свою позицию, что надо искать ошибку в проге на ПК, возможно адрес устройства неправильно установлен

Я же говорил что всё кроме записи х10 функцией работает....причем если работаю не с контроллером а с симулятором всё работает

IVM
18.05.2011, 18:17
Отклик есть как-будто запись прошла...возвращает кол-во записанных байт
Возьмите описание на Modbus и посмотрите, что должно быть в отклике на код функции 10Hex и что есть у Вас (не что-то как будто, а конкретно, побайтно). Если отклик корректный, то все с обменом нормально. Пока не разберетесь с откликом так и будете плутать во тьме.

Денис_NTS
18.05.2011, 18:25
Да я всё уже перерыл и ответ приходит какой нужно....и под симулятор я ничего не настраивал . Работал сразу с контроллером, а вот когда с записью не получилось сдул симулятор....
Request = 0000000000060110010000020400010001
Response= 000000000006011001000002000000000000

IVM
18.05.2011, 18:27
Он уже давно наворечен)))))
Код надо наворочать на CoDeSys. Надо будет управлять COM-портом ПЛК на низком уровне.

IVM
18.05.2011, 18:29
Да я всё уже перерыл и ответ приходит какой нужно....и под симулятор я ничего не настраивал . Работал сразу с контроллером, а вот когда с записью не получилось сдул симулятор....
Request = 0000000000060110010000020400010001
Response= 000000000006011001000002000000000000
Если отклик нормальный (ПЛК все принял правильно), то в чем проблема.

Денис_NTS
18.05.2011, 18:33
Если отклик нормальный (ПЛК все принял правильно), то в чем проблема.

В регистрах пусто....на контроллере....

IVM
18.05.2011, 18:35
В регистрах пусто....на контроллере....
Сколько регистров посылаете и что значит пусто.

Денис_NTS
18.05.2011, 18:39
2 по 2 байта посылаю по единице в регистре.....а на контроллере "0"-и

IVM
18.05.2011, 19:02
2 по 2 байта посылаю по единице в регистре.....а на контроллере "0"-и
Проставьте значения для каждой строки: (это надо смотреть в отпадчике вашей проги на PC)


PC -> PLC
Адрес подчиненного -
Функция -
Начальный адрес ст. -
Начальный адрес мл. -
Кол-во регистров ст. -
Кол-во регистров мл. -
Количество байт -
Данные ст. -
Данные мл. -
Данные ст. -
Данные мл. -
Контрольная сумма мл. -
Контрольная сумма ст. -


PC <- PLC

Адрес подчиненного -
Функция -
Начальный адрес ст. -
Начальный адрес мл. -
Кол-во регистров ст. -
Кол-во регистров мл. -
Контрольная сумма мл. -
Контрольная сумма ст. -


Контрольная сумма (расчетная) мл. -
Контрольная сумма (расчетная) ст. -

Денис_NTS
18.05.2011, 20:46
IVM и capzap большое спасибо! Сегодня еще помучаюсь... завтра напишу ...по возможности загляните в тему завтра

Денис_NTS
20.05.2011, 10:24
нет пока не отмучился ....времени не было...

Денис_NTS
20.05.2011, 13:22
на посылку = 000000000006 01 10 00 02 00 02 04 01000000
приходит ответ = 000000000006 01 10 00 02 00 02 00
но в регистр ничего не записалось...есть подозрение, что для записи мултирегистров должен быть элемент "string" но его в режиме слэйва почему-то нет. :confused: ????

Денис_NTS
20.05.2011, 13:50
в модуль 4 байте тоже не могу записать ,
запрос = 000000000006 01 10 00 00 00 02 0401020304
ответ = 000000000006 01 10 00 00 00 02
есть у кого-нибудь возможность проверить это на плк 100???

Денис_NTS
20.05.2011, 14:17
я не уверен что панель по протоколу модбас работает...
скорее всего овен

Денис_NTS
20.05.2011, 14:19
если Вы в плк 100 писали х10 функцией и все работало тогда вопрос исчерпан...пример будет полезен...спасибо

Денис_NTS
20.05.2011, 14:31
capzap, Вы пробовали писать в плк 100 х10 функцией???? главный вопрос для меня. если да - то я отстану...просто я отложил свою библиотеку в сторону ...написал простой ,где поднимаю сокет и делаю запрос выше упомянутого вида и получаю ответ соответственно...а на плк ничего....

Денис_NTS
20.05.2011, 14:37
такого я не ожидал....мне чужой код не нужен ...спасибо за диалог...жаль ,что кроме упреков в безграмотности ничего полезного не услышал..

Денис_NTS
20.05.2011, 14:57
да нет... я уже вдоль и поперек излазил...у меня конкретная задача - написать библиотеку под наш софт... и никаких сторонних библиотек мы не используем по убеждению(так привыкли). кстати насчет библиотек сейчас попробую ActiveX modbus в тесте запустить...позже отпишусь

Денис_NTS
20.05.2011, 15:28
capzap!!!Спасибо Вам!!! ... за подсказку про "внедрить ...." я запустил приложение, которое писал с тем самым ActiveX modbus...и О Чудо заработало...потом запустил его(диалог) + modbus TCP slave посмотрел посылки....и вот что нашел...тот самый 6-ой байт он отличается от "6" но только как он вычисляется и что это вообще , я пока не понял....в документации по протоколу пока не нашел...если знаете что это буду признателен ...

Денис_NTS
20.05.2011, 15:45
Это размер PDU....Вот это залет...неделю сражался...

IVM
20.05.2011, 16:52
на посылку = 000000000006 01 10 00 02 00 02 04 01000000
приходит ответ = 000000000006 01 10 00 02 00 02 00
но в регистр ничего не записалось...есть подозрение, что для записи мултирегистров должен быть элемент "string" но его в режиме слэйва почему-то нет. :confused: ????
Сколько регистров пишется в ПЛК и что такое 000000000006 ?

Денис_NTS
20.05.2011, 21:39
Сколько регистров пишется в ПЛК и что такое 000000000006 ?
Это MBAP header и в нем размер ADU(6) моя ошибка в том , что размер АДУ не 6 а больше,6 байт это у посылки на чтение. Пишется 2 регистра 4 байта.

IVM
21.05.2011, 10:06
Это MBAP header и в нем размер ADU(6) моя ошибка в том , что размер АДУ не 6 а больше,6 байт это у посылки на чтение. Пишется 2 регистра 4 байта.
А где сами байты и контрольная сумма, которые Вы посылаете в ПЛК. В пакете их не видно.
А где контрольная сумма иэ ПЛК. В пакете отклике ее нет.

PC -> PLC
Адрес подчиненного - 01
Функция - 10
Начальный адрес ст. - 00
Начальный адрес мл. - 02
Кол-во регистров ст. - 00
Кол-во регистров мл. - 02
Количество байт - 04
Данные ст. - ?
Данные мл. - ?
Данные ст. - ?
Данные мл. - ?
Контрольная сумма мл. - ?
Контрольная сумма ст. - ?


PC <- PLC

Адрес подчиненного - 01
Функция - 10
Начальный адрес ст. - 00
Начальный адрес мл. - 02
Кол-во регистров ст. - 00
Кол-во регистров мл. - 02
Контрольная сумма мл. - ?
Контрольная сумма ст. - ?


Контрольная сумма (расчетная) мл. - ?
Контрольная сумма (расчетная) ст. - ?

Денис_NTS
21.05.2011, 19:07
Для ModBus TCP она не нужна...01000000 вот они байты....тема закрыта у меня всё работает! УРА!!!

vasylye
21.11.2012, 14:22
При работе с ПЛК110-60 я использовал код функции 10Нex (запись регистров) и все прекрасно работало (писал за раз 5 регистров). Правда интерфейс был RS-485. Странно что эта функция не реализована для ПЛК100.


вы могли бы дать простейший пример для записи этих регистров?

у меня стоит задача считывать / записывать почти две сотни регистров, если писать по одному, то очень долго получается....

IVM
21.11.2012, 14:36
вы могли бы дать простейший пример для записи этих регистров?

у меня стоит задача считывать / записывать почти две сотни регистров, если писать по одному, то очень долго получается....
Пишите в личку.