Страница 3 из 6 ПерваяПервая 12345 ... ПоследняяПоследняя
Показано с 21 по 30 из 76

Тема: Вопрос по библиотеке Modbus.lib

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от KSergey Посмотреть сообщение
    Похоже, всё таки придётся со счётчиками работать, если точность нужна.
    Счетчиков потребуется примерно пол сотни, а это дополнительная нагрузка на обмен, все таки дополнительно читать еще 50 регистров, придется жертвовать точностью в сторону скорости.

    Я уже реализовал подобный объект, правда управление без контроллера с МастерСкада и модулей 23 шт. и не МДВВ, а МВ. Счетчики не использовал - то в принцпе устраивает, да импульсы иногда пропускает - но не критично.

    Так себе думаю, получается все 54 модуля нужно разделить на 4 порта ( RS-485-1, RS-485-2, RS-232+преобразователь, DebugRS-232+преобразователь) - итого 13 модулей на порт - 13 слов - входа, и 13 байт - выходов. Все это дело опрашивать с помощью библиотеки Modbus.lib, так как http://www.owen.ru/forum/showthread....ght=modbus.lib и с конфигуратором похоже лучше не связываться.
    Осталось разобраться с modbus.lib. В тойже теме пост № 149 человек написал: "А затем выясняется: что для N количества модулей необходимо вынести открытие порта в одну задачу, обращение к N устройствам еще в несколько, а обработку полученных данных в другую задачу."
    Вот у меня отсюда и вопрос - как же тогда правильно программно организовать опрос.????
    Кто нибуть вообще пол сотни МДВВ опрашивал?????
    Последний раз редактировалось a_gricaj; 18.09.2016 в 12:11.

  2. #2

    По умолчанию

    Ну вроде работает и чтение и запись - два модуля на столе.
    А как избавится от вот этого:
    Вложение 26437

    Причем эта ошибка (меняет постоянно свое значение с 0 на 255 и обратно) не мешает - выхода включаются.
    Мой код
    Код:
              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
               IF port_opened=2 THEN 
    
              CASE master1   OF
                         0: 
                              ModbusAdrDi11(
    	                                                 Enable:=enabl ,		
    	                                                 Mode:=MB_RTU ,		
    	                                                 DevAddr:=11 ,			
    	                                                 FirstAddr:=51 ,			
    	                                                 Quantity:=1,				
    	                                                 ComHandle:=Settings.Port , 
    	                                                 TimeOut:=TimeOut , 		
    	                                                 Buffer:=Buffer,			
    	                                                 Complete=>cmpl ,	
    	                                                 Exception=>ErrorDI11 ,			
    	                                                 ByteCnt=>DataSize );		
                             
                             IF cmpl
                                  THEN
    	                                   IF ErrorDI11=0
                                                   THEN 
    		                                             DIWordAdr11:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
    	                                   END_IF
    	                                   master1:=1; 
                             END_IF
    
    
                         1: 
                              ModbusAdrDi11(
    	                                                 Enable:=enabl ,			
    	                                                 Mode:=MB_RTU ,	
    	                                                 DevAddr:=12 ,			
    	                                                 FirstAddr:=51 ,			
    	                                                 Quantity:=1,			
    	                                                 ComHandle:=Settings.Port , 
    	                                                 TimeOut:=TimeOut , 		
    	                                                 Buffer:=Buffer ,			
    	                                                 Complete=>cmpl ,		
    	                                                 Exception=>ErrorDI12 ,			
    	                                                 ByteCnt=>DataSize );		
                             
                             IF cmpl
                                  THEN
    	                                   IF ErrorDI11=0
                                                   THEN 
    		                                             DIWordAdr12:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
    	                                   END_IF
    	                                   master1:=2; 
                             END_IF
    
                         2: (*çàïèñü*)
                                Buffer[0]:=0;
                                Buffer[1]:=DOByteAdr11;
                                ModbusAdrDO11(
    	                                                  Enable:= enabl,
    	                                                  Mode:= MB_RTU,
    	                                                  DevAddr:= 11,
    	                                                  FirstAddr:= 50,
    	                                                  Quantity:= 1,
    	                                                  ComHandle:= Settings.Port,
    	                                                  TimeOut:= TimeOut,
    	                                                  Buffer:= Buffer,
    	                                                  Complete=> cmpl,
    	                                                  Exception=> ErrorDO11,
    	                                                  RegCnt=> DataSize);
                             
                             IF cmpl
                                 THEN
                                            master1:=3; 
                             END_IF
    
    
                         3:
                             Buffer[0]:=0;
                             Buffer[1]:=DOByteAdr12;
                             ModbusAdrDO12(
    	                                                  Enable:= enabl,
    	                                                  Mode:= MB_RTU,
    	                                                  DevAddr:= 12,
    	                                                  FirstAddr:= 50,
    	                                                  Quantity:= 1,
    	                                                  ComHandle:= Settings.Port,
    	                                                  TimeOut:= TimeOut,
    	                                                  Buffer:= Buffer,
    	                                                  Complete=> cmpl,
    	                                                  Exception=> ErrorDO12,
    	                                                  RegCnt=> DataSize);
                             (*åñëè óñòàíîâëåí ïðèçíàê çàâåðøåíèÿ îïåðàöèè, òî *)
                             IF cmpl
                                 THEN
                                            master1:=0; 
                             END_IF
    
              END_CASE
    
    
    IF  enabl = FALSE THEN  	enabl := TRUE;
    END_IF
    
    END_IF
    
    DOByteAdr11.7:=DIWordAdr11.0;

  3. #3
    Пользователь
    Регистрация
    10.11.2014
    Адрес
    Санкт-Петербург
    Сообщений
    980

    По умолчанию

    Цитата Сообщение от a_gricaj Посмотреть сообщение
    Счетчиков потребуется примерно пол сотни, а это дополнительная нагрузка на обмен, все таки дополнительно читать еще 50 регистров, придется жертвовать точностью в сторону скорости.

    Я уже реализовал подобный объект, правда управление без контроллера с МастерСкада и модулей 23 шт. и не МДВВ, а МВ. Счетчики не использовал - то в принцпе устраивает, да импульсы иногда пропускает - но не критично.

    Так себе думаю, получается все 54 модуля нужно разделить на 4 порта ( RS-485-1, RS-485-2, RS-232+преобразователь, DebugRS-232+преобразователь) - итого 13 модулей на порт - 13 слов - входа, и 13 байт - выходов. Все это дело опрашивать с помощью библиотеки Modbus.lib, так как http://www.owen.ru/forum/showthread....ght=modbus.lib и с конфигуратором похоже лучше не связываться.
    Осталось разобраться с modbus.lib. В тойже теме пост № 149 человек написал: "А затем выясняется: что для N количества модулей необходимо вынести открытие порта в одну задачу, обращение к N устройствам еще в несколько, а обработку полученных данных в другую задачу."
    Вот у меня отсюда и вопрос - как же тогда правильно программно организовать опрос.????
    Кто нибуть вообще пол сотни МДВВ опрашивал?????
    A_gricaj, я не могу понять, Вы вроде бы даете в одном из своих сообщений ссылку на тему "Универсальный диспетчер Modbus", но после этого спрашиваете, как организовать опрос. В указанной теме очень подробно описан один из способов.
    Сможете ли Вы быстро опросить 54 модуля вопрос сложный. У меня в существующих проектах до 19 модулей при этом цикл опроса от 30 мс до 1500 мс (т.е. часть модулей опрашивается с периодом 30 мс, другие с периодом 1500 мс). 54, конечно, поболее, но я думаю, что в 1 секунду уложитесь, если разведете по разным портам, а запись будете осуществлять по изменению. Тут главная проблема в том, что некоторые модули долго отвечают. Так, например, модуль МУ110-16Р на скорости 57600 для установки своих 16 выходов требует порядка 15 мс, в то время как теоретически обмен одним регистром должен занимать примерно 2-3 мс.
    Поэтому главная загвоздка в том, как быстро отвечают модули МДВВ. От этого и будет зависеть время полного цикла опроса.
    Последний раз редактировалось Спорягин Кирилл; 19.09.2016 в 09:47.

  4. #4

    По умолчанию

    Такого количества не было, но, я думаю, правильно будет использовать отдельный PRG, в которой один раз открывать порт, а внутри этой программы уже использовать ФБ обращения к приборам. На входе ФБ можно выставить номер прибора и команду Enable, на выходе - результат обработки и Complete. По приходу Complete от предыдущего блока, включать Enable последующего. Записывать выходы можно по изменению, для экономии трафика. Как-то так.

  5. #5

    По умолчанию

    Цитата Сообщение от KSergey Посмотреть сообщение
    Такого количества не было, но, я думаю, правильно будет использовать отдельный PRG, в которой один раз открывать порт, а внутри этой программы уже использовать ФБ обращения к приборам. На входе ФБ можно выставить номер прибора и команду Enable, на выходе - результат обработки и Complete. По приходу Complete от предыдущего блока, включать Enable последующего. Записывать выходы можно по изменению, для экономии трафика. Как-то так.
    Новое PRG, точно поможет? где-то читал что не поможет....

    Только, что сделал FB котором: открытие порта, далее чтение из 21 модуля, потом запись в 21 модуль. Тайм-аут 10мс. Но ФИЗИЧЕСКИ подключены к порту только два модуля. И залил код "DO:=DI" ну если есть вход сразу включается выход. Так вот задержка между включением светодиода на входе до включения реле на выходе примерно 1 сек.
    Думаю, что если сейчас 19 модулей работают по тайм-ауту, а это 19 модулей*2 кол. обращений*10=380 мс плюс там еще какие то задержки. Если все это уберется, то может все будет и нормально - завтра буду на объекте - попробую....

    А по изменению это идея, достаточно перед записью сравнить старое значение байта с новым и если они равны тогда перейти на следующий шаг CASE, так?
    Последний раз редактировалось a_gricaj; 19.09.2016 в 00:01.

  6. #6

    По умолчанию

    Цитата Сообщение от a_gricaj Посмотреть сообщение
    Новое PRG, точно поможет? где-то читал что не поможет....

    Только, что сделал FB котором: открытие порта, далее чтение из 21 модуля, потом запись в 21 модуль. Тайм-аут 10мс. Но ФИЗИЧЕСКИ подключены к порту только два модуля. И залил код "DO:=DI" ну если есть вход сразу включается выход. Так вот задержка между включением светодиода на входе до включения реле на выходе примерно 1 сек.
    Думаю, что если сейчас 19 модулей работают по тайм-ауту, а это 19 модулей*2 кол. обращений*10=380 мс плюс там еще какие то задержки. Если все это уберется, то может все будет и нормально - завтра буду на объекте - попробую....

    А по изменению это идея, достаточно перед записью сравнить старое значение байта с новым и если они равны тогда перейти на следующий шаг CASE, так?
    Да, если нужно изменить выход, то case:=case+1, если нет, то case:=0.
    Сейчас на работе. Если найду модуль, то попробую разобраться с записью. Я подозреваю, что 255 - это ошибка таймаута.
    Модуля вывода нет, но 255 - это таймаут.
    Последний раз редактировалось KSergey; 19.09.2016 в 08:32.

  7. #7

    По умолчанию

    Цитата Сообщение от KSergey Посмотреть сообщение
    Да, если нужно изменить выход, то case:=case+1, если нет, то case:=0.
    Сейчас на работе. Если найду модуль, то попробую разобраться с записью. Я подозреваю, что 255 - это ошибка таймаута.
    Модуля вывода нет, но 255 - это таймаут.
    Да, скорее всего это таймаут, при подключенных всех 23 модуля на (одном порте) все ушло...

  8. #8

    По умолчанию

    Цитата Сообщение от a_gricaj Посмотреть сообщение
    А по изменению это идея, достаточно перед записью сравнить старое значение байта с новым и если они равны тогда перейти на следующий шаг CASE, так?
    Да, если значение для выхода не изменилось, то просто не заходить на шаг записи выходов. Таким образом избавитесь от лишних посылок в сети.

    Можно также попробовать опрашивать состояние счетчиков модуля одной посылкой.

    Отдельная PRG не поможет.

  9. #9
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    проверять нужно чтением лога запросов/ответов, а не домыслами
    Интересно, как Вы будете определять изменение входов в модулях
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  10. #10

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    проверять нужно чтением лога запросов/ответов, а не домыслами
    Интересно, как Вы будете определять изменение входов в модулях
    Запись по изменению, а не чтение.

Страница 3 из 6 ПерваяПервая 12345 ... ПоследняяПоследняя

Похожие темы

  1. Еще раз о библиотеке SysLibSockets
    от dudanov в разделе ПЛК1хх
    Ответов: 52
    Последнее сообщение: 28.01.2015, 15:41
  2. По библиотеке UNM
    от Сергей Мих в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 25.04.2012, 23:06
  3. Вопрос по библиотеке UNM
    от askpify в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 31.10.2009, 23:50
  4. По Овеновской библиотеке PID ?
    от mar154 в разделе ПЛК1хх
    Ответов: 5
    Последнее сообщение: 28.10.2008, 12:32

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •