PDA

Просмотр полной версии : Проблемы с проектом для ПЛК304



GIR
04.02.2016, 18:01
Столкнулся с некоторыми проблемами при создании проекта для ПЛК304.
1. CODESYS с вашего сайта: Версия 3.5 SP4 Patch 4 (Для СПК, прошивки 3.939 и выше; Для ПЛК3хх) отсюда (http://www.owen.ru/catalog/codesys_v3/opisanie);
2. Таргеты PLC30x-M01 with CoDeSysSP v3.5.3.40 отсюда (http://www.owen.ru/catalog/codesys_v3/32050189).

Проблема 1
Создаю простой проект, пытаюсь скомпилировать - вываливается 100 ошибок, первая из которых - Не удалось вставить библиотеку IOStandart, 3.5.1.0 (System).
22323

Добавляю стандартную библиотеку (в наборе нужной нет - одна новее, другая старее), пропадают 99 ошибок, остается только та, что указана сверху.
22325

Проблема 2
Мне нужно чтобы контроллер был Modbus Slave устройством. Пытаюсь настроить как указанно здесь (http://www.owen.ru/uploads/pages_from_aip42_sait.pdf).

Добавляю Modbus Slave устройство, автоматически добавляется библиотека, но с ней снова проблемы.
22327

Возможно я что-то делаю не так, по этому возникли вопросы по работе с Modbus:
1. Для использования протокола Modbus надо что-то ещё устанавливать/настраивать?
2. Для использования протоколов Modbus TCP/RTU нужно использовать библиотеки(функциональные блоки) Modbus-master и ModBus-slave отсюда (http://www.owen.ru/catalog/codesys_v3/80224381), или достаточно настроить переменные куда записывать значения в ModbusTCP_Slave_Device?
2. Для работы в режиме Slave надо ли добавлять Modbus Master устройство в проект, из инструкции не совсем понятно.
3. В инструкции сказано, что версия добавляемого устройства должна соответствовать/быть ниже версии таргета, но у меня в библиотеке есть версия Мастера(мастер мне тоже нужен будет, но в другом проекте) только выше таргета.

GIR
05.02.2016, 13:37
Проблема 1 решилась исправлением в файле таргета версии указанной библиотеки с 3.5.1.0 на 3.5.2.0, которая имеется в кодесисе.
Проблема 2 решилась подменом версии отсутствующих библиотек на имеющиеся через "Заполнители".

Но всё равно хотелось бы получить официальный ответ, другую версию таргетов (и/или кодесиса/библиотек).

И ещё вопрос по версиям: можно ли использовать версии библиотек и устройств выше/ниже чем версия таргета?

arsenius
05.02.2016, 13:43
Была такая проблема. http://www.owen.ru/forum/showthread.php?t=23136 Поставил SP5. Таргет с сайта качал. Вроде работает. И модбасы, мастер и слейв, заработали. Ничего не переименовывал.

Евгений Багаев
05.02.2016, 14:31
Здравствуйте, GIR!

Для решения проблемы перейдите на версию Codesys SP5 Patch 5 и установите архив репозитория, который содержит в себе все необходимые версии библиотек, использующихся в target-файле (Требуется версия репозитория не ранее SP4). Для удобства все это, включая актуальный target-файл ПЛК304, выложил в облако (https://cloud.mail.ru/public/LZpF/7mZqMwMmw)

При реализации обмена с устройствами с помощью стандартных средств Codesys в дереве проекта: Modbus_Com -> Modbus_Master -> Modbus_Slave используйте версию Modbus_Master 3.5.3.0. На более поздних версиях будут ошибки компиляции. Версии Modbus_Com и Modbus_Slave можно использовать последние доступные.

Также такая конфигурация ПО позволяет работать с шаблонами модулей Мх110: http://www.owen.ru/forum/showthread.php?t=21365

На данный момент идет актуализация программного обеспечения на диске, поставляемом в комплекте. Приносим извинения за предоставленные неудобства.

GIR
08.02.2016, 16:00
благодарю, теперь компилируется нормально.

GIR
24.02.2016, 07:45
Возникла новая проблема.
Для обмена с устройством использую библиотеку SysCom. При попытке принять с помощью функции Read посылка делится на 2 части, причем вторая часть записывается поверх первой (в массиве из 256 байт, который используется в качестве буфера).

Размер посылок 229 и 159 байт. Размер буфера в Settings задаю 256.
В первом случае сначала принимается 200 байт, а потом 29, которые затирают первые 29 байт из 200.
Во втором случае сначала принимается 100 байт, а потом оставшиеся 59, как и в первом случае.
Посылки меньше 100 байт принимаются нормально.

Программу пишу для ПЛК304, но, пока нет нужного оборудования, испытываю на ПЛК308 (с кодесисом и таргетами с его родного диска). Хотелось бы узнать какой размер аппаратного буфера СОМ-порта у ПЛК304 и ПЛК308. Из-за чего возникает такая проблема или может это какие-то особенности работы SysCom?

capzap
24.02.2016, 07:54
да вот какая разница что за устройство, функция чтения возвращает количество принятых байт, не ужели так сложно запомнить это число, чтоб при следующем приеме порции данных знать в какой индекс массива записать пришедшие байты

GIR
24.02.2016, 09:27
Спасибо, с этим разобрался. Но вновь у меня проблемы. На этот раз с LREAL.
Работа в режиме симуляции:
22820
А вот программа залита в контроллер:
22821

Объясните пожалуйста в чем дело. MIME2LREAL это моя функция, результат которой LREAL.

capzap
24.02.2016, 10:14
а где написано что овеновские контроллеры поддерживают работу с LREAL?

GIR
24.02.2016, 10:29
а где написано, что они не поддерживают? среда разработки указана, а она поддерживает.

GIR
24.02.2016, 11:21
теперь уже не важно написано где-то или нет) что мне с этим делать? придется самому побитово пересобирать REAL из LREAL и обратно?

capzap
24.02.2016, 12:13
в справке имеется замечание по поводу работы длинного реала
А как поступить, можно воспользоваться поиском, у Вас не первого же встречается такая проблема

GIR
25.02.2016, 13:05
Нашел вот это (http://www.owen.ru/forum/showthread.php?t=10285&page=5). Библиотеку в КДС3 подключить не смог. А код товарища vitiali по моему не совсем верен.
в частности мне не совсем понятно это условие:

IF mant>0 THEN (*чтобы при нулевой мантисе не вылизло какое-нибудь число*)
expon:=expon-1023;
expon:=expon+127; (*если мантиса больше 0 экспон. приймет значения *)
END_IF

Написал свои функции для преобразования LREAL в REAL:

FUNCTION LREAL2REAL : REAL
VAR_INPUT
IN: LWORD;
END_VAR
VAR
lwMant: LWORD;
lwExpon: LWORD;
lwSign: LWORD;
lwREAL: LWORD;
pREAL: POINTER TO REAL;
END_VAR

lwMant:=SHR(IN,29) AND 16#7FFFFF;
lwExpon:=SHR(IN,52) AND 16#7FF;
IF lwExpon<896 THEN
lwExpon:=0;
ELSIF lwExpon>1151 THEN
lwExpon:=255;
ELSE
lwExpon:=lwExpon+127-1023;
END_IF
lwExpon:=SHL(lwExpon,23);
lwSign:=SHR(IN,32) AND 16#80000000;
lwREAL:=lwMant OR lwExpon OR lwSign;
pREAL:=ADR(lwREAL);
LREAL2REAL:=pREAL^;
и обратно:

FUNCTION REAL2LREAL : LWORD
VAR_INPUT
IN: REAL;
END_VAR
VAR
lwMant: LWORD;
lwExpon: LWORD;
lwSign: LWORD;
pIN: POINTER TO LWORD;
aIN: ARRAY [0..1] OF REAL;
END_VAR

aIN[0]:=IN;
pIN:=ADR(aIN);
lwMant:=SHL(pIN^ AND 16#7FFFFF,29);
lwExpon:=SHL((SHR(pIN^,23) AND 16#FF)+1023-127,52);
lwSign:=SHL(pIN^ AND 16#80000000,32);
REAL2LREAL:=lwMant OR lwExpon OR lwSign;

GIR
02.03.2016, 12:03
Новая проблема с Modbus.
Пытаюсь настроить обмен двух контроллеров по ModbusTCP. В слейве указываю нужное кол-во регистров на чтение и запись:
22926
делаю соотнесение входов и выходов с соответствующими массивами, которые будут использоваться в качестве буферов:
22927

и тут возникает вопрос: а мастеру по каким адресам надо обращаться?

В слейве не нашел где указан адрес (начальный адрес регистров чтения/записи). Где-то читал, что одни регистры начинаются с адреса 2000, другие с 3000, но какие именно не помню, и вообще к ПЛК/КДС это относилось ли. Сейчас этот документ найти не могу.

На "странице конфигурации" вроде как есть нужные поля, но они почему-то затенены.

Еще не понятно вот это:

Регистры временного хранения – определяют количество holding регистров
канала. Параметр может принимать значения от 2 до 40 (см. рис. 11.25);
Входные регистры – определяют количество input регистров канала. Параметр
может принимать значения от 2 до 40 (см. рис. 11.25).
А если мне надо передать 1000 регистров?

capzap
02.03.2016, 12:33
и тут возникает вопрос: а мастеру по каким адресам надо обращаться?

с нуля не пробовали еще?

GIR
02.03.2016, 12:37
Предположим регистры %IW начинаются с 0, а %QW тогда с какого? Тоже с 0?

capzap
02.03.2016, 12:51
так то их требуется опрашивать разными функциями модбаса почему бы и нет, проверить то трех минут достаточно

GIR
02.03.2016, 12:54
А, похоже дошло.
Если мастер делает запрос с командой 03 и адресом регистра 0, то он обращается к регистрам IW (временного хранения).
Если команда 04 и адрес 0, то он читает регистры QW (входные).
Если команда 16 и адрес 0, то запись регистров QW.

Так?

GIR
02.03.2016, 12:56
а что с 1000 регистров делать? Для каждых 40 регистров отдельное устройство создавать?

capzap
02.03.2016, 13:01
Если мастер делает запрос с командой 03 и адресом регистра 0, то он обращается к регистрам IW (временного хранения).
Если команда 04 и адрес 0, то он читает регистры QW (входные).
Если команда 16 и адрес 0, то запись регистров QW.

Так?
по логике, да. Но если не пойдет попробуйте стучаться по адресам которые выставили в настройках, вдруг это не количество а адресация :)

capzap
02.03.2016, 13:04
а что с 1000 регистров делать? Для каждых 40 регистров отдельное устройство создавать?

переходите на библиотеки

GIR
02.03.2016, 14:20
Овеновская библиотека ModBus-slave только для RTU/ASCII, для TCP надо использовать стандартную ModbusTCP Slave, я правильно понимаю?

capzap
02.03.2016, 14:27
я бы порекомендовал самому написать, не так там и сложно принять пакет, разобрать что он хочет, сделать выборку из массива данных, сформировать ответ и отправить.