PDA

Просмотр полной версии : плк150 - Rs485 - микросим м08



demon
29.04.2010, 07:30
У меня возникли проблемы со связью ПЛК150 по RS485 с внешним устройством.
Необходимо обмениваться по RS485 с Микросим М0803. До этого использовали Микросим 06. Возникали подобные проблемы, но с настройками М06 их удавалось решить.
Проблема в следующем. При обмене пакетами между двумя устройствами (Master - ПЛК150, Slave - М08) теряются первые несколько байт от М08. По всей видимости ПЛК150 не успевает переключится с режима передачи на режим прием данных. На М06 была функция задержки ответа. В М08 такой функции нет. Подскажите пожалуйста, можно ли что-нить сделать с ПЛК150 или с линией связи, чтобы уйти от данной проблемы. Может ПЛК150 имеют какую-то настройку, чтобы переключение происходило быстрее. Спасибо.

Филоненко Владислав
29.04.2010, 10:20
ModBus RTU?
Вариант один - повысить скорость обмена.

demon
29.04.2010, 10:28
Протокол не ModBus. Протокол свой. Сейчас стоит скорость 9600. При увеличении скорости думаете эта проблема уйдет?

Филоненко Владислав
29.04.2010, 10:53
полагаю, что прибор начинает отвечать слишком быстро, чем выше скорость - тем меньше время переключения.

Николаев Андрей
29.04.2010, 11:01
Если у Вас свой протокол - Вам надо писать обмен с помощью библиотеки SysLibCom.
Пример есть в разделе примеры программ и полезности.

demon
29.04.2010, 12:19
Я написал обмен именно с помощью библиотеки SysLibCom. Обмен идет, но он некорректный.
Формат пакетов:
запрос: ff адрес1 адрес2 com crc 03
ответ: ff адрес1 адрес2 com data crc 03

Я отправляю пакет, а ответ корректный только примерно в 10% при максимально возможной скорости в 115200.
В остальных теряется от 1 до 3 первых байт.

К тому же периодически контроллер начинает перегружаться, хотя модуль Statistic показывает 4-6 in 100mks.

Вот проект:
2303
И логи:
2304

Малышев Олег
29.04.2010, 13:35
Категорически неправильно.
1) Вам обязательно нужно анализировать perem что бы не превысило 255 байт. Это основное!
2) ЦИКЛ REPEAT - убрать из программы!!!! Создайте массив на чтение и запрашивайте сколько считано и столько байт анализируйте
3) FOR i:=1 TO perem DO
sost:=SysComWrite(Open_Com.com_num,ADR(mas[i]),1,0);
END_FOR;
заменять на SysComWrite(Open_Com.com_num,ADR(mas[1]),perem,0)

demon
29.04.2010, 13:58
1) perem не переполнится, так как ответ составляет меньше 30 байт. И с каждым новым запросом perem обнуляется. Поэтому не считаю нужным это анализировать.
2) Чем плох цикл repeat? Хотите сказать, что не успеет 20 байт считать? Из-за этого виснит?
3) Согласен. Изменил. Корректных ответов увеличилось до 20% и перегружаться вроде бы перестал

Но основная проблема осталась. ПЛК не успевает переключаться на прием, в результате теряется 1-3 первых байта

Малышев Олег
29.04.2010, 14:26
Какая у Вас версия прошивки?
Начиная с 2.10.1 (01.04.2009) - уменьшено время переключения из передачи в приём с 40 до 8 бит (для посл. портов в библиотеке SysLibCom.lib)

Малышев Олег
29.04.2010, 14:31
1) И еще раз - обязательно анализируйте - perem - размер посылки может быть заначительно больше 255 при помехах на линии, наводках и т.п.
2) Цикл ПЛК не должен содержать никаких торможений - из -за этого запускается охранный таймер. Программу нужно ОБЯЗАТЕЛЬНО сделать без repeat. Чтение одного байта - не должно подвешивать все подряд.

Малышев Олег
29.04.2010, 14:36
Функция SysComRead возвращает количество байт прочитанных в буфер RS,
т.е. можно вызвать SysComRead() с размером буфера в 255 байт и получить реальное количество байт

demon
29.04.2010, 14:39
Какая у Вас версия прошивки?
Начиная с 2.10.1 (01.04.2009) - уменьшено время переключения из передачи в приём с 40 до 8 бит (для посл. портов в библиотеке SysLibCom.lib)

PLCInfo
PLC model MODEL PLC 150
Binary VERSION 2.10.8
Need Target version 2.10
Compiled: 14:11:48 Sep 21 2009
MAC 6A:77:00:00:86:F0
IP 192.168.207.5
GATE 10.0.6.1
MASK 255.255.255.0
PIC upper version is 07
Licence unlimited
Current DAC
PIC lower version is 0d

demon
29.04.2010, 14:42
Функция SysComRead возвращает количество байт прочитанных в буфер RS,
т.е. можно вызвать SysComRead() с размером буфера в 255 байт и получить реальное количество байт

Щас попробую. Просто Филоненко Владислав здесь (http://www.owen.ru/forum/showthread.php?t=1118&page=2&highlight=%F1%F7%E8%F2%FB%E2%E0%E9%F2%E5) советует читать по одному байту.

demon
29.04.2010, 14:51
заменил цикл repeat
sost:=SysComRead(Open_Com.com_num,ADR(mas1[1]),255,0);
стало только хуже. Опять ПЛК стал зависать

Филоненко Владислав
29.04.2010, 14:53
читать по одному байту надо всегда. вы не можете ожидать всю пачку. может быть больше или меньше. читать по одному, анализировать и складывать.

demon
29.04.2010, 15:00
Ну вот я читаю по одному. В результате в 75% случаях теряется первый байт, иногда (но уже реже) теряются два байта. Есть какие-либо варианты исправить это? уйти от этого.
Вот здесь (http://www.owen.ru/forum/showthread.php?t=1118&page=4&highlight=%F1%F7%E8%F2%FB%E2%E0%E9%F2%E5) еще нашел про паузу в 0,347 мс. По всей видимости она влияет? Я так понимаю эту паузу убрать или уменьшить нельзя?

demon
29.04.2010, 15:26
можеть быть программно хотя бы что-нить посоветуете?

Малышев Олег
29.04.2010, 16:17
повысить скорость

richie
14.01.2011, 12:00
demon:
Начиная с версии xx.27 в приборе М0803 появился байтовый параметр "Задержка ответа" (0...100 мс).
Задает временной интервал задержки перед началом ответа на полученную команду или между посылками в режиме постоянной передачи.

P.S. Доступны для заказа приборы с протоколом Modbus-RTU.
Так же можно обратиться на предприятие-изготовитель для запроса обновления прошивки, чтобы обновить существующий прибор,
в том числе и изменить протокол обмена.