Просмотр полной версии : Конфигурация ПЛК-Modbus (slave)- как запихнуть более 860 регистров??
a_gricaj
09.10.2016, 21:23
Здравствуйте, подскажите пожалуйста такой вопрос:
у себя в проекте для передачи данных в OPC-сервер и обратно использую регистры которые вбиваю в "Конфигурация ПЛК" => "Modbus(slave)" .
Так вбил 860 регистров (в основном WORD, DWORD мало) - все ок, обмен хороший.При добавлении 861 регистра ПЛК уходит в СТОП или в перезагрузку - как повезет. Подозреваю, что ресурс свободных регистров, я исчерпал. Как увеличить количество регистров, так как мне не хватает - нужно еще пару сотен??????
Может ли это быть связано с прошивкой???
Моя:
26954
Сергей0308
09.10.2016, 22:29
Если не требуется высокого быстродействия и с одной стороны можно "упаковать", а с другой "распаковать" можно передавать одним регистром множество переменных уже писал об такой идее: http://www.owen.ru/forum/showthread.php?t=23807&page=5
Если один байт регистра использовать для "синхронизации", а второй для передачи данных, получится одним регистром передать 128 переменных(16 битных), то есть количество регистров сократится в 128 раз!
a_gricaj
09.10.2016, 22:42
Если не требуется высокого быстродействия и с одной стороны можно "упаковать", а с другой "распаковать" можно передавать одним регистром множество переменных уже писал об такой идее: http://www.owen.ru/forum/showthread.php?t=23807&page=5
Если один байт регистра использовать для "синхронизации", а второй для передачи данных, получится одним регистром передать 128 переменный(16 битных), то есть количество регистров сократится в 128 раз!
Упаковывать и распаковывать можно (так битовые сигналы передаю), а вот быстродействие нужно, и так теряю его на опросе пол сотни МДВВ, а если на связи с верхним уровнем буду терять так вообще ппц будет.
А так спс, надо будет по свободе посмотреть.....
a_gricaj
09.10.2016, 22:45
Здравствуйте, подскажите пожалуйста такой вопрос:
у себя в проекте для передачи данных в OPC-сервер и обратно использую регистры которые вбиваю в "Конфигурация ПЛК" => "Modbus(slave)" .
Так вбил 860 регистров (в основном WORD, DWORD мало) - все ок, обмен хороший.При добавлении 861 регистра ПЛК уходит в СТОП или в перезагрузку - как повезет. Подозреваю, что ресурс свободных регистров, я исчерпал. Как увеличить количество регистров, так как мне не хватает - нужно еще пару сотен??????
Может ли это быть связано с прошивкой???
Моя:
26954
с прошивкой 2.15.9 - после загрузки кода в ПЛК CodeSYS отказывается повторно подключаться к ПЛК, в чем тут еще проблема????? На 2.14.0 такого не было.....
А ОРС видит регистры которые в плк я не программировал и начала валится связь, прикольненько.......
Филоненко Владислав
10.10.2016, 05:48
Такое поведение связано ввыходом за пределы памяти I/O.Вы переменные в конфигурации именуете или обращаетесь по %Q.x.x.x?
Подозреваю, что ресурс свободных регистров, я исчерпал. Как увеличить количество регистров, так как мне не хватает - нужно еще пару сотен??????
переходить на библиотечное исполнение слейва и переменные держать не в конфигураторе, а в структуре в глобальных данных или ФБ
a_gricaj
10.10.2016, 07:34
Именовал, а нужно было %Q.x.x.x???
Достаточно ли будет просто удалить имена в конфигураторе, а в ФБ сделать например так:
L7DelayActAlarmFeedbackActuator:= %QW7.679.0;
L7DelayActAlarmFeedbackAutomaton:= %QW7.680.0;
L7DelayActAlarmPositon:=%QW7.681.0;
L7FromScadaControl:=%QW7.682.0;
L7FromScadaSettings:=%QW7.683.0;
%QW7.684.0:=L7ToScadaActiveTimeToAlarmPosition;
%QW7.685.0:=L7ToScadaStatus;
И как тогда правильно понимать последнюю букву "М" в марке контроллера????
a_gricaj
10.10.2016, 08:51
переходить на библиотечное исполнение слейва и переменные держать не в конфигураторе, а в структуре в глобальных данных или ФБ
Где почитать о " библиотечное исполнение слейва " подскажите пожалуйста
Где почитать о " библиотечное исполнение слейва " подскажите пожалуйста
вот (http://www.owen.ru/forum/showthread.php?t=23997&p=222431&viewfull=1#post222431) один из примеров, только надо будет вместо UDP использовать TCP-соединение и дописать ответку протокола 16 функции, чтоб всё по взрослому было
a_gricaj
10.10.2016, 09:06
вот (http://www.owen.ru/forum/showthread.php?t=23997&p=222431&viewfull=1#post222431) один из примеров, только надо будет вместо UDP использовать TCP-соединение и дописать ответку протокола 16 функции, чтоб всё по взрослому было
Файл в архиве не открывается в КС
импортировать нужно, а не открывать
a_gricaj
10.10.2016, 10:06
импортировать нужно, а не открывать
Да точно, забыл...
СПС за пример, но пока его отложу - знаний не хватает, если не по "взрослому" так покатит (в отдельном ФБ тупое переприсваивание):
L13DelayActAlarmFeedbackActuator:=%QW7.721.0;
L13DelayActAlarmFeedbackAutomaton:=%QW7.722.0;
L13DelayActAlarmPositon:=%QW7.723.0;
L13FromScadaControl:=%QW7.724.0;
L13FromScadaSettings:=%QW7.725.0;
%QW7.726.0:=L13ToScadaActiveTimeToAlarmPosition;
%QW7.727.0:=L13ToScadaStatus;
??????????????????????????????????????????????????
a_gricaj
10.10.2016, 11:04
перебил так более 150 сигналов, пока все по старому.......
DmitriiAnyushin
10.10.2016, 11:20
Ну все можно не перебивать руками, а через указатель массив переложить - я уже этим вопросом задавался
http://www.owen.ru/forum/showthread.php?t=22160
Только там все равно конфигуратор весь размечать надо (создать заданное количество элементов) и косяк с ограничением элеменетов остается. Чтоб больше данных передать можно использовать четырехбайтовые элементы
a_gricaj
10.10.2016, 12:04
Ну все можно не перебивать руками, а через указатель массив переложить - я уже этим вопросом задавался
http://www.owen.ru/forum/showthread.php?t=22160
Только там все равно конфигуратор весь размечать надо (создать заданное количество элементов) и косяк с ограничением элеменетов остается. Чтоб больше данных передать можно использовать четырехбайтовые элементы
Я уже готов и руками перебить если бы только работало....
Конфигуратор я "разметил", и присвоил имена, что я так понял делать не нужно было, вот скрин:
26961
на скрине видно, что у меня есть переменная Register2, Register3,Register4 и т.д. было до 860 - все работало.
Правильно ли я понял, что нужно все эти "Register" убрать, а в фб сделать так например:
L4DelayActAlarmFeedbackActuator:=%QW7.658.0; (раньше %QW7.658.0 было присвоено имя RegisterNNN)
Будет ли это работать ???
Менять все на четырех байтовые элементы для меня ппц - скада уже сделана почти...
Для информации: Откатился на прошивку 2.14.0 - контроллер начал отзываться после заливки в него кода, чего не было на 2.15.9 - на разных прошивках с одним и тем же кодом ПЛК ведет себя по разному....
DmitriiAnyushin
10.10.2016, 13:52
Я уже готов и руками перебить если бы только работало....
Конфигуратор я "разметил", и присвоил имена, что я так понял делать не нужно было, вот скрин:
26961
на скрине видно, что у меня есть переменная Register2, Register3,Register4 и т.д. было до 860 - все работало.
Правильно ли я понял, что нужно все эти "Register" убрать, а в фб сделать так например:
L4DelayActAlarmFeedbackActuator:=%QW7.658.0; (раньше %QW7.658.0 было присвоено имя RegisterNNN)
Будет ли это работать ???
Менять все на четырех байтовые элементы для меня ппц - скада уже сделана почти...
Для информации: Откатился на прошивку 2.14.0 - контроллер начал отзываться после заливки в него кода, чего не было на 2.15.9 - на разных прошивках с одним и тем же кодом ПЛК ведет себя по разному....
Я тоже уже этот вопрос задавал, но ответа не получил - больше чем определенное значение элементов (не помню сколько - возможно и 860) модбас не работает, а ПЛК[м02] вообще вылетает (хотя конфигуратор под 1000 элементов рассчитан) (http://www.owen.ru/forum/showthread.php?t=25302). Без разницы как заносить - руками каждый или указателем массив в размеченную область перекладывать.
Филоненко Владислав
10.10.2016, 16:35
=%QW7.658.0 так делать нельзя! Именуйте переменные, иначе компилятор не может проконтролировать разбиение памяти
Филоненко Владислав
10.10.2016, 16:36
Я тоже уже этот вопрос задавал, но ответа не получил - больше чем определенное значение элементов (не помню сколько - возможно и 860) модбас не работает, а ПЛК[м02] вообще вылетает (хотя конфигуратор под 1000 элементов рассчитан) (http://www.owen.ru/forum/showthread.php?t=25302). Без разницы как заносить - руками каждый или указателем массив в размеченную область перекладывать.
Ждите обновления прошивки, проблема найдена и решена.
P.S. всё же что за задачи с 1000 переменных в slave?
a_gricaj
10.10.2016, 16:37
Я тоже уже этот вопрос задавал, но ответа не получил - больше чем определенное значение элементов (не помню сколько - возможно и 860) модбас не работает, а ПЛК[м02] вообще вылетает (хотя конфигуратор под 1000 элементов рассчитан) (http://www.owen.ru/forum/showthread.php?t=25302). Без разницы как заносить - руками каждый или указателем массив в размеченную область перекладывать.
На следующий проект хотел брать ПЛК[м02], но теперь не буду, тут со старым проблем куча, а новый наверное вообще ппц.
Блин вообще не пойму зачем пихать в контроллер Ethernet 100 Мбит/с если нельзя из него вытянуть 1000 Word, может где-то я "косячу почерному" - ну типа галочку не поставил????????????
a_gricaj
10.10.2016, 16:41
=%QW7.658.0 так делать нельзя! Именуйте переменные, иначе компилятор не может проконтролировать разбиение памяти
Я запутался, изначально у меня было правильно (см.скрин)??????????????????????????????????
a_gricaj
10.10.2016, 16:46
ну, настроение Вы подняли, это не свинокомплекс, а элеватор...., если надежность стремится к нулю тогда, что же делать клиенту, если при этом он звонил (перед началом проектирования) в тех.подержку и уточнял "выдаст ли ваш ПЛК110 на верх 1000 вордов или нет", а клиенту тех.поддержка ответила: "выдаст"......
Филоненко Владислав
10.10.2016, 17:00
ну, настроение Вы подняли, это не свинокомплекс, а элеватор...., если надежность стремится к нулю тогда, что же делать клиенту, если при этом он звонил (перед началом проектирования) в тех.подержку и уточнял "выдаст ли ваш ПЛК110 на верх 1000 вордов или нет", а клиенту тех.поддержка ответила: "выдаст"......
Дело не в возможности поднять 1000 вордов. Хоть 10000. Чисто тех. ограничение было.
А в том, что 1 ПЛК не может надёжно управлять или регистрировать 1000 параметрами. Это несколько десятков, если не сотня модулей расширения.
Технически это работает.
Но с точки зрения теории надёжности система - это концентратор, выход которого из строя или обрыв с ним связи, или пропадание питания выводит весь объект из строя.
a_gricaj
10.10.2016, 17:08
Дело не в возможности поднять 1000 вордов. Хоть 10000. Чисто тех. ограничение было.
А в том, что 1 ПЛК не может надёжно управлять или регистрировать 1000 параметрами. Это несколько десятков, если не сотня модулей расширения.
Технически это работает.
Но с точки зрения теории надёжности система - это концентратор, выход которого из строя или обрыв с ним связи, или пропадание питания выводит весь объект из строя.
может мы друг друга не поняли - 1000 вордов это отдать должен ПЛК ОРС-серверу для скады, причем здесь модуля....
И зачем посты удалять то???????????????
Филоненко Владислав
10.10.2016, 17:18
А откуда он их возьмёт, эти 1000 значений? Это реальные I/O. А значит реальные модули и реальные связи. Всё в 1 точке.
Спорягин Кирилл
10.10.2016, 17:59
На следующий проект хотел брать ПЛК[м02], но теперь не буду, тут со старым проблем куча, а новый наверное вообще ппц.
Новый как раз очень хорош.
Он быстрее старого примерно в 10-15 раз (см. тут (http://www.owen.ru/forum/showthread.php?t=22002&page=7&p=206930&viewfull=1#post206930)).
Причем это уже подтверждается не только простым тестом, но и опытом моего практического применения.
К тому же прошивка его явно лучше отлажена и он гораздо привлекательнее на вид.
Ворды передаваемые на верх безусловно связаны с модулями ввода/вывода. Так, например, при расчете количества тегов (того же Modbus Master OPC Serverа) я обычно на 1 аналоговый вход закладываю 5-10 тэгов (значение, верхняя, нижняя критическая/предупредительная граница, тэг аларма - уже 6 тэгов).
Для Владислава Филоненко.
На мой взгляд, 1000 тэгов на контроллер - это нормально. Так что нужно поддерживать данную функциональность.
a_gricaj
10.10.2016, 18:48
А откуда он их возьмёт, эти 1000 значений? Это реальные I/O. А значит реальные модули и реальные связи. Всё в 1 точке.
Хорошо, какое максимальное количество регистров можно использовать??????????????????????????????
И это объясните мне пожалуйста:
26976
как это тогда правильно понимать......
Филоненко Владислав
11.10.2016, 05:52
Хорошо, какое максимальное количество регистров можно использовать??????????????????????????????
И это объясните мне пожалуйста:
26976
как это тогда правильно понимать......
Мы сейчас говорим не о технической возможности (перевозить 5 тонн в кузове на 100км/ч)
а о здравом смысле (не возить бензин с кислотой вперемешку в стеклянной таре по просёлочной дороге на 100км/ч)
Я всегда стараюсь придерживаться правила :
А. 1 лог.контроллер (ПЛК, ПР,ТРМ какой-нибудь) на 1 лок. объект/функцию
+
Б. 1-2 канала независимых от(А)измерения на объект/функцию (для независимого сбора данных)
+
В. 1 аварийный контроллер на пул объектов
+
Г. хотя бы 1 автономная защита на объект/функцию
Д. всё это 2 каналами связывается с вышестоящим уровнем или 1 канал с HMI и 1 канал с вышестоящим контроллером
Выход из строя любого компонента - выход из строя одной функции. Он детектируется и локализуется сразу.
a_gricaj
11.10.2016, 07:59
Мы сейчас говорим не о технической возможности (перевозить 5 тонн в кузове на 100км/ч)
а о здравом смысле (не возить бензин с кислотой вперемешку в стеклянной таре по просёлочной дороге на 100км/ч)
Я всегда стараюсь придерживаться правила :
А. 1 лог.контроллер (ПЛК, ПР,ТРМ какой-нибудь) на 1 лок. объект/функцию
+
Б. 1-2 канала независимых от(А)измерения на объект/функцию (для независимого сбора данных)
+
В. 1 аварийный контроллер на пул объектов
+
Г. хотя бы 1 автономная защита на объект/функцию
Д. всё это 2 каналами связывается с вышестоящим уровнем или 1 канал с HMI и 1 канал с вышестоящим контроллером
Выход из строя любого компонента - выход из строя одной функции. Он детектируется и локализуется сразу.
Если выполнить все пункты ваши мне кажется - это несколько удорожит стоимость оборудование и потеряется основная привлекательность ПЛК ОВЕН - цена, я например не скрою, поставлен в рамки использования только ПЛК ОВЕН потому что - он дешевый. А если городить огород как предлагаете вы, так тогда берем один контроллер от другого производителя - у меня молзаводом управляет один контроллер.................
Но понимаете, мне сейчас переделывать свой проэкт и скаду и мне ппц как хочется узнать каким числом регитров я ограничен, уже стало понятно, что 860 уже много- но сколько можно, куда мне ужиматся?
DmitriiAnyushin
11.10.2016, 09:15
P.S. всё же что за задачи с 1000 переменных в slave?
Сбор информации с других слэйвов, небольшие доработки и передача на скаду. С каждого слэйва по 300 регистров. Устройств примерно 5-10 (в зависимости от проекта). Плюс еще настройки, предупреждения и т.д.
Филоненко Владислав
11.10.2016, 09:50
Запросите тестовую версию в ГТП. Или подождите релиза
Если выполнить все пункты ваши мне кажется - это несколько удорожит стоимость оборудование и потеряется основная привлекательность ПЛК ОВЕН - цена, я например не скрою, поставлен в рамки использования только ПЛК ОВЕН потому что - он дешевый. А если городить огород как предлагаете вы, так тогда берем один контроллер от другого производителя - у меня молзаводом управляет один контроллер.................
Но понимаете, мне сейчас переделывать свой проэкт и скаду и мне ппц как хочется узнать каким числом регитров я ограничен, уже стало понятно, что 860 уже много- но сколько можно, куда мне ужиматся?
Вы вот который день уже пишите,а можно было уже давно сесть за разбор моего примера и пополнить свой багаж знаний
DmitriiAnyushin
11.10.2016, 10:27
Вы вот который день уже пишите,а можно было уже давно сесть за разбор моего примера и пополнить свой багаж знаний
Какую бы нибудь документацию по используемым Вами функциям и библиотекам, а то непонятно с чего начать разбираться
А еще лучше если Овен создал бы библиотеку для организации слэйва (как сейчас для ModbusRTU Master) и официально выложил бы на сайте, чтобы велосипеды не мастерились
работа с syslibsocket описано в доках идущих на диске с плк и на сайте,работа с модбас взята из библиотеки oscat.de за основу, только упрощена до нельзя
a_gricaj
11.10.2016, 11:01
Какую бы нибудь документацию по используемым Вами функциям и библиотекам, а то непонятно с чего начать разбираться
А еще лучше если Овен создал бы библиотеку для организации слэйва (как сейчас для ModbusRTU Master) и официально выложил бы на сайте, чтобы велосипеды не мастерились
это нашел http://www.owen.ru/forum/showthread.php?t=16814&highlight=syslibsocket
a_gricaj
11.10.2016, 11:13
это нашел http://www.owen.ru/forum/showthread.php?t=16814&highlight=syslibsocket
Вы уже здесь были)
a_gricaj
11.10.2016, 12:07
Вы вот который день уже пишите,а можно было уже давно сесть за разбор моего примера и пополнить свой багаж знаний
Мне еще не совсем понятно в каком виде я получу переменные в опс-сервере...
a_gricaj
11.10.2016, 12:20
работа с syslibsocket описано в доках идущих на диске с плк и на сайте,работа с модбас взята из библиотеки oscat.de за основу, только упрощена до нельзя
Вы имеете ввиду этот пример:
26990
???
Мне еще не совсем понятно в каком виде я получу переменные в опс-сервере...
в ФБ UDPMBUS строка условия byRecv[6]=1 AND byRecv[7]=3 означает адрес слейва должен быть равен 1 и функция 3, означающая отправку группы регистров, так как я запрашиваю заведомо известное количество регистров, я не делаю в примере дополнительную проверку какой начальный адрес и количество запрашивается, а сразу перехожу к отправке нужных данных. Если будете контролировать групповой запрос сможете посылать разные данные, соответствующие начальному адресу и количеству
Вы имеете ввиду этот пример:
26990
???
нет заходите сюда http://www.owen.ru/catalog/codesys_v2/67395347 и скачивайте любой архив с бибками, в них обычно складываются как бибки так и их описание
ЗЫ и не забывайте такой аспект, что в конфигураторе модбас является сохраняемым в энергонезависимой памяти, следовательно при каждом выключении плк, будет происходить запись на флеш этих данных, тут и от более малого количества происходят сбои, так что делайте выводы
a_gricaj
11.10.2016, 13:53
ЗЫ и не забывайте такой аспект, что в конфигураторе модбас является сохраняемым в энергонезависимой памяти, следовательно при каждом выключении плк, будет происходить запись на флеш этих данных, тут и от более малого количества происходят сбои, так что делайте выводы
Значит получается, по любому нужно уходить от конфигуратора, но блин я вообще немогу понять как подступится к вашему примеру....
В PLC_PRG отсекайте все лишнее, оставте только работу модбаса. Структуру данных, которую он отправляет заполняйте в ручную в режиме онлайн, чтоб пока привыкнуть к этому виду, скачайте билдер от вейнтека и запустите эмулятор онлайновый, в качестве контроллера выберите модбас зеро и галку поставте работать по UDP. Если нет желания то вот набор можно скачать от производителя КДС http://www.owen.ru/forum/showthread.php?t=14315&p=102798&viewfull=1#post102798, открывал сокеты я по этим примерам, что UDP, что TCP,для ТСР будет всё тоже самое что касается модбас, измениться только открытие/закрытие сокета и отправка/чтение
a_gricaj
11.10.2016, 14:42
В PLC_PRG отсекайте все лишнее, оставте только работу модбаса. Структуру данных, которую он отправляет заполняйте в ручную в режиме онлайн, чтоб пока привыкнуть к этому виду, скачайте билдер от вейнтека и запустите эмулятор онлайновый, в качестве контроллера выберите модбас зеро и галку поставте работать по UDP. Если нет желания то вот набор можно скачать от производителя КДС http://www.owen.ru/forum/showthread.php?t=14315&p=102798&viewfull=1#post102798, открывал сокеты я по этим примерам, что UDP, что TCP,для ТСР будет всё тоже самое что касается модбас, измениться только открытие/закрытие сокета и отправка/чтение
спс большое
да пока не зачто, если возникнут проблемы выкладывайте проект с тестированием слейва, подскажу что не так
DmitriiAnyushin
12.10.2016, 10:24
Тестовая прошивка для ПЛК110-30 М02, о которой писал Владислав Филоненко.
А для ПЛК110-60[М02] выложите пожалуйста (если готова)
Евгений Дударев
12.10.2016, 11:12
К сожалению, Владислав передал в группу технической поддержки версию на 110-30. Тогда завтра попрошу его выложить на 110-60.
Евгений Дударев
13.10.2016, 15:39
Прошу использовать прошивку 0.3.62
DmitriiAnyushin
14.10.2016, 10:51
Большое спасибо! Надо только имя файла переименовать, а то при выполнении команды UpdateCore браузер скажет, что прошивка не найдена
Только у меня возник ряд вопросов в добавок к уже имеющимся. Посмотрите пожалуйста - http://www.owen.ru/forum/showthread.php?t=25302&p=223780#post223780
a_gricaj
07.02.2017, 01:02
да пока не зачто, если возникнут проблемы выкладывайте проект с тестированием слейва, подскажу что не так
Здравствуйте, не стал создавать новую тему, а решил продолжить свою старую так как, в принципе название подходит.
Начал делать новый проект: таже связка ПЛК110+ОРСсервер(Инсат)+МастерСкада. Уж очень не хочется в ручную вбивать 600-700 регистров в конфигураторе и решил разобраться с бибкой SysLibSockets.
Подогнали мне пример:
раздел описания:
FUNCTION_BLOCK SENSOR
VAR CONSTANT
TIMEOUT_TIME : TIME := T#5S ;
POLLING_TIME : TIME := T#10S ;
TRUST_TIME : TIME := T#15S ;
END_VAR
VAR_INPUT
IP1 : DWORD := 16#0A000665;
IP2 : DWORD ;
END_VAR
VAR_OUTPUT
SKY : UINT ;
SUN : UINT ;
TRUST : BOOL ;
END_VAR
VAR
STATE : INT := 0 ;
TIMEOUT_TIMER : TON ;
TRUST_TIMER : TOF ;
SOCKET : DINT :=SOCKET_INVALID ;
SADR : SOCKADDRESS ;
REQUEST : ARRAY [0..11] OF BYTE := 5(0) , 6 , 1 , 3 , 0 , 0 , 0 , 2 ;
ANSWER : ARRAY [0..12] OF BYTE ;
_IP2 : BOOL ;
END_VAR
код FB:
IF IP1 <> 0 THEN
CASE STATE OF
0:
SOCKET := SysSockCreate ( SOCKET_AF_INET , SOCKET_STREAM , SOCKET_IPPROTO_TCP ) ;
IF SOCKET <> SOCKET_INVALID THEN
STATE := 1 ;
ELSE STATE:=4;
END_IF
TIMEOUT_TIMER ( IN := TRUE , PT := TIMEOUT_TIME ) ;
1:
SADR.sin_addr := IP1;(*SEL ( _IP2 AND ( IP2 <> 0 ) , IP1 , IP2 ) ;*)
SADR.sin_family := SOCKET_AF_INET ;
SADR.sin_port := 502 ;
SysSockConnect ( SOCKET , ADR ( SADR ) , SIZEOF ( SADR ) ) ;
STATE := 2 ;
2:
IF SysSockSend ( SOCKET , ADR ( REQUEST ) , SIZEOF ( REQUEST ) , 0 ) = SIZEOF ( REQUEST ) THEN
STATE := 3 ;
ELSE
TIMEOUT_TIMER ( IN := TRUE ) ;
END_IF
3:
IF SysSockRecv ( SOCKET , ADR ( ANSWER ) , SIZEOF ( ANSWER ) , 0 ) <> 0 THEN
IF ( ANSWER [ 0 ] = REQUEST [ 0 ] ) AND ( ANSWER [ 1 ] = REQUEST [ 1 ] ) THEN
SKY := WORD_OF_BYTE ( ANSWER [ 9 ] , ANSWER [ 10 ] ) ;
SUN := WORD_OF_BYTE ( ANSWER [ 11 ] , ANSWER [ 12 ] ) ;
TRUST_TIMER ( IN := TRUE ) ;
_IP2 := FALSE ;
END_IF
STATE := 4 ;
ELSE
TIMEOUT_TIMER ( IN := TRUE ) ;
END_IF
4:
SysSockClose ( SOCKET ) ;
SOCKET := SOCKET_INVALID ;
IF REQUEST [ 1 ] = BYTE#16#FF THEN
REQUEST [ 0 ] := REQUEST [ 0 ] + 1 ;
END_IF
REQUEST [ 1 ] := REQUEST [ 1 ] + 1 ;
STATE := SEL ( TIMEOUT_TIMER.Q , 5 , 0 ) ;
TIMEOUT_TIMER ( IN := FALSE ) ;
5:
TIMEOUT_TIMER ( IN := TRUE , PT := POLLING_TIME ) ;
IF TIMEOUT_TIMER.Q THEN
TIMEOUT_TIMER ( IN := FALSE ) ;
STATE := 0 ;
END_IF
END_CASE
IF TIMEOUT_TIMER.Q THEN
STATE := 4 ;
_IP2 := NOT _IP2 ;
END_IF
ELSIF SOCKET <> SOCKET_INVALID THEN
SysSockClose ( SOCKET ) ;
SOCKET := SOCKET_INVALID ;
STATE := 0 ;
END_IF
TRUST_TIMER ( IN := FALSE , PT := TRUST_TIME ) ;
TRUST := TRUST_TIMER.Q ;
И появились вопросы:
1. ІР-адрес 10.0.6.101 будет 16#0A000665. Правильно???
2. Если этот код не переходит на 3 шаг кейса, значит нет ответа от ПК с OPC-cервером(в моем случае это 10.0.6.101)??????
3. На третьем шаге (если правильно понял)идет чтение переменных, а как тогда записать значение переменной в OPC-сервер?????
4. Вообще насколько этот код подходит для ПЛК110+ОРСсервер(Инсат), может нужно что-то переделать?????
Сразу извиняюсь за тупые вопросы - это мое первое знакомство с SysLibSockets....
a_gricaj
09.02.2017, 12:25
Никто не может подсказать????
Филоненко Владислав
09.02.2017, 13:02
Проект содержит массу ошибок. Работать на ПЛК не будет.
a_gricaj
09.02.2017, 13:54
Проект содержит массу ошибок. Работать на ПЛК не будет.
Владислав можете другой пример дать - перекопав форум я вообще запутался и не знаю как начать..
Спорягин Кирилл
10.02.2017, 14:09
600-700 регистров не передавал, но вот 350 без особых затруднений и SysLibSocetoв. Время конфигурирования 20-40 секунд.
Просто добавьте в Modbus Slave 4-х байтовые переменные на нужный размер передаваемых данных и на начало этого массива наведите структуру (пусть она зовется DA).
Например, в глобальных данных вот так:
DA AT %QD7.1.0 : ExDataArea;
А структура ExDataArea состоит из других стуктур:
(* Область обмена с верхнем уровнем *)
TYPE ExDataArea :
STRUCT
Sensor1Base : SensorBase;
Sensor2Base : SensorBase;
Motor1Base : MotorBase;
END_STRUCT
END_TYPE
Здесь SensorBase и MotorBase - это "базовые" структуры датчика и мотора, т.е. те переменные, которые эти функциональные блоки должны передать на верхний уровень, или те переменные которые эти ФБ должны получить с верхнего уровня.
Таким образом за секунды Вы конфигурируете множество осмысленных переменных.
Филоненко Владислав
10.02.2017, 14:49
Использование не поименованных переменных в конфигурации не даёт возможности среде разработки проверить корректность их типов, адресов, размеров областей данных.
А далее трудноуловимые "плавающие" ошибки.
Спорягин Кирилл
10.02.2017, 15:00
Поэтому я стараюсь в базовых структурах использовать только тип word, dword и real. Таким образом я избегаю всяческих проблем с выравниванием памяти и т.п.
Но в целом "волков бояться в лес не ходить".
a_gricaj
10.02.2017, 15:01
600-700 регистров не передавал, но вот 350 без особых затруднений и SysLibSocetoв. Время конфигурирования 20-40 секунд.
Просто добавьте в Modbus Slave 4-х байтовые переменные на нужный размер передаваемых данных и на начало этого массива наведите структуру (пусть она зовется DA).
Например, в глобальных данных вот так:
DA AT %QD7.1.0 : ExDataArea;
А структура ExDataArea состоит из других стуктур:
(* Область обмена с верхнем уровнем *)
TYPE ExDataArea :
STRUCT
Sensor1Base : SensorBase;
Sensor2Base : SensorBase;
Motor1Base : MotorBase;
END_STRUCT
END_TYPE
Здесь SensorBase и MotorBase - это "базовые" структуры датчика и мотора, т.е. те переменные, которые эти функциональные блоки должны передать на верхний уровень, или те переменные которые эти ФБ должны получить с верхнего уровня.
Таким образом за секунды Вы конфигурируете множество осмысленных переменных.
Кирилл,а ошибки о которых говорит Филоненко Владислав?
a_gricaj
10.02.2017, 15:03
Поэтому я стараюсь в базовых структурах использовать только тип word, dword и real. Таким образом я избегаю всяческих проблем с выравниванием памяти и т.п.
Но в целом "волков бояться в лес не ходить".
а идея Ваша мне понравилась спс - как вариант
Контролер не стопорится при работе???
a_gricaj
10.02.2017, 15:10
Использование не поименованных переменных в конфигурации не даёт возможности среде разработки проверить корректность их типов, адресов, размеров областей данных.
А далее трудноуловимые "плавающие" ошибки.
При использовании конфигуратора с "забитымы" 600 регистров тоже не все гладко. Тут правда пока я грешу на себя (или любителей тыкать кнопки Старт/Стоп на шасси ПЛК) - контроллер работал месяц и ушел в стоп. В журнале ничего существенного нет. Мож кто подскажет как отловить проблемму?
Спорягин Кирилл
10.02.2017, 15:15
а идея Ваша мне понравилась спс - как вариант
Контролер не стопорится при работе???
Не слушайте Владислава. Если ошибка с доступом к памяти и будет она вылезет сразу. Вы увидите всякие странные значения в переменных.
У меня на такой технологии передачи данных все объекты работают. Все отлично.
a_gricaj
13.02.2017, 12:49
Не слушайте Владислава. Если ошибка с доступом к памяти и будет она вылезет сразу. Вы увидите всякие странные значения в переменных.
У меня на такой технологии передачи данных все объекты работают. Все отлично.
А Dword вы перестраиваете? И нужно ли соблюдать выравнивание памяти?? ОРС сервер у меня фигню читает при записи Dword....
Если соблюдать выравнивание то работает... а так получается рваный Dword ...
Филоненко Владислав
13.02.2017, 14:00
Не слушайте Владислава. Если ошибка с доступом к памяти и будет она вылезет сразу. Вы увидите всякие странные значения в переменных.
У меня на такой технологии передачи данных все объекты работают. Все отлично.
Да, не слушайте, поездка на Оймякон в феврале для запуска зависшего оборудования - это незабываемо :)
Филоненко Владислав
13.02.2017, 14:01
При использовании конфигуратора с "забитымы" 600 регистров тоже не все гладко. Тут правда пока я грешу на себя (или любителей тыкать кнопки Старт/Стоп на шасси ПЛК) - контроллер работал месяц и ушел в стоп. В журнале ничего существенного нет. Мож кто подскажет как отловить проблемму?
Модуль button для сложных помехово-педипальцевых условий используют опытные ПЛК-ники.
a_gricaj
13.02.2017, 14:16
Модуль button для сложных помехово-педипальцевых условий используют опытные ПЛК-ники.
я не использую этот модуль, неопытный, потому и спросил совета....
Спорягин Кирилл
13.02.2017, 15:40
Да, не слушайте, поездка на Оймякон в феврале для запуска зависшего оборудования - это незабываемо :)
Владислав, не пугайте народ.
a_gricaj
13.02.2017, 16:00
Владислав, не пугайте народ.
Владислав видимо имеет ввиду это(из справки CS):
Единственное ограничение заключается в запрете размещения элементов структуры по прямым адресам (AT объявления недопустимы!).
Но работает же)
Единственное, что я так понял нужно подганять сруктуру так, что бы Dword начинался с регистра кратного 4,не совсем удобно, но удобней чем делать это в слейве
Кирилл Вы выравниваете(подгоняете) структуру под область памяти или есть какой то секрет)??? У меня просто в перемешку идут слова и двойные слова...(по другому немогу)
Спорягин Кирилл
13.02.2017, 16:34
Единственное, что я так понял нужно подганять сруктуру так, что бы Dword начинался с регистра кратного 4,не совсем удобно, но удобней чем делать это в слейве
Кирилл Вы выравниваете(подгоняете) структуру под область памяти или есть какой то секрет)??? У меня просто в перемешку идут слова и двойные слова...(по другому немогу)
Да, я просто все wordы собираю вместе, и если их нечетное кол-во, то добавляю Reserve.
Владислав видимо имеет ввиду это(из справки CS):
Единственное ограничение заключается в запрете размещения элементов структуры по прямым адресам (AT объявления недопустимы!).
Но работает же)
В справке имеется ввиду, что элемент структуры Вы не можете разместить по прямому адресу, т.е. такая констукция не допустима
STRUCT
Var1 AT %QW7.0 : word;
END_STRUCT
a_gricaj
13.02.2017, 16:45
СПС за консультацию
a_gricaj
13.02.2017, 23:45
Только указатель на структуру разместите с такого адреса - и все dword'ы, real'ы внутри структуры всегда будут с нужных адресов.
Не растолкуете подробней...
a_gricaj
15.02.2017, 10:21
Всё 4-байтное в базе (а также фб и структуры) всегда автоматически выравниваются на адрес кратный 4-м байтам. В структурах и фб - относительно старта структуры и фб => если указатель с правильного адреса - внутри думать не нужно. Неявные переменные объявлять явно имеет смысл для наглядного представления или при переносе описания структуры в другие языки (где автовыравнивания может не быть). Слейвы, мастера, sysmemalloc - всегда с "нужного" адреса.
А-а-а. Да пусть острит. Как бы очеловечивает форум.
СПС понял
Здравствуйте, оказывается я не один кто так делает нас много.
Какой прогресс? с обновление прошивки? и работой с областью обмена от 860 и больше? У меня объект уже два года по принципу косвенной адресации работает, проблем нет. Даже аллокатор памяти обмена написан, работает автоматически, программы которым нужен обмен регистрируются в нем и он им выделяет адреса в области обмена. По которым они потом работают. Имеется контролер ПЛК110 м02 он на много производительней, очень интересует возможность расширения памяти обмена до регистров так 10000 возможно больше. Прелесть этого в том что вся рабочая память при необходимости доступна из hmi. Примерно из опыта своих программ на один вход физический где-то идет 6-10 регистров для конфигурации внутренней программы обработчика входа/выхода.
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot