PDA

Просмотр полной версии : ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)



Страницы : 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Николаев Андрей
26.03.2013, 17:04
http://forum-ru.codesys.com/viewtopic.php?t=895
http://www.forum-ru.3s-software.com/viewtopic.php?f=1&t=1843&p=3454
4. PLC WinNT на производстве вряд ли используется.
3. Развивать эту тему для диплома совершенно нет смысла, ИМХО. Ну по крайней мере на контроллерах ОВЕН.
Как вариант, если Вам будет интересно - для задач с не жесткими требованиями к реакции системы.
Например взять простейший PC малобюджетный. И сделать на нем контроллер, и, к примеру скомуницировать с какими-либо промышленными устройствами. Например по Ethernet (ModBus TCP).
Но перед этим стоит уточнить в компании Пролог стоимость лицензии WinNT. Экономическая часть в дипломе мало читабельна, но нужна...

capzap
26.03.2013, 17:09
Здравствуйте, я студент 3 курса. В данное время пишу доклад на тему CoDeSys SP PLCWinNT V2.4. У меня возникли сложности по поиску информации, не затруднит ли вас ответит на некоторые вопросы?
А именно:
1) В моем докладе я изучаю виртуальный контроллер PLCWinNT, его функции и работу. Возможно ли работать с исполнительными механизмами такие как МЭО или измерительными приборами как термопара и прочее, использовав лишь PLCWinNT? То есть "превратить" наш пк в плк. При этом используя мощные пк, с операционкой win xp или win 7. Если возможно то, что для этого необходимо?

2)Система исполнения - CoDeSys SP RTE я так понимаю это отдельный софт, который непосредственно и превращает пк в плк. Когда я нажимаю Start system ничего не происходит. Что должно вообще произойти? И как вообще запустить эту программу на win 7?

4) Для чего может использоваться PLCWinNT на производстве?

3) Как вы думайте стоит ли развивать эту тему в дипломной работе, например по программированию плк фирмы "ОВЕН"?

на производстве не может использоваться винНТ так как срок его работы два часа. Он необходим для отладки кода не привязанного к физическим устройствам на прямую. Коммуникации отлаживать тоже не советую, если в дальнейшем они будут ставится на плк овен. На нем можно отрабатывать только общие вопросы
А так спасибо что развесилили

Yegor
26.03.2013, 17:18
Возможно ли работать с исполнительными механизмами такие как МЭО или измерительными приборами как термопара и прочее, использовав лишь PLCWinNT? То есть "превратить" наш пк в плк. При этом используя мощные пк, с операционкой win xp или win 7. Если возможно то, что для этого необходимо?Эти «ПЛК» (PLCWinNT и SP RTE) могут работать с последовательным портом. Вооружившись преобразователем интерфейса RS232-RS485 (http://www.owen.ru/catalog/37471589) и какой-нибудь коммуникационной библой под кодесис (для того же модбаса, например), вы как раз и получаете полноценный контроллер. У него, конечно, нет своих входов и выходов, но это всё решается модулями ввода-вывода (http://www.owen.ru/catalog/99197162).
2)Система исполнения - CoDeSys SP RTE я так понимаю это отдельный софт, который непосредственно и превращает пк в плк. Когда я нажимаю Start system ничего не происходит. Что должно вообще произойти? И как вообще запустить эту программу на win 7?С кодесисом идёт два софтовых ПЛК — SP RTE и PLCWinNT. Первый работает на уровне ядра в реальном времени. Второй запускается на уровне пользователя. Начать рекомендую со второго — его нужно просто запустить из «Пуска» и подключиться к нему на локалхосте. Со вторым работать не доводилось; сейчас попробовал установить, но там, судя по всему, XP надо, которой у меня нет давно.
4) Для чего может использоваться PLCWinNT на производстве?Конкретно PLCWinNT только для отладки чего-нибудь с ком-портом. А вообще софтовые ПЛК с реальным временем вполне можно юзать на не слишком ответственных объектах.
3) Как вы думайте стоит ли развивать эту тему в дипломной работе, например по программированию плк фирмы "ОВЕН"?Вы не назвали свою специальность и не определились с объектом автоматизации. Если ограничитесь гаражными воротами и светильником, то это максимум небольшая курсовая работа. Так что придумайте объект пожирнее и вперёд... Ну, там, уличное освещение целого микрорайона, например... с учётом особенностей рельефа местности и контролем исправности осветительных элементов посредством... и т.д. =)
на производстве не может использоваться винНТ так как срок его работы два часа. Он необходим для отладки кода не привязанного к физическим устройствам на прямую. Коммуникации отлаживать тоже не советую, если в дальнейшем они будут ставится на плк овен. На нем можно отрабатывать только общие вопросыДва часа это у демо-версии. Коммуникации нормально отлаживаются (не тестируются, а именно отлаживаются).

capzap
26.03.2013, 17:31
Егор, так как поднимается сокет в плк овен, нет ни у кого и разработчики КДС о такой особенности не в курсе и не учитывали. Насчет демо, а бедному студенту для отчетности требуется покупать лицензию или так и будет все показывать на демке

Yegor
26.03.2013, 17:46
С замечанием про сокеты согласен, но ком-порт нормально работает вроде.

Двух часов демо-версии студенту за глаза хоть для работы над дипломом, хоть для его защиты. Я тут недавно одному заказчику прогу под ПЛК писал. Ну, как всегда многочасовые циклы, требование корректно восстановливаться при сбое питания и т.п. Короче, для удобства ввёл свои часы, которые можно в сто раз ускорить, и вместо TIME() везде писал свою PTIME(), а из Standard.lib пару нужных блоков переписал с нуля чтобы они тоже PTIME() вызывали. Красота же: задрал ползунок на 50x во время отладки — и прогнал суточный процесс за считанные минуты. Не надо константы дёргать, условия в тру форсировать и прочей фигнёй страдать. Попутно ещё идеальная постановка на паузу получилась (обычный TIME() ведь не остановишь). Я это к чему... Два часа для отладки «на столе» это уйма времени.

capzap
26.03.2013, 17:57
другой безперспективничек, не Вы ли высчитывали что время цикла 63мс, ну и кому такой цикл нужен не великоваты ли будут антидребезговые функции к примеру, опрос тот же по последовательному порту, модуль уснет пока ему запросы будут доставлятся

capzap
26.03.2013, 18:02
"стоит ли развивать эту тему в дипломной работе"
Перспективы нет, там докладывать отсилы минут пять

FedorN
26.03.2013, 18:58
Спасибо всем с ответами, очень помогли. Я не правильно выразился на счет дипломной работы, просто я буквально недавно стал программировать на CoDeSys простенькие программы типа: светофор , открывание кодовых дверей, управление мэо ...в общем сама суть программирования понравилась...и мысля возникла, связать кодесис с дипломным проектом. Сейчас постигаю эту программу и хотелось, так сказать, узнать мнение людей которые работают с этим... А специальность моя, автоматизация производственных процессов и электротехники.

kost2
28.03.2013, 11:59
Есть ли где-то в библиотеках генератор случайных чисел? что-то не нашел...

capzap
28.03.2013, 12:12
Есть ли где-то в библиотеках генератор случайных чисел? что-то не нашел...

Такой генератор имеется в библиотеке оскат

petera
28.03.2013, 12:32
Еще один ф.блок не из OSCAT-овской библиотеки, но тоже бесплатной -"HBMutilities"

FUNCTION_BLOCK rand (* Generation of Pseudo Random Numbers *)
VAR_INPUT
initvalue: DWORD; (* Initialization value *)
END_VAR
VAR_OUTPUT
SRND: DWORD; (* procedure works like rnd, but it is *)
END_VAR (* improved [no util.lib, better input/ *)
VAR (* output definition ... *)
a1: BOOL;
a2: BOOL;
a5: BOOL;
a18: BOOL;
a0: BOOL;
Q: DWORD;
END_VAR


F Q=0 THEN
IF initvalue<>0 THEN
Q:=initvalue;
ELSE
Q:=123456;
END_IF;
END_IF;
a1:=Q.2;
a2:=Q.3;
a5:=Q.6;
a18:=Q.18;
a0:=(((a1 XOR a2) XOR a5) XOR a18);
Q:=2*Q;
Q.0:=a0;
SRND:=Q;

petera
28.03.2013, 12:46
А если значение полученное с помощью rand пропустить через эту функцию

FUNCTION DW2REAL : REAL (* Conversion from DWORD into REAL. *)
VAR_INPUT (* useful for the FB "rnd". pseudo *)
DW: DWORD; (* random numbers can be transformed*)
END_VAR (* to range [-1,...,+1] *)
VAR
END_VAR

DW2REAL:=2*((DWORD_TO_REAL(DW)/4294967296)-0.5); (* That's it !*)
То получится случайное число от -1 до +1
Эта функция из той же библиотеки "HBMutilities"

agz
28.03.2013, 13:32
День добрый! В PLC Configuration для ПЛК63-М в адресном пространстве modbus создал 103 (0..102) пользовательские переменные типа FloatP с адресами 82..286 (с шагом 2). Теперь пытаюсь создать пользовательские переменные типа IntP соответственно c адресами 332..511, но рабочими из них оказываются только 14 (0..13) с последним адресом 346, поскольку далее, например, такой код программы Х := ADR(%QW3.14.0) выдает ошибку несуществующего адреса, тогда как Х := ADR(%QW3.13.0) не выдает. Не могли-бы прояснить в чем проблема? Заранее благодарен.

capzap
28.03.2013, 14:09
День добрый! В PLC Configuration для ПЛК63-М в адресном пространстве modbus создал 103 (0..102) пользовательские переменные типа FloatP с адресами 82..286 (с шагом 2). Теперь пытаюсь создать пользовательские переменные типа IntP соответственно c адресами 332..511, но рабочими из них оказываются только 14 (0..13) с последним адресом 346, поскольку далее, например, такой код программы Х := ADR(%QW3.14.0) выдает ошибку несуществующего адреса, тогда как Х := ADR(%QW3.13.0) не выдает. Не могли-бы прояснить в чем проблема? Заранее благодарен.

Можно вопрос, Вы как студент что то проектируете или на производстве выполняете какую то задачу, просто сто два реала это очень много, скорее всего ресурс исчерпан

melky
28.03.2013, 17:14
Подскажите пожалуйста, как для ПЛК63 в CodeSys выходы REAL превратить в BOOL, ведь насколько я понимаю, то для модификаций с релейными выходами или ключами они таковыми и должны быть ?
таргет файл общий на L и M модификацию, без указания типов выбираемых выходов.

Однако, BOOL_TO_REAL в проект, но не проще было тип выхода менять ? :(

И может кто знает, как макрос сохранить в виде библиотеки ? а то пока научился только создавать свои библиотеки только из самого проекта. (переделал ППЗУ и двоичный шифратор от товарища rovki)
для CodeSys, и заодно вопрос, есть возможность задавать параметры внутри библиотеки, или обязательно должны быть вынесены параметры в виде входов ?

capzap
28.03.2013, 17:31
Однако, BOOL_TO_REAL в проект, но не проще было тип входа менять ? :(
ну на эту тему очень много сказано техподдержкой
Возьмите другой плк где чистые релейные выходы

petera
28.03.2013, 17:32
Подскажите пожалуйста, как для ПЛК63 в CodeSys выходы REAL превратить в BOOL, ведь насколько я понимаю, то для модификаций с релейными выходами или ключами они таковыми и должны быть ?
таргет файл общий на L и M модификацию, без указания типов выбираемых выходов.

Однако, BOOL_TO_REAL в проект, но не проще было тип входа менять ? :(
Ни как.
У ПЛК 63/73 аппаратный ШИМ на выходах, значит только REAL 0 и 1 для ОТКЛ. и ВКЛ. выхода

capzap
28.03.2013, 17:40
для CodeSys, и заодно вопрос, есть
возможность задавать параметры
внутри библиотеки, или
обязательно должны быть
вынесены параметры в виде
входов ?
вы с документацией ознакамливались. Зачем библиотека если макрос это обычное ПОУ блок или функция в зависимости нужно сохранять внутренние переменные

Vov4ik
28.03.2013, 18:11
Подскажите как присвоить значения многомерному массиву
например:
mass: ARRAY [0..1] OF ARRAY[0..3] OF INT:=1,2,3,4,5,6,7,8;
значения присваиваются только первому "ряду", то есть mass [1][0] :=0;

melky
28.03.2013, 19:45
capzap я пока не понял, как макросы эти сохранять, в любом виде, хоть макросом, хоть библиотекой.
Тут больше наверное проблемы не знания обращений непосредственно с программой. Так же не получилось копировать из окна одной программы в окно другой. Может я делаю что-то не так, но ни комбинации клавиш не срабатывают, ни кнопки на панели команд

capzap
28.03.2013, 19:55
capzap я пока не понял, как макросы эти сохранять, в любом виде, хоть макросом, хоть библиотекой.
Тут больше наверное проблемы не знания обращений непосредственно с программой. Так же не получилось копировать из окна одной программы в окно другой. Может я делаю что-то не так, но ни комбинации клавиш не срабатывают, ни кнопки на панели команд

Правую кнопку мышки ни кто не отменял. Другой вопрос если Вы решили из лоджика в кдс скопировать тогда видимо ни чего не получится
Примеров конечно на сфс мало, но в документации язык описан с простенькими примерчиками

melky
28.03.2013, 22:59
capzap может у меня лыжи не едут, но никак не копируется...
http://www.owen.ru/forum/attachment.php?attachmentid=8406&stc=1&d=1364497093
http://www.owen.ru/forum/attachment.php?attachmentid=8407&stc=1&d=1364497093

Либо нет команды копирования, либо ни к чему не приводит если из окна в окно пытаться скопировать.

capzap
28.03.2013, 23:02
а, так попробуйте не элемент выделить а область чтоб туда попал элемент/ы.
ЗЫ С правой кнопкой это я зря конечно :) она понадобится в дальнейшем для расстановки по порядку, а в пределах окна элементы копируются?

melky
28.03.2013, 23:45
capzap пробовал и область копировать и отдельный элемент, ничего не помогает.
В пределах окна одной запущенной программы копируется без проблем по Ctrl+C и вставляется по Ctrl+V.

Почему и озадачился созданием макросов сперва, но когда уперся, что его нельзя скопировать совершенно в другой проект, то сделал библиотеку. Вроде как и макрос можно сохранять как библиотеку, но так и не понял как это сделать.

capzap
29.03.2013, 00:35
capzap пробовал и область копировать и отдельный элемент, ничего не помогает.
В пределах окна одной запущенной программы копируется без проблем по Ctrl+C и вставляется по Ctrl+V.

Почему и озадачился созданием макросов сперва, но когда уперся, что его нельзя скопировать совершенно в другой проект, то сделал библиотеку. Вроде как и макрос можно сохранять как библиотеку, но так и не понял как это сделать.

Если целиком, да и часть тоже можно потом просто лишнее удалить, то ищите в меню экспорт/импорт

petera
29.03.2013, 03:18
Подскажите как присвоить значения многомерному массиву
например:
mass: ARRAY [0..1] OF ARRAY[0..3] OF INT:=1,2,3,4,5,6,7,8;
значения присваиваются только первому "ряду", то есть mass [1][0] :=0;
:confused: :eek:
http://s43.radikal.ru/i101/1303/20/8f7be9f9c0d6t.jpg (http://s43.radikal.ru/i101/1303/20/8f7be9f9c0d6.png) http://s018.radikal.ru/i501/1303/6c/86b5dee5fa3ft.jpg (http://s018.radikal.ru/i501/1303/6c/86b5dee5fa3f.png)

agz
29.03.2013, 08:37
Можно вопрос, Вы как студент что то проектируете или на производстве выполняете какую то задачу, просто сто два реала это очень много, скорее всего ресурс исчерпан

для производства, просто есть написанный (не мной) клиент, под который приходится выдавать данные в некотором заданном формате.

capzap
29.03.2013, 09:15
для производства, просто есть написанный (не мной) клиент, под который приходится выдавать данные в некотором заданном формате.

Тут тогда надо Валенка уговаривать посмотреть :) может у него есть наработки как организовать слейв на 63 с помощью библиотек

Игорек
29.03.2013, 10:38
Подскажите пожалуйста,пробовал найти на форуме но так и не получилось, стоит выбор ПЛК. В чем разница между ПЛК110-220.32.Р-L и ПЛК110-220.32.Р-М. написано что в ограничении размера памяти области ввода/вывода. Обьясните на словах с чем столкнусь в процессе работы с двумя ПЛК.

kgsh82
29.03.2013, 10:43
Подскажите пожалуйста,пробовал найти на форуме но так и не получилось, стоит выбор ПЛК. В чем разница между ПЛК110-220.32.Р-L и ПЛК110-220.32.Р-М. написано что в ограничении размера памяти области ввода/вывода. Обьясните на словах с чем столкнусь в процессе работы с двумя ПЛК.

Попробуйте поискать в РЭ на контроллер (или в РП)

capzap
29.03.2013, 11:33
Подскажите пожалуйста,пробовал найти на форуме но так и не получилось, стоит выбор ПЛК. В чем разница между ПЛК110-220.32.Р-L и ПЛК110-220.32.Р-М. написано что в ограничении размера памяти области ввода/вывода. Обьясните на словах с чем столкнусь в процессе работы с двумя ПЛК.

В конфигураторе при букве L сможете разместить ограниченное количество переменных для модбас, в М-ке их количество значительно больше

Игорек
29.03.2013, 14:20
В конфигураторе при букве L сможете разместить ограниченное количество переменных для модбас, в М-ке их количество значительно больше
можно немного подробней??заранее благодарен

Валенок
31.03.2013, 21:51
можно немного подробней??заранее благодарен
http://www.owen.ru/catalog/56617975

Попробуйте поискать в РЭ на контроллер (или в РП)
(С) kgsh82

Валенок
31.03.2013, 22:29
Тут тогда надо Валенка уговаривать посмотреть :) может у него есть наработки как организовать слейв на 63 с помощью библиотек

Слейв не делал - не было задач.

Если для про-ва, то
1.В лоб. Зато шустрый в работе
Оно не обеднело бы от 12кр. за кокой-нить ПЛК110-30-М в качестве шлюза. Ваш клиент даже не узнал бы об этом. И 63й в него залил бы хоть 20кБ. Мне проще на 63 клиента (мастера) сделать. Причем программирование обоих для обмена - где-то 10 минут включая кофе. Быстрее чем вы конфигурацию заполнили )) :eek:

