Здравствуйте, уважаемая техподдержка! Мы пытаемся наладить связь по ADS между контроллером BC9020 и Trace Mode. Проблема в следующем. В контроллере в области прямоадресуемой памяти объявлена переменная INT длиной 2 байта по адресу 10. Для того, чтобы прочитать эту переменную из Trace Mode, настраиваем драйвер T12 следующим образом Параметр #1(B) - 0x1 Параметр #2(B) - 0x0 Параметр #3(W) - 0x4020 Параметр #4(W) - 0xa Направление - Input Тип данных - Integer Дополнительно - BECKHOFF:ID=192.168.3.2.1.1;Port=800; Аргумент экрана - INT. Проблема в том, что значение выводится на экран, но побайтно, то есть выводится только значение 10 байта, а переменная двухбайтная и занимает 11-й байт тоже. В принципе можно склеить значения 2-х байтов и получить желаемый результат, но удваивается количество каналов в проекте. Подскажите пожалуйста, в чем моя ошибка?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1. Аргумент экрана должен быть привязан к каналу HEX16, который связан с указанным "Источником". 2. Параметр #1(B) - 0x1 означает, что Вы принимаете переменную размером 1 байт. Вы не пробовали поставить Параметр #1(B) - 0x2?
Posted by intellis (Участник № / Member № 2383) on :
Спасибо, после отработки пункта 2 все заработало! Настраивал связь по видеопримеру подключения Beckhoff и даже не догадывался, что Параметр #1(B) означает количество байт. Спасибо за качественную техподдержку!
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Отправил описание драйвера.
Posted by intellis (Участник № / Member № 2383) on :
Спасибо, получил.
Posted by intellis (Участник № / Member № 2383) on :
Здравствуйте, уважаемая техподдержка! Чтобы не плодить темы, продолжу здесь. При увеличении источников, связанных с контроллером BC9020 по протоколу ADS (в узле планируется около 1500 источников) очень сильно упала скорость обмена с контроллером. Данные обновляются примерно 1 раз в 10 секунд, это касается и чтения и записи. При этом проверяли утилитой от производителя Twincat ADS Monitor, в ней обмен по-прежнему быстрый. Или драйвер Beckhoff в Trace Mode рассчитан на небольшое количество источников?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Вам надо организовать связь групповыми запросами через каналы ChGroupReq, как указано в переданном Вам описании драйвера.
Posted by intellis (Участник № / Member № 2383) on :
Спасибо за ответ. Пока получилось вывести несколько аналоговых сигналов. В связи с этим несколько вопросов. 1. Возможно ли через Call.ChGroupReq не только собирать данные, но и задавать значения в контроллер (у меня пока не получилось). 2. Какое оптимальное количество параметров без потери скорости обмена можно передавать через Call.ChGroupReq. 3. Что делать с масштабированием аналоговых сигналов, которые я обычно выполнял в канале типа Float? Пока два варианта: каждый аргумент Call.ChGroupReq перенаправлять на каналы Float, второй - через программу в TM.
Posted by intellis (Участник № / Member № 2383) on :
Поправка ко второму вопросу. Имелось в виду, сколько параметров без потери скорости обмена можно передавать через ОДИН канал Call.ChGroupReq
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1. Групповая запись в драйвере не предусмотрена. 2. Методического ограничения на количество переменных, запрашиваемых групповым образом через 1 канал ChGroupReq, нет. Надо только учитывать, что чем длиннее кадр, тем больше вероятность появления ошибки в ответе и, следовательно, больше вероятность переспросов. За счет этого может снизиться производительность. Других причин для снижения скорости обмена я не вижу. 3. Если полученные групповым запросом переменные Вам не надо архивировать, обрабатывать для посылки сообщений в ОТ и пр., то, видимо, линейное преобразование для отображения на экране или в документе можно произвести и в программе. Если Вам для каких из этих переменных все-таки понадобятся каналы, то линейное преобразование можно произвести в их штатных внутренних процедурах обработки.
Posted by intellis (Участник № / Member № 2383) on :
Спасибо за ответ, будем пробовать.
Posted by intellis (Участник № / Member № 2383) on :
Подключил все входные сигналы (более 500) через Call.ChGroupReq, с аргументов Call.ChGroupReq на обычные каналы и все заработало на ура! При том, что в узле около 500 выходных сигналов, которые выводятся обычном образом, без Call.ChGroupReq, время обмена с контроллером не более секунды.
Posted by ivostrikov (Участник № / Member № 4308) on :
Пришлите, пожалуйста описание драйвера BECKHOFF на mrven@mail.ru
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Для связи с Twin-Cat используется
Пользовательский драйвер типа 12 подтипа 1.
t12s114.dll - драйвер должен быть размещен рядом с исполняемыми файлами Trace Mode.
tsadsdll.dll и прочие dll от Twin-Cat должны быть инсталлированы и зарегистрированы.
Допускается линковка "Источников" на Call.ChGReq.
НАСТРОЙКИ "Источников/Приемников".
Параметр1: тип операции 255 - чтение кода ошибки возвращаемого API - 1 целое 16 - чтение статуса nAdsState,nDeviceState - 2 целых
если источник залинкован на канал (тип In/Out задает операцию чтения.записи) 0, (с доступом по имени - не обязательно) - 1 4х байтовая переменная формат плавающий или целый задается каналом(FLOAT,HEX) 1,2,3,4 (с доступом по адресу - не обязательно) - парам3=indexGroup,парам4=indexOffset длина данных= (парам1) размер элемента = 1,2,,4
если источник залинкован на Call.ChGReq 0, при конвертации превращается в 5,6,7,8 в зависимости от типа аргумента 5,6,7,8,9 с доступом по имени или по адресу к массиву длина данных= (парам1-4)*(число аргументов в канале) размер элемента = 1,2,,4(float),4(INT32)
Параметр2: - номер контроллера (от 0 до 255) Параметр3: - indexGroup Параметр4: - indexOffset
Поле ДОПОЛНИТЕЛЬНО: Если ID и/или Port не заданы, то используеся локальный и 801
Name=имя_параметра - (обязательно, в случае задания ID и/или Port - не обязательно)
<BECKHOFF> - у всех каналов обязательно <BECKHOFF:Name=имя_параметра> - у каналов с доступом по имени <BECKHOFF:ID=NN.NN.NN.NN.mm.mm;Port=ppp;Name=имя_параметра;> - у каналов с доступом по имени Разделитель <;> - обязателен.
коды TRACE MODE
ERR_RT_CONNECT=17 - библиотека TsAdsDll.dll не загружена ERR_RT_NOTFOUND=12 - ошибка преобразования имени в адрес ERR_RT_READ=4 - ошибка чтения ERR_RT_FORMAT=7 - доступ по имени, а имя не определено
В RTM каналы видны как 12.114.
Posted by ivostrikov (Участник № / Member № 4308) on :
Как мне, например, считать групповым запросом через CALL.ChGroupReq 20 переменных типа INT(2 байта), начиная с адреса MB3000(indexGroup = 0x4020, indexOffset = 0xbb8)?
Posted by ivostrikov (Участник № / Member № 4308) on :
Спасибо, уже разобрался
Posted by Polag (Участник № / Member № 4573) on :
Пришлите, пожалуйста описание драйвера BECKHOFF на polygalov83@mail.ru
Posted by Polag (Участник № / Member № 4573) on :
Здравствуйте, уважаемая техподдержка! Мы пытаемся наладить связь по ADS между контроллером BC9050 и Trace Mode. Проблема в следующем. В контроллере в области прямоадресуемой памяти объявлена переменная REAL длиной 4 байта по адресу 0 (IN AT %MW0:real). Для того, чтобы прочитать эту переменную из Trace Mode, настраиваем драйвер T12 следующим образом Параметр #1(B) - 0x4 Параметр #2(B) - 0x0 Параметр #3(W) - 0x4020 Параметр #4(W) - 0x0 Направление - Input Тип данных - FLOAT Дополнительно - BECKHOFF:ID=192.168.1.201.1.1;Port=800; Аргумент экрана – IN / REAL.
Информация приходит, но число с плавающей точкой контроллером и скадой воспринимаются по-разному. Из скады пишем 54,0, в ПЛК получаем что-то подобное 2,23-045… , когда читаем из ПЛК, опять в скаде получаем 54,0. Как решить проблему?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Не понятно каким образом производится запись в контроллер. Описанные Вами настройки используются только для чтения данных из контроллера. Проверьте раздельно чтение и запись. Для этого создайте два источника. Первый источник с направлением input, второй - out и привяжите их к каналам типа Float. Каналы Float свяжите с аргументами.
Posted by Romсheg (Участник № / Member № 3792) on :
2Polag: Вам надо задать правильный порядок следования байт при чтении регистров в формате Float, видимо у устройства не Intel-формат для Float. Как это сделать - есть в справке по настройке источников/приемников ModBus.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
to Romcheg: причем здесь ModBus?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Как вы смотрите значения в PLC?
Posted by Romсheg (Участник № / Member № 3792) on :
Прошу прощения, попутал насчет ModBus. Но то, о чем я сказал - скорее всего и есть причина: перепутан формат последовательности байт при чтении Float.
Posted by Polag (Участник № / Member № 4573) on :
Здравствуйте, в первом посте все в порядке, там я описал настройки для чтения, подобные я использовал и для записи, лишь меняется направление на OUTPUT. И вообще с целочисленными данными у меня проблем нет – читаю и пишу. При чтении из ПЛК переменный со значением 1.1 в скаде я увижу -1.07609е+008. Эксперимент проводил несколько раз, переделывая все ПО занового – результат один. Вопрос: работает ли драйвер с переменными типа REAL, и проверяли ли вы это, если да, то готов протестировать ваш проект. К ПЛК я подключаюсь по Ethernet через TwinCat, в отладочном режиме вижу все значения переменных, настройка отображения переменных DECIMAL.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Здравствуйте. С переменными REAL драйвер работает. Причина заключается в неправильном формате последовательности байт. Проверьте, возможно, в настройках TwinCat для разных типов данных задаются различные порядки последовательности байт. Также, возможно, что порядок следования байт меняется в контроллере.