PDA

Просмотр полной версии : Передача данных по CSD ПЛК+ПМ01-->ПМ01+ ЛЛК



desperadoes
14.02.2014, 17:52
Привет всем! Прошу помощи со следующей проблеммой:
Передаю данные с одного ПЛК100 на другой ПЛК100 по CSD соеденению через ПМ01подключенный по RS-485, Использую при этом библиотеки модбас.либ. Так как надо звонить на несколько номеров и получать данные с разных объектов.
В приложенных проекта я получаю 5 чисел типа REAL. Operation_Station звонит на Water_Station и получает от туда данные.
Проблема возникает при получении данных. Данные приходят не те что надо, точнее те но не в том порядке или вообще все пять значений заполняются первыми двумя значениями с Water_Station и ужасно долго около 3-4 минуты.
на Water_Station
d:=135.4;
d1:=10.6;
d2:=150.3;
d3:=6.6;
d4:=70.6;
на Operation_Station может прийти
d:=70.6;
d1:=10.6;
d2:=70.6;
d3:=70.6;
d4:=70.6;
Не пойму в чем причина?
Отключаю ПМ01 и соеденяю напрямую два ПЛК100 проводами по тому же 485, Все долетает за секунду причем так как надои без никаких проблем
Подскажте пожалуйстав чем моя ошибка?

desperadoes
18.02.2014, 12:50
Товарищи! что не у кого нет никаких мыслей?

kfvniiz
18.02.2014, 17:07
Код не смотрел, но предположу что дело в таймаутах. Во-первых учитываешь ли ты что на установку связи нужно время. А потом учитываешь ли что передача данных по CSD соединению занимает ~800-1200 мc в одном направлении. А ты посылаешь запрос туда и получаешь ответ от туда и по этому на один запрос будет уходить порядка двух секунд. Скорей всего у тебя получается следующее ты посылаешь туда запрос, из-за маленького таймаута считаешь, что ответа не пришло и шлешь следующий запрос, но вместо ответа на него получаешь ответ на первый запрос (но тут могут быть разные варианты).

В общем увеличь таймауты.

desperadoes
18.02.2014, 22:07
Спасибо за ответ.
Я начинаю опрос только после подтверждения что соединение установлено.
Вы имеете ввиду стандартные тайм ауты в модбасовском блоке? который по умолчанию стоит 50мс.
Прошу kfvniiz если не трудно, уделить мне немного времени и посмотреть код.:rolleyes:
Уж очень нужно а у самого пока никак.

kfvniiz
19.02.2014, 00:04
Дык надо пробовать, вот открываем "Описание интерфейса библиотеки ФБ для работы с протоколом Modbus" и там читаем описание функций. У тебя в проекте используются MB_RD_HOLD_REGS и MB_RD_INP_REGS. У обоих этих функций есть параметр TimeOut. Вот как он описан в документации:


TimeOut: TIME – тайм-аут [мс] – максимальная задержка ведомого устройства на обработку запроса (интервал времени после получения корректного запроса и отправкой первого символа квитанции). Рекомендуемое значение 10мс.
Теперь учитывая задержки в канале CSD и время реакции устройства думаем, что туда нужно поставить. Я бы поставил бы 2500 мс (а может даже и 3000 мс) и проверил работает или нет. А затем бы путем последовательного уменьшения определил бы время при котором появятся ошибки обмена. Затем взял бы время с запасом от этого т.к. CSD канал непрозрачный и что там да как происходит дело неизвестное (т.е. вероятно в зависимости от качества сигнала время передачи может меняться).

desperadoes
19.02.2014, 01:10
Спасибо буду пробовать. Потом обязательно отпишусь, что получилось.

desperadoes
20.02.2014, 21:11
Спасибо kfvniiz! Установил тайм ауты на 2500мс. и все пошло. 4 попытки, 4 удачных приема. Вот не знаю стоит ли здесь CRC проверять или нет? в этой же библиотеки есть блок, правда не знаю как им пользоваться.
Еще раз спасибо за помощь;)