2.Тоже в лоб. И еще быстрее в работе.
А может там заместо клиента - сервер сделать (дальше см. п.1)

3.Не в лоб.
Откуда 100 реалов ? Что он там считает ? Может выкините того клиента и разумно переделаете его. Сэкономите деньги за шлюз, потратите время на программирование.

Если все же нужны эти 100 реалов, то, например, используя 1 (один) флоат в 63ем:
1.Мастер читает значение этого флоата (пофиг какое)
2.Используя значение этого флоата мастер в него пишет нужный индекс в некоем зашифрованном виде
3.Слейв видя изменения в флоате - расшифровывает индекс и пишет туды нужное значение.
4.Мастер читает значение этого флоата и пихает его в нужное место своего массива
5.гоуту п.2

Написание алгоритма бывает быстрее чем забить сотню реалов в конфигурацию с адресами. Автоматизация всетаки :)

kgsh82
01.04.2013, 05:57
http://www.owen.ru/catalog/56617975

(С) kgsh82

Надо же как-то человека научить читать

konst2
01.04.2013, 08:16
Подскажите пожалуйста, как мне попроще преобразовать реальное время 64 разряда, как я понял в микросекундах, в 32 разрядную величину в сеундах.
Так что-бы я мог прошедшее время легко определять вычетанием из реального времени (в сек), моей переменной (сек), Короче как пкревести реальное время в переменную DATE_AND_TIME
((сокр. DT) содержит время в секундах, начиная с 0 часов 1 января 1970 года. Диапазон значений от: 1970-00-00-00:00:00 до 2106-02-06-06:28:15.)
Желательно написать в LD или в ST.
Может быть как-то так, примерно.

capzap
01.04.2013, 09:06
Подскажите пожалуйста, как мне попроще преобразовать реальное время 64 разряда, как я понял в микросекундах, в 32 разрядную величину в сеундах.
Так что-бы я мог прошедшее время легко определять вычетанием из реального времени (в сек), моей переменной (сек), Короче как пкревести реальное время в переменную DATE_AND_TIME
((сокр. DT) содержит время в секундах, начиная с 0 часов 1 января 1970 года. Диапазон значений от: 1970-00-00-00:00:00 до 2106-02-06-06:28:15.)
Желательно написать в LD или в ST.

Смотрите библиотеку оскат, функцию DT_DINT, только без миллисекунд и мкс естественно

drvlas
01.04.2013, 10:05
Убрал в правильный форум (http://www.owen.ru/forum/showthread.php?t=14673). Извините, недосмотрел

konst2
01.04.2013, 13:57
Смотрите библиотеку оскат, функцию DT_DINT, только без миллисекунд и мкс естественно

Нашел только DT_TO_DINT , а что ставить входной переменной? там ведь должны быть две переменные, а там только один вход, что-то я не догоняю?

capzap
01.04.2013, 14:08
Нашел только DT_TO_DINT , а что ставить входной переменной? там ведь должны быть две переменные, а там только один вход, что-то я не догоняю?

Так EN разрешает работу блока, на вход подаете переменную с типом DT, на выходе получаете переменную типа DINT

PS посты читал с телефона, не уловил сути, видимо обратное преобразование Вам потребуется DINT_TO_DT, где на вход надо подать секунды, а получить DATE_AND_TIME. Есть правда вопрос, а на каком плк Вы получаете 64-разрядные данные?

konst2
02.04.2013, 06:22
Так EN разрешает работу блока, на вход подаете переменную с типом DT, на выходе получаете переменную типа DINT

PS посты читал с телефона, не уловил сути, видимо обратное преобразование Вам потребуется DINT_TO_DT, где на вход надо подать секунды, а получить DATE_AND_TIME. Есть правда вопрос, а на каком плк Вы получаете 64-разрядные данные?

Так вот читаю справочную систему и вижу.
CurTime
Функциональный блок (библиотека SysLibTime.lib) дает текущее время локальной системы в микросекундах (структура SysTime64).

Переменная VAR_IN_OUT SystemTime
Тип данных SysTime64
Описание Текущее время локальной системы в микросекундах (см. описание структуры SysTime64).

Структура SysTime64
Данная структура (библиотека SysLibTime.lib) применяется для представления текущего времени локального компьютера в микросекундах. Младшая (Low) часть вместе со старшей частью времени, образуют структуру размером 64 бит. Она используется функциональными блоками CurTime и CurTimeEx.

Компонент ulLow ulHigh
Тип данных DWORD DWORD
Описание Младшая часть локального времени Старшая часть локального времени

Я в этом пока мало понимаю.
Но мне нужно, в определённый момент взять текущее время моей системы, запомнить его (лучще в секундах, а не в микросекундах так как это время можно запомнить в одной переменной Dword) и потом отображать время прошедшее от этого момента.
Так вот и встаёт вопрос как мне лучше это локальное время (которое в микросекундах) преобразовать в секунды.
А может вы подскажете что нужно сделать чтобы КоДеСис на ПК в режиме эмуляции, присваивал переменным, время локальной системы (в данном случае время ПК) я бы тогда сам разобрался с этим вопросом. Подключить Плк пока не получится, они ещё не пришли.

capzap
02.04.2013, 07:10
Так вот читаю справочную систему и вижу.
CurTime
Функциональный блок (библиотека SysLibTime.lib) дает текущее время локальной системы в микросекундах (структура SysTime64).

Переменная VAR_IN_OUT SystemTime
Тип данных SysTime64
Описание Текущее время локальной системы в микросекундах (см. описание структуры SysTime64).

Структура SysTime64
Данная структура (библиотека SysLibTime.lib) применяется для представления текущего времени локального компьютера в микросекундах. Младшая (Low) часть вместе со старшей частью времени, образуют структуру размером 64 бит. Она используется функциональными блоками CurTime и CurTimeEx.

Компонент ulLow ulHigh
Тип данных DWORD DWORD
Описание Младшая часть локального времени Старшая часть локального времени

Я в этом пока мало понимаю.
Но мне нужно, в определённый момент взять текущее время моей системы, запомнить его (лучще в секундах, а не в микросекундах так как это время можно запомнить в одной переменной Dword) и потом отображать время прошедшее от этого момента.
Так вот и встаёт вопрос как мне лучше это локальное время (которое в микросекундах) преобразовать в секунды.
А может вы подскажете что нужно сделать чтобы КоДеСис на ПК в режиме эмуляции, присваивал переменным, время локальной системы (в данном случае время ПК) я бы тогда сам разобрался с этим вопросом. Подключить Плк пока не получится, они ещё не пришли.

http://www.owen.ru/forum/showthread.php?t=13588
6 и 7 пункты не желаете взглянуть

konst2
02.04.2013, 08:25
http://www.owen.ru/forum/showthread.php?t=13588
6 и 7 пункты не желаете взглянуть

Да я это смотрел и раньше, но мало что понял.
Спасибо и на том. Буду пытать сам выбросить микросекунды и обрезать до 32 бит.

melky
02.04.2013, 09:59
Подскажите, при использовании датчиков Pt1000, в свойствах входа для ПЛК его в прямом виде нет в списке. Я правильно понимаю, что это
ТС 1000П 1.385
Документация конечно тоже не блещет явным указанием.

kgsh82
02.04.2013, 13:20
Подскажите, при использовании датчиков Pt1000, в свойствах входа для ПЛК его в прямом виде нет в списке. Я правильно понимаю, что это
ТС 1000П 1.385
Документация конечно тоже не блещет явным указанием.

Именно так

capzap
02.04.2013, 13:41
Нашел только DT_TO_DINT , а что ставить входной переменной? там ведь должны быть две переменные, а там только один вход, что-то я не догоняю?

такой пример посмотрите, только на реальном плк будет работать

melky
02.04.2013, 16:17
Ошибка подключения к ПЛК100
Провожу соединение, просит записать в ПЛК программу (режим отладки, без записи в flash), начинает выполнять программу, потом в какой-то момент связь с плк обрывается и все....... соединиться с плк больше не получается...

capzap
02.04.2013, 16:24
Ошибка подключения к ПЛК100
Провожу соединение, просит записать в ПЛК программу (режим отладки, без записи в flash), начинает выполнять программу, потом в какой-то момент связь с плк обрывается и все....... соединиться с плк больше не получается...

в эмуляторе Ваш проект работает?

melky
02.04.2013, 16:41
capzap, хуже, он работает и в ПЛК, но через время лампочка "связь" гаснет и необходимы танцы с бубнами, чтобы из codesys опять приконектиться к плк, причем пока плк работает связь поднять не удается.

Используется шнур из комплекта и PCI EXPRESS плата ком порта, при чем не дешевый вариант USB -> COM а аппаратный COM порт.
Через дешевый PCI EXPR связь вообще не удалось поднять

http://www.owen.ru/forum/attachment.php?attachmentid=8460&stc=1&d=1364906669

А так же начинают дублироваться свойства подключения сами по себе.

Сейчас вот уже несколько минут работает через вход USB, еще не отвалился. Так что сложно судить в чем проблема, возможно в взаимодейстии компа с PCI EXPRESS, а может и в шнурке.... не могу сказать.

capzap
02.04.2013, 17:44
capzap, хуже, он работает и в ПЛК, но через время лампочка "связь" гаснет

если в эмуляторе работает не выходя в стоп, значит дело только в параметрах связи, можно попробовать Проект->Опции->Рабочий стол и в нем таймаут связи увеличить

melky
02.04.2013, 18:09
ок, завтра опробую увеличить таймаут.
Через USB работает до сих пор.

petera
03.04.2013, 03:21
ок, завтра опробую увеличить таймаут.
Через USB работает до сих пор.
Пока писал и отлаживал программу "на столе" кодесис нормально подключался к ПЛК, а когда стал подключаться к ПЛК установленном в собранном шкафу периодически стала отваливаться связь.
Мне помог чей-то совет (не помню тему) по увеличению таймаутов до 20000 мс.
http://s019.radikal.ru/i614/1304/53/5ac8db7c1475t.jpg (http://s019.radikal.ru/i614/1304/53/5ac8db7c1475.png)

mcsafik
03.04.2013, 11:50
Здравствуйте!
Скажите пожалуйста, можно ли подключить к одной сети rs-485 два преобразователя АС-4 и запускать одновременно на разных компьютерах овен процесс менеджер, чтобы получать данные на две программы с приборов в одной сети?

Спасибо.

melky
03.04.2013, 12:54
mcsafik в РЭ толком не написана такая возможность, но у него есть дип переключатель, отключающий резисторы на линии, следовательно его можно устанавливать и в середине RS485 линии как один или несколько приборов.

Вроде как сам преобразователь не является мастером для RS485, то должно быть можно.
А тех поддержка что на этот счет говорит ?

melky
03.04.2013, 12:56
Вопрос по CodeSys - Есть в программе быстрая возможность вычистить неиспользуемые переменные ?

Странно, что сама программа этого не выполняет при удалении FB например был CTU1: CTU; я его удалил а в списке переменных он остается.

kgsh82
03.04.2013, 13:33
Проект-Опции-Генератор кода

melky
03.04.2013, 17:03
kgsh82 не совсем понял как ? пробовал исключать и т.д. все равно остается в списке то, что уже удалено.

petera
03.04.2013, 17:06
kgsh82 не совсем понял как ? пробовал исключать и т.д. все равно остается в списке то, что уже удалено.
При удалении функционального блока из тела программы его имя остается в разделе определения переменных. Есть такая фишка.
Попробуйте в Прооект-> Опции-> Генератор кода отметить "Проверять автоматически" - "Неиспользуемые переменные"

melky
03.04.2013, 17:22
petera пробовал, но не понял как оно работает....
сохранял проект как, потом открывал, а в переменных все равно он сидит.

В какой момент они должны удаляться или какую команду необходимо дать, чтобы произошло удаление лишних переменных ?

petera
03.04.2013, 17:47
petera пробовал, но не понял как оно работает....
сохранял проект как, потом открывал, а в переменных все равно он сидит.

В какой момент они должны удаляться или какую команду необходимо дать, чтобы произошло удаление лишних переменных ?
В нижнем окне будет список, щелкаем на строчках и переходим к нужному месту, а там ручками удаляем. Так наверно.

melky
03.04.2013, 18:15
В нижнем окне каком ? никакого списка именно неиспользуемых переменных нигде не отображается.
Может не туда смотрю ?

О, почему-то не сразу отобразилось, теперь есть. Спасибо.

melky
03.04.2013, 18:48
Очень интересно, были CTUD и работали, потом перестали работать при этом при компиляции никаких ошибок ? :(

Вопрос на засыпку, почему входной параметр CTU счетчика PV - WORD, а при вводе значения 65535 выход счетчика Q переводится в 1 ?
при вводе 32767 (15 бит) он еще 0, при вводе 32768 (16 бит) уже 1.

Сам параметр WORD имеет значение от 0 до 65535 - как так?

Подскажите, есть 32-х битный счетчик в CodeSys ?

Так же заметил на операциях сравнения. <, > и т.д. По HELP указано, что значения могут быть WORD, DWORD, DINT и т.д. по факту DWORD не работает, как только в верхнем разряде появляется 1, то < или другой оператор срабатывает.

Валенок
05.04.2013, 01:36
указано, что значения могут быть WORD, DWORD, DINT и т.д. по факту DWORD не работает, как только в верхнем разряде появляется 1, то < или другой оператор срабатывает.
Курим типы и их приведение, включая неявные

melky
05.04.2013, 11:02
Валенок попробуйте сравнить явный dword#4294967295 c с числом немного меньшим, например dword#4294967290 и посмотрите на выходы блоков сравнения. Либо вставьте в таймер word#65535 и посмотрите на выход QU заодно прочтите в справке, что должно быть на выходе QU...

Обломс, справка не соответствует действительности.

Куда уж явнее, если в объявлении переменных я указываю например tm1:DWORD;

S.A.D.
05.04.2013, 15:18
подскажите пожалуйста, что значит сообщение об ошибке, появляющееся в процессе заливки проекта с текстом: неразрешенные ссылки на внешние POU. И дальше приводятся 2 POU один из которых является ФБ одной из подключенных библиотек, а второй я вообще не знаю откуда он взял. Ни одно из наименований в проекте не используется. Использую ПЛК100-РМ

S.A.D.
05.04.2013, 15:45
проблема решена. прошу прощения за беспокойство

S.A.D.
05.04.2013, 17:13
не могу открыть сокет биб-кой syslibsockets.
пишу
diSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP);

и ф-ия возвращает -1, т.е. что сокет открыт неудачно. Непойму что я сделал не так. У кого есть опыт работы с этой биб-кой, пните в нужную сторону плиз.

Валенок
05.04.2013, 17:14
Ни разу неиспользовал эти счетчики. Зачем ?
Посмотрел. Сделал вывод - внутри работа со знаковыми (int'ами) Типа jge вместо jae. Плакать ?

melky
05.04.2013, 17:31
Валенок со сравнением возможно ошибся (может в прошлый раз забыл явно указать тип) или на EQ так действует, не помню, меня больше счетчики интересовали в тот момент.

А вот счетчики удивляют. pv1 и pv2 заданы в явном виде pv1:WORD:=ххххх

А выход не соответствует документации, проверьте в режиме ST, а то мне проще CFC использовать.

http://www.owen.ru/forum/attachment.php?attachmentid=8476&stc=1&d=1365168632

Не плакать, а как-то донести разработчикам, что документация не соответствует работе ПО.
p.s. там ошибочка, сям ошибочка, и однажды кого-нибудь перепилит на станке :)

Валенок
05.04.2013, 17:47
.
там ошибочка, сям ошибочка, и однажды кого-нибудь перепилит на станке
именно по этому в ответственных местах не использую откуда-то блоки- а сам их делаю.

melky
05.04.2013, 18:12
Валенок похвально, но странно, что с некоторыми элементами такое происходит. Или вы и ADD сами пишите и т.д. элементарные блоки ?

При попытке после ADD поставить dint_to_dword получаем ошибку, говорящую о том, что переменная таки dword.

http://www.owen.ru/forum/attachment.php?attachmentid=8477&stc=1&d=1365171113

И что значит откуда-то ? большая их часть вшита в CodeSys

УПС, эту ошибку я исправил, тут действительно смешивались на SEL разные типы данных bool и dword и из-за этого сравнение давало ошибку.

melky
05.04.2013, 18:34
Валенок я уже исправил эту программу, там на сел попадал bool, преобразовал и все заработало правильно.
Жалко что пришлось все это писать самому, когда есть счетчики, на которых это делается в несколько раз быстрее. Просто сам факт удивил, что заявлены 16 битные счетчики, а на все 16-ть не работают.

Валенок
05.04.2013, 18:41
Ну вот по миниатюре. Рекомендую порядок исполнения сделать в "соответствии с потоком". Тут бывают нюансы.
ADD(33) а SEL(35), хотя выход с SEL идет в ADD и тд..

Валенок
05.04.2013, 22:00
Переезжаешь ?

rovki
05.04.2013, 22:03
А мы бы и хатку под искали;) :D :)

spinogryz57
06.04.2013, 20:59
Помогите пожалуйста найти описание ПИД регулятора(если оно конечно есть) из библиотеки Util.lib

ASo
06.04.2013, 21:54
1. Стандартная справка, там есть описание ПОУ библиотеки util.lib
2. Как известно, лучшим описанием языка программирования является транслятор с него. Поэтому откройте сам файл библиотеки в КДС, изучите ПОУ PID, он написан на ST.

S.A.D.
07.04.2013, 21:55
не могу открыть сокет на ПЛК100 биб-кой syslibsockets.
пишу
diSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP);

и ф-ия возвращает -1, т.е. что сокет открыт неудачно. Непойму что я сделал не так. У кого есть опыт работы с этой биб-кой, пните в нужную сторону плиз.
товарищи, неужели один я такой везучий?)))

Energetik80
12.04.2013, 19:29
конфигуратор

Energetik80
12.04.2013, 19:32
Господа подскажите речь идет о ПЛК160. В чем разница если я буду опрашивать периферийные устройства через конфигурацию ПЛК или через библиотеки SYS

Yegor
12.04.2013, 20:33
Для начала расскажите что именно собрались опрашивать, как часто и в каком объёме.

Energetik80
13.04.2013, 23:03
Опрашивать буду по 485 мэ110 3шт. Мв110-8а 1шт. Мсд200 1 шт. ПЧ 1шт.
По обьему не скажу ну около 50 Переменных разного типа.
По 232 панель оператора, Обьем я думаю не меньше.

Yegor
15.04.2013, 05:56
Библиотеки мне помогали когда я капризный Мерадат опрашивал. А один коллега обнаружил, что с конфигуратором при больших объёмах иногда съезжают регистры на один влева или вправо. С другой стороны, когда весь модбас определён в конфигураторе, программа не замусоривается всякой фигнёй, которая к задаче управления отношения не имеет. Так что попробуйте сначала в конфигурации сделать, и если что-то не понравится, переедете на библиотеки.

Можно было бы сказать, что в библах вы сами запросы формируете и определяете моменты передачи, но в конфигурации момент тоже определять можно (режим передачи по команде), а запросы вручную формировать особого смысла нет — зачем то же самое вручную считать?

Energetik80
15.04.2013, 06:39
Спасибо. Попробую.

Скрипник Александр
15.04.2013, 14:08
Ставил ли кто-нибудь Codesys на windows 8 x64? Вроде бы поставилось нормально, но среда не видит gateway. При попытке подключения к контроллеру выдается ошибка "Не возможно подключиться к удаленному шлюзу".
При входе в параметры связи система долго думает (видимо сетевой таймаут) и выдает "No gateway with the given settings could be found!"
Firewall отключен.

Сам себе и отвечу (может кому пригодится). Проблема была во встроенном антивирусе "Windows Defender". Причем просто добавить папку Codesys в исключения не помогло. Пришлось все снести, отключить защитника, переустановить Codesys и вроде бы пошло.

drvlas
17.04.2013, 12:16
Вопрос по CodeSys - Есть в программе быстрая возможность вычистить неиспользуемые переменные ?Ручками я поудалял, что не используется. Но остался огромный перечень VAR CONSTANT "переменных", как глобальных. так и объявленных в разных POU. Выбрасывать их низзя, ибожеж используются! Но почему-то упорно выдаются мне в списке неиспользуемых.
К чему бы это? Мож погода изменится?

perunov
18.04.2013, 08:26
Доброе утро. Не могу найти ответа на свой вопрос. Есть несколько устройств. ТРМ202, два модема ПМ01, и комп с Lectus. Через гипертерминал к модемам подключаюсь свободно, никаких проблем. Но никак не могу подключиться к модему через лектус и передать данные с ТРМ202 по CSD. Настройки портов перепроверял. Лектус пишет "Нет связи с устройством". Модем+ТРМ202: модем настроен на автоподъём трубки. Не пойму где я ошибся.

capzap
18.04.2013, 08:35
Доброе утро. Не могу найти ответа на свой вопрос. Есть несколько устройств. ТРМ202, два модема ПМ01, и комп с Lectus. Через гипертерминал к модемам подключаюсь свободно, никаких проблем. Но никак не могу подключиться к модему через лектус и передать данные с ТРМ202 по CSD. Настройки портов перепроверял. Лектус пишет "Нет связи с устройством". Модем+ТРМ202: модем настроен на автоподъём трубки. Не пойму где я ошибся.

Услуга работы с CSD подключена?

perunov
18.04.2013, 09:41
Услуга работы с CSD подключена?
Затрудняюсь ответить. Как это можно проверить?

perunov
18.04.2013, 09:47
Затрудняюсь ответить. Как это можно проверить?
Вроде бы разобрался. Сейчас буду тестить. Большое спасибо.

YuriBel
18.04.2013, 09:53
Подключите оба модема к ПК, свяжитесь с ними через два гипертерминала и прозвонитесь с одного на другой. Номер телефона в команде ATD нужно записать без точки с запятой - это звонок в режиме передачи данных. С точкой с запятой - это голосовой звонок. Если услуга передачи данных и факсов открыта на ваших симках, то модемы должны соединиться в режиме передачи данных и вы увидите строку Connect 9600 или что-то в этом роде. если услуга не разрешена, соединение не установится. Если все ОК, можете с клавиатуры черкнуть пару строк самому себе и увидеть, как они просквозят эфир и нарисуются на втором гипертерминале.

J0shua
18.04.2013, 13:11
Здравствуйте, подскажите пожалуйста:
Запрограмировал ПЛК100, использовал SFC. Первый шаг программы, устанавливает систему в исходное состояние, и после ресета ПЛК стартует с этого шага. НО рабочий шаг, это 2. И программа после цикла возвращается на этот шаг (т.е. к 1 шагу больше не обращается).
Если выключаю питание ПЛК, то программа стартует (как я понимаю) с последнего рабочего шага (это 2 шаг), и получатеся что система не устанавливается в исходное состояние.
Вопрос: каким образом можно сделать так чтобы, при включении после потреи питания, ПЛК стартовал с начала (1 шага) программы, а не с последнего активного?

petera
18.04.2013, 17:03
Здравствуйте, подскажите пожалуйста:
Запрограмировал ПЛК100, использовал SFC. Первый шаг программы, устанавливает систему в исходное состояние, и после ресета ПЛК стартует с этого шага. НО рабочий шаг, это 2. И программа после цикла возвращается на этот шаг (т.е. к 1 шагу больше не обращается).
Если выключаю питание ПЛК, то программа стартует (как я понимаю) с последнего рабочего шага (это 2 шаг), и получатеся что система не устанавливается в исходное состояние.
Вопрос: каким образом можно сделать так чтобы, при включении после потреи питания, ПЛК стартовал с начала (1 шага) программы, а не с последнего активного?
По поводу
Если выключаю питание ПЛК, то программа стартует (как я понимаю) с последнего рабочего шага (это 2 шаг), и получатеся что система не устанавливается в исходное состояние.Это результат глупости разработчиков ПЛК! ПЛК продолжает работать на аккумуляторе при обесточенном оборудовании, и если он находился в шаге 2(или любом другом), то там и остается, а не стартует с этого шага.
В любом случае нужно добавить в конфигурацию модуль Statistic.
В нем есть бит Power status. Присвоить ему имя, например PWR.
А дальше в зависимости от того, как сделана программа.
1. Ваша SFC это главная программа - PLC_PRG.
В этом случае добавляете ко всем шагам условие перехода "NOT PWR" (он должен быть самым левым) на начальный шаг (Init).
2. Ваша SFC вызывается из другой программы, например из PLC_PRG.
В этом случае или по варианту 1 или используйте Флаги SFC
А) или SFCInit:
Переменная типа BOOL. Когда переменная получает значение ИСТИНА, программа переходит на шаг Init и все SFC флаги сбрасываются. Шаг Init становится активным, но не выполняется, пока переменная имеет значение ИСТИНА. Как только SFCInit примет значение ЛОЖЬ, выполнение программы продолжится
Б) или SFCReset:
Переменная типа BOOL. Работает подобно SFCInit. Но приостановка выполнения происходит после шага инициализации Init. Поэтому флаг SFCReset можно сбросить в самом шаге Init.
В раздел входных переменных SFC программы нужно добавить объявление
SFCInit : BOOL;
или
SFCReset:BOOL;
Использование SFCInit
1.В PLC_PRG по условию "NOT PWR:=TRUE" устанавливаем этот флаг для соотв. программы: prg_sfc.SFCInit := TRUE; Она останавливается и переходит на Init
2.В PLC_PRG сбрасываем этот флаг по условию "PWR:=TRUE", SFC программа начинают работать сначала.
В шаге Init нужно предусмотреть соответствующую инициализацию всех важных внутренних переменных, поскольку сброс флагами SFC POU не вызывает нач. инициализацию.
Использование SFCReset
1.В PLC_PRG по условию "NOT PWR:=TRUE" устанавливаем этот флаг для соотв. программы: prg_sfc.SFCReset:= TRUE; Она останавливается и переходит на Init
2.В действии шага Init выполняется последовательность соответствующая инициализацию всех важных внутренних переменных
3. Последней строчкой выполняем сброс SFCReset:= FALSE;
Где-то так...
ЗЫ. Я думаю, что при использовании SFCInit можно сделать проще
В любом случае в основной программе есть вызов программы SFC в виде prg_sfc(). Меняем на prg_sfc(SFCInit:=NOT PWR)

AngryGrey
20.04.2013, 08:04
Доброго времени суток! Недавно обратил свое внимание на ПЛК ОВЕН, ранее работал только с SIEMENS. При программировании возник вопрос.

В Step7 есть такое понятие как ДатаБлок (DB - все знают о чем я :) )
Вопрос в следующем - как можно (и можно ли вообще) работать с переменными и таблицами переменных в CODESYS ПЛК110? И как определить область памяти (переменные типа M, если по аналогии с сименом)? Есть ли таблица символов?

capzap
20.04.2013, 08:56
Доброго времени суток! Недавно обратил свое внимание на ПЛК ОВЕН, ранее работал только с SIEMENS. При программировании возник вопрос.

В Step7 есть такое понятие как ДатаБлок (DB - все знают о чем я :) )
Вопрос в следующем - как можно (и можно ли вообще) работать с переменными и таблицами переменных в CODESYS ПЛК110? И как определить область памяти (переменные типа M, если по аналогии с сименом)? Есть ли таблица символов?

Есть, называется все по другому

AngryGrey
20.04.2013, 09:19
А как называется? Что в справке искать то? :)

drvlas
20.04.2013, 09:27
Где-то так...Именно так. использую SFCReset для того, чтобы не ставить в каждом шаге проверки. Но у меня SFC - не главная, поэтому я приспособил этот флаг для "вылавливания" нажатия кнопки СТОП. Работает замечательно - где бы SFC прога ни находилась, по СТОПу срывается в ИНИТ и уж там смотрю: ага, так мы сюда попали не просто так, а по кнопке СТОП - ну и делаю чего надо.
Так что флаг SFCReset - рулез!

А вот слежение за питанием сделал (тоже на этом же форуме подсказали) через watchdog. Как только вижу пропадание питания (ну, еще полсекунды ковыряюсь в носу), тупо становлюсь в мертвую петлю, откуда watchdog таймер сорвет в сброс всю программу:


TON_Power( IN:= NOT bPower_OK, PT:=T#0.5s);
WHILE TON_Power.Q DO ; END_WHILE

Здесь bPower_OK - именно тот бит в модуле статистики, о котором многоуважаемый коллега petera и говорит.
Внешне это выглядит именно так, как пользователь имеет право ожидать: как только питание сорвалось, ПЛК летит в сброс. Если включить сразу же питание - мы видим нормальный старт, с инициализациями и прочим, положенным при старте.
Кому надо - можно сначала (до ухода в метрвую пелтю) выполнить те или иные действия по "безопасной" смерти программы. Ну, ради чего аккум в ПЛК и задумывался.

capzap
20.04.2013, 10:21
А как называется? Что в справке искать то? :)

:) а вот это как у Семена, платите и Вам все покажут, все расскажут

AngryGrey
20.04.2013, 11:23
:) У Семена не платил и тут не охота :)

capzap
20.04.2013, 12:06
:) У Семена не платил и тут не охота :)

Ну значит и с этой средой разберетесь

Валенок
21.04.2013, 14:50
В Step7 есть такое понятие как ДатаБлок (DB - все знают о чем я )Вопрос в следующем - как можно (и можно ли вообще) работать с переменными и таблицами переменных в CODESYS ПЛК110? И как определить область памяти (переменные типа M, если по аналогии с сименом)? Есть ли таблица символов?

Сёменские DB с точки зреня КДС - ужос. И остальные вопросы - жесть.
Встречный вопрос - а на фига ?

melky
21.04.2013, 16:14
Валенок ничего ужасного в Сименсе нет. Просто такова архитектура, тянется в наследство с предыдущих контроллеров для поддержки.

з.ы. в Codesys многие вещи прозрачны для пользователя, о многом нет необходимости заботиться.
а таблица символов ни что иное как объявленные переменные, если в общих чертах

AngryGrey
21.04.2013, 17:37
Сёменские DB с точки зреня КДС - ужос. И остальные вопросы - жесть.
Встречный вопрос - а на фига ?

DB всегда использую для передачи данных в HMI. Например создал таблицу со множеством битовых переменных (например 32 строчки,т.е. 32 бита), каждая из которых отвечает за свою ошибку(неисправность) тех.процесса. Затем в HMI считываю DB не по битно, а целиком в виде переменной INT и разбиваю на биты уже в HMI (WinCC такое поддерживает). Таким образом вместо 32 тегов используется всего один, что значительно снижает стоимость лицензии. Так что на мой взгляд DB очень весомая и нужная вещь. Хотелось бы узнать как подобное провернуть в CodeSYS.

capzap
21.04.2013, 18:10
DB всегда использую для передачи данных в HMI. Например создал таблицу со множеством битовых переменных (например 32 строчки,т.е. 32 бита), каждая из которых отвечает за свою ошибку(неисправность) тех.процесса. Затем в HMI считываю DB не по битно, а целиком в виде переменной INT и разбиваю на биты уже в HMI (WinCC такое поддерживает). Таким образом вместо 32 тегов используется всего один, что значительно снижает стоимость лицензии. Так что на мой взгляд DB очень весомая и нужная вещь. Хотелось бы узнать как подобное провернуть в CodeSYS.

Вы бы начали с разбора примеров, например в этом разделе http://www.owen.ru/forum/forumdisplay.php?f=49
В КДС передаются данные множеством способов, смотря кто мастер, смотря что использовать из библиотек и т.п.
ЗЫ а по поводу винсиси, если тегом выступает массив интов, то можно вообще обойтись им одним, да и обращение к меркерной памяти идет быстрее, чем к дб, так что в гонке за скоростью по обмену с визуализацией она получше будет чем дб

melky
21.04.2013, 19:33
AngryGrey если не ошибаюсь, прямой записи битов в память (переменную) в CodeSys нет. Необходимо считать Byte, word, dword - сформировать значение согласно битовой маске, потом сохранить - далее передать.

Николаев Андрей
21.04.2013, 19:40
AngryGrey если не ошибаюсь, прямой записи битов в память (переменную) в CodeSys нет. Необходимо считать Byte, word, dword - сформировать значение согласно битовой маске, потом сохранить - далее передать.
Вы точно в этом уверенны? Возможно я не правильно понял Ваш пост?

Yegor
21.04.2013, 21:26
если не ошибаюсь, прямой записи битов в память (переменную) в CodeSys нет. Необходимо считать Byte, word, dword - сформировать значение согласно битовой маске, потом сохранить - далее передать.Попробуйте как-нибудь сделать integer.4 := TRUE например.

melky
22.04.2013, 00:56
Yegor хм, как-то не пробовал такое проделывать, если работает, тогда принципы похожи. Просто в Симене это чуть ли не по умолчанию, так как все входы/выходы привязаны через регистры процессора
адресно. Просто CodeSys начал изучать в режиме CFC, на STL не пишу, но учту на будущее.

AngryGrey
22.04.2013, 02:47
Попробуйте как-нибудь сделать integer.4 := TRUE например.

Уже что-то :) Спасибо.

capzap
22.04.2013, 06:21
Уже что-то :) Спасибо.

Как было правильно сказано, нужно изучить азы, потом будут разговаривать.
Для начала прочтите хотя бы "от корки до корки" этот документ http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf
Чтоб не делать вид, что Вам только что открыли секрет КДС

perunov
22.04.2013, 10:54
Сообщение от perunov
Доброе утро. Не могу найти ответа на свой вопрос. Есть несколько устройств. ТРМ202, два модема ПМ01, и комп с Lectus. Через гипертерминал к модемам подключаюсь свободно, никаких проблем. Но никак не могу подключиться к модему через лектус и передать данные с ТРМ202 по CSD. Настройки портов перепроверял. Лектус пишет "Нет связи с устройством". Модем+ТРМ202: модем настроен на автоподъём трубки. Не пойму где я ошибся.

Услуга работы с CSD подключена?


День добрый. Услуга работы с CSD была подключена. Проблема осталась. Лектус так же не видит модем. Прошу помощи.

amn
24.04.2013, 22:41
Здравствуйте. Вопрос по таймеру.

Хотелось бы внести ясность. Для чего в ниже приведенном фрагменте timer вызывается два раза подряд? Один раз с параметрами, второй раз без параметров. Одного раза с параметрами разве недостаточно?

Вот фрагмент кода из примера по работе с библиотеками Модбас:


case...
...
1:
timer(IN:=TRUE , PT:=Polling_Time );
timer;
stat:=2;
2:
timer;
IF timer.Q THEN
timer(IN:=FALSE , PT:=Polling_Time );
timer;
stat:=0;
Ready:=TRUE;
END_IF
...

capzap
25.04.2013, 06:18
когда timer.Q станет равно TRUE, в теле условия происходит останов таймера IN:=FALSE, чтоб не помешать его работе при следующих вызовах. Потому как запуск осуществляется по фронту, а не просто от ИСТИНЫ

buferk
25.04.2013, 08:32
Как в LD реализована функция jmp?

Yegor
25.04.2013, 11:05
когда timer.Q станет равно TRUE, в теле условия происходит останов таймера IN:=FALSE, чтоб не помешать его работе при следующих вызовах. Потому как запуск осуществляется по фронту, а не просто от ИСТИНЫЭто не объясняет повторный вызов на следующей же строчке.

capzap
25.04.2013, 12:59
:) a слона то и не заметил.
А я то еще хотел написать что раз это кейс, то перехода может и не быть

melky
29.04.2013, 22:41
Вопрос по CodeSys.. Одновременное использование ST и CFC возможно в одном проекте ? Или только возможно использования функций и блоков, написанных на ST в среде CFC ?

Yegor
30.04.2013, 05:51
Используйте хоть что хоть с чем.

melky
30.04.2013, 09:46
Yegor Внимательнее в чтениях вопросов...

Одновременно в одном окне код на ST и CFC возможен ? или все-таки только функции писать на ST и потом вставлять их в CFC ?

Например мне гораздо удобнее использовать именно CFC, по крайней мере более логически понятнее схема работы да и проще накидать цепочку, чем все это переписывать в ST. Однако как при этом организовать те же циклы, если внутри цикла будет много блоков на CFC ?

Николаев Андрей
30.04.2013, 10:28
Yegor Внимательнее в чтениях вопросов...

Одновременно в одном окне код на ST и CFC возможен ? или все-таки только функции писать на ST и потом вставлять их в CFC ?

Например мне гораздо удобнее использовать именно CFC, по крайней мере более логически понятнее схема работы да и проще накидать цепочку, чем все это переписывать в ST. Однако как при этом организовать те же циклы, если внутри цикла будет много блоков на CFC ?

Рекомендую ознакомиться с циклом бесплатных видеороликов по CODESYS, который недавно распространялся.
Многое станет понятнее. И про цикл, и про подпрограммы.
А там и до Task Configuration доберетесь.

yurmik
30.04.2013, 11:28
Всем привет. Возникла проблема с визуализацией. Нужно, что бы главный экран был постоянен, а при нажатие на элементы этого экрана появлялись новые окна, визуализации,а предыдущий экран не сворачивался. То есть вновь открывшееся окно было поверх предыдущего.

melky
30.04.2013, 11:39
1 день.
Установка CODESYS и target-файлов
Архив с target-файлами
Дискретные входы и выходы, связь с ПЛК
Режим эмуляции
Логические операторы
Визуализация
Язык LD

2 день.
Объявление переменных
Аналоговые входы и выходы
Арифметические операторы
Операторы сравнения
Операторы выбора
Командный вход

3 день.
Цикл работы ПЛК
Пример для ПЛК73
Язык ST
Изменение target-файла в проекте
Подключение модуля ввода

4 день.
Фронты сигналов и отладка
RS и SR-триггеры
Счетчики импульсов
Таймеры
Программирование ОВЕН ПР в среде OWEN Logic

5 день.
Подключение библиотеки Util.lib
Использование ПИД-алгоритма
Операторы преобразования типов
Финальный пример

И где здесь организации циклов и использования подпрограмм согласно моему вопросу ?, может ткнете носом, что именно мне скачать из того, что есть, чтобы начать двигаться в правильном направлении ?

Николаев Андрей
30.04.2013, 11:54
Не люблю тыкать носом - могу просто подсказать.
Общее понимание цикла ПЛК:
http://vimeo.com/64178598
Если Вы готовы идти далее:
10. Пример использования менеджера задач для вызова POU.
Скачать (7 Кб)
11. Пример вызова различных POU на различных языках.
Скачать (12 Кб)
http://www.owen.ru/forum/showthread.php?t=13588

melky
30.04.2013, 12:18
Николаев Андрей Спасибо за наводку. А первоначально говорили, что данная тема разбиралась в видеоуроках... :)

yurmik
30.04.2013, 12:33
Всем привет. Возникла проблема с визуализацией. Нужно, что бы главный экран был постоянен, а при нажатие на элементы этого экрана появлялись новые окна, визуализации,а предыдущий экран не сворачивался. То есть вновь открывшееся окно было поверх предыдущего.

Кто нибудь знает как это сделать?

amn
03.05.2013, 13:57
Здравствуйте. Изучаю реализацию опроса Модбас через библиотеки. В примере попалась переменная OPEN_TSK. Не могу найти то место в проекте, где она была объявлена.

Пример скачан с этой страницы
http://www.owen.ru/forum/showthread.php?t=13584
Пример 12. Опрос ТРМ138 по протоколу Modbus (через конфигурацию или через библиотеку Modbus.Lib).

Файл: PLC150_U_M_TRM138_WR_COIL.pro
POU: Set_param_Coil
Строка: 52
Переменная: OPEN_TSK

Компилятор на отсутствие этой переменной в разделе объявлений не ругается. Но в проекте она встречается только один раз в том месте, где я указал.

Вопрос: где объявлена переменная OPEN_TSK?

С уважением, Михаил.

Yegor
03.05.2013, 14:18
Это не переменная, а константа. Член перечисления COM_TSK из библиотеки ComService.lib.

Евгений_Томск
03.05.2013, 17:13
Кто нибудь знает как это сделать?Добрый день. Попробуйте в свойствах нужной визуализации поставить "точку" рядом с текстом "управляющая панель".

amn
03.05.2013, 17:20
Хорошо, пусть будет константа, но все же вопрос был: где она объявлена?

В библиотеке ComService.lib есть функциональный блок ComService
в этом функциональном блоке объявлена переменная Task типа COM_TSK. И это все, что мне удалось увидеть. Остальная информация скрыта.

FUNCTION_BLOCK COM_SERVICE
VAR_INPUT
Enable: BOOL;
Settings: COMSETTINGS;
Task: COM_TSK;
END_VAR

Вопрос 1: каким образом можно увидеть то место, где объявлен этот тип (COM_TSK)?

Далее в примере видим:

...
(*
Настройка и открытие порта (COM_SERVICE)
Пока на выходе Ready не будет сигнал TRUE, стучимся в порт
Порт открывается с настройками, указанными в com_settings,
а на вход Task подаются следующие значения:

0 - Открытие и настройка порта в соответствии с настройками в структуре Settings
1 - Изменение настроек уже открытого порта на настройки указанные в Settings
2 - Закрытие порта, номер порта берется из Settings.Port
*)
COM_SERVICE1(Enable:=TRUE , Settings:=Settings , Task:=OPEN_TSK )
...

Мне пока еще непонятно, каким образом функциональный блок видит константу OPEN_TSK, если в локальных переменных она не объявлена, а в разделе глобальных переменных ее нет?

Вопрос 2: Как мне увидеть то место, где объявлена константа OPEN_TSK?

ASo
03.05.2013, 18:26
Library Manager - (ComService) - Data types
И видим тип перечисление.

capzap
03.05.2013, 18:31
Хорошо, пусть будет константа, но все же вопрос был: где она объявлена?

В библиотеке ComService.lib есть функциональный блок ComService
в этом функциональном блоке объявлена переменная Task типа COM_TSK. И это все, что мне удалось увидеть. Остальная информация скрыта.

FUNCTION_BLOCK COM_SERVICE
VAR_INPUT
Enable: BOOL;
Settings: COMSETTINGS;
Task: COM_TSK;
END_VAR

Вопрос 1: каким образом можно увидеть то место, где объявлен этот тип (COM_TSK)?

Далее в примере видим:

...
(*
Настройка и открытие порта (COM_SERVICE)
Пока на выходе Ready не будет сигнал TRUE, стучимся в порт
Порт открывается с настройками, указанными в com_settings,
а на вход Task подаются следующие значения:

0 - Открытие и настройка порта в соответствии с настройками в структуре Settings
1 - Изменение настроек уже открытого порта на настройки указанные в Settings
2 - Закрытие порта, номер порта берется из Settings.Port
*)
COM_SERVICE1(Enable:=TRUE , Settings:=Settings , Task:=OPEN_TSK )
...

Мне пока еще непонятно, каким образом функциональный блок видит константу OPEN_TSK, если в локальных переменных она не объявлена, а в разделе глобальных переменных ее нет?

Вопрос 2: Как мне увидеть то место, где объявлена константа OPEN_TSK?

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

amn
03.05.2013, 19:41
Спасибо всем ответившим.
Правильный ответ на мой 1-й вопрос:
Library Manager - (ComService) - Data types
И видим тип перечисление.

Делаю вывод:
Объявленный тип данных является глобальным по умолчанию.
Если ошибаюсь пусть меня поправят.

С уважением, Михаил.

Yegor
03.05.2013, 22:15
Объявленный тип данных является глобальным по умолчанию.Принцип умолчаний здесь неприменим, т.к. вариант лишь один — любой тип данных в кодесисе является глобальным.

yurmik
06.05.2013, 10:30
Добрый день. Попробуйте в свойствах нужной визуализации поставить "точку" рядом с текстом "управляющая панель".
Спасибо за ответ. Я имею ввиду всплывающее окно. То есть на схеме несколько клапанов. Нажимая на каждый, появляется окно, их может быть одновременно несколько открытых, если нажать сразу на несколько клапанов. Именно окно поверх схемы. А с управляющей панелью места не хватит на все клапаны на экране.

petera
06.05.2013, 12:32
Вижу ошибку в коде но не знаю как исправить, прошу помощи.
PROGRAM PLC_PRG
VAR
TP1:TP;
OUT: INT;
END_VAR

TP1(IN:=TRUE,PT:=T#7s);
OUT:=0;
IF TP1.Q=0 THEN
OUT:=1;
TP1(IN:=FALSE,PT:=T#0s);
TP1(IN:=TRUE,PT:=T#10s);
IF TP1.Q=0 THEN
OUT:=2;
TP1(IN:=FALSE,PT:=T#0s);
END_IF
END_IF
Таймер внутри таймера. (это кусок из проекта)
По задумке должно быть
OUT:=0;
через семь секунд
OUT:=1;
и через десять секунд
OUT:=2;
У Вас не таймер внутри таймера, а IF внутри другого IF. И условие для вложенного IF не будет выполняться никогда.
Т.к. программа в ПЛК выполняется циклически, то всякий раз, через время одного цикла:
-первой строкой программы, время задержки таймера устанавливается равным 7с.
- второй строкой программы обнуляется переменная OUT
И в результате

...............
IF TP1.Q=0 THEN
OUT:=1;
каждые 7 с, и на время одного цикла переменная OUT будет принимать значение равное 1.
А из этой конструкции
..........

TP1(IN:=FALSE,PT:=T#0s);
TP1(IN:=TRUE,PT:=T#10s);
IF TP1.Q=0 THEN
OUT:=2;
А условие IF TP1.Q=0 THEN не будет выполняться никогда, т.к. после TP1(IN:=TRUE,PT:=T#10s) выход TP1.Q всегда будет в состоянии 1.
А TP1(IN:=TRUE,PT:=T#10s); не имеет смысла, т.к. смотрим выше на первую строку программы.

Не понятен контекст фрагмента кода, если нужно один раз после старта программы выполнить последовательность состояний для OUT:= 0(в начале) ,1(через 7с), 2(через 10с), то например так.

PROGRAM PLC_PRG
VAR
TP1:TP:=(PT:=T#10s);
OUT: INT;
END_VAR
TP1(IN:=TRUE);
IF TP1.ET>=T#7s THEN
OUT:=1;
ELSE
OUT:=0;
END_IF
IF TP1.ET=T#10s THEN
OUT:=2;
END_IF

svanekst
06.05.2013, 13:52
У Вас не таймер внутри таймера, а IF внутри другого IF. И условие для вложенного IF не будет выполняться никогда.


Спасибо.
Хотел упростить код чтобы проще было мне помочь но похоже упростил на столько что специалисты отвечают на то что видят а не на то что я думаю.
Я прикрепил проект, у меня не получается вот что:
1) Должен отработать таймер в CASE 1:
2) Должны отработать два таймера в функции
3) И только после этого должен отработать таймер в CASE 2:

Код я снова упростил, на самом деле в функции есть вычисления. По отдельности всё работает хорошо, функция вычисляет то что требуется, время работы таймеров динамически рассчитывается внутри функции. В самой программе CASE обходит всё как задумано и т.д. Но стоит мне функцию вставить в программу расчет в функции до конца не доходит, после первого цикла контроллера продолжает выполняться программа когда функция еще не дошла до своего логического конца.

petera
06.05.2013, 14:49
Спасибо.
Хотел упростить код чтобы проще было мне помочь но похоже упростил на столько что специалисты отвечают на то что видят а не на то что я думаю.
Я прикрепил проект, у меня не получается вот что:
1) Должен отработать таймер в CASE 1:
2) Должны отработать два таймера в функции
3) И только после этого должен отработать таймер в CASE 2:

Код я снова упростил, на самом деле в функции есть вычисления. По отдельности всё работает хорошо, функция вычисляет то что требуется, время работы таймеров динамически рассчитывается внутри функции. В самой программе CASE обходит всё как задумано и т.д. Но стоит мне функцию вставить в программу расчет в функции до конца не доходит, после первого цикла контроллера продолжает выполняться программа когда функция еще не дошла до своего логического конца.

В проекте кодесиса могут присутствовать разные POU -программы, функции и функциональные блоки. Давайте не путать термины.
У Вас в проекте нет функций, а есть две программы. Программа Fn() вызывается из главной программы.
Обе программы не работают параллельно.
Строки программы Fn() выполняются тогда, когда в основной программе PLC_PRG происходит ее вызов и затем продолжает выполняться основная программа со строки следующей за вызовом программы Fn(). А не ждет, когда в вызываемой программе отработает таймер и выполнятся все CASE. Вы же ни как не обмениваетесь состоянием переменных между программами, нет ни глобальных переменных ни выходных переменных у Fn()

melky
06.05.2013, 16:08
Есть аналог дешифратора 32 бит в CodeSys, как присутствует в OWEN Logic ?

На входе целочисленное от 0 до 31 (номер бита, который необходимо установить в 1), на выходе число 32-х битное согласно установленному биту.

capzap
06.05.2013, 16:20
Есть аналог дешифратора 32 бит в CodeSys, как присутствует в OWEN Logic ?

На входе целочисленное от 0 до 31 (номер бита, который необходимо установить в 1), на выходе число 32-х битное согласно установленному биту.

сложнейший код, вряд ли кто решится в библиотеку его положить

melky
06.05.2013, 16:26
capzap, блин, я тормоз, PUTBIT все тоже самое делает по аналогии с DC32 из лоджика.

Для меня ST пока темный лес практически. :)

capzap
06.05.2013, 16:33
PUTBIT не совсем соответствует Вашему описанию задачи, либо её не правильно сформулировали, либо не заглядывали во внутрь DC32, потому что в лоджике есть PUTBIT


ЗЫ на катринке то, что я до этого написал в ST

melky
06.05.2013, 16:39
capzap возможно, но работает так же как и в Лоджике DC32.
Допустил ошибку при копировании функции, сейчас проверю ваш вариант на ST для сравнения.
Что-то ваш вариант при входном значении 31 выдает 0

15 на входе должно в dword на выходе дать 1 в 15-м бите. число 32768, не выходит каменный цветок у функции почему-то

capzap
06.05.2013, 17:01
capzap возможно, но работает так же как и в Лоджике DC32.
Допустил ошибку при копировании функции, сейчас проверю ваш вариант на ST для сравнения.
Что-то ваш вариант при входном значении 31 выдает 0

15 на входе должно в dword на выходе дать 1 в 15-м бите. число 32768, не выходит каменный цветок у функции почему-то

а это была проверка :) , объявите переменную cnst вместо INT -> DWORD и должно заработать. Начинайте с анализа кода, что и для чего, а не просто бездумное копирование. В лоджике ведь работает? Там просто все числа 32-х разрядные, а в КДС типы бывают и 16-и разрядные

melky
06.05.2013, 17:01
ага, уже разобрался. Почитал справку по SHL и заменил все на DWORD

Вот сижу, соображаю, как заставить свигаться биты по кругу, но не среди 8-ми битов, а по выбору, например среди 5-ти младших, и чтобы 5-й бит шел на 1-й..... ?

lava_02
07.05.2013, 01:45
Следующая проблема... Когда размер файла созданного и редактируемого посредством SysLibFile становится 1кб (1024байт), данные в него перестают добавляться. Как можно решить эту проблему?

melky
07.05.2013, 11:07
capzap может у меня хромает логика, но если эту же функцию написать с параметрами BYTE то вроде как должны значения меняться согласно входным переменным.
0 = 1, 1 = 2, 2 = 4, 3 = 8, 4 = 16, 5 = 32, 6 = 64, 7 = 128, 8 = 1
однако 8 = 0 и так до 31, 32 = 1, то есть Codesys где-то кладет на BYTE и продолжает считать все через DWORD. Думаю с WORD будет та же петрушка. Или я где-то что-то не учитываю ?

capzap
07.05.2013, 11:16
capzap может у меня хромает логика, но если эту же функцию написать с параметрами BYTE то вроде как должны значения меняться согласно входным переменным.
0 = 1, 1 = 2, 2 = 4, 3 = 8, 4 = 16, 5 = 32, 6 = 64, 7 = 128, 8 = 1
однако 8 = 0 и так до 31, 32 = 1, то есть Codesys где-то кладет на BYTE и продолжает считать все через DWORD. Думаю с WORD будет та же петрушка. Или я где-то что-то не учитываю ?

В байте 256 "единиц",с нуля до 255, чтоб увидеть 256 нужен как минимум ворд. А ноль Вы видите по тому что 8 это уже девятый разряд

melky
07.05.2013, 11:34
capzap то, что 8 это 9-й разряд я понимаю, но это относится к word и dword. Суть то в другом, в работе функции битового сдвига SHL по отношению к BYTE а не по отношению к DWORD, что он делает постоянно, независимо от явного указания переменных. Вроде как 8 это уже разряд следующего байта и если параметр задан Byte то функция должна вернуться к началу. Ведь когда параметр DWORD и мы на вход подаем 32-й разряд функция возвращается в начало и на выходе ставит 1. И так по кругу. По отношению же к BYTE и WORD функция на это плюет. ИМХО - не логично.

capzap
07.05.2013, 11:38
capzap то, что 8 это 9-й разряд я понимаю, но это относится к word и dword. Суть то в другом, в работе функции битового сдвига SHL по отношению к BYTE а не по отношению к DWORD, что он делает постоянно, независимо от явного указания переменных. Вроде как 8 это уже разряд следующего байта и если параметр задан Byte то функция должна вернуться к началу. Ведь когда параметр DWORD и мы на вход подаем 32-й разряд функция возвращается в начало и на выходе ставит 1. И так по кругу. По отношению же к BYTE и WORD функция на это плюет. ИМХО - не логично.

Не путаете с ROL?

melky
07.05.2013, 11:50
capzap не путаю. Правильнее было бы в справочной информации по функции указать, что она работает только с DWORD. но это имхо.
Кстати ROL тоже с BYTE косячит, если не ошибаюсь... попробую проверить щас.
ROL так не косячит, 128 потом опять 1 и по кругу.

capzap
07.05.2013, 11:56
capzap не путаю. Правильнее было бы в справочной информации по функции указать, что она работает только с DWORD. но это имхо.
Кстати ROL тоже с BYTE косячит, если не ошибаюсь... попробую проверить щас.

Если бы плк был 64-разрядным, Вы бы и при dword сместив на 32 увидели бы ноль а не единицу

melky
07.05.2013, 12:08
capzap читаем внимательно HELP
SHR
res:= SHR(in,n) Побитный сдвиг операнда in вправо на n бит с дополнением нулями слева.

Входные переменные и результат должны быть типа BYTE, WORD или DWORD.

Фактически SHL сдвигает не операнд, а регистр, который ессно 32-х разрядный. Маленькая, но ошибка в документации.
ROL и ROR соответственно честно работают с операндами.

capzap
07.05.2013, 12:17
Жаль что Вы не поняли о чем я намекал в предыдущем посте

melky
07.05.2013, 12:25
capzap я понял на что вы намекали, что при 64-х разрядном ПЛК бит сдвигался бы от 0 до 63 позиций за счет разрядности регистра процессора. Ну так в HELP тогда так и надо указывать, что SHL и SHR сдвигают РЕГИСТР а не ОПЕРАНД. Нет ? я опять не прав и не умею читать по русски ?

capzap
07.05.2013, 12:30
Операнд in может иметь любой тип, вот он и сдвигается и если смещение вышло за разрядность то результат будет ноль, но так как больше 32 разрядов быть не может, то при смещении на 32 в байте снова появляется единица. Все правильно написано и работает так же

melky
07.05.2013, 12:42
capzap только это не отражено в документации. я об этом. Намотаю на ус, больше все равно ничего не остается.

а при dword выход за разрядность почему не дает 0 ? :)
палка о двух концах, не находите ?

capzap
07.05.2013, 12:46
Дворд и так имеет по максимуму разрядность, вот и перескакивает на единицу. В лоджике как происходит этот процесс?

melky
07.05.2013, 13:02
capzap в Лоджике нельзя жестко задать операндом BYTE, поэтому проверить реакцию не получится. Сами же об этом выше писали.

capzap
07.05.2013, 13:09
capzap в Лоджике нельзя жестко задать операндом BYTE, поэтому проверить реакцию не получится. Сами же об этом выше писали.

Я про Дворд

melky
07.05.2013, 14:16
capzap Dword там ведет себя аналогично, при записи бита выше 31 не выдает 0, а идет по кругу.

Тут другая головная боль, как заставить биты крутиться не по 8-ми, а по 5-ти без расчета ручками. например мне надо сделать ротацию кондюков по времени из 5-ти устройств в режиме 3+2, при одном пороге температуры перейти на 4+1, при втором пороге запустить все 5. Так же при выводе одного опять же перейти на 4+1 с соблюдением порога температуры.

Когда BYTE весь полный (используем 8 устройств) проблем с ROL нет, а вот когда он неполный надо расчитывать на лету, и вот на лету у меня и не получается. Могу только жестко забить нужные значения например для 3+2. Более простого способа чем ROL как-то даже не придумаю... Разве что весь макрос от AI! перенести, но там тоже не все меня устраивает, хотя им проще управлять...

Еще один вопрос вспомнил, который хотел задать. Если я сделал библиотеку (функцию, блок) и всю ее переношу в Retain переменные, она полностью будет сохранять свои значения или надо заботиться именно о переменных, чтобы сохранить данные ?

capzap
07.05.2013, 14:30
Есть еще команда MOD она может помочь в таких делах

melky
07.05.2013, 15:28
capzap не совсем понимаю, как он может помочь.
Использую маску по методу исключения, ну или можно инвертировать сигнал.
Например при штатном режиме 3+2 идут комбинации byte
3, 6, 12, 24 - потом должно идти 17 (первое и последнее устройство), потом опять 3 и так далее.
При переходе на режим 4+1 комбинация уже другая 1, 2, 4, 8, 16, 1.

А например вариант 3+3 (основной режим) уже вовсе
(3+3) 7, 14, 28, 56, 49, 35, 7
перешли на (4+2) 15, 30, 60, 57, 51, 39, 15
а на (5+1) 31, 62, 61, 59, 55, 47, 31

Я вот пока закономерности не особо вижу, как можно универсально написать, чтобы это все можно было менять на лету например через переменную ModBUS или еще как, не перепрошивая ПЛК.

Кое какая закономерность есть, только как ее применить, вопрос....когда 3 устр. в резерве, после двух старших битов (когда хвост ползет на начало) по MOD получается 7, 14, 28 (как инверсия 3 запущенных устройств)
когда 2 устр. в резерве то по MOD 3, 6, 12, 24
когда 1 устр. то по MOD 1, 2, 4, 8, 16

capzap
07.05.2013, 16:21
capzap не совсем понимаю, как он может помочь.
Использую маску по методу исключения, ну или можно инвертировать сигнал.
Например при штатном режиме 3+2 идут комбинации byte
3, 6, 12, 24 - потом должно идти 17 (первое и последнее устройство), потом опять 3 и так далее.
При переходе на режим 4+1 комбинация уже другая 1, 2, 4, 8, 16, 1.

А например вариант 3+3 (основной режим) уже вовсе
(3+3) 7, 14, 28, 56, 49, 35, 7
перешли на (4+2) 15, 30, 60, 57, 51, 39, 15
а на (5+1) 31, 62, 61, 59, 55, 47, 31

Я вот пока закономерности не особо вижу, как можно универсально написать, чтобы это все можно было менять на лету например через переменную ModBUS или еще как, не перепрошивая ПЛК.

Кое какая закономерность есть, только как ее применить, вопрос....когда 3 устр. в резерве, после двух старших битов (когда хвост ползет на начало) по MOD получается 7, 14, 28 (как инверсия 3 запущенных устройств)
когда 2 устр. в резерве то по MOD 3, 6, 12, 24
когда 1 устр. то по MOD 1, 2, 4, 8, 16

Специально для Вас достал ноут и разрядил батарею, пример на скорую руку, могут быть ошибки, про множество вариантов не стал делать, попытался показать направление как это можно провернуть
Необращайте внимание на таргет для плк160, конфигурация не затронута

melky
07.05.2013, 17:02
capzap спасибо, попробую разобраться в ST и как-то потом применить. Мне правда непонятно, почему MOD 31 ? в смысле непонятно, как расчитать это самое число для MOD

так, для данного примера с MOD 31 разобрался. но тут два устройства, не так сложно. а при 3-х два разных MOD надо будет как-то объединять...
Вот бы еще научиться ST примеры быстро переводить в CFС :), а то пока соображу как и чего ....

Валенок
07.05.2013, 18:35
Из этого:

..читаем внимательно HELP
SHR
res:= SHR(in,n) Побитный сдвиг операнда in вправо на n бит с дополнением нулями слева...
Фактически SHL сдвигает не операнд, а регистр, который ессно 32-х разрядный. Маленькая, но ошибка в документации.
ROL и ROR соответственно честно работают с операндами.
сделал вывод - melky не знает как работает SHL
Просто надо внимательно читать HELP (в данном случае :))

Побитный сдвиг операнда in вправо на n бит с дополнением нулями слева...

Ошибок нет. Все по чесному.

как заставить биты крутиться не по 8-ми, а по 5-ти без расчета ручками.

А просто нужно имитировать работу проца. Например у вас регистр из 5 бит. Имитируем ROL на байте.

b := ROL(b,1);
b.0 := b.5; он же - OF
b.5 := 0; и его нету как бы



ST примеры быстро переводить в CFС

Выбираем ПОУ. Правая кнопа. Конвертировать. FBD - кастрированный CFC

melky
07.05.2013, 19:10
Валенок я пытаюсь внимательно читать HELP и по моему мнению ОПЕРАНД это то, что на входе, для SHL в Codesys либо BYTE, либо WORD, либо DWORD.

И если при записи в DWORD значения 32 мы получаем на выходе 1 и идем по кругу
То логично предположить что и указав, что работаем с BYTE и записи на вход 8 тоже должны получить 1 на выходе

В обоих случаях происходит переполнение ОПЕРАНДА (нет такой "буквы" по счету в данном "слове").
Тут одно из двух, либо при работе с байтом и записи на входе 8 должна быть на выходе 1-ца, либо при работе с двойным словом и записи 32 на входе должен быть 0 на выходе.

Просто перевести не проблема, проблема адаптировать код ST к моим условиям, так как пример не имеет обвязки необходимой. В общем более менее разобрался с переводом в CFC

capzap
07.05.2013, 19:13
"Выбираем ПОУ. Правая кнопа. Конвертировать. FBD - карованный CFC"
Я бы не предложил фбд, там такой гемор начнется если джампов много

Валенок
07.05.2013, 19:14
И если при записи в DWORD значения 32 мы получаем на выходе 1 и идем по кругу

Я этой фразы вообще не понимаю. Изобразите вызов на чём-нибудь. С указанием типов

PS
Только щас заметил. SHL - нули справа. Но это мелочи

Валенок
07.05.2013, 19:28
..если джампов много
:confused: в ST ?

capzap
07.05.2013, 20:14
:confused: в ST ?

То что из условий или кейсов в фбд получится

capzap
07.05.2013, 21:10
И если при записи в DWORD значения 32 мы получаем на выходе 1 и идем по кругу
То логично предположить что и указав, что работаем с BYTE и записи на вход 8 тоже должны получить 1 на выходе

В обоих случаях происходит переполнение ОПЕРАНДА (нет такой "буквы" по счету в данном "слове").
Тут одно из двух, либо при работе с байтом и записи на входе 8 должна быть на выходе 1-ца, либо при работе с двойным словом и записи 32 на входе должен быть 0 на выходе.


Для того чтоб по окончании разрядности типа данных увидеть снова единичку начиная с нулевого разряда существуют ROL/ROR-ы.И если уж Вы озаботились документацией на SHL, то что скажете про ADD, эффект то тот же (см. картинку). Правда я что то не вижу появляющуюся единицу, а вот единицу сместить на 32 в лево снова появилась

Валенок
07.05.2013, 22:31
Тоже покопался.
Хелп - в норме. Компилятор на выхлопе - под вопросом.
Сформулирую так. Битовые сдвиги до занесения результата в память(переменную) реализуются через что-то типа внутреннего цикла c однократным сдвигом, но размер этого цикла перед операцией зачищается до модуля 32 (N <- N AND 31). Вот тут и порылось.
На это косвенно указывает и результат
2 <- SHL(1,33) или SHL(1,65). Т.е. SHL(1,1)
Более правильно было бы еще сначала сравнить N c 31. Если больше - сразу 0 и выход. А дальше - как есть

Немцам видимо не приходит в голову что русские будут за каким-то делать SHL более 31 раза для 32-битового регистра. На таком они и погорели. Тогда. Их парламентеры с Петровым И. переговоры ведут. Может сдадуцца. Всех с наступающим.

PS
А в атмеге нету типа SHL AX,CL ?

melky
08.05.2013, 00:24
Валенок да вопрос то не в именно 32 на входе dword shl или 8 на входе byte shl а вообще в любом числе на входе.

когда shl dword происходит расчет бита по циклу на одном операнде и на выходе есть значение, а когда shl byte или word при превышении числа на выходе тупо 0.
функция одна, а работает на разных операндах по разному. вот разность и есть ошибка в логике. ИМХО.
кстати не проверял еще математические функции, но на примере сименса там проверку делает система, если идет перепонение, то можно контроировать по регистру произошло переполнение или нет.
а тут add считает по кругу а вот можно ли проверить или нет, не смотрел еще, может кто знает ?

Yegor
08.05.2013, 06:05
Да это симулятор такой кривой. На ПЛК с SHL всё ок.

Валенок
08.05.2013, 07:42
Да это симулятор такой кривой. На ПЛК с SHL всё ок.
Ну вот и разобрались.



когда shl dword происходит расчет бита по циклу на одном операнде и на выходе есть значение, а когда shl byte или word при превышении числа на выходе тупо 0.

А то тут shl(byte,32) - и опять получим себя

melky
08.05.2013, 09:47
А то тут shl(byte,32) - и опять получим себя
именно так себя ведет с операндом dword

Yegor, если в ПЛК ведет себя так же как с dword, то надо взять на заметку и не забыть об этом.

melky
08.05.2013, 09:48
А по поводу retain переменных что скажете ?, если я всю библиотеку туда запихну, она будет сохранять все свои внутренние переменные ?

YuriBel
08.05.2013, 10:50
А по поводу Retain в справке достаточно ясно написано:
"Замечания. Если хотя бы одна переменная функционального блока объявлена как RETAIN, то все данные экземпляров целиком помещаются в энергонезависимый сегмент."

А для функций: "Внимание: объявление в функции RETAIN локальной переменной не приведет к желаемому результату. Не пытайтесь создавать локальные энергонезависимые переменные в функциях"

Вот как-то так...

melky
08.05.2013, 11:45
YuriBel с объявлениями переменных понятно.
Я делаю FB без объявления переменных retain но сам FB объявляю как retain.
При этом симулятор мне пишет, что память retain не задана.
типа
VAR RETAIN
tr1: TRAB;
END_VAR
Внутри FB есть счетчики, арифметические выражения. Вот в таком варианте будут все данные FB попадать в Retain или все-таки необходимо заботиться о выносе переменных отдельно от FB ?

YuriBel
08.05.2013, 12:17
По идее должны все попадать.

melky
08.05.2013, 12:29
надо будет на железе проверить, а то может опять прелести эмулятора....

Валенок
08.05.2013, 23:05
Вот в эмуляторе с ретайном точно проблема.
А так: FB - структура. Объявили ее в ретайне. Вся структура там.
PS
Про SHL подтверждаю Егора - на железе как положено (110-60L)
В эмуляторе бывают и другие отличия. Опять же - к немцам.

svanekst
09.05.2013, 21:47
Помогите кто нибудь с кодом. Хотя бы подскажите куда думать.
Мне надо чтобы таймер работал внутри цикла. Что-то типа такого

FOR i:=1 TO 12 DO
t:=T#7s;
TP1(IN:=TRUE,PT:=t,Q=>Prst1);
IF TP1.Q=0 THEN
TP1(IN:=FALSE,PT:=T#0s);
END_IF
END_IF
END_IF
END_FOR

Я знаю что этот код кривой, но ровный никак не могу придумать. Поставленную задачу сделал через инструкцию CASE, в общем-то всё работает. Но когда я на код смотрю плакать хочется, 12 раз повторяется одно и то-же. Вижу что напрашивается Цикл использовать но в цикле таймер и я никак не могу добиться чтобы таймер ждал итерацию. Может это и не возможно но тогда прошу это подтвердить. В таком случае придется смириться.

capzap
09.05.2013, 22:12
Помогите кто нибудь с кодом. Хотя бы подскажите куда думать.
Мне надо чтобы таймер работал внутри цикла. Что-то типа такого

FOR i:=1 TO 12 DO
t:=T#7s;
TP1(IN:=TRUE,PT:=t,Q=>Prst1);
IF TP1.Q=0 THEN
TP1(IN:=FALSE,PT:=T#0s);
END_IF
END_IF
END_IF
END_FOR

Я знаю что этот код кривой, но ровный никак не могу придумать. Поставленную задачу сделал через инструкцию CASE, в общем-то всё работает. Но когда я на код смотрю плакать хочется, 12 раз повторяется одно и то-же. Вижу что напрашивается Цикл использовать но в цикле таймер и я никак не могу добиться чтобы таймер ждал итерацию. Может это и не возможно но тогда прошу это подтвердить. В таком случае придется смириться.

Вы бы хоть написали, что желаете получить

svanekst
09.05.2013, 22:21
Вы бы хоть написали, что желаете получить
Спасибо вам.
Мне надо чтобы прошла интерация цикла 1, потом отработал таймер, потом следующая интерация цикла 2, снова отработал таймер, потом 3 и так далее пока цикл не закончится.
А у меня таймер включился а цикл не обращая внимания но то что таймер еще не остановился побежал дальше. Я хочу понять как можно заставить цикл ожидать таймер который находится внутри цикла.

ASo
09.05.2013, 23:24
Тогда в течении 12*7=84с будет выполняться только этот код. Поэтому или все остальное подвиснет или отработает ограничение по времени программного цикла.
Поэтому в вашем случае цикл while. А правильно - полное переписывание программного кода.

petera
09.05.2013, 23:28
Спасибо вам.
Мне надо чтобы прошла интерация цикла 1, потом отработал таймер, потом следующая интерация цикла 2, снова отработал таймер, потом 3 и так далее пока цикл не закончится.
А у меня таймер включился а цикл не обращая внимания но то что таймер еще не остановился побежал дальше. Я хочу понять как можно заставить цикл ожидать таймер который находится внутри цикла.
Цикл FOR будет выполняться весь в текущем цикле программы и не подходит для данной задачи.
Решение очевидно. Нужно разложить FOR на составляющие
Есть некая переменная цикла i, которая в каждом цикле увеличивается на величину шага, и есть проверка условия достижения переменной i конечного значения.
Например так

PROGRAM PLC_PRG
VAR
TP1: TP:=(PT:=T#7s);
i: INT;
Prst1: BOOL;
END_VAR

IF i<12 THEN
TP1(IN:=NOT TP1.Q, Q=>Prst1);
IF NOT TP1.Q THEN
i:=i+1;
END_IF
END_IF

svanekst
09.05.2013, 23:36
Тогда в течении 12*7=84с будет выполняться только этот код. Поэтому или все остальное подвиснет или отработает ограничение по времени программного цикла.
Поэтому в вашем случае цикл while. А правильно - полное переписывание программного кода.

Это понятно что 84 секунды должен выполняться код, но только именно это у меня и не получается написать таймер внутри цикла И код я уже полностью переписал но только он страшный, 12 раз инструкцией CASE выполняется одно и то-же. Хочется сделать его компактным. А почему цикл while надо использовать, ведь заранее известно что в цикле всегда 12 интераций?

petera
09.05.2013, 23:40
Это понятно что 84 секунды должен выполняться код, но только именно это у меня и не получается написать таймер внутри цикла И код я уже полностью переписал но только он страшный, 12 раз инструкцией CASE выполняется одно и то-же. Хочется сделать его компактным. А почему цикл while надо использовать, ведь заранее известно что в цикле всегда 12 интераций?
А меня Вы, что проигнорировали? Вот работающий код Вашей задачи
Например так

PROGRAM PLC_PRG
VAR
TP1: TP:=(PT:=T#7s);
i: INT;
Prst1: BOOL;
END_VAR

IF i<12 THEN
TP1(IN:=NOT TP1.Q, Q=>Prst1);
IF NOT TP1.Q THEN
i:=i+1;
END_IF
END_IF

capzap
10.05.2013, 08:09
Я хочу понять как можно заставить цикл ожидать таймер который находится внутри цикла.

Ни как, это не возможно. Это программирование контроллеров, а не компьютеров, тут другой подход.
До сих пор хотелось бы узнать, какую цель Вы преследуете такой конструкцией. Опишите задачу всего проекта, тогда Вам помогут найти правильное решение, красивое и т.д.

drvlas
10.05.2013, 11:51
Это программирование контроллеров, а не компьютеров, тут другой подход+1. Зависать в любом месте программі нельзя.


Опишите задачу всего проекта, тогда Вам помогут найти правильное решение, красивое и т.д.Да, в принципе. уважаемый коллега petera дал вполне годный код. Автору вопроса нужно всего лишь ввести этот код в пустой проект, подключить Standard.lib и убедиться, как все красиво работает. То, что у него должно выполняться 1 раз в каждом шаге цикла при истечении таймера - записать над или под строкой


i:=i+1;

И фсьо...

Рассуждая дальше, не могу не отметить, что упомянутая "сложная и громоздкая" конструкция CASE на самом деле очень и очень часто используется как раз при разруливании задачи: выполнять несколько разных по смыслу действий с разносом в некоторые интервалы времени (даже не обязательно одинаковые, как в нашем примере) или по выплнению тех или иных условий во внешнем мире (то есть ожидать не внутренние таймеры, а внешние события). Для таких случаев заводится переменная ФАЗА, которая может принимать одно из ограниченного множества значений, а по ней прокручивается тот самый


CASE ФАЗА OF
ФАЗА1: (* Ждем Q первого таймера *)
...
ФАЗА2: (* Ждем Q второго таймера *)
...
ФАЗА3: (* Джем внешнего события *)
...
END_CASE


Ну, и уж совсем красиво это решается в SFC. Там замени слово ФАЗА на понятие ШАГ - и получишь те же крашенки, только в профиль :)

capzap
10.05.2013, 12:21
по поводу кода petera, не поверю что нужна такая простота, n-цать раз отсчитать время и пойти дальше, в каждой итерации наверное предполагаются и другие различные действия. Поэтому надо знать конкретную задачу от автора

drvlas
10.05.2013, 13:28
надо знать конкретную задачу от автораДа ладно... Автор пока шашлык кушает - что ж, мешать ему???
На самом деле, после постинга от petera, мы здесь уже не консультируем ТС, а просто теоретизируем для саморазвития :)
Поэтому вполне можем нарисовать все возможные случаи и без автора. Я вижу всего 2 варианта:

1) В каждом шаге цикла нужно выполнять вполне себе одинаковое действие. Тогда над/под той строкой инкремента "i" достаточно прописать необходимые действия
2) действия зависят от номера цикла. Тогда над инкрементом поставить тот же CASE - и вытворять что угодно, в зависимости от "фазы", представленной той же переменной "i".
Повторюсь, что я рассматриваю цикл им. petera как частный случай общего подхода к управлению процессом в реальном времени с ненулевыми задержками на каждом шаге. Если число шагов известно (12) и переходы зависят только от внутреннего таймера - то на ST уже ничего больше и не надо придумывать.
Или ты можешь предложить такую задачу (от имени автора вопроса), которая не опишется циклом Петеры? :)

amn
10.05.2013, 16:58
Здравствуйте. Изучаю Модбас через библиотеки. Мне нужно для связи ПЛК100, МВА8, МДВВ, ПР110 и панель ИП320. Возможно блоков ввода-вывода будет много. В форуме прочитал, что если больше 3-5 приборов, то лучше использовать библиотеки, а не конфигуратор.

Где-то попадалось сообщение, что уважаемый Валенок какую-то библиотеку подправлял. Есть ли ссылка на исправленный вариант?

Вопрос такой: какие библиотеки порекомендуете как более надежные?

С уважением, Михаил.

amn
11.05.2013, 12:01
Упростим вопрос: какими библиотеками пользуетесь и какие есть нарекания?

capzap
11.05.2013, 12:18
Упростим вопрос: какими библиотеками пользуетесь и какие есть нарекания?

есть одна библиотека modbus.lib, её кстати и Валенок правил

Gans
11.05.2013, 12:22
Здравствуйте, amn.

Упростим вопрос: какими библиотеками пользуетесь и какие есть нарекания?
Для опроса МВА8 могу порекомендовать протокол ОВЕН, с ModBus у меня были проблемы. Следовательно или протокол ОВЕН для всех, или разносить по разным интерфейсам протоколы ОВЕН и ModBus. + можно сэкономить время передовая в модули вывода только изменения :-)
Лучше расскажите сколько и чего будет стоять на объекте и каковы требования по времени опроса модулей.
P. S. У меня на объектах нормально работает на протоколе ОВЕН (без библиотек) около 20-30 модулей МВА8, МВУ8, МДВВ (давно делалось).

amn
11.05.2013, 16:29
Лучше расскажите сколько и чего будет стоять на объекте и каковы требования по времени опроса модулей.


По предварительным подсчетам предполагается 1 ПЛК100, 4 МДВВ, 3 МВА8, 1 ПР110. Скорость опроса не критична, так как это проект системы отопления и водоснабжения.


есть одна библиотека modbus.lib, её кстати и Валенок правил

А ссылка на правленную версию есть?

capzap
11.05.2013, 16:33
А ссылка на правленную версию есть?

нет, бибка открытая, кто хочет сам её "затачивает" под себя

amn
11.05.2013, 17:49
Так она работает нормально? Без ошибок?

drvlas
11.05.2013, 18:10
Так она работает нормально? Без ошибок?
Да кто ж кроме Валенка тебе ответит по сути допиловки? Кинь ему в личку вопрос, вернется с шашлыков и, поковыриваясь зубочисткой, расскажет, что там к чему.
Сама библиотека да, должна быть рабочая. Я ее не юзал. Мож тут и представители ОВЕНа могли бы зубочистку выплюнуть и поведать. Так что дождись рабочего времени, не горячись. На шашлычек выберись покамест :)


По предварительным подсчетам предполагается 1 ПЛК100, 4 МДВВ, 3 МВА8, 1 ПР110. Скорость опроса не критична,
Ну, х.з., какие там в твоей системе будут процессы. На всякий случай поделюсь, сам недавно впервые запустил несколько слейвов на одной сопле: опрос-то происходит циклически по всему кругу. И на каждый запрос Мастер терпеливо ждет ответа от Слейва. А среди Слейвов разные бывают: МВ110, например, откликаются через 4-7 мс после окончания запроса от Мастера, а вот ИП320, при всем моем восхищении этим модулем, - аж через 50 и более. В результате ПЕРИОД опроса всех Слейвов получается уже сотни миллисекунд - вовсе не так быстро, как я думал. И это на скорости 38400, когда само время передачи сообщения уже не играет особой рояли...
Так что будь внимателен, можешь отдельно протестировать модули, которые собираешься ставить - и нарисовать себе картинку, как оно примерно будет. Чтобы не было "потом сюрприза" :)

Amko
11.05.2013, 18:23
Один мастер - 8 слейвов, и период опроса не критичен. Нафиг городить опрос через библиотеки?
Не мучайте себя, сделайте конфигуратором. Модулей мало, скорость пофиг, работать будет.

amn
11.05.2013, 21:52
drvlas, спасибо, что уделили внимание. Ваши посты приятно читать. У Вас талант правильно формулировать вопросы, делать выводы и доходчиво объяснять. А уважаемого Валенка подождем, думаю он и сам сюда заглянет.:)



Не мучайте себя, сделайте конфигуратором. Модулей мало, скорость пофиг, работать будет.

Amko, мне предстоит еще один проект, там уже скорость опроса имеет значение, поэтому на этом хотел потренироваться.:)


нет, бибка открытая, кто хочет сам её "затачивает" под себя

Capzap, хотел заглянуть вовнутрь Modbus.lib. Открываю ее в Кодесис как проект, пытаюсь открыть любой ФБ, пишет, что объект не может быть открыт, потому что вы не имеете какого-то доступа.

Вопрос: как посмотреть содержимое библиотеки?

С уважением, Михаил.

capzap
11.05.2013, 23:21
пишет, что объект не может быть открыт, потому что вы не имеете какого-то доступа

После тысячи сообщений на форуме получите доступ :D :D :D

amn
12.05.2013, 17:08
Молодец, Capzap! Вроде бы ответили, а вопрос остался.:D

drvlas
12.05.2013, 17:20
Молодец, Capzap! Спешит закрыть 4-ю тысячу. За это вообше - ПЛК начинают работать на удвоенной тактовой частоте :)

capzap
12.05.2013, 17:28
Молодец, Capzap! Вроде бы ответили, а вопрос остался.:D

ну держите, раз не хотите самостоятельно опыта набираться

rovki
12.05.2013, 17:29
Точно, а за 5тыщь -утраивается ,реально :D .

capzap
12.05.2013, 17:30
Спешит закрыть 4-ю тысячу. За это вообше - ПЛК начинают работать на удвоенной тактовой частоте :)

нет, техподдержка обещала безвозмездно забрать всё что поломал за это время

Алексеu
13.05.2013, 11:28
Всем доброго времени суток.
Подскажите пожалуйста, как данную конструкцию переложить на ST.
Спасибо.
ps А то у самого таймер.Q остается в TRUE.

kolyan
13.05.2013, 12:30
Всем доброго времени суток.
Подскажите пожалуйста, как данную конструкцию переложить на ST.
Спасибо.
ps А то у самого таймер.Q остается в TRUE.

Ну, как-то так:

TON1( IN:=(Nop and bi0_trig and bi1_trig), PT:=t#1s);

amn
13.05.2013, 17:26
ну держите, раз не хотите самостоятельно опыта набираться

Capzap, спасибо! Сам бы я к этому пришел бы как раз после 1000 сообщения на форуме.:)


Всем доброго времени суток.
Подскажите пожалуйста, как данную конструкцию переложить на ST.
Спасибо.
ps А то у самого таймер.Q остается в TRUE.

Мне кажется у вас сама конструкция неправильная. На входе таймера и на выходе одна и та же переменная. Если она на входе TRUE, то и на выходе она также будет TRUE и таймер тут уже роли не играет.

Вы напишите своими словами что хотите получить, так легче будет вам помочь. А то как спросили, так вам и ответили. Я уверен, что удовлетворения от полученного ответа вы не получили.

С уважением, Михаил.

melky
13.05.2013, 18:22
Не лады с RETAIN переменными.
написал библиотечку, если всю целиком ее определить как retain (поставил 6 штук) то КДС пишет, что съело 992 байта из 4 кб (ПЛК 100).
Переписал библиотечку так, что в ней всего 4 меременных retain, ставлю в проект, сами библиотеки уже не ввожу в retain переменные, по идее если FB использует в своем теле такие переменные, то и взять должна только их.
В библиотеке 4 переменных dword обозначены как retain, поставил 6 штук, должно бы скушаться 96 байт, а в итоге еще больше съело, уже 1 кб.

Как с этим бороться ?

svanekst
13.05.2013, 18:31
С таймером TP разобрался. Отдаю долг форуму - новичкам пригодится.
OUT1-OUT5 => Ресурсы.Конфигурация ПЛК.Discrete Outputs [FIX]

PROGRAM PLC_PRG
VAR
TP1:TP;
IN1: INT;
T: TIME := T#1s;
END_VAR

IF IN1=0 THEN
TP1(IN:=NOT TP1.Q,PT:=T,Q=>OUT1);
IF NOT TP1.Q THEN
IN1:=2;
END_IF
ELSIF IN1=1 THEN
TP1(IN:=NOT TP1.Q,PT:=T,Q=>OUT2);
IF NOT TP1.Q THEN
IN1:=3;
END_IF
ELSIF IN1=2 THEN
TP1(IN:=NOT TP1.Q,PT:=T,Q=>OUT3);
IF NOT TP1.Q THEN
IN1:=4;
END_IF
ELSIF IN1=3 THEN
TP1(IN:=NOT TP1.Q,PT:=T,Q=>OUT4);
IF NOT TP1.Q THEN
IN1:=0;
END_IF
ELSIF IN1=4 THEN
TP1(IN:=NOT TP1.Q,PT:=T,Q=>OUT5);
IF NOT TP1.Q THEN
IN1:=1;
END_IF
END_IF
Скриншот https://downloader.disk.yandex.ru/preview/a2ae6c65f09ae315466768db17004c85/mpfs/8zeEH6gV2HdK4iaon_S7iE0-DhOEHMoF_3JESKvq--Dur-1zHO0Ly0K2Jx1xCm9Imq7517GiKg6hYjLjXMPPkw%3D%3D?uid =0&filename=CASE_analog.jpg&disposition=inline&hash=&limit=0&content_type=image%2Fjpeg&size=XL&crop=0
Всем Спасибо за помощь.

amn
13.05.2013, 18:37
melky, а сколько экземпляров этих ФБ используете? Мне кажется надо умножить количество retain переменных на количество экземпляров ФБ, где они используются.

melky
13.05.2013, 18:50
amn, 6 экземпляров, в каждом по 4 dword переменных retain, в итоге 1006 байт вместо 96 байт.

Если же в библиотеке нет retain переменных а сами экземпляры кинуть в retain то съедалось 992 байта.
Вот такой вот парадокс странный.

YuriBel
13.05.2013, 18:57
Еще раз читаем внимательно.
"Замечания. Если хотя бы одна переменная функционального блока объявлена как RETAIN, то все данные экземпляров целиком помещаются в энергонезависимый сегмент."

Не может у ФБ быть части данных вне Retain области, если хотя бы одна переменная там находится.
"Или все сапоги на тумбочке, или все сапоги под тумбочкой".
Так что никаких чудес.

melky
13.05.2013, 19:04
YuriBel вот блин, а что теперь делать то ? как заставить вещи считаться и сохраняться, вводить дополнительные входы для FB чтобы он с RETAIN переменных брал значения и продолжал считать дальше ?

amn
13.05.2013, 19:16
Где-то попадались директивы, позволющие в ФБ исключить переменные из retain.
___

Ошибочка вышла, там речь шла о persistent.
{nonpersistent} исключение данных из persistent стр 150 из CoDeSys_V23_RU.pdf

YuriBel
13.05.2013, 19:29
вот блин, а что теперь делать то ?

Я конечно не настоящий сварщик, но мне пока сложно представить себе ситуацию, которая бы однозначно требовала помещения ФБ в ретэйн. сделайте переменные в ретэйн, прицепите их к входам и выходам ФБ и работайте с ними.

capzap
13.05.2013, 21:24
YuriBel вот блин, а что теперь делать то ? как заставить вещи считаться и сохраняться, вводить дополнительные входы для FB чтобы он с RETAIN переменных брал значения и продолжал считать дальше ?

Есть еще глобальные данные и указатели можно подать на вход блока

Алексеu
13.05.2013, 21:27
Да,забыл сказать-данная конструкция в ST должна работать в цикле
IF ...
ELSIF ...;
ELSIF ...;
TON1(IN:=(NoP AND bi0_trig) OR (NoP AND bi1_trig),PT:=T#1s);
END_IF;
поэтому, когда я делал так:

Ну, как-то так:

TON1( IN:=(Nop and bi0_trig and bi1_trig), PT:=t#1s);
то как раз после этого выход таймера и оставался в TRUE.

Мне кажется у вас сама конструкция неправильная. На входе таймера и на выходе одна и та же переменная. Если она на входе TRUE, то и на выходе она также будет TRUE и таймер тут уже роли не играет.
С уважением, Михаил.
Конструкция замечательно работает в CFC за счет буковки R:D , но совсем не хочет работать в ST(во всяком случае у меня)

Все-разобрался:).

melky
13.05.2013, 22:28
YuriBel так вот же, еще дополнитеьные входы будут необходимы.
Просто когда заметил, что при всем FB отъедается память не как в Owen Logic, удивился. Если бы прога предназначалась для ПЛК100, может и не парился бы, а так планировал ее на ПЛК63 запускать, а в доках прочел, что всего 448 байт под retain отводится и упс....

Переписал библиотеку с переносом параметров выхода в VAR_IN_OUT. В результате переменные, цепляющиеся на входы переносим в retain а саму библиотеку нет. Съело 937 байт.

Я не пойму, тут такая же дырка, как и с загрузкой библиотек в принципе ? при Компиляции CodeSys компилирует все библиотеки, вне зависимости, сколько поставленно в проект по факту ?
Сейчас начну вычищать лишние библы, чтобы проверить.

Так и есть, бл.... слов нет, целиком библиотеки подключать нельзя, или может быть можно и живьем в приборе реально будет заниматься меньше памяти.
Можно как-то контролировать сколько памяти реально использовано в ПЛК ?
Удалил все библиотеки из oscat кроме одной используемой, и получил честные 97 байт. (96 на переписанной библиотеке с 6-ью экземплярами и + 1 добавленная переменная)

melky
16.05.2013, 09:33
Вопрос по циклу программы - в КДС в онлайн режиме можно посмотреть реальное время выполнения цикла программы ?

Yegor
16.05.2013, 09:38
Засекундомерьте:
VAR
prevScanTime, delta: TIME;
END_VAR

delta := TIME() - prevScanTime;
prevScanTime := TIME();
1-2 мс с небольшой прогой на ПЛК110-60.

melky
16.05.2013, 09:40
Yegor то есть только программным костылем ? Какого-нить меню в самом КДС не предусмотрено чтобы посмотреть ?

capzap
16.05.2013, 09:48
Какого-нить меню в самом КДС не предусмотрено чтобы посмотреть ?

а в документации что пишется по поводу модуля статистики в конфигураторе?

melky
16.05.2013, 09:55
capzap вы про эту статистику из Информации о проекте ? или еще какую-то ?

Нажав кнопку ‘Статистика’ (Statistics), вы получите статистическую информацию о проекте. Она
включает число POU, типов данных, локальных и глобальных переменных.

capzap
16.05.2013, 09:56
а слово конфигуратор Вы прочитали в моем посте, это там же где и про модуль button

melky
16.05.2013, 10:08
capzap а, понял, спасибо. Поиграюсь с ним, чтобы разобраться.
Только если я правильно понял, информацию по нему надо в документации на ПЛК смотреть а не в доках по КДС.
А, нашел в доках по КДС.... буду разбираться.

capzap
16.05.2013, 10:12
Только если я правильно понял, информацию по нему надо в документации на ПЛК смотреть а не в доках по КДС.
Это кому как :)
http://www.owen.ru/catalog/51162335
последний пункт для скачивания

Grig CH
16.05.2013, 10:24
Всем добрый день.
Можно ли установить на компьютер клиента CodeSys HMI без установки
самой CodeSys?

Николаев Андрей
16.05.2013, 11:57
Можно.
Правда были разговоры, что надо поставить целиком весь комплект, а потом выборочно компоненты удалить, чтобы Gateway остался.

melky
16.05.2013, 11:57
Вопрос по Modbus. Если ошибаюсь поправьте. Проблема заключается в том, что в сети предполагается шлюз Modbus - SNMP, который может выступать как мастером так и слейвом, но мастером ему быть предпочтительнее, так как он будет мониторить оборудование с которым ПЛК будет работать постольку поскольку. ПЛК же будет собирать данные с датчиков, так же должен читать некоторые данные с указанного оборудования по modbus и передавать все это шлюзу. Либо шлюз будет забирать сам.

В случае, если ПЛК будет слейвом, он же не сможет читать данные с других слейвов в сети ? Или есть возможность читать и писать через порт при помощи Modbus.lib будучи слейвом ? (сижу вот с ней разбираюсь потихоньку)

Николаев Андрей
16.05.2013, 12:00
ModBus.lib только для RTU.
Для работы по Ethernet она не подойдет.
Так то и по какому интерфейсу должен быть мастером и слейвом. Я запутался...

melky
16.05.2013, 12:17
Николаев Андрей именно RTU и рассматривается.
шлюз Modbus RTU - SNMP предполагается делать мастером сети.
Сможет ли ПЛК, будучи слейвом читать данные с других слейв устройств через библиотеку Modbus.lib открыв порт или ПЛК в любом случае должен быть мастером ?
Да, скорее всего к ПЛК еще будут подключены модули ввода-вывода типа МК110 и другие с аналоговыми входами.

В общем как правильно будет построить сеть в данном случае ?
Шлюз так же может быть и слейвом, но предпочтительнее, если это возможно в такой связке, чтобы он был все-таки мастером.

Почему Modbus.lib только для RTU ? в документации по ней вроде и ASCII тоже участвует, или оно не так как надо работает ?

Шлюз, это дополнительное устройство в сети некой америкосовской фирмы. Необходим из-за системы диспетчеризации у заказчика. Они могут работать только по SNMP

YuriBel
16.05.2013, 15:13
Две простых вещи:
Если не хотите проблем, то мастер в сети должен быть один.
Без мастера в сети никакого обмена не будет.Слейвы между собой общаться не умеют.
Отсюда делайте выводы, какая будет сеть.

melky
16.05.2013, 16:20
YuriBel В примерах для ПЛК100 - запись INT и REAL сам ПЛК не обозначен ни как мастер ни как слейв. Только работа с библиотеками и портом.

Интересно то, что на com_num при запуске примера выдается красным *** INVALID: 0 ***

Все-таки необходимо назначать в конфигурации ПЛК, что он Мастер Modbus даже для данного примера ? И при этом так же в конфигураторе надо обозначать все слейвы ?
Реально рабочие примеры есть вообще, а то сложно что-то понять, когда что-то не так сделано.


Получилось управлять выходами МК110 при помощи Modbus.lib, при этом я не делал ПЛК ни мастером ни слейвом в конфигурации. Получается можно сделать ПЛК слейвом для другого мастера и при этом управлять другим слейвом. По идее, другого устройства под руками нет к сожалению.

petera
16.05.2013, 16:47
YuriBel В примерах для ПЛК100 - запись INT и REAL сам ПЛК не обозначен ни как мастер ни как слейв. Только работа с библиотеками и портом.

Интересно то, что на com_num при запуске примера выдается красным *** INVALID: 0 ***

Все-таки необходимо назначать в конфигурации ПЛК, что он Мастер Modbus даже для данного примера ? И при этом так же в конфигураторе надо обозначать все слейвы ?
Реально рабочие примеры есть вообще, а то сложно что-то понять, когда что-то не так сделано.


Получилось управлять выходами МК110 при помощи Modbus.lib, при этом я не делал ПЛК ни мастером ни слейвом в конфигурации. Получается можно сделать ПЛК слейвом для другого мастера и при этом управлять другим слейвом. По идее, другого устройства под руками нет к сожалению.
Ну так
Получилось управлять выходами МК110 при помощи Modbus.lib, при этом я не делал ПЛК ни мастером ни слейвом в конфигурациипри использовании библиотеки конфигурация и не нужна.
Т.к. у ПЛК два порта, то можно один использовать для мастера, а второй для слейва и программно обмениваться данными между ними.

YuriBel
16.05.2013, 16:55
Мухи отдельно, котлеты отдельно, в смысле конфигурация сама по себе, бублиотека сама по себе.
А вообще меня всегда удивляет упорное желание людей браться за сложные вещи, не попробовав делать простые.
Начинайте с простых вещей, если с ними не получается решить задачу в принципе, беритесь за сложные. С конфигурацией работать проще, чем с библиотекой, и поработав с ней, а заодно прочитав, как работает Модбас, можно понять, что и как нужно делать. И если на практике окажется, что не получается с конфигурацией добиться нужной скорости работы, то это повод браться за библиотеку, а если скорость приемлема, то можно все оставить на конфигурации.
И поверьте, сделать, пусть самый простой, пример самому иногда бывает намного полезнее, чем посмотреть чужой работоспособный. Набитые шишки - это на самом деле полезный багаж.

melky
16.05.2013, 17:02
petera На ПЛК100 вроде один порт 485, какой второй ?

YuriBel Через конфигурацию можно настроить Modbus устройства сторонних производителей ? Меня не интересуют устройства ОВЕН как таковые. Точнее то, что будет висеть из Овена и может быть настроено через конфигурацию, потребует однозначного определения ПЛК как мастера. Мне же мастером необходим Шлюз стороннего производителя. При этом мне необходимо получать от стороннего оборудования в ПЛК один или два параметра чтобы ими потом управлять с ПЛК.

YuriBel
16.05.2013, 17:32
Через конфигурацию ничего кроме самого контроллера настроить нельзя.
В контроллере через конфигурацию организовываются элементы Мастер и Слейв. Мастер имеет Права, Сдлейв имеет Обязанности. Слейв имеет адрес и некоторый набор битов и регистров и обязан по команде Мастера на чтение или запись этих битов и регистров выполнять требуемые действия. Мастер соответственно выдает запросы разным Слейвам и принимает от них ответы. Соответственно нужно один раз и навсегда понять, что в сети Модбас не может быть двух Мастеров. Потому что, если два Мастера одновременно отправят запрос на один и тот же Слейв, и один Мастер получит ответ, предназначавшийся другому Мастеру, то начнется БАРДАК. Поэтому вашу задачу нужно решать путем разделения на две сети - в одной ПЛК будет Мастером и будет опрашивать блоки (абсолютно все равно, Овеновские или нет, важно чтобы все они работали на одной версии модбас с одинаковыми настройками обмена), а по другой сети ПЛК будет Слейвом и будет отвечать на запросы Мастера, которым в этой сети будет тот самый шлюз. Все это скорее всего можно реализовать через конфигурацию, а можно, если очень хочется, через библиотеку. Но сначала нужно четко понять, что в одной сети одно устройство не может быть "чуть-чуть беременным", оно или Мастер или Cлейв. Поэтому я осмелюсь посоветовать разобраться сначала с отдельными блоками через конфигурацию, и только если там будут явные проблемы, браться за библиотеку.
А вообще было бы легче давать советы, понимая "масштаб бедствия". Сколько блоков, сколько у них регистров, насколько часто их нужно опрашивать, будет ли HMI панель, что на ней нужно отображать, и т.д.

capzap
16.05.2013, 17:32
petera На ПЛК100 вроде один порт 485, какой второй ?

YuriBel Через конфигурацию можно настроить Modbus устройства сторонних производителей ? Меня не интересуют устройства ОВЕН как таковые. Точнее то, что будет висеть из Овена и может быть настроено через конфигурацию, потребует однозначного определения ПЛК как мастера. Мне же мастером необходим Шлюз стороннего производителя. При этом мне необходимо получать от стороннего оборудования в ПЛК один или два параметра чтобы ими потом управлять с ПЛК.

:) жесть, чует мое сердце, еще долго будет молодой человек мозг всем тут рвать.
По библиотеке modbus.lib она написана только для мастера, подобной бибки для слейва в свободном доступе не существует. Сам протокол стандартный, поэтому его будут понимать все устройства поддерживающие его

melky
16.05.2013, 17:45
capzap ой буду :)
YuriBel панелей не будет в принципе. Блока нет в наличии, чтобы проверять. (имею ввиду Шлюз, 20 с лишним килорублей мне из своего кармана жалко) :)

Я собственно почему и пытаюсь научиться работать через библиотеку, а не через конфигуратор, потому что не знаю, что там и как. У меня просто нет этих данных и когда будут неизвестно.

melky
17.05.2013, 10:09
Неадекватное поведение элементов библиотеки Modbus.lib
MB_RD_COILS и MB_RD_HOLD_REGS.
Первый при опросе в цикле читает 0 (тут на Exeption 1), 8, 5 байт (параметр ByteCnt), второй 2, 8, 7

Почему при не меняющихся входных параметрах FB так себя ведет ? Ведь такого не должно быть...

amn
17.05.2013, 11:14
petera На ПЛК100 вроде один порт 485, какой второй ?

Из порта RS-232 можно сделать RS-485 через преобразователь интерфейсов АС3-М.

А как такой вариант: мастером управляем через библиотеку по одному интерфейсу, а слейв организуем на другом интерфейсе через конфигурацию. Будет работать?

capzap
17.05.2013, 11:29
Неадекватное поведение элементов библиотеки Modbus.lib
MB_RD_COILS и MB_RD_HOLD_REGS.
Первый при опросе в цикле читает 0 (тут на Exeption 1), 8, 5 байт (параметр ByteCnt), второй 2, 8, 7

Почему при не меняющихся входных параметрах FB так себя ведет ? Ведь такого не должно быть...

Читаем здесь в чем отличие коилсов от регистров http://ru.wikipedia.org/wiki/Modbus
либо формулируйте правильно вопрос

melky
17.05.2013, 12:07
capzap я говорю не об отличиях этих функций, а о том, что сами по себе функции упорно выполняют циклическую работу.
Выход Complete сообщает, что операция завершена (то есть произвели чтение), ByteCnt сообщает сколько байт прочел.
Так вот эти функции не выполняют однократную операцию, а работают почму-то циклом. Например чтение регистров читает 2 байта, потом 8 байт, потом 7 байт.

Вопрос - ПОЧЕМУ она себя так ведет?, ведь когда на входах мы прописали читать Адресс Х, начальный адрес (регист) Y, количество байт Z - должна прочитать один раз и заткнуться, ну либо читать каждый цикл НО ОДНО количество переменных, с одного адреса, с одного регистра (смещения), и строго одно указанное количество байт.

Нет ? или я опять что-то не понимаю ?

amn, думаю, что преобразователь дополнительный это уже будет крайней мерой.

capzap
17.05.2013, 12:14
capzap я говорю не об отличиях этих функций, а о том, что сами по себе функции упорно выполняют циклическую работу.
Выход Complete сообщает, что операция завершена (то есть произвели чтение), ByteCnt сообщает сколько байт прочел.
Так вот эти функции не выполняют однократную операцию, а работают почму-то циклом. Например чтение регистров читает 2 байта, потом 8 байт, потом 7 байт.
а слабо видео выложить о чем Вы тут толкуете, потому что я не понимаю такой ситуации

melky
17.05.2013, 12:41
Видео слабо, но скринами сейчас сделаю.

Три шага выполнения чтения регистров. На третьем шаге в ячейку [4] попадает состояние выходов МК110, потом прыгает еще и в ячейку [1] и на втором шаге, когда ByteCnt = 8 все убивается и так по кругу, если убрать r_trig и просто разрешить работу.

То есть не один раз какое-то значение получаем из МК а постоянно меняющиеся значения, одно из которых мое. я уже не говорю, что параметр Quantity = 1 и я его не меняю.

Либо в описалове на библиотеку что-то не рассказано, либо ее поведение полный неадекват.