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

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

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

    По умолчанию

    Цитата Сообщение от a_gricaj Посмотреть сообщение
    Сеть собирал не я - мне нужно переделать после другого программиста, а она собрана повторюсь 54 шт мдвв. Мне нужно "вытянуть" максимум по просу. Ну может 5 секунд я и загнул конечно. Вот и спрашиваю совет, как правильно все организовать.,
    Подскажите пожалуйста как правильно записать байт в 50 регистр МДВВ (см. посты выше).
    регистр это всегда слово, а не байт, в доках написано с какого по какой разряд используются входа/выхода,остается только к слову добавить точку и цифру номера разряда, чтоб прочитать/записать були
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  2. #22

    По умолчанию

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

  3. #23

    По умолчанию

    Ну вроде работает и чтение и запись - два модуля на столе.
    А как избавится от вот этого:
    Вложение 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;

  4. #24

    По умолчанию

    Где хотябы почитать про эту ошибку подскажите пожалуйста???

  5. #25

    По умолчанию

    Цитата Сообщение от 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. #26
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

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

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

  7. #27

    По умолчанию

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

  8. #28

    По умолчанию

    Цитата Сообщение от 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.

  9. #29
    Пользователь
    Регистрация
    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.

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

    По умолчанию

    Обратите внимание, еще на вот эту таблицу. Из нее хорошо, видно, что есть некоторая задержка в том, как отвечают модули. Это видно по разнице между опросами 4, 16, 32 и 48 байт. Так на скорости 115200 опрос 16 байт занимает 8 мс, а 32 байт - 10 мс. Из чего можно сказать, что опрос 16 байт на скорости 115200 примерно 2 мс (сходится с теоретическим расчетом). Но вот первые 16 байт он почему-то опрашивает аж 8 мс. В этом времени главная составляющая - это задержка от слейва - т.е. время, которое тот думает перед отправкой ответа.

Страница 3 из 8 ПерваяПервая 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

Ваши права

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