Страница 507 из 736 ПерваяПервая ... 7407457497505506507508509517557607 ... ПоследняяПоследняя
Показано с 5,061 по 5,070 из 7355

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

  1. #5061

    По умолчанию

    Всем здравствуйте! Начинаю осваивать ПЛК Овен. Сейчас в работе ПЛК110-32РМ.
    Подключил ПЛК(master) с панелью оператора СП307(slave) по RS-485, протокол MODBUS rtu. Оператор выбирает какой механизм включить на дисплее, ПЛК переодически считывает из панели биты состояния, вкл/откл выходы. Все хорошо, все работает.
    Нужно из панели периодически считывать текущее время(PSW[300]-[306] ), вдруг оператор его изменил, и устанавливать это время в ПЛК, для корректного формирования своих лог файлов (какой механизм сколько работал и когда).

    Сталкнулся со следующей проблемой:
    В конфигураторе ПЛК добавляю Universal ModBus Device, добавляю в него 7 регистров, устанавливаю команду читать и период опроса 10сек (10000 мс).
    Полусаю: считывает 1 регистр, проходит 10 сек, считывает другой регистр (не обязательно по порядку), прроходит 10 сек, и т.д....

    КАК СДЕЛАТЬ ЧТО БЫ ПЛК СЧИТЫВАЛ ВСЕ 7 РЕГИСТРОВ ЗА 1 ЦИКЛ???

    Т.Е. прочитал 7 регистров, прошло 10 сек, проситал опять все 7 регистров и т.д.
    период опроса менял, таймаут тоже, без результатно....

    cod1.jpg

    Пробовал настроить Universal ModBus Device by command - все тоже самое. 1 команда - 1 регистр, 1 команда - другой регистр (не обязательно по порядку).

    Подскажите в чем дело? Или так и должно быть?

  2. #5062

    По умолчанию

    Дело в том, что PLC Configuration не умеет делать групповые запросы. Используйте ModBus.lib. Или можно панель мастером сделать, что по мне удобнее.

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

    По умолчанию

    Цитата Сообщение от RV9WFJ Посмотреть сообщение
    Дело в том, что PLC Configuration не умеет делать групповые запросы.
    и для кого тут форумчане делились опытом, как использовать модуль строка
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

  4. #5064

    По умолчанию

    Цитата Сообщение от RV9WFJ Посмотреть сообщение
    Дело в том, что 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 КАРЛ
    т.е. если Read10s_PRG запускается 1 раз в 10 мс то требуется 299*10мс.
    если Read10s_PRG запускается 1 раз в 10000 мс то требуется 299*10000мс.

    Вот этого я никак не ожидал вообще!!! Но справедливости ради надо отметить что порт открывается, обмен идет, и можно одним запросом прочитать сразу несколько регистров =) На 10000мс не проверял конечно, остановился на 800мс. Далее "логика" была понятна.

    Но и тут казалось можно было выкрутиться:
    Создаем POU OpenPort_PRG -> настраиваем циклически 10мс -> вставляем туда код:
    Код:
    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
    Порт открывается быстро. А теперь в Read10s_PRG просто работаем с этим портом (естественно нужные переменные делаем глобальными)

    Код:
    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 );
    cmpl будет TRUE когда get1_modbus получит данные.
    НО
    получит она их через 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 ничего не выйдет - проверено! После открытия порта в программе конфигуратор больше не может подключиться к интерфейсу.
    Вот такая интересная ночка выдалась =)

  5. #5065
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,218

    По умолчанию

    Цитата Сообщение от death132 Посмотреть сообщение
    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 КАРЛ
    т.е. если Read10s_PRG запускается 1 раз в 10 мс то требуется 299*10мс.
    если Read10s_PRG запускается 1 раз в 10000 мс то требуется 299*10000мс.

    Вот этого я никак не ожидал вообще!!! Но справедливости ради надо отметить что порт открывается, обмен идет, и можно одним запросом прочитать сразу несколько регистров =) На 10000мс не проверял конечно, остановился на 800мс. Далее "логика" была понятна.

    Но и тут казалось можно было выкрутиться:
    Создаем POU OpenPort_PRG -> настраиваем циклически 10мс -> вставляем туда код:
    Код:
    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
    Порт открывается быстро. А теперь в Read10s_PRG просто работаем с этим портом (естественно нужные переменные делаем глобальными)

    Код:
    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 );
    cmpl будет TRUE когда get1_modbus получит данные.
    НО
    получит она их через 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 ничего не выйдет - проверено! После открытия порта в программе конфигуратор больше не может подключиться к интерфейсу.
    Вот такая интересная ночка выдалась =)
    Зачем одно и тоже по всем веткам форума писать?
    26 лет деятельности в области промышленной безопасности

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

    По умолчанию

    Цитата Сообщение от death132 Посмотреть сообщение
    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 КАРЛ
    т.е. если Read10s_PRG запускается 1 раз в 10 мс то требуется 299*10мс.
    если Read10s_PRG запускается 1 раз в 10000 мс то требуется 299*10000мс.

    Вот этого я никак не ожидал вообще!!! Но справедливости ради надо отметить что порт открывается, обмен идет, и можно одним запросом прочитать сразу несколько регистров =) На 10000мс не проверял конечно, остановился на 800мс. Далее "логика" была понятна.

    Но и тут казалось можно было выкрутиться:
    Создаем POU OpenPort_PRG -> настраиваем циклически 10мс -> вставляем туда код:
    Код:
    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
    Порт открывается быстро. А теперь в Read10s_PRG просто работаем с этим портом (естественно нужные переменные делаем глобальными)

    Код:
    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 );
    cmpl будет TRUE когда get1_modbus получит данные.
    НО
    получит она их через 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) про напоследок, Вы серьезно считаете что открыли Америку?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

  7. #5067

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    1) А заглянуть во внутренности COM_SERVICE и поправить нужное или написать свое ПОУ открытия порта внимательно читая доки на syslibcom было не досуг?
    2) Ну ради экспериментов можно конечно ознакомиться с плкашной многозадачностью, но чувствуется не до конца Вы разобрались
    3) про напоследок, Вы серьезно считаете что открыли Америку?
    Если читали первое сообщение то видели что это мой первый опыт с ПЛК, потому и просил помощи, и вопрос задал в теме для новичков! До заглядывания во внутренности библиотек и исправления их под свои нужды я еще не дорос. Тем более задача на первый взгляд была элементарной: читать несколько регистров 1 запросом очень редко. Не думал что для этого нужны танцы с бубном.

    А вы если такой гуру то лучше бы помогли советом или делом для решения изначального вопроса. Зачем тыкать сопляка который итак ничего не знает "во внутренности COM_SERVICE" ???

  8. #5068

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    и для кого тут форумчане делились опытом, как использовать модуль строка
    Строку читать пробовал, но приходило каждый раз одно и то же, хотя данные должны были меняться. Разбираться не стал, послушал разумного совета petera и RV9WFJ. Задача решена, пусть и абсолютно другим способом.

  9. #5069

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Зачем одно и тоже по всем веткам форума писать?
    Не думал что так оперативно и там и там ответят. Больше не буду.

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

    По умолчанию

    Цитата Сообщение от death132 Посмотреть сообщение
    А вы если такой гуру то лучше бы помогли советом или делом для решения изначального вопроса. Зачем тыкать сопляка который итак ничего не знает "во внутренности COM_SERVICE" ???
    а смысл помогать, Вам сказали что панель лучше мастером, Вы уже поменяли подход, завтра например Валенок скажет, что лучше нету когда панель слейв, опять станете переходить?
    И мой совет это не тыканье носом,а рекомендация изучить как пишется код, проанализировать в каком месте возникает задержка открытия порта
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

Страница 507 из 736 ПерваяПервая ... 7407457497505506507508509517557607 ... ПоследняяПоследняя

Метки этой темы

Ваши права

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