PDA

Просмотр полной версии : Конфигурация ПЛК-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?

capzap
10.10.2016, 07:27
Подозреваю, что ресурс свободных регистров, я исчерпал. Как увеличить количество регистров, так как мне не хватает - нужно еще пару сотен??????
переходить на библиотечное исполнение слейва и переменные держать не в конфигураторе, а в структуре в глобальных данных или ФБ

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
переходить на библиотечное исполнение слейва и переменные держать не в конфигураторе, а в структуре в глобальных данных или ФБ

Где почитать о " библиотечное исполнение слейва " подскажите пожалуйста

capzap
10.10.2016, 08:56
Где почитать о " библиотечное исполнение слейва " подскажите пожалуйста

вот (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 функции, чтоб всё по взрослому было

Файл в архиве не открывается в КС

capzap
10.10.2016, 09:41
импортировать нужно, а не открывать

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
Запросите тестовую версию в ГТП. Или подождите релиза

capzap
11.10.2016, 10:15
Если выполнить все пункты ваши мне кажется - это несколько удорожит стоимость оборудование и потеряется основная привлекательность ПЛК ОВЕН - цена, я например не скрою, поставлен в рамки использования только ПЛК ОВЕН потому что - он дешевый. А если городить огород как предлагаете вы, так тогда берем один контроллер от другого производителя - у меня молзаводом управляет один контроллер.................

Но понимаете, мне сейчас переделывать свой проэкт и скаду и мне ппц как хочется узнать каким числом регитров я ограничен, уже стало понятно, что 860 уже много- но сколько можно, куда мне ужиматся?

Вы вот который день уже пишите,а можно было уже давно сесть за разбор моего примера и пополнить свой багаж знаний

DmitriiAnyushin
11.10.2016, 10:27
Вы вот который день уже пишите,а можно было уже давно сесть за разбор моего примера и пополнить свой багаж знаний

Какую бы нибудь документацию по используемым Вами функциям и библиотекам, а то непонятно с чего начать разбираться
А еще лучше если Овен создал бы библиотеку для организации слэйва (как сейчас для ModbusRTU Master) и официально выложил бы на сайте, чтобы велосипеды не мастерились

capzap
11.10.2016, 10:38
работа с 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
???

capzap
11.10.2016, 12:38
Мне еще не совсем понятно в каком виде я получу переменные в опс-сервере...

в ФБ UDPMBUS строка условия byRecv[6]=1 AND byRecv[7]=3 означает адрес слейва должен быть равен 1 и функция 3, означающая отправку группы регистров, так как я запрашиваю заведомо известное количество регистров, я не делаю в примере дополнительную проверку какой начальный адрес и количество запрашивается, а сразу перехожу к отправке нужных данных. Если будете контролировать групповой запрос сможете посылать разные данные, соответствующие начальному адресу и количеству

capzap
11.10.2016, 12:39
Вы имеете ввиду этот пример:
26990
???
нет заходите сюда http://www.owen.ru/catalog/codesys_v2/67395347 и скачивайте любой архив с бибками, в них обычно складываются как бибки так и их описание

capzap
11.10.2016, 12:41
ЗЫ и не забывайте такой аспект, что в конфигураторе модбас является сохраняемым в энергонезависимой памяти, следовательно при каждом выключении плк, будет происходить запись на флеш этих данных, тут и от более малого количества происходят сбои, так что делайте выводы

a_gricaj
11.10.2016, 13:53
ЗЫ и не забывайте такой аспект, что в конфигураторе модбас является сохраняемым в энергонезависимой памяти, следовательно при каждом выключении плк, будет происходить запись на флеш этих данных, тут и от более малого количества происходят сбои, так что делайте выводы

Значит получается, по любому нужно уходить от конфигуратора, но блин я вообще немогу понять как подступится к вашему примеру....

capzap
11.10.2016, 14:03
В 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,для ТСР будет всё тоже самое что касается модбас, измениться только открытие/закрытие сокета и отправка/чтение

спс большое

capzap
11.10.2016, 15:46
да пока не зачто, если возникнут проблемы выкладывайте проект с тестированием слейва, подскажу что не так

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 - всегда с "нужного" адреса.



А-а-а. Да пусть острит. Как бы очеловечивает форум.

СПС понял

saniyo
16.06.2017, 16:36
Здравствуйте, оказывается я не один кто так делает нас много.
Какой прогресс? с обновление прошивки? и работой с областью обмена от 860 и больше? У меня объект уже два года по принципу косвенной адресации работает, проблем нет. Даже аллокатор памяти обмена написан, работает автоматически, программы которым нужен обмен регистрируются в нем и он им выделяет адреса в области обмена. По которым они потом работают. Имеется контролер ПЛК110 м02 он на много производительней, очень интересует возможность расширения памяти обмена до регистров так 10000 возможно больше. Прелесть этого в том что вся рабочая память при необходимости доступна из hmi. Примерно из опыта своих программ на один вход физический где-то идет 6-10 регистров для конфигурации внутренней программы обработчика входа/выхода.