Просмотр полной версии : 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 ?
в одном проекте использовать и библиотеку сислибком и пользоваться конфигурацией плк для связи с устройствами не стоит. сделайте все опросы через библиотеку (без конфигуратора) и проблем не будет
Антон12345
25.04.2012, 09:09
Спасибо за ответ! Реализовывать все на библиотеках на данном этапе не совсем удобно и несколько трудоёмко. Хотелось бы все же попробывать обьединить
если у вас уже есть написанный самопальный библиотечный мастер, значит навык есть, а создание еще 1 такого для другого модуля на шине не намного сложнее ручного набивания конфигураторного мастера в случае большого количества переменных
по поводу "объединить": год назад тоже интересовался этим вопросом,
посоветовали не объединять (http://www.owen.ru/forum/showthread.php?t=10419&page=2)
Антон12345
25.04.2012, 10:23
Я с вами согласен, не намного сложнее, но все же... Не хотелось бы настраивать огород и переделывать весь проект из-за отправки нескольких команд... Вопрос разношерстности опять же. Если выхода не будет, то придется. Но мне почему-то кажется, что выход есть. Хотелось бы услышать мнение овеновцев. Но все равно спасибо за совет.
а много переделывать и не надо будет. вот есть у вас глобальные переменные в конфигурации плк в области модбас мастера, вы объявляете повторно их же в разделе глобальных переменных, а ветку модбас мастер из конфигурации плк удаляете, затем присвоите выходы с подпрограммы опроса модулей по rs-485 этим глобальным переменным. все, концы подсоединены, для остальной программы ничего не изменилось, глобальные переменные обмена все так же принимают значения параметров с модулей на шине. осталось только написать эту самую подпрограммку опроса.
Антон12345
26.04.2012, 07:39
Не могу с вами не согласиться. По всей видимости так и придется сделать. Может тогда скинете ссылочку на документацию по Modbus lib ? Если такая все же имеется...
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. Таймаут тоже пробывал менять. В чем моя ошибка? Или не моя?
Антон12345
24.05.2012, 09:06
в каком терминале?
который подлсушивает порт 485.
Странная ситуация: когда прибор не отвечает-255 приходит по таймауту, заданному в MB_WR_REGS. Когда отвечает - выход Complete переходит в true именно в момент, когда приходит ответ от устройства, но по прежнему 255 (ПЛК мастер пишет в, скажем Lectus)
который подлсушивает порт 485.
Странная ситуация: когда прибор не отвечает-255 приходит по таймауту, заданному в MB_WR_REGS. Когда отвечает - выход Complete переходит в true именно в момент, когда приходит ответ от устройства, но по прежнему 255 (ПЛК мастер пишет в, скажем Lectus)
если снифер стоит в сети, это вовсе не означает что информация попадает в порт мастеру и она корректна, надо смотреть чем заполнен приемный буффер. У меня возниали ситуации подобные, помогало чередование чтения и записи, и при таймауте >50мс вовсе ошибок небыло
Антон12345
24.05.2012, 10:00
если снифер стоит в сети, это вовсе не означает что информация попадает в порт мастеру и она корректна, надо смотреть чем заполнен приемный буффер
Ответ попадает в порт и об этом говорит то, что флаг завершения обмена (Cmpl) появляется именно в момент ответа устройства.
Простите, а что значит чередовать чтение с записью? И в какой буфер должен поступить ответ, в тот из которого пишем?
надо поднимать переписку чтоб ответить в чем была проблема, помню только что повлияло на работу, а сейчас перешел на библиотеку UNM со своей реализацией функций модбаса, теперь точно возвращаться к SysLibCom уже не буду :)
Антон12345
24.05.2012, 10:48
Согласен, UNM гораздо удобнее. Просто у нас задача передавать данные чере ПМ01 с удаленного обьекта на сервер по GPRS. Пришлось самим повторять овеновский блок modem, кот не работает по GPRS.
Может какой примерчик остался ненароком, был бы признателен )
Антон12345
24.05.2012, 12:19
Уважаемые специалисты ОВЕН, жду вашией помощи!!!
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 устройства о том, что переменная получена... Может нужен какойто отдельный блок, кот анализирует в ответе контрольную сумму? Хотя судя по тому, что у него есть таймаут, то врятли....
Спасибо конечно, но с установкой соединения с помощью SysLibCom всё получилось. Проблема в отсылки значений в формате modbus, с помощью MB_WR_REGS. Нужно оценивать ответ slave устройства о том, что переменная получена... Может нужен какойто отдельный блок, кот анализирует в ответе контрольную сумму? Хотя судя по тому, что у него есть таймаут, то врятли....
Если Вы остановились только на этой функции, а не о протоколе в целом, то я никогда не контролирую ответ на команду записи регистров, ценной для меня информации в ней нет
Антон12345
24.05.2012, 15:54
Если Вы остановились только на этой функции, а не о протоколе в целом, то я никогда не контролирую ответ на команду записи регистров, ценной для меня информации в ней нет
Т.е. вам не важно дошла ли информация до устроийства и записалась ли или нет?
Т.е. вам не важно дошла ли информация до устроийства и записалась ли или нет?
Важно, но с техникой так не бывает, что чтение идет нормально, а запрос с записью не доходит. Тут либо ни чего не идет, либо все доходит. Кроме того, если привыкать к забугорным технологиям, то на каждое устройство ставиться обратная связь. И уж если она показывает, что требуемое устройство не включилось, я начинаю "волноваться"
Вроде в тему. Попробую прояснить для себя кое-что.
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 не возвращается. Проверка та же что и в первом случае с помощью эмулятора - результат ноль. Ошибка явно глупая, но какая?
Вроде в тему. Попробую прояснить для себя кое-что.
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
Task = OPEN_TSK, Task = CLOSE_TSK вроде алгоритм понятен. Вопрос по этой части
IF Task = RESET_TSK THEN
Ready := NOT SysComSetSettings(Settings.Port, ADR(Settings));
END_IF
Почему ОК возвращается инверсией? Ведь в описании четко написано SysComSetSettings возвращает true при успехе, в противном случае false. Или эту часть алгоритма я недопонимаю или все наоборот?
SysComSetSettings возвращает 0, если Ok
SysComSetSettings возвращает 0, если Ok
Если так, то тогда все становится на свои места. Правда вроде логика немного нарушена.
kulikovv
13.02.2013, 18:24
Может кто подскажет в чем проблема: управляю входом блока MB_WR_REGS библиотеке modbus.lib. Запросы уходят, в терминале вижу что от устройства приходит ответ, но ошибка все время 255. Таймаут тоже пробывал менять. В чем моя ошибка? Или не моя?
На ПЛК73 нарвался на точно такую же засаду. Слейв команду записи отрабатывает, шлет ответ, но ПЛК в момент прихода ответа выкидывает комплит в месте с ошибкой 255, задолго до назначенного таймаута. При этом 06-я функция работает корректно.
Господа разработчики - в чем проблема?
На ПЛК73 нарвался на точно такую же засаду. Слейв команду записи отрабатывает, шлет ответ, но ПЛК в момент прихода ответа выкидывает комплит в месте с ошибкой 255, задолго до назначенного таймаута. При этом 06-я функция работает корректно.
Господа разработчики - в чем проблема?
Тоже столкнулся на ПЛК73, подумал и решил разработать свой ФБ для модбаса. Закончил пока с 3 и 4 функцией. Скоро приступлю к записи. Считаю, что решиться две проблемы: будет корректно работать и уменьшиться количество POU. С ограничением количества POU столкнулся при автоматизации кондиционера - долго пришлось извращаться
требуется помощь в изобретении велосипеда. В общем нужна поддержка 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 работает исправно, а у меня не работает, причем на любом порту. Открывается порт нормально, загвоздка именно в настройках.
неужели ни у кого никаких мыслей?
проблему решил. Ошибка была в том, что я не обратил внимание на обязательность заполнения количества бит данных в настройке. Короче лоханулся на ровном месте.
c одной проблемой разобрался, и встрял в другую. Необходимо мне чтобы всегда был выставлен RTS. Выставил я его в настройках, однако на 7 ноге относительно 5 всегда стабильно -5,8В вне зависимости что я там выставляю в программе. И при подключении к ПК нуль модемным кабелем в программе прослушке я не вижу чтобы был выставлен CTS. Логично предположить, что ПЛК не выставляет RTS. Может кто сталкивался с этим?
Доброго времени суток.
Возникла вот проблема.
С помощью 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. Попытка не обращать на это дела работоспособности порту не добавила - колличество отправленых байтов равно нулю, это же подтверждает осциллограф.
Доброго времени суток.
Возникла вот проблема.
С помощью 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. Попытка не обращать на это дела работоспособности порту не добавила - колличество отправленых байтов равно нулю, это же подтверждает осциллограф.
Выложите проект
Выложите проект
Ну проектом это назвать пока сложно. Первая попытка достучаться по веревке к девайсу
Делалось на основе:
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
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot