Значит получается, по любому нужно уходить от конфигуратора, но блин я вообще немогу понять как подступится к вашему примеру....
В PLC_PRG отсекайте все лишнее, оставте только работу модбаса. Структуру данных, которую он отправляет заполняйте в ручную в режиме онлайн, чтоб пока привыкнуть к этому виду, скачайте билдер от вейнтека и запустите эмулятор онлайновый, в качестве контроллера выберите модбас зеро и галку поставте работать по UDP. Если нет желания то вот набор можно скачать от производителя КДС http://www.owen.ru/forum/showthread....l=1#post102798, открывал сокеты я по этим примерам, что UDP, что TCP,для ТСР будет всё тоже самое что касается модбас, измениться только открытие/закрытие сокета и отправка/чтение
да пока не зачто, если возникнут проблемы выкладывайте проект с тестированием слейва, подскажу что не так
К сожалению, Владислав передал в группу технической поддержки версию на 110-30. Тогда завтра попрошу его выложить на 110-60.
Прошу использовать прошивку 0.3.62
Большое спасибо! Надо только имя файла переименовать, а то при выполнении команды UpdateCore браузер скажет, что прошивка не найдена
Только у меня возник ряд вопросов в добавок к уже имеющимся. Посмотрите пожалуйста - http://www.owen.ru/forum/showthread....780#post223780
Здравствуйте, не стал создавать новую тему, а решил продолжить свою старую так как, в принципе название подходит.
Начал делать новый проект: таже связка ПЛК110+ОРСсервер(Инсат)+МастерСкада. Уж очень не хочется в ручную вбивать 600-700 регистров в конфигураторе и решил разобраться с бибкой SysLibSockets.
Подогнали мне пример:
раздел описания:
код FB:Код: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
И появились вопросы:Код: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....
Никто не может подсказать????
Проект содержит массу ошибок. Работать на ПЛК не будет.
600-700 регистров не передавал, но вот 350 без особых затруднений и SysLibSocetoв. Время конфигурирования 20-40 секунд.
Просто добавьте в Modbus Slave 4-х байтовые переменные на нужный размер передаваемых данных и на начало этого массива наведите структуру (пусть она зовется DA).
Например, в глобальных данных вот так:
DA AT %QD7.1.0 : ExDataArea;
А структура ExDataArea состоит из других стуктур:
Здесь SensorBase и MotorBase - это "базовые" структуры датчика и мотора, т.е. те переменные, которые эти функциональные блоки должны передать на верхний уровень, или те переменные которые эти ФБ должны получить с верхнего уровня.Код:(* Область обмена с верхнем уровнем *)
TYPE ExDataArea :
STRUCT
Sensor1Base : SensorBase;
Sensor2Base : SensorBase;
Motor1Base : MotorBase;
END_STRUCT
END_TYPE
Таким образом за секунды Вы конфигурируете множество осмысленных переменных.
Использование не поименованных переменных в конфигурации не даёт возможности среде разработки проверить корректность их типов, адресов, размеров областей данных.
А далее трудноуловимые "плавающие" ошибки.
Поэтому я стараюсь в базовых структурах использовать только тип word, dword и real. Таким образом я избегаю всяческих проблем с выравниванием памяти и т.п.
Но в целом "волков бояться в лес не ходить".
При использовании конфигуратора с "забитымы" 600 регистров тоже не все гладко. Тут правда пока я грешу на себя (или любителей тыкать кнопки Старт/Стоп на шасси ПЛК) - контроллер работал месяц и ушел в стоп. В журнале ничего существенного нет. Мож кто подскажет как отловить проблемму?
Владислав видимо имеет ввиду это(из справки CS):
Единственное ограничение заключается в запрете размещения элементов структуры по прямым адресам (AT объявления недопустимы!).
Но работает же)
Единственное, что я так понял нужно подганять сруктуру так, что бы Dword начинался с регистра кратного 4,не совсем удобно, но удобней чем делать это в слейве
Кирилл Вы выравниваете(подгоняете) структуру под область памяти или есть какой то секрет)??? У меня просто в перемешку идут слова и двойные слова...(по другому немогу)
Да, я просто все wordы собираю вместе, и если их нечетное кол-во, то добавляю Reserve.
В справке имеется ввиду, что элемент структуры Вы не можете разместить по прямому адресу, т.е. такая констукция не допустима
STRUCT
Var1 AT %QW7.0 : word;
END_STRUCT
СПС за консультацию
Здравствуйте, оказывается я не один кто так делает нас много.
Какой прогресс? с обновление прошивки? и работой с областью обмена от 860 и больше? У меня объект уже два года по принципу косвенной адресации работает, проблем нет. Даже аллокатор памяти обмена написан, работает автоматически, программы которым нужен обмен регистрируются в нем и он им выделяет адреса в области обмена. По которым они потом работают. Имеется контролер ПЛК110 м02 он на много производительней, очень интересует возможность расширения памяти обмена до регистров так 10000 возможно больше. Прелесть этого в том что вся рабочая память при необходимости доступна из hmi. Примерно из опыта своих программ на один вход физический где-то идет 6-10 регистров для конфигурации внутренней программы обработчика входа/выхода.