Про глаз перебор. Еслиб захотел увидеть Владислав, то и не смог т.к. codesys не обновляется с такой частотой не через usb не через ethernet.
---------------
Вот и у меня претензия к конфигуратору.
Если я опрашиваю модуль с 2мя регистрами с частотой 100 мс, то фактически получается каждый регистр обновляется раз в 200мс, хотя если они стоят рядом друг с другом то можно былоб преминить функцию модбас группового запроса на что ушло намного меньше времени, в даном случае в 2 раза и регистры обновлялись раз в 100 мс. Конфигуратор туп.
Последний раз редактировалось Scream; 19.08.2015 в 12:26.
Если я правильно понимаю, такая же проблема и при использовании библиотеки. Я ведь должен на каждом скане проверять переменную Complite. У меня нет возможности создать событие, которое вызовет мой обработчик, когда придут данные. Поэтому и нужно, на мой взгляд, выносить опрос модулей в отдельную задачу, которая будет циклически вызываться как можно чаще.
Здесь мне не понятно, почему модули начали затыкаться? Какая им разница с какой частотой их опрашивают? Другое дело, что если у МВ110-8А внутренний период обновления данных в районе 600 - 900 мс на канал (согласно руководства по эксплуатации модулей), то эти модули опрашивать чаще нет смысла (под внутренним периодом опроса я подразумеваю время с какой частотой физические измерения на входах преобразуются в данные, располагающиеся в регистрах Modbus модуля). И это можно учесть при организации опроса. Но вот для модулей МВ110-8АС внутренне время опроса одного канала - 5 мс. А для модулей дискретного ввода/вывода, частота обновления данных измеряется долями мс. Поэтому их опрашивать имеет смысл чаще. Это все можно и нужно учитывать при организации опроса.
Для этого в конфигураторе есть величина Polling time. В случае работы с библиотекой за этим нужно следить самостоятельно.
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Эту проблему можно отчасти решить используя для опроса string переменные см. тут - http://www.owen.ru/forum/showthread.php?t=21799
Та нееее... С конфигуратором вообще нет прямого способа узнать о приходе данных (только косвенные вроде смены адреса или изменения значения), а с библиотекой хотя бы есть сигнал complete. И временем цикла в таких задачах вполне можно пренебречь. Миллисекунда туда-сюда погоды в таких сетях не делает.Если я правильно понимаю, такая же проблема и при использовании библиотеки. Я ведь должен на каждом скане проверять переменную Complite. У меня нет возможности создать событие, которое вызовет мой обработчик, когда придут данные. Поэтому и нужно, на мой взгляд, выносить опрос модулей в отдельную задачу, которая будет циклически вызываться как можно чаще.Ну мало ли на что там ресурсов перестаёт хватать. А может и я чего не так намерил. Делал от скуки, а не от науки.Здесь мне не понятно, почему модули начали затыкаться? Какая им разница с какой частотой их опрашивают?
Да бы не отвлекаться на филосовские дискуссии о "событиях" попробую конкретизировать рассуждения. А опытные пользователи ПЛК и разработчики пусть укажут на ошибки, неточности и слабые места в них.
Условия задачи оставим прежними - опросить 10 модулей ввода/вывода: 4 модуля МВ110-8АС, 3 модуля МВ110-32ДН и 3 модуля МУ110-32Р (опрос только измерений). Для определенности примем, что опрос ведется на скорости 115200 бит/сек.
Рассмотрим возможный вариант опроса через modbus.lib.
Создадим некие ФБ для каждой разновидности модулей. В этих ФБ используем блоки MB_RD_HOLD_REGS и MB_WR_REGS для записи и чтения регистров. Для каждого модуля в системе создаем свой экземпляр. Вызов этих экземпляров осуществляем последовательно в некоторой программе, назовем ее Module_PRG, которую поместим в задачу, выполняющуюся циклически с неким периодом.
Первое, что хочется понять каков должен быть период вызова Module_PRG? Как я понимаю он должен быть таким, чтобы между 2-мя последовательными вызовами система успевала отправить запрос модулю и получить ответ. Для этого рассчитаем время требуемое для пересылки запроса и ответа на него по сети Modbus при скорости 115200 кбит/сек. Будем исходить из потребностей аналогового модуля. Запрос включает: адрес уст-ва (1 байт) + номер функции (1 байт) + адрес регистра (2 байта) + кол-во регистров (1 байт) + CRC (2 байта) = 7 байт. Ответ включает: адрес уст-ва (1 байт) + номер функции (1 байт) + данные в int (16 байт) + CRC (2 байта) = 20 байт. Итого передать по сети туда-обратно нужно 27 байт. На скорости 115200 бит/сек для этого необходимо: 27*8/115200 = 0,0019 секунды или 1,9 мс. Добавим к этому времени возможные неучтенности (пауза, стоповые биты и прочее) в размере 2 мс. Или даже еще более осторожно - в руководстве по эксплуатации ПЛК 110-160 диапазон значений Pooling Time 10 - 1000 мс - примем за достаточную (с большим запасом) величину периода опроса одного модуля - 10 мс. Тогда получается период вызова программы Module_PRG должен составлять 10 мс. А весь цикл опроса 10-ти модулей 100 мс.
Главную программу PLC_PRG в этом случае следует вызывать раз в 110 мс, например.
Возможно ли достижения таких скоростей опроса с использованием библиотеки Modbus.lib?
Опрос через конфигуратор.
Теперь умозрительно создадим аналогичную сеть в конфигураторе. Для опроса аналоговых модулей будем использовать, уже указанный мною выше, прием с переменными String.
Создадим для каждого физического модуля соответствующий Universal Modbus Device и зададим им Pooling Time = 10 мс.
Какой период опроса должен получиться в этом случае в конфигураторе?
Последний раз редактировалось Спорягин Кирилл; 19.08.2015 в 15:36.