PDA

Просмотр полной версии : SysLibCom



Антон12345
25.04.2012, 08:14
Доброе время суток, уважаемые коллеги!
Вопрос к тем, кто работал с SysLibCom. Плк100 опрашивает по modbus RTU (стандартная библиотека Modbus serial, используемая в конфигурации) некое устройство (порт rs485). Я останавливаю этот обмен командой, затем с помощью функции COM_SERVICE (OPEN_TSK) захватываю 485 порт, и пишу туда, с помощью ф-ии SysComWrite, все что надо, а затем отпускаю порт (тем же COM_SERVICE, командой CLOSE_TSK). Затем пытаюсь возобновить опрос командой 255, но как не крути Modbus Master молчит и возобновления опроса достичь не удается. Подскажите, пожалуйста, где я что забыл сделать?? И как использовать поочередно в одном проекте стандартную библиотеку Modbus serial и системную SysLibCom ?

swerder
25.04.2012, 08:59
в одном проекте использовать и библиотеку сислибком и пользоваться конфигурацией плк для связи с устройствами не стоит. сделайте все опросы через библиотеку (без конфигуратора) и проблем не будет

Антон12345
25.04.2012, 09:09
Спасибо за ответ! Реализовывать все на библиотеках на данном этапе не совсем удобно и несколько трудоёмко. Хотелось бы все же попробывать обьединить

swerder
25.04.2012, 09:20
если у вас уже есть написанный самопальный библиотечный мастер, значит навык есть, а создание еще 1 такого для другого модуля на шине не намного сложнее ручного набивания конфигураторного мастера в случае большого количества переменных

swerder
25.04.2012, 09:34
по поводу "объединить": год назад тоже интересовался этим вопросом,
посоветовали не объединять (http://www.owen.ru/forum/showthread.php?t=10419&page=2)

Антон12345
25.04.2012, 10:23
Я с вами согласен, не намного сложнее, но все же... Не хотелось бы настраивать огород и переделывать весь проект из-за отправки нескольких команд... Вопрос разношерстности опять же. Если выхода не будет, то придется. Но мне почему-то кажется, что выход есть. Хотелось бы услышать мнение овеновцев. Но все равно спасибо за совет.

swerder
25.04.2012, 11:13
а много переделывать и не надо будет. вот есть у вас глобальные переменные в конфигурации плк в области модбас мастера, вы объявляете повторно их же в разделе глобальных переменных, а ветку модбас мастер из конфигурации плк удаляете, затем присвоите выходы с подпрограммы опроса модулей по rs-485 этим глобальным переменным. все, концы подсоединены, для остальной программы ничего не изменилось, глобальные переменные обмена все так же принимают значения параметров с модулей на шине. осталось только написать эту самую подпрограммку опроса.

Антон12345
26.04.2012, 07:39
Не могу с вами не согласиться. По всей видимости так и придется сделать. Может тогда скинете ссылочку на документацию по Modbus lib ? Если такая все же имеется...

swerder
26.04.2012, 09:16
disk_plc_8.14 (http://kipshop.ru/CoDeSys/8.14/disk_plc_8.14.zip)\Библиотеки ОВЕН\Lib_Doc\ModBus.pdf

Антон12345
27.04.2012, 15:03
СПАСИБО !///

Антон12345
28.04.2012, 08:00
Хотя я этот документ вдоль и поперек изучил, в нем есть описание только по основным блокам, а о таких, как MB_MOVED и т.д. ни слова нет (

Антон12345
24.05.2012, 08:08
Может кто подскажет в чем проблема: управляю входом блока MB_WR_REGS библиотеке modbus.lib. Запросы уходят, в терминале вижу что от устройства приходит ответ, но ошибка все время 255. Таймаут тоже пробывал менять. В чем моя ошибка? Или не моя?

capzap
24.05.2012, 08:27
в каком терминале?

Антон12345
24.05.2012, 09:06
в каком терминале?
который подлсушивает порт 485.
Странная ситуация: когда прибор не отвечает-255 приходит по таймауту, заданному в MB_WR_REGS. Когда отвечает - выход Complete переходит в true именно в момент, когда приходит ответ от устройства, но по прежнему 255 (ПЛК мастер пишет в, скажем Lectus)

capzap
24.05.2012, 09:43
который подлсушивает порт 485.
Странная ситуация: когда прибор не отвечает-255 приходит по таймауту, заданному в MB_WR_REGS. Когда отвечает - выход Complete переходит в true именно в момент, когда приходит ответ от устройства, но по прежнему 255 (ПЛК мастер пишет в, скажем Lectus)

если снифер стоит в сети, это вовсе не означает что информация попадает в порт мастеру и она корректна, надо смотреть чем заполнен приемный буффер. У меня возниали ситуации подобные, помогало чередование чтения и записи, и при таймауте >50мс вовсе ошибок небыло

Антон12345
24.05.2012, 10:00
если снифер стоит в сети, это вовсе не означает что информация попадает в порт мастеру и она корректна, надо смотреть чем заполнен приемный буффер

Ответ попадает в порт и об этом говорит то, что флаг завершения обмена (Cmpl) появляется именно в момент ответа устройства.
Простите, а что значит чередовать чтение с записью? И в какой буфер должен поступить ответ, в тот из которого пишем?

capzap
24.05.2012, 10:19
надо поднимать переписку чтоб ответить в чем была проблема, помню только что повлияло на работу, а сейчас перешел на библиотеку UNM со своей реализацией функций модбаса, теперь точно возвращаться к SysLibCom уже не буду :)

Антон12345
24.05.2012, 10:48
Согласен, UNM гораздо удобнее. Просто у нас задача передавать данные чере ПМ01 с удаленного обьекта на сервер по GPRS. Пришлось самим повторять овеновский блок modem, кот не работает по GPRS.
Может какой примерчик остался ненароком, был бы признателен )

Антон12345
24.05.2012, 12:19
Уважаемые специалисты ОВЕН, жду вашией помощи!!!

capzap
24.05.2012, 12:23
GPRS.
Настройка и установка GPRS соединения:
AT+SAPBR=3,1,«CONTYPE»,«GPRS»
AT+SAPBR=3,1,«APN»,«internet.beeline.ru»
AT+SAPBR=3,1,«USER»,«beeline»
AT+SAPBR=3,1,«PWD»,«beeline»
AT+SAPBR=1,1 — установка GPRS связи
AT+SAPBR=2,1 — полученный IP адрес
+SAPBR: 1,1,«10.229.9.115»
AT+SAPBR=4,1 — текущие настройки соединения
AT+SAPBR=0,1 — разорвать GPRS соединениеесли речь о ПМ, незнаю назначение блока modem, я открыва порт и АТ-командами устанавливаю соединение, как вышеизложенный код, единственно у меня ПМ с чипсетом SIM900

Антон12345
24.05.2012, 12:56
Спасибо конечно, но с установкой соединения с помощью SysLibCom всё получилось. Проблема в отсылки значений в формате modbus, с помощью MB_WR_REGS. Нужно оценивать ответ slave устройства о том, что переменная получена... Может нужен какойто отдельный блок, кот анализирует в ответе контрольную сумму? Хотя судя по тому, что у него есть таймаут, то врятли....

capzap
24.05.2012, 15:09
Спасибо конечно, но с установкой соединения с помощью SysLibCom всё получилось. Проблема в отсылки значений в формате modbus, с помощью MB_WR_REGS. Нужно оценивать ответ slave устройства о том, что переменная получена... Может нужен какойто отдельный блок, кот анализирует в ответе контрольную сумму? Хотя судя по тому, что у него есть таймаут, то врятли....

Если Вы остановились только на этой функции, а не о протоколе в целом, то я никогда не контролирую ответ на команду записи регистров, ценной для меня информации в ней нет

Антон12345
24.05.2012, 15:54
Если Вы остановились только на этой функции, а не о протоколе в целом, то я никогда не контролирую ответ на команду записи регистров, ценной для меня информации в ней нет

Т.е. вам не важно дошла ли информация до устроийства и записалась ли или нет?

capzap
24.05.2012, 17:12
Т.е. вам не важно дошла ли информация до устроийства и записалась ли или нет?
Важно, но с техникой так не бывает, что чтение идет нормально, а запрос с записью не доходит. Тут либо ни чего не идет, либо все доходит. Кроме того, если привыкать к забугорным технологиям, то на каждое устройство ставиться обратная связь. И уж если она показывает, что требуемое устройство не включилось, я начинаю "волноваться"

zaur
04.06.2012, 12:51
Вроде в тему. Попробую прояснить для себя кое-что.

IF port_opened=0 THEN
Settings.Port:=com_num;
Settings.dwBaudRate:=115200;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
Вот это отлично открывает и настраивает порт. Потом проверяю с помощью эмулятора slave modbus на ПК. Обмен идет все хорошо. Это с библиотекой Modbus.lib.
А вот такая штука с библиотекой syslibcom.

IF NOT port_opened THEN
com_handle:=SysComOpen(com_num);
IF com_handle<>16#FFFFFFFF THEN
port_init:=TRUE;
ELSE
SysComClose( com_num);
com_handle:=SysComOpen( com_num);
port_init:=TRUE;
END_IF

com_set.Port:=com_num;
com_set.dwBaudRate:=9600;
com_set.byParity:=0;
com_set.dwTimeout:=0;
com_set.byStopBits:=0; (* *)
com_set.dwBufferSize:=0;
com_set.dwScan:=0;
res:=SysComSetSettings(com_num,ADR(com_set));

IF NOT res THEN
port_opened:=TRUE;
END_IF
В общем получается так. Порт всегда уже открыт. Но он закрывается, а потом открывается (handle=1 вернулся нормально). А вот настроить порт все не удается. TRUE не возвращается. Проверка та же что и в первом случае с помощью эмулятора - результат ноль. Ошибка явно глупая, но какая?

capzap
04.06.2012, 14:01
Вроде в тему. Попробую прояснить для себя кое-что.

IF port_opened=0 THEN
Settings.Port:=com_num;
Settings.dwBaudRate:=115200;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
Вот это отлично открывает и настраивает порт. Потом проверяю с помощью эмулятора slave modbus на ПК. Обмен идет все хорошо. Это с библиотекой Modbus.lib.
А вот такая штука с библиотекой syslibcom.

IF NOT port_opened THEN
com_handle:=SysComOpen(com_num);
IF com_handle<>16#FFFFFFFF THEN
port_init:=TRUE;
ELSE
SysComClose( com_num);
com_handle:=SysComOpen( com_num);
port_init:=TRUE;
END_IF

com_set.Port:=com_num;
com_set.dwBaudRate:=9600;
com_set.byParity:=0;
com_set.dwTimeout:=0;
com_set.byStopBits:=0; (* *)
com_set.dwBufferSize:=0;
com_set.dwScan:=0;
res:=SysComSetSettings(com_num,ADR(com_set));

IF NOT res THEN
port_opened:=TRUE;
END_IF
В общем получается так. Порт всегда уже открыт. Но он закрывается, а потом открывается (handle=1 вернулся нормально). А вот настроить порт все не удается. TRUE не возвращается. Проверка та же что и в первом случае с помощью эмулятора - результат ноль. Ошибка явно глупая, но какая?
А вот так выглядит COM_SERVICE.lib из нутри

IF NOT Enable THEN RETURN;
END_IF
Delay := Delay + 1;
IF (Delay MOD 100) = 0 THEN
IF Task = OPEN_TSK THEN
IF Opened = FALSE THEN
IF SysComOpen(Settings.Port) = 16#FFFFFFFF THEN
Task := CLOSE_TSK;
ELSE
Opened := TRUE;
END_IF
ELSE
Task := RESET_TSK;
END_IF
END_IF
IF Task = RESET_TSK THEN
Ready := NOT SysComSetSettings(Settings.Port, ADR(Settings));
END_IF
IF Task = CLOSE_TSK THEN
SysComClose(Settings.Port);
Ready := FALSE;
Opened := FALSE;
END_IF
END_IF

zaur
05.06.2012, 05:31
Task = OPEN_TSK, Task = CLOSE_TSK вроде алгоритм понятен. Вопрос по этой части
IF Task = RESET_TSK THEN
Ready := NOT SysComSetSettings(Settings.Port, ADR(Settings));
END_IF
Почему ОК возвращается инверсией? Ведь в описании четко написано SysComSetSettings возвращает true при успехе, в противном случае false. Или эту часть алгоритма я недопонимаю или все наоборот?

Валенок
05.06.2012, 07:59
SysComSetSettings возвращает 0, если Ok

zaur
05.06.2012, 08:15
SysComSetSettings возвращает 0, если Ok
Если так, то тогда все становится на свои места. Правда вроде логика немного нарушена.

kulikovv
13.02.2013, 18:24
Может кто подскажет в чем проблема: управляю входом блока MB_WR_REGS библиотеке modbus.lib. Запросы уходят, в терминале вижу что от устройства приходит ответ, но ошибка все время 255. Таймаут тоже пробывал менять. В чем моя ошибка? Или не моя?

На ПЛК73 нарвался на точно такую же засаду. Слейв команду записи отрабатывает, шлет ответ, но ПЛК в момент прихода ответа выкидывает комплит в месте с ошибкой 255, задолго до назначенного таймаута. При этом 06-я функция работает корректно.
Господа разработчики - в чем проблема?

kgsh82
14.02.2013, 08:41
На ПЛК73 нарвался на точно такую же засаду. Слейв команду записи отрабатывает, шлет ответ, но ПЛК в момент прихода ответа выкидывает комплит в месте с ошибкой 255, задолго до назначенного таймаута. При этом 06-я функция работает корректно.
Господа разработчики - в чем проблема?

Тоже столкнулся на ПЛК73, подумал и решил разработать свой ФБ для модбаса. Закончил пока с 3 и 4 функцией. Скоро приступлю к записи. Считаю, что решиться две проблемы: будет корректно работать и уменьшиться количество POU. С ограничением количества POU столкнулся при автоматизации кондиционера - долго пришлось извращаться

S.A.D.
08.10.2013, 09:33
требуется помощь в изобретении велосипеда. В общем нужна поддержка SysComSetSettings Ex(антимат озабоченый слитно не дал написать) чего в com_service.lib не предусмотрено. Стал писать свой ФБ открытия закрытия порта.

FUNCTION_BLOCK COM_SERVICEEX
VAR_INPUT
Enable:BOOL;
Settings:COMSETTINGSEX;
TASK:BYTE;
END_VAR
VAR_OUTPUT
Ready:BOOL;
END_VAR
VAR
P_discr: DWORD;
CLOSE_OK:BOOL;
END_VAR
_________________________________________

IF Enable THEN
IF TASK=0 THEN SysComClose(Settings.Port); P_discr:=SysComOpen(Settings.Port);
IF P_discr<>16#FFFFFFFF THEN
Settings.Size:=SIZEOF(Settings);
Ready:=NOT SysComSetSettingsEx(Settings.Port, ADR(Settings));
ELSE TASK:=2;
END_IF
ELSIF TASK=2 THEN CLOSE_OK:=SysComClose(Settings.Port); Ready:=FALSE;
END_IF
END_IF

в итоге при открытии порта не прокатывает задание настроек для SysComSetSettingsEx. Вываливается инвалид 16#FE. Глядел в различных темах как писали другие люди - я делаю вроде все так же. Может кто подскажет в чем я не прав. COM_SERVICE.lib работает исправно, а у меня не работает, причем на любом порту. Открывается порт нормально, загвоздка именно в настройках.

S.A.D.
08.10.2013, 14:53
неужели ни у кого никаких мыслей?
проблему решил. Ошибка была в том, что я не обратил внимание на обязательность заполнения количества бит данных в настройке. Короче лоханулся на ровном месте.

S.A.D.
08.10.2013, 19:13
c одной проблемой разобрался, и встрял в другую. Необходимо мне чтобы всегда был выставлен RTS. Выставил я его в настройках, однако на 7 ноге относительно 5 всегда стабильно -5,8В вне зависимости что я там выставляю в программе. И при подключении к ПК нуль модемным кабелем в программе прослушке я не вижу чтобы был выставлен CTS. Логично предположить, что ПЛК не выставляет RTS. Может кто сталкивался с этим?

Foregit
19.11.2013, 16:50
Доброго времени суток.
Возникла вот проблема.
С помощью SysLibCom пытаюсь c 110-60 подключиться по своему протоколу с двумя устройствами. За основу брал пример реализации из приложенных примеров.
Одно устройство (измеритель вакуума TPG300) сидит на RS232 порту, и я его заставил общаться.
Беру тот же пример переделываю под другое устройство (Leybold TD20) под другой порт - теперь под RS-485-2. Никак не могу получить ответа.
Но что смутило: смотрю осцилом на линиях - ПЛК посылает свою посылку 24 байта, ответа от устройства я не вижу, но при этом SysComRead возвращает 24 принятых байта, при чем инвертированных тех, что я посылаю. Возникла дурная мысль, что он работает как асинхронный 232 интерфейс - и по линии RxD сразу считывает то же, что и посылает.
Когда делал обмен с модулями МВА через конфигуратор, там в параметрах модуля (для RS485-2) был выбор :
Interface type RS485/RS232/HARD_HANDSH/... и т.д.
Может и здесь получается, что хоть порт 485, а ведет себя как асинхронный 232? Если это так как ему задать тип?

UPD: Хех, переделал исходник на RS485-1 - ( com_num1:=0; как писали здесь) получил красненький INVALID. Попытка не обращать на это дела работоспособности порту не добавила - колличество отправленых байтов равно нулю, это же подтверждает осциллограф.

kgsh82
20.11.2013, 13:52
Доброго времени суток.
Возникла вот проблема.
С помощью SysLibCom пытаюсь c 110-60 подключиться по своему протоколу с двумя устройствами. За основу брал пример реализации из приложенных примеров.
Одно устройство (измеритель вакуума TPG300) сидит на RS232 порту, и я его заставил общаться.
Беру тот же пример переделываю под другое устройство (Leybold TD20) под другой порт - теперь под RS-485-2. Никак не могу получить ответа.
Но что смутило: смотрю осцилом на линиях - ПЛК посылает свою посылку 24 байта, ответа от устройства я не вижу, но при этом SysComRead возвращает 24 принятых байта, при чем инвертированных тех, что я посылаю. Возникла дурная мысль, что он работает как асинхронный 232 интерфейс - и по линии RxD сразу считывает то же, что и посылает.
Когда делал обмен с модулями МВА через конфигуратор, там в параметрах модуля (для RS485-2) был выбор :
Interface type RS485/RS232/HARD_HANDSH/... и т.д.
Может и здесь получается, что хоть порт 485, а ведет себя как асинхронный 232? Если это так как ему задать тип?

UPD: Хех, переделал исходник на RS485-1 - ( com_num1:=0; как писали здесь) получил красненький INVALID. Попытка не обращать на это дела работоспособности порту не добавила - колличество отправленых байтов равно нулю, это же подтверждает осциллограф.

Выложите проект

Foregit
21.11.2013, 14:44
Выложите проект

Ну проектом это назвать пока сложно. Первая попытка достучаться по веревке к девайсу

Делалось на основе:
http://www.owen.ru/forum/showthread.php?t=551&p=41631&viewfull=1#post41631

Девайс - блок управления турбиком :
http://www.mpi-hd.mpg.de/gerda/TG04_TECHNICAL/manuals/TD20_manual.pdf