Дело в том, что PLC Configuration не умеет делать групповые запросы. Используйте ModBus.lib. Или можно панель мастером сделать, что по мне удобнее.
Вид для печати
Дело в том, что PLC Configuration не умеет делать групповые запросы. Используйте ModBus.lib. Или можно панель мастером сделать, что по мне удобнее.
ModBus.lib - это был мой следующий шаг. Есть примеры как читать несколько регистров со slave устройства одним запросом. Жизнь удалась!!!
Логика у меня была следующая:
1. Создаем POU (программа) Read10s_PRG.
2. В конфигурации задач настраиваем Тип - циклический, Интервал - 10000ms
3. В программе Read10s_PRG настраиваем параметры порта -> открываем порт -> читаем -> обрабатываем данные -> закрываем порт.
4. Получаем считывание нескольких регистров slave устройства и их обработку 1 раз в 10 сек.
На мой взгляд все логично=) А вот не тут-то было!!!!!
конструкция COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK ); должна открыть порт и выставить COM_SERVICE1.ready в TRUE, и на это ей нужно 299!!! циклов (запусков Read10s_PRG). 299 КАРЛ :confused:
т.е. если Read10s_PRG запускается 1 раз в 10 мс то требуется 299*10мс.
если Read10s_PRG запускается 1 раз в 10000 мс то требуется 299*10000мс.
Вот этого я никак не ожидал вообще!!! Но справедливости ради надо отметить что порт открывается, обмен идет, и можно одним запросом прочитать сразу несколько регистров =) На 10000мс не проверял конечно, остановился на 800мс. Далее "логика" была понятна.
Но и тут казалось можно было выкрутиться:
Создаем POU OpenPort_PRG -> настраиваем циклически 10мс -> вставляем туда код:
Порт открывается быстро. А теперь в Read10s_PRG просто работаем с этим портом (естественно нужные переменные делаем глобальными)Код: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
cmpl будет TRUE когда get1_modbus получит данные.Код:get1_modbus: MB_RD_HOLD_REGS
get1_modbus(
Enable:=TRUE ,
Mode:=MB_RTU ,
DevAddr:=1 ,
FirstAddr:=300 ,
Quantity:=14,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );
НО
получит она их через 13 циклов (запусков Read10s_PRG ) 13!!!
т.е. если Read10s_PRG запускается 1 раз в 10000мс то мы получим данные через 13*10000мс
Все данные получены экспериментально.
Ну и напоследокКод:PLCInfo
PLC model MODEL PLC 110-32 Версия ПО метр: 2.0
Binary VERSION 2.15.8
Need Target version 2.10
Compiled: 11:51:53 Dec 26 2015
MAC 6A:77:00:81:4F:67
IP 10.0.6.10
GATE 10.0.6.1
MASK 255.255.255.0
PIC upper version is 15
Licence unlimited
Если кто-то захочет на одном интерфейсе по ModBus опрашивать часть устройств через конфигуратор а часть в программе через modbus.lib ничего не выйдет - проверено! После открытия порта в программе конфигуратор больше не может подключиться к интерфейсу.
Вот такая интересная ночка выдалась =)
1) А заглянуть во внутренности COM_SERVICE и поправить нужное или написать свое ПОУ открытия порта внимательно читая доки на syslibcom было не досуг?
2) Ну ради экспериментов можно конечно ознакомиться с плкашной многозадачностью, но чувствуется не до конца Вы разобрались
3) про напоследок, Вы серьезно считаете что открыли Америку?
Если читали первое сообщение то видели что это мой первый опыт с ПЛК, потому и просил помощи, и вопрос задал в теме для новичков! До заглядывания во внутренности библиотек и исправления их под свои нужды я еще не дорос. Тем более задача на первый взгляд была элементарной: читать несколько регистров 1 запросом очень редко. Не думал что для этого нужны танцы с бубном.
А вы если такой гуру то лучше бы помогли советом или делом для решения изначального вопроса. Зачем тыкать сопляка который итак ничего не знает "во внутренности COM_SERVICE" ???
а смысл помогать, Вам сказали что панель лучше мастером, Вы уже поменяли подход, завтра например Валенок скажет, что лучше нету когда панель слейв, опять станете переходить?
И мой совет это не тыканье носом,а рекомендация изучить как пишется код, проанализировать в каком месте возникает задержка открытия порта
Здравствуйте. Подскажите как скачать программу из ПЛК 110