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

capzap
20.03.2012, 15:05
5762 ЕСЛИ МОЖНО ТО ПЕРЕЧИСЛИТЕ ПОЖАЛУЙСТА СПИСОК ЛИТЕРАТУРЫ ПО ПРОРАММИРОВАНИЮ НА ST
:) я пользуюсь этим http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf

BEN
20.03.2012, 15:12
спасибо!!!

Валенок
20.03.2012, 16:58
А отключать как?
А не просили :)

SStas
26.03.2012, 17:33
Здравствуйте! Подскажите пожалуйста Модбас слейв TCP передает только десять переменных в сеть, в чем проблема, как увеличить их колличество? Может адреса регистров не могу словить? ПЛК100-24Р-М.

RV9WFJ
26.03.2012, 17:50
Здравствуйте! Подскажите пожалуйста Модбас слейв TCP передает только десять переменных в сеть, в чем проблема, как увеличить их колличество? Может адреса регистров не могу словить?Звучит примерно как "машина едет только 10 км/час как ехать быстрее?" Для начала написать что за машина и пробовали ли вы на газ надавить. Как-то так, а иначе вам никто не поможет.
Возможно действительно адреса поймать не можете, я работал с большим числом.

SStas
26.03.2012, 18:10
ПЛК 100 собирает данные по Овен RS485 с 12 ТРМ202 данные, обрабатывает их и в формате Byte и Word через Модбас Слейв TCP/IP передает их скаде Трейс Моуд, скада видит только десять первых регистров, остальные упорно игнорирует, пробовал разные адреса..., только десять первых переменных берет, вне зависимости Byte или Word, может я че не так конфигурирую?
Трейс Моуд читает адреса регистров в 0хFF формате.

sv.vasilev
27.03.2012, 06:50
как поменять время и дату в ПЛК 150?

RV9WFJ
27.03.2012, 07:34
в формате Byte и Word через Модбас Слейв TCP/IP передает их скаде Трейс Моуд, скада видит только десять первых регистровТрейс Моуд не демо? Попробуй сначала ModBus тестером, например таким: Terring ModBus Tools 3.1.0. Или проект в студию.
P.S. Формат адреса значения не имеет.

sv.vasilev
27.03.2012, 11:04
Подскажите, каким образом считать время в контроллере в формате дата [число, месяц, год] время [часы, минуты, секунды], т.е. считать из программы

Yegor
27.03.2012, 12:28
Воспользуйтесь функциональным блоком CurTimeEx из библиотеки SysLibTime.lib. Удобно делать с библиотекой SysLibMem.lib:
VAR
timedate: SystemTimeDate;
systime: SysTime64;
GetTime: CurTimeEx;
END_VAR

(* Предварительно обнуляем структуры, как того требует CurTimeEx *)
SysMemSet(ADR(systime), 0, SIZEOF(systime));
SysMemSet(ADR(timedate), 0, SIZEOF(timedate));

GetTime(SystemTime := systime, TimeDate := timedate);Имейте в виду: часы на овеновских ПЛК идут как пьяные. Они легко отстают на минуту за сутки и постоянно то ускоряются, то замедляются с периодичностью в 5-6 секунд. Если требуется равномерный источник времени для процесса, используйте функцию TIME().

SStas
27.03.2012, 14:48
Трейс Моуд не демо? Попробуй сначала ModBus тестером, например таким: Terring ModBus Tools 3.1.0. Или проект в студию.
P.S. Формат адреса значения не имеет.
Спасибо за ответ, все сделал, проблема оказалась в железе контроллера, пониженное напряжение +5 в, было 4,4в, исправил, все пошло по маслу.

sv.vasilev
28.03.2012, 07:23
Yegor, можете привести пример с использованием функции Time? т.к. требуется источник точного времени.

Yegor
28.03.2012, 07:38
TIME() выдаёт не календарное время, а время с момента запуска. Насколько я понимаю, это не то. Как бы там ни было, вот пример:
VAR
uptime: TIME;
END_VAR

uptime := TIME();Совмещением TIME() и CurTimeEx можно добиться равномерности также и календарного времени, но точности всё равно не будет, т.к. часы безнадёжно отстают и забегают во время простоя. Остаётся надеяться, что «овны» займутся этой проблемой.

capzap
28.03.2012, 11:10
TIME() выдаёт не календарное время, а время с момента запуска. Насколько я понимаю, это не то. Как бы там ни было, вот пример:
VAR
uptime: TIME;
END_VAR

uptime := TIME();Совмещением TIME() и CurTimeEx можно добиться равномерности также и календарного времени, но точности всё равно не будет, т.к. часы безнадёжно отстают и забегают во время простоя. Остаётся надеяться, что «овны» займутся этой проблемой.

Вот мне интересно у Вас такие проблемы и в пустом проекте и сколько стоит максимальное время цикла, а еще пробовали Вы воспользоваться многозадачностью и считать время в отдельной задаче с фиксированным периодом?

Yegor
28.03.2012, 12:28
и в пустом проектеДа.
максимальное время цикла1000.
пробовали Вы воспользоваться многозадачностью и считать время в отдельной задаче с фиксированным периодом?Попробовал 200, 500 и 1000. Сначала выглядит будто ок, но потом всё равно перепрыгивает. В общем, та же фигня.

Да и какое значение имеют условия исполнения, если при отключенном питании часы всё равно тупят? Я выключаю контроллер в 17:00 с синхронизированными по компу часами, а на утро к 8:00 обнаруживаю 30-секундное отставание. По праздникам и выходным больше минуты выходит. И в течение дня значительное отклонение набирается.

sv.vasilev
29.03.2012, 07:51
При использовании функц.блока CurTimeEx, обращение к времени происходит один раз, потом значения времени не меняются, в документации ничего вразумительного найти не нашел...

Если использовать

VAR
timedate: SystemTimeDate;
systime: SysTime64;
GetTime: CurTimeEx;
END_VAR

(* Предварительно обнуляем структуры, как того требует CurTimeEx *)
SysMemSet(ADR(systime), 0, SIZEOF(systime));
SysMemSet(ADR(timedate), 0, SIZEOF(timedate));

GetTime(SystemTime := systime, TimeDate := timedate);
то при компиляции выдает "вызвать можно только экземпляр функционального блока" ошибка 4267

Yegor
29.03.2012, 08:03
При использовании функц.блока CurTimeEx, обращение к времени происходит один раз, потом значения времени не меняются, в документации ничего вразумительного найти не нашел.Структуры надо обнулять прежде чем передавать их в CurTimeEx. Иначе вы не запрашиваете время, а устанавливаете его.
при компиляции выдает "вызвать можно только экземпляр функционального блока" ошибка 4267Специально скопировал и вставил прямо этот код — он компилируется и работает. Возможно, у вас там какой-то конфликт имён, например, уже существует функция GetTime. Можете показать свой проект, и мы разберёмся, в чём дело.

sv.vasilev
29.03.2012, 08:23
Yegor
вот проект 5795
в программе "vremi"
Спасибо заранее!

Yegor
29.03.2012, 11:07
Добавьте в проект SysLibMem.lib, о которой я говорил ранее, и уберите вот это:
SysMemSet: DATE;

sv.vasilev
29.03.2012, 13:02
SysLibMem.lib добавлена


SysMemSet: DATE; убрал,
при компиляции все равно надо указать индентификатор SysMemSet.
не получилось:(

Yegor
29.03.2012, 13:28
Функция SysMemSet содержится в библиотеке SysLibMem.lib. Добавлять вручную эту функцию (особенно в качестве переменной) не требуется. Вряд ли помогу чем-то ещё, т.к. у меня при удалении той строки и добавлении библиотеки ваш проект успешно компилируется.

asupsp700
29.03.2012, 15:34
Здравствуйте. Я в своем проекте измеряю частоту с помощью функции FREQ_MEASURE. Помогите советом, можно ли в этой функции увеличить количество периодов усреднения (вход PERIODS)а то по умолчанию 1-10 а мне нужно больше.
Заранее благодарю за любую помощь.
Дмитрий.

kol9n
30.03.2012, 00:21
Здравствуйте, помогите пожалуйста советом.
Какую скорость передачи по сити mudbus rtu выбрать? от чего зависит этот выбор, можно ли ставить максимальную?
почему на ип панели не устанавливается скорость 57600 б/с.
Заранее спс))

Валенок
30.03.2012, 19:14
Здравствуйте. Я в своем проекте измеряю частоту с помощью функции FREQ_MEASURE. Помогите советом, можно ли в этой функции увеличить количество периодов усреднения (вход PERIODS)а то по умолчанию 1-10 а мне нужно больше.
Заранее благодарю за любую помощь.
Дмитрий.
Исходник Util открыт. Можно изменить на любое значение.
А зачем усреднять ? Так скачет частота ?

Валенок
30.03.2012, 19:21
Здравствуйте, помогите пожалуйста советом.
Какую скорость передачи по сити mudbus rtu выбрать? от чего зависит этот выбор, можно ли ставить максимальную?
почему на ип панели не устанавливается скорость 57600 б/с.
Заранее спс))
Можно ставить любую. Зависит в основном от длины. До 20..30м - 115200и не парится. Если не устраивает кол-во ошибок - можно уменьшить скорость. Некоторые девайсы не совсем чисто работают на 115200.
С ИП - судьба.

kol9n
31.03.2012, 00:23
ок спс))) попробую прост получается как раз 20 - 30 м)))

asupsp700
31.03.2012, 08:12
Исходник Util открыт. Можно изменить на любое значение.
А зачем усреднять ? Так скачет частота ?
Спасибо за подсказку.
Частота действительно сильно скачет, так как я беру сигнал с индуктивного датчика на конвейерной ленте (колесо, которое вращается находясь на обратной ветви конвейера).

Yegor
02.04.2012, 14:24
Если нужно, чтобы работало, как работает, то нечего здесь упрощать. Разве что два таймера переписывать на один с селектором, но это ухудшение читаемости только будет.

vaniok2k8
02.04.2012, 19:04
Здравствуйте господа!
Простая программа(LD):

input_1
output_1
---||-------------------------------------------------------------------------------------()---
Imput_1 и Output_1 обозначил как глобальные переменные и указал адреса.

VAR_GLOBAL
input_1 AT %IX1.0.0: BOOL;
output_1 AT %QX1.0.0: BOOL;
END_VAR

При написании проекта использовал целевую платформу (target-файл) PLC110.60-L.
Какому DI и DQ на контроллере будут соответствовать данные адреса? И вообще как узнать соответствие адреса с входом/выходом на контроллере?

vaniok2k8
02.04.2012, 20:38
Прочтите в документации или в справке как именовать фиксированный канал и избавтесь от того что написали в глобальных переменных. Присвоите имя определенному DI или DO, и этим именем будете оперировать впрограмме и подобные вопросы отпадут

Т.е заходим в настройку ПЛК, выбираем DI, двойным щелчком мыши по входу и в появившемся окошке вводим название (Например Output_1), Output_1 становится системной переменной?

В инструкции указанно что DI1-DI4 - используются для высокочастотных счетчиков энкодеров и.т.д! Но не где нету такого:что DI5 у него системный адрес %IX1.0.0?Как определить такое соответствие?

vaniok2k8
02.04.2012, 20:40
Я так понимаю по порядку высчитывать! Т.е DI1 = %IX0.0.0, DI2 = %IX0.0.1...и.т.д! Правильно ли я понял?

vaniok2k8
02.04.2012, 22:09
... всем используемым входам и выходам присвоили имена и они в программе автоматически становятся глобальными, на кой Вам сдались эти AT %... ?

Я просто не знал что можно именовать входы и выходы таким образом...В вашем скрине есть + Fast discrete inputs[SLOT] и есть +Discrete inputs[FIX]. В чем отличие? Правильно ли я ввел соответствие портам на ПЛК (в миниатюре)?
У меня в документации написано что DI1 - DI4 используются в качестве высокоточных счетчиков, и энкодеров...в этом причина разделение входов на + Fast discrete inputs[SLOT] и +Discrete inputs[FIX]?

vaniok2k8
03.04.2012, 10:17
Ну теперь все ясно!Спасибо большое...

vaniok2k8
03.04.2012, 13:33
А при подключении ПЛК к компу через Rs 232, нужно создавать в "Настройках ПЛК" Universal network module... или Modbas()? И в каких случаях мы добавляем данные модули?

vlad72
05.04.2012, 02:19
Уважаемые форумчане! есть примеры на форуме с использованием
библиотеки SysLibTime, в которых предусмотрена коррекция времени
ПЛК. Т.е. синхронизацию с системным временем ПК.
Для визуала времени ПЛК воспользовались переменными из CurTimeEx
Для визуала времени с ПК строкой - %t%X %d/%m/%Y в конфигурировании элемента ...
Собственно задача- как или где снять время ПК для использования
в основной программе PLC_PRG.Ведь %X или %Y куда то обращаются за информацией для отображения в визуале,а как .где.,чем снять показания
для основной проги?
В "трендах" ведь отображается время ПК? а время ПЛК туда ...))))) никак..
Может чего пропустил,я не так давно ПЛК занимаюсь))

Сергей Мих
05.04.2012, 15:07
Уважаемые знатоки КОДЕСА, прошу поясните. Взял пример из описания библиотеки UNM. Есть строка << If SetByte(0,‘ATZ$N$R’,5) !=1 then... >>
Объясните плиз начинающему, для чего << ! >> ?

Сергей Мих
05.04.2012, 15:23
Спасибо, теперь понятно.

Сергей Мих
05.04.2012, 15:39
Тоесть строки << If SetByte(0,‘ATZ$N$R’,5) !=1 then... >> и << If SetByte(0,‘ATZ$N$R’,5) <>1 then... >> одинаковы?

kol9n
07.04.2012, 22:42
здравствуйте, может у кого было.... подключил устройства ввода/вывода к плк 150, через rs 485 (по mudbus rtu) все работает, сейчас на объекте идет отладка проекта, приезжаю через неделю и перезаливаю измененный проект, а связь по модбасу пропадает и не включается после перезапуска плк, с чем эт может быть связано? включается только случайно (у меня был не задействованный мдвв подключился к нему, а потом сеть опять заработала=))) странно....

и еще проблема с подключением датчика термосопротивление pt 100 настроил вроде правильно, подключил так два провода (+) в 10 клемме, и оставшийся (-) к 9 клемме, настройка и значение на скрине ниже


заранее спасибо

5831

Николаев Андрей
08.04.2012, 18:18
Надо разбираться.
Не меняли ли Вы тип контроллера, что в сетевом обмене вообще добавлено, и т.д.

Чем подробнее опишете - тем легче будет понять где затык.
Описание присылайте на support@owen.ru

kol9n
08.04.2012, 22:12
кину, а на счет настройки pt 100 не чего сказать не можете?

sv.vasilev
09.04.2012, 05:31
доброго времени суток.
Есть ли в CoDeSys функциональный блок для копирования массива в массив, т.е. есть массив значений за день (24 элемента) его необходимо целиком скопировать в 1-ю ячейку массива за месяц (30 элементов) ??

sv.vasilev
09.04.2012, 06:01
суть в том, чтобы скопировать массив значений среднего расхода за 1-й день в 1-й элемент массива (за месяц), и т.д. пока не кончится месяц.

sv.vasilev
09.04.2012, 10:38
есть массив x[1...24], который надо скопировать в массив y [1...24] поэлементно. В st можно организовать все через цикл, но может быть есть библиотечная функция, которой можно сделать данную операцию в одно действие.
как пользоваться SysLibCpy не понятно...

Yegor
09.04.2012, 12:14
SysMemCpy(ADR(y),ADR(x),24)Такое правильно будет работать только для однобайтовых типов. Более универсальный вариант:
SysMemCpy(ADR(y), ADR(x), MIN(SIZEOF(x), SIZEOF(y)))

sv.vasilev
09.04.2012, 13:50
capzap, Yegor спасибо, получилось!

Валенок
09.04.2012, 20:33
Фигня какая-то. Если

есть массив x[1...24], который надо скопировать в массив y [1...24]
и Xi и Yi одного типа, то просто :
Y := X;
Даже если Y двухмерный - Y[...,1..24]
Y[i]:=X;
если разного типа,то за исключением пар типа word/int/uint, манипуляция с sysmemcpy/move кинет просто мусор в Y, а "более универсальный вариант" просто застрахует от распространения мусора за пределы области Y и обращения к области за пределами X, и, часто, от зависания прям щас. Такая страховка с мin(sizeof1,sizeof2) для данного случая - как ношпа при апендиците. Лучше уж зависание прям щас на столе, чем в полях долго колупаться, выясняя почему проект как-то не так работает, и после долгих мучений обнаружить что в Y - мусор.

Yegor
10.04.2012, 06:02
Y := XНадо учиться со школьной программы заново :-D

sv.vasilev
11.04.2012, 05:13
Продалжаю марафон простых вопросов от новичков..)
Каким образом обнулить массив. Требуется, например, обнулить массив средних значений расхода за сутки в 00:00:00 часов?
Имеется ввиду функция, которая производит обнуление массива в одно действие.

Yegor
11.04.2012, 06:12
:-\
SysMemSet(ADR(X), 0, SIZEOF(X))

Валенок
11.04.2012, 10:51
Ну раз ждут :

X := Z; (* :) *)


VAR_CONST
Z : этот_же_тип;
END_VAR

Для таких задач памяти - как грязи.
PS
Некие люди как-то очень сильно переживали про отсутствие жесткого контроля типов под указателями.

Yegor
11.04.2012, 12:14
VAR_CONST
Z : этот_же_тип;
END_VARVAR CONSTANT наверное. Было бы элегантное решение если б только не...
Cannot convert 'ARRAY [0..10] OF INT' to 'ARRAY [0..11] OF INT'.
Некие люди как-то очень сильно переживали про отсутствие жесткого контроля типов под указателями.Ночами не сплю и ем плохо.

Валенок
11.04.2012, 13:29
Да и сonst не обязательно.
var
z,x : ..
end

x := z;

Просто не нужно писать в z

этот же тип ?

Cannot convert 'ARRAY [0..10] OF INT' to 'ARRAY [0..11] OF INT'.
А еще бывают синонимы типов :)

anatolys
11.04.2012, 14:28
подскажите пожалуйста, какой в ST синтаксис по части присвоения переменным Set/Reset ? надо по приходу одного сигнала ставить переменную в Set, а по приходу другого - в Reset.

Валенок
11.04.2012, 15:14
if пришел_один_сигнал then
переменная := Set;
end_if

if пришел_другой_сигнал then
эта_или_другая_переменная := Reset;
end_if

Во общем - как спросили.

anatolys
11.04.2012, 16:00
ну да, какой вопрос, такой и ответ. хорошо, переформулирую. согласно документации:

"Обмотки могут быть с "самофиксацией" типов SET и RESET. Обмотки типа SET обозначаются буквой "S" внутри круглых скобок (S). Если соответствующая этой обмотке переменная принимает значение ИСТИНА, то она навсегда (до сброса R) сохраняет его.
Обмотки типа RESET обозначаются буквой R. Если соответствующая переменная принимает значение ЛОЖЬ, то она навсегда (до установки S) сохраняет его."

как мне чему-то в ST сказать, что оно (S) или (R) ?

Yegor
11.04.2012, 17:36
Да и сonst не обязательно.
var
z,x : ..
end

x := z;

Просто не нужно писать в z

этот же тип ?Задумайтесь немного о читаемости. Чтобы понять, что это обнуление, вам придётся весь юнит разобрать.

Yegor
11.04.2012, 18:39
а если будет более понятное название peremennaja_dlja_obnulenijaperemennaja_dlja_obnule nija_massiva_razmerom_10_elementov_v_kotoruyu_nich ego_nelzya_zapisyvat

Нет, правда... Я осознаю корявость копирования через SysMemCpy по сравнению с естественным X := Y, но обнуление присваиванием нулевой неконстантной переменной это лечение зубов не через рот. Вот.

SBER
11.04.2012, 19:04
как мне чему-то в ST сказать, что оно (S) или (R) ?

переменная:=1 - SET
переменная:=0 - RESET

Наверное как то так:D

Валенок
11.04.2012, 19:58
лечение зубов не через рот. Вот.
:) :)
Егор, большинство число моих поу состоит из 5..20 строчек, c 5..10 переменными.Некий сброс чего-то там - стандартная ситуация c присвоением специального значения. И необязательно нуля. Поэтому лично я для не парения моска в таких случаях рядом объявляю переменную с префиксом z


PROGRAM Clock
VAR_OUTPUT
STD : SystemTimeDate;
END_VAR
VAR
zSTD : SystemTimeDate;
zST64,ST64 : SysTime64;
Get : CurTimeEx;
END_VAR
STD := zSTD;
ST64 := zST64;
Get( SystemTime := ST64, TimeDate := STD );



Чтобы понять, что это обнуление, вам придётся весь юнит разобрать.
Думаю что здесь комментариев не нужно, не говоря о разборе z..
Представьте что значение сброса для массива вордов - 12345. И придется циклы внедрять, т.е. код переделывать.
А константа - это подсказка компилятору о защите по записи, которую я, заметьте, лично сам установил

Я очень даже люблю указатели, все библиотечки на них, но работать с ними на ровном месте, по-моему, ни к чему.

Валенок
11.04.2012, 20:08
"Обмотки могут быть с "самофиксацией" типов SET и RESET
Забываем про обмотки и ищем в хелпе ФБ SR и RS, ну или разбираем работу пускателя :
мотор:=NOT кнопка_стоп AND ( мотор OR кнопка_пуск );

Aleksandr
11.04.2012, 22:52
Подскажите пожалуйста, как с помощью Modbus Master опросить (записать) старшие биты регистра другого контроллера используя конфигурацию (с младшими все понятно).

Валенок
11.04.2012, 23:02
Не колупаться с битами, а опросить целый регистр

Aleksandr
11.04.2012, 23:10
Не колупаться с битами, а опросить целый регистр
А как записать ?

Aleksandr
11.04.2012, 23:33
на уроках информатики должны были давать, что такое битовые операции :)
SHL, AND и OR к примеру
:)
Это все понятно!
как мне установить через конфигуратор 9 бит первого регистра в 1!

Валенок
12.04.2012, 00:20
Это все понятно!
как мне установить через конфигуратор 9 бит первого регистра в 1!
или так
первый_регистр.8 :=1;

Aleksandr
12.04.2012, 00:33
Да, но мне же придется записывать в др (slave) контроллер целый регистр, а какие там установлены биты, никто не знает...Хорошо предварительно их можно прочитать. Но за время передачи данных Они могут измениться. Например, при чтении седьмой бит=0, записываем в 9-ый ед-цу, пока идет передача в slave контроллер, там изменяется седьмой бит на1. А мы туда же пишем целый регистр с 0-м седьмым битом. как здесь быть???

Валенок
12.04.2012, 00:39
Думаете кучу бит прочитате/запишите быстрее регистра ?
Отправили туда 1 бит. Записался, пока идет ответ, он стал 0. А вы думаете что там 1. Тоже самое

Aleksandr
12.04.2012, 00:54
Думаете кучу бит прочитате/запишите быстрее регистра ?
Отправили туда 1 бит. Записался, пока идет ответ, он стал 0. А вы думаете что там 1. Тоже самое

Да нет, так уже пользуемся. не понятно почему используя конфигуратор и 8-bit output modul биты с 0 по 7 можно записать, а с 8 по 15 нет, с 16 по 23 опять можно; c24 по 31 снова нельзя...................

Валенок
12.04.2012, 01:02
Короче если у вас биты - RW, а частота изменений на слейве больше частоты опросов - ничего хорошего.
Если очень нужно старший байт в регистре побитно - ручками.
Все остальное - к авторам.

sv.vasilev
12.04.2012, 05:06
Документацию читаю постоянно:) Но таких вещей,которые пишите вы там не нахожу:( в частности про копирование (дано общее описание, без примеров), про считывание времени контроллера...может у меня не хватает какой то еще документации... Навыков и опыта программирования у меня, практически, ноль( Но спасибо, Вам за помощь. Понимаю, что спрашиваю очевидные для вас вещи..эх..

S.A.D.
12.04.2012, 11:56
прошу подсказку. ПЛК со статичным IP висит в интернете через ПМ01. Как к нему подключиться кодезисом? В ПДФ документе в соответствующем разделе описание от USB. Создание в параметрах связи TCP/IP подключения 2 уровня ничего не дает. Где еще что настроить надо?

sialiv
12.04.2012, 15:40
ПЛК 160. CoDeSys.
Нужен бит, который был бы установлен на время первого скана, при включении контроллера (подаче питания).
Существует ли такой системный бит? Если нет, то как его лучше сделать?

drvlas
12.04.2012, 15:50
как то странно построена архитектура устройств что регистр управления в слейве может менять кто то еще кроме мастера

В общем-то, +1. То есть, решать нужно концептуально - что откуда меняется. И каша с обращениями к одному регистру - это признак скорее неправильной организации.
Раздели его на 2 - один статусный, один управления. Как вариант.

Но к уважаемому capzap есть оговорка: можно так построить обмен, что в регистр управления мастер пишет бит-команду, а Слейв очищает этот бит, когда ее выполняет. Я так организовал у себя и нормально работает. Не нужно повторно по Модбасу записывать (сбрасывать) бит.

swerder
12.04.2012, 17:00
ПЛК 160. CoDeSys.
Нужен бит, который был бы установлен на время первого скана, при включении контроллера (подаче питания).
Существует ли такой системный бит? Если нет, то как его лучше сделать?

не совсем понятно, что вы подразумеваете под "первым сканом", но в конфигурации плк если добавить модуль статистика, там будет битовая переменная power, отображающая наличие питания контроллера

sialiv
12.04.2012, 17:38
В первом цикле выполнения программы обычно выставляется системный бит...

swerder
12.04.2012, 17:53
кажется тут такого нет, хотя взгляните на раздел "конфигурация задач" в справке, возможно появится способ самому сделать этот псевдосистемный бит из своей программы

Yegor
13.04.2012, 06:00
Нужен бит, который был бы установлен на время первого скана, при включении контроллера (подаче питания).
Существует ли такой системный бит? Если нет, то как его лучше сделать?Пфф...
VAR
firstScan: BOOL := TRUE;
END_VAR

(* Тело PLC_PRG *)

firstScan := FALSE;


(* Использование: IF PLC_PRG.firstScan THEN ... *)

drvlas
13.04.2012, 09:02
не совсем хорошо когда мастер только предполагает что нужная переменная сбросилась, в таком случае должна быть проверка чтением, а зачем читать, когда сразу можно и записать.
Ну почему. Вопрос в том, что по смыслу представляет собой та команда, которую Мастер дает записью в данный бит. У меня это команды, исполнение которых контролируется другими способами. И команда не подается второй раз, пока та проверка не произойдет. Поэтому проверять, сбросился ли бит в регистре управления - вовсе не надо.
Да и потом, как учит меня уважаемый Валенок, надо самому себе ответить: а кого я проверяю? Вот я и думаю. Прохождение команды по Модбасу - надо проверять? Нет, это делается иначе. Понимание команды Слейвом - ну, если уж принял, то поймет. Принятие команды к исполнениею: нет ли условий, которые могут позволить этому нахалу проигнорировать приказ? Да, это уже возможно. Вот это и проверяю. Но по другим регистрам. Все равно считаю, что установленный бит-команда "слизнулся" Слейвом. Он свою функцию выполнил.

Пример. Есть бит, приказывающий весоизмерительному АЦП взять тару: текущий вес записать и потом отнимать от всех последующих результатов. Мастер установил, а потом проверяет по ДРУГОМУ регистру статус. Если там нет ошибки ДИАПАЗОН ТАРЫ, то это означает, что операция выполнена. А если есть ошибка - ну, значит вес тары за пределами допустимого и тара не взята. А наш бит-приказ - он точно сброшен, что ж ему стоять...

Валенок
13.04.2012, 09:03
RW для мастера и слейва - это нормально. Чисто пример : изменение параметра в меню ПЛК63 локально, и полностью синхронно, но удаленно, на панели. О частоте изменений даже смешно говорить. Но даже тут если вдруг умудрятся ввести одновременно два разных значения - кто-то потеряет свое. Но, конечно же, сразу это увидит.
А если частота изменений быстрее самого обмена - тут вообще будет засада. Поэтому и лучше

решать .. концептуально - что откуда меняется. И каша с обращениями к одному регистру - это признак скорее неправильной организации.
И командное управление - битами и просто числом (это одно и тоже), когда мастер просто уверен что биты/число примут и обнулят - внешне RW для всех, но это и есть решение на уровне концепций. Т.е. мастер не пишет/читает, он только пишет, и всегда знает что там будет после записи.

PS
Опс. об этом сказали выше на минуту раньше

drvlas
13.04.2012, 10:19
Опс. об этом сказали выше на минуту раньшеВидишь, дорогой Учитель, я стараюсь!

"Если его долго бить, то толк выйдет. Бестолочь останется" :)

Очень хочется обобщить свое разумение организации обмена между Мастером и Слейвом. Ну, что вертится сейчас:

- классификация регистров обмена по способу записи-считывания - со сравнением применительно к разным задачам;
- типовые алгоритмы взаимодействия Масетр-Слейв ("тот сказал то, а тот ответил это, а тот ему вот то, и так далее")
- способы обеспечения надежности взаимодействия
- инициализация взаимодействия (процессы при перезапуске Мастера и/или Слейва)
- построение системы отработки аварийных ситуаций
...

К сожалению, разумения пока маловато.
А может уважаемые коллеги подскажут ссылочку на материалы в тему? Одно дело - формальное описание Модбаса, а совсем иное - статья опытного разработчика по практическим вопросам.

vaniok2k8
13.04.2012, 11:04
Какими минимальными требованиями должен обладать компьютер. что бы на него можно было поставить среду Codesys? И возможность управлять проектами?

Николаев Андрей
13.04.2012, 11:11
Особых требований нет. Если покупаете ПК сейчас - все будут работать.
Если ПК уже стоит, и боитесь, что будет слабоват - скачайте с нашего сайта или с сайта www.3s-software.com саму среду и попробуйте.

vaniok2k8
13.04.2012, 11:25
Мы собираемся покупать компьютер в цех и с помощью его, программы,и самого контроллера управлять производством...какой компьютер минимальный по требованиям нужно купить???

Николаев Андрей
13.04.2012, 11:39
Еще раз. Сейчас какой бы компьютер не купили - его хватит. Уже нет настолько слабых ПК, чтоб CoDeSys не потянуть.
НУ и они указаны в документации:
http://www.owen.ru/uploads/rp_plk110.160.pdf
Стр.8

kolyan
13.04.2012, 11:57
Пробовал в своё время ставить CoDeSys на компьютер с памятью 128МБайт и процессором 330 (или около этого) МГц, с интегрированной видеокартой.
Работало всё нормально)))).

vooodooo22
13.04.2012, 15:54
Добрый день.

Пара вопросов от новичка. Отрывок кода:

tiktak : TON;
i : INT;
Q_ : BOOL := TRUE;
start : BOOL := TRUE;
************************************************** ***********
tiktak ( IN := start, PT := T#17s);
i := TIME_TO_INT(tiktak.ET)/1000 MOD 17;

CASE i OF
1..8:
IF Q_ THEN
Prs (START := start); (*функциональный блок - типа бегущего огня с заданными интервалами времени*)
P1 := Prs.Var1;
P2 := Prs.Var2;
P3 := Prs.Var3;
P4 := Prs.Var4;

ELSE;
END_IF

9..16:
IF Q_ THEN
Prs (START := start);
P1 := Prs.Var1;
P2 := Prs.Var2;
P3 := Prs.Var3;
P4 := Prs.Var4;
ELSE;
END_IF

END_CASE

При i = 1..8 функциональный блок вполняется.
1) Подскажите пожалуйста, почему в момент, когда i = 9..16 следующее за ним условие не выполняется? Правильно ли построен код?
И если кто подскажет, как по проще организовать цикл данного в примере FB буду очень благодарен.

2) После присвоения start = FALSE и попытке запустить программу по новой (start = TRUE) перестает работать и первый функциональный блок при i=1...8.
Есть ли ошибка по этому поводу в данном коде?

Заранее спасибо

servo
13.04.2012, 16:40
Как можно остановить счет таймера TON если он уже начал отсчитывать время до включения? Заранее спасибо!

swerder
13.04.2012, 16:57
Как можно остановить счет таймера TON если он уже начал отсчитывать время до включения? Заранее спасибо!

подать на вход in значение false:confused:

swerder
13.04.2012, 17:14
vooodooo22 что-то определенно не так с вашим блоком, вот картина после одного цикла работы таймера, видно, что оба кода отработали

Валенок
13.04.2012, 17:25
..Подскажите пожалуйста, почему
1.Потому что никто кроме Вас не знает что и как делает Ваш Prs
2.Потому что никто кроме Вас не знает, есть ли еще желающие записать в Q_
3.Потому что i в первую секунду = 0
4.Зачем здесь case вообще ?

Правильно ли построен код?
Любой код построен правильно если он выполняет свою задачу.

как по проще организовать цикл данного в примере FB
Что надо в итоге ?

kol9n
15.04.2012, 01:19
здравствуйте, как можно ограничить значение числа формата риал после запятой, например оставить после запятой только два знака, заранее спс

Валенок
15.04.2012, 10:36
* 100, округлить, /100
А для чего если не секрет ?

kol9n
16.04.2012, 01:30
ну просто слишком много разрядов после запятой)))) особенно с датчиков температуры

kol9n
16.04.2012, 01:32
допустим число 27.1239999212, а после округления в в программе 27.12 просто интересно если стандартные функции округления я не нашел))

Валенок
16.04.2012, 02:02
Визуализация - округляет по формату
Экран 63/73 - тоже. см.соотв.функции
Панели - округляют

Так на фик надо ?

vooodooo22
16.04.2012, 09:14
Что надо в итоге ?

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

Функциональный блок(CFC) выполняет включение/выключение лампочек поочередно, он состоит из таймеров.
С циклами FOR, WHILE, REPEAT как то не ладится (цикл запускает блок, но мгновенно приходит к концу, пока как блок еще работает в первом цикле), поэтому попробовал CASE, но и этот оператор, как выяснилось, тут не помошник, т.к. включает условие лишь при выполнении равенства значений, в следствии чего актвиация лампочек происходит, но по времени сбивается.

Валенок
16.04.2012, 11:35
лампочек 4 ?

VAR
M:byte:=17;
T:ton;


T(IN:=not T.Q, PT := T#2s);
M:=SEL(T.Q,M,ROL(M,1));
Do1:=M.0;
Do2:=M.1;
Do3:=M.2;
Do4:=M.3;

PS
Первые две стоки в одну - непредлагаю :)

vooodooo22
16.04.2012, 13:19
лампочек 4 ?

я бы сказал блоков (допустим) 4, в итоге если блок длится 8 секунд, то у таймера T время PT:=T#8s; (как-то так)



T(IN:=not T.Q, PT := T#2s);


Как сделать, чтобы таймер включался/выключался в нужный момент, но при этом не потерял свою цикличность? :)

swerder
16.04.2012, 14:48
вам нужен таймер с паузой
смотрите пост #7 (http://www.owen.ru/forum/showthread.php?t=7077)

vooodooo22
16.04.2012, 15:36
вам нужен таймер с паузой
смотрите пост #7 (http://www.owen.ru/forum/showthread.php?t=7077)

извиняюсь не заметил) спасибо! здорово! чудеса да и только =)

Дмитрий ENGMIR
18.04.2012, 18:23
Помогите разобраться с модемом;
Есть основа- плк 150, ПМ 01 и ультразвуковой датчик;
со всей дискреткой разобрался, все работает; проблема с модемом:
делал на основе примера приведенного в докум. к ПМ01
задача отправлять смс на 3 уровня,
модем отправляет одну смс и все, потом начинаю сначала -он молчит
перегружаю - не помогает.
Подскажите пожалуйста. Может есть пример на CFC или LD

SanyaCF
23.04.2012, 13:02
Здравствуйте. Подскажите, мне нужно зафиксировать время срабатывания дискретного входа ПЛК110, сохранить его в энергонезависимую память и отобразить на панели СП270.

swerder
23.04.2012, 14:43
так что подсказать то?

vooodooo22
23.04.2012, 15:50
Доброго всем времени суток:)
Столкнулся с таким вопросом.
Нужно увеличить скорость работы программы "пример" с временными интервалами в таймерах в среднем 1000мс(плюс/минус).Уменьшаю временные интервалы с 1000 мс до 100 мс,
т.е. у каждой цифры отнимаю по нулю. В итоге система перестает работать.
Вопрос: система вообще перестает работать или просто визуально не дает проследить за ее работой?
И как можно проследить за данными летящими с такой скоростью?:confused:

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

В идеале нужно будет работать с временными интервалами в 20 мс, как быть:(

rovki
23.04.2012, 16:33
:D Данные ,летящие с такой скоростью превращаются из фото в кино или в лампу которая вроде горит постоянно,а на самом деле мигает с частотой 50гц.

vooodooo22
23.04.2012, 17:24
:D Данные ,летящие с такой скоростью превращаются из фото в кино или в лампу которая вроде горит постоянно,а на самом деле мигает с частотой 50гц.

так и есть:) , в итоге часть программы ПЛК будет управлять симистором

RV9WFJ
24.04.2012, 07:25
Или ШИМ используйте или не подойдет вам ПЛК.

vooodooo22
24.04.2012, 09:27
И все таки заработала программка после корректировки интервалов времени, отключения антивирусника и прочих ненужных программ, которые грузили систему (комп слабоват). В итоге при интервалах 100мс программка адекватно работает, но при переходе на еще меньшие интервалы до 20 мс - ступор:) Есть аналогичная программка, в которой счет каждый таймер берет с одной точки (она работает и при 10 мс(!)), а в данном "примере" счет каждый таймер берет от предыдущего таймера, вот и происходит потеря информации видать.

Придется наверно всетаки ШИМ (http://www.owen.ru/forum/showthread.php?t=11469) использовать

vooodooo22
24.04.2012, 16:13
Подскажите пожалуйста, в ПЛК 110-32 К М количество обычных дискретных выходов составляет 10 по паспорту, а в PLC-Configuration таргет-файла PLC110_32 визуально указано 16 (8 и 8), но в комментах отмечено 10 (8 и 2). Как узнать во второй группе какие рабочие 2 выхода из 8-ми? Скрин прилагается. Простите если туплю :o

SanyaCF
24.04.2012, 16:29
Здравствуйте. Подскажите, мне нужно зафиксировать время срабатывания дискретного входа ПЛК110, сохранить его в энергонезависимую память и отобразить на панели СП270.

Конкретнее интересует каким образом записать время в память контролера.

Николаев Андрей
24.04.2012, 16:46
Подскажите пожалуйста, в ПЛК 110-32 К М количество обычных дискретных выходов составляет 10 по паспорту, а в PLC-Configuration таргет-файла PLC110_32 визуально указано 16 (8 и 8), но в комментах отмечено 10 (8 и 2). Как узнать во второй группе какие рабочие 2 выхода из 8-ми? Скрин прилагается. Простите если туплю :o
Вы забыли про быстрые выходы.

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

SanyaCF
24.04.2012, 17:09
Мне нужно зафиксировать время срабатывания дискретного входа, для ведения журнала событий. Извините за некорректность вопросов :) я только начинаю разбираться в программировании

Aleksys
24.04.2012, 17:23
Здравствуйте, помогите пожалуйста разобраться.:confused:
Есть ПЛК100-220.РМ, GSM модем ПМ01-24.АВ, кабель К7, не хватает пока что
мозгов как все это настроить и сконфигурировать например для отправки SMS при срабатывании первого входа. Заранее благодарен!

swerder
24.04.2012, 17:57
Aleksys, тут примеры, выбирайте (http://www.owen.ru/forum/showthread.php?t=11277)

SanyaCF диск плк, файл PLC_Configuration_OWEN.pdf, стр.62 модуль архиватор

Aleksys
25.04.2012, 05:30
Спасибо большое за ответ!

vooodooo22
26.04.2012, 12:44
подскажите пожалуйста, корректно ли указывать в Global_Variables прямой адрес входных/выходных переменных, например
out AT %QX2.1 :BOOL;
т.е. имею ввиду будут ли переменные присваиваться к входам/выходам при объявлении их в Global_Variables или для их присваивания к вх/вых они должны указываться только в Variable_Configuration?

swerder
26.04.2012, 13:15
vooodooo22, корректно, сам всегда так делаю, более того, с прямыми адресами переменные можно объявлять даже просто в разделах VAR программ либо вообще пользоваться прямыми адресами вместо переменных

vooodooo22
26.04.2012, 13:35
Спасибо! ;)

Aleksys
26.04.2012, 14:04
Подскажите пожалуйста как конфигурируется модем ПМ-01 в проекте CodeSys для отправки сообщений?
ПМ-01 соединен кабелем К7 с портом RS232 ПЛК 100, заранее благодарен!

vaniok2k8
26.04.2012, 19:35
здравствуйте господа!
Написал проект на языке LD (управление 10-ю конвейерами), ну и визуализацию к нему! как сделать так что бы работники цеха, включая компьютер и запуская проект, могли только видеть визуализацию и управлять конвейерами и не имели доступ к коду? И обязательно для управления проектом запускать Codesys?Какие есть решения? Заранее спасибо!

vooodooo22
27.04.2012, 13:31
Доброго всем времени суток.
Подскажите пожалуйста добрые люди как реализовать с дискретных входов регулировку скважности ШИМа? О ШИМ знаю очень мало. Может есть где статейка именно о реализации регулировки скважности ШИМа на ПЛК?

Заранее благодарен :)

MoZart
27.04.2012, 17:58
Добрый день.
При при запуске должно вызываться событие On_Start.
Написал POU On_Start. При компиляции выдаётся предупреждение 2501:A callback function is not allowed to contain local variables.
Что это такое, почему выскакивает и как её обойти?
Вот код POU:
раздел декларирования


PROGRAM On_START
VAR
fAD, fSize, fileadr : DWORD;
Important_Variables : ARRAY[1..38] OF STRING[10];

END_VAR

раздел реализации


(*--------Загружаем важные переменные из файла-------------*)

fAD:=ADR(Important_Variables);
fSize:=SIZEOF(Important_Variables);
fileadr:=SysFileOpen('I_V.txt','w');
SysFileRead(fileadr,fAD,fSize);
SysFileClose(fileadr);

N14_NKUM := STRING_TO_UDINT(Important_Variables[1]);
N15_NKUM := STRING_TO_UDINT(Important_Variables[2]);
N16_NKUM := STRING_TO_UDINT(Important_Variables[3]);
N17_NKUM := STRING_TO_UDINT(Important_Variables[4]);
N18_NKUM := STRING_TO_UDINT(Important_Variables[5]);
N18a_NKUM := STRING_TO_UDINT(Important_Variables[6]);
N19_NKUM := STRING_TO_UDINT(Important_Variables[7]);
N20_NKUM := STRING_TO_UDINT(Important_Variables[8]);
N21_NKUM := STRING_TO_UDINT(Important_Variables[9]);
N22_NKUM := STRING_TO_UDINT(Important_Variables[10]);
N14_QC1 := STRING_TO_UDINT(Important_Variables[11]);
N15_QC1 := STRING_TO_UDINT(Important_Variables[12]);
N16_QC1 := STRING_TO_UDINT(Important_Variables[13]);
N17_QC1 := STRING_TO_UDINT(Important_Variables[14]);
N18_QC1 := STRING_TO_UDINT(Important_Variables[15]);
N18a_QC1 := STRING_TO_UDINT(Important_Variables[16]);
N19_QC1 := STRING_TO_UDINT(Important_Variables[17]);
N20_QC1 := STRING_TO_UDINT(Important_Variables[18]);
N21_QC1 := STRING_TO_UDINT(Important_Variables[19]);
N22_QC1 := STRING_TO_UDINT(Important_Variables[20]);
N1_NKUM := STRING_TO_UDINT(Important_Variables[21]);
N2_NKUM := STRING_TO_UDINT(Important_Variables[22]);
N3_NKUM := STRING_TO_UDINT(Important_Variables[23]);
N4_NKUM := STRING_TO_UDINT(Important_Variables[24]);
Drenazh_NKUM := STRING_TO_UDINT(Important_Variables[25]);
N14_PrevCount := STRING_TO_WORD(Important_Variables[26]);
N15_PrevCount := STRING_TO_WORD(Important_Variables[27]);
N16_PrevCount := STRING_TO_WORD(Important_Variables[28]);
N17_PrevCount := STRING_TO_WORD(Important_Variables[29]);
N18_PrevCount := STRING_TO_WORD(Important_Variables[30]);
N19_PrevCount := STRING_TO_WORD(Important_Variables[31]);
N20_PrevCount := STRING_TO_WORD(Important_Variables[32]);
N21_PrevCount := STRING_TO_WORD(Important_Variables[33]);
N22_PrevCount := STRING_TO_WORD(Important_Variables[34]);
LT001_LHHC := STRING_TO_WORD(Important_Variables[35]);
LT001_LHC := STRING_TO_WORD(Important_Variables[36]);
LT001_LLC := STRING_TO_WORD(Important_Variables[37]);
LT001_LLLC := STRING_TO_WORD(Important_Variables[38]);

Помогите, пожалуйста, разобраться.

sleyer
28.04.2012, 09:53
Объясните пожалуйста:
Перед началом цикла значение out1 = FALSE;
В конце цикла out1 = TRUE
Когда выполняется последнее условие выхода и цикл переходит к блоку Init значение out1 = FALSE.
И так со всеми выходами типа BOOL, если перед выполнением в Init значение FALSE, то чтобы внутри цикла не происходило и какие значения перед последним условием выхода не были в блоке Init опять FALSE.
Так и должно быть?
C аналоговыми выходами все нормально. При начале цикла - 0, перед выходом - 10, при возврате на Init - 10.

MoZart
28.04.2012, 10:59
STRING(10)
И что это значит???
Можно поподробнее для чайников?

skr1251
28.04.2012, 23:53
Добрый день. Подскажите пожалуйста как в LD правильно управлять выходами МДВВ. если можно на конкретном примере. За ранее спасибо.

drvlas
30.04.2012, 00:22
Скажите пожалуйста, как подключить ПЛК100 к компу не напрямую к Етернет-порту, а через рутер?
Имеется в виду подключение для работы с КоДеСис.

Я так понимаю, что нужно изменить параметры связи в настройках КДС. Но не знаю, как именно.

Спасибо!

UPD: Разобрался. Подключил.

Aleksys
01.05.2012, 06:35
Подскажите кабель КС7 подходит для работы в связке ПЛК100(порт RS232) и модем ПМ-1(разъем Х2), или он только для связи ПМ-1 с ПК. Спасибо!

B0BAKA
01.05.2012, 15:59
Здравствуйте!
Имеется ПЛК150-А-L, какой минимум по содержимому проекта необходим для его успешной компиляции (Login)?
В видеоуроках показано как логинится пустой проект с ПЛК100, с ПЛК150 же не получается, выдает ошибку "The project must be correct for login".

vooodooo22
02.05.2012, 12:24
Добрый день.
Возник такого рода небольшой вопрос: возможно ли импортировать (подключить) в проект данные таблицы MS Excel для их использования в массиве?

vooodooo22
02.05.2012, 13:52
можно, MS Excel имеет возможность сохранять в формате csv, а его в свою очередь легко парсить в любом языке программирования, включая и ПЛК-шные языки

Мелоч, а приятно:) Спасибо;)

vooodooo22
04.05.2012, 13:23
Хотелось бы уточнить один вопрос.
Нам нужно по RS485 в управляющую программу ПЛК присвоить переменной (допустим) "i:INT:=1" значение "i:=2", можем ли мы в таком случае использовать OPC-server и по средством программы "Matrikon OPC Explorer" производить эти монипуляции (исключая использование протокола Modbus или OWEN конкретно в данном случае)? Изучение протоколов идет очень тяжко в связи с отсутствием базовых знаний по сетям =(
Провел эксперимент локально (localhost) по примеру статьи "Запускаем OPC сервер CDS V2.3"(представленной ПК ПРОЛОГ на сайте codesys.ru) используя таргет "CoDeSys SP PLCWinNT 2.4": все работает как надо. Вопрос именно в том, будет ли это работать с RS485?

ps.Еще раз прошу прощения за категорию глупых вопросов, но как говорится «Самый глупый вопрос тот, который не прозвучал»:)

YuriBel
04.05.2012, 15:32
Мне кажется, что удобнее будет использовать бесплатные Мастер-СКАДА и МастерOPC на 32 точки. Там все можно сделать еще и достаточно наглядным.

vooodooo22
04.05.2012, 15:47
Мне кажется, что удобнее будет использовать бесплатные Мастер-СКАДА и МастерOPC на 32 точки. Там все можно сделать еще и достаточно наглядным.

Спасибо! Попробую копнуть в этом направлении;)

Копнул...
"MasterSCADA RT32 - бесплатная SCADA: ... Поддерживает OPC HDA клиент. Другие дополнительные модули и опции не поддерживаются и отдельно не поставляются" - не подскажите что здесь имеют ввиду под словами "модули и опции"?:o
"IEC61850-OPC-32 ...Пробная полнофункциональная версия на 32 тега." - это и есть МастерOPC?:)
Сможет ли заменить OPC-server Codesys в этой связке МастерOPC на 32 точки?

YuriBel
04.05.2012, 16:50
В Мастер-СКАДА существует некоторое количество дополнительных модулей, позволяющих расширить функциональность, например СМС оповещения, связь с базами данных и т.д. Все это будет невозможно подключить к бесплатной версии. Но оно вам скорее всего и не понадобится. МастерOPC - это modbus OPCсервер, то есть ровно то, что вам нужно. Настоятельно рекомендую не тратя (конкретно сейчас)времени на вопрсы зарегистрироваться на сайте Инсата, скачать и установить эти два продукта и поиграться с ними, посмотрев в том числе и видеоинструкции, которые есть на сайте. Думаю, что почти все вопросы отпадут (весьма вероятно, что появятся новые, аппетит растет во время еды).
Соответственно, если настройка переменных в контроллере для обмена по modbus для вас не составляет проблем, то всё должно получиться.
В этом случае наличие CODESYS на компьютере, который будет работать в связке с контроллером на объекте совсем не обязательно.

vooodooo22
04.05.2012, 17:19
...Настоятельно рекомендую не тратя (конкретно сейчас)времени на вопрсы зарегистрироваться на сайте Инсата...

Уже;)

Спасибо большое еще раз!

B0BAKA
04.05.2012, 22:37
capzap, действительно, точки с запятой хватило.
А еще вопрос, чтобы обращаться к дискретному входу-выходу, достаточно ли задать ему имя переменной?
Например, я задал имя дискретному выходу test1 в PLC Configuration, описал его как BOOL-переменную.
В теле программы присваиваю значение TRUE.
После этого плк не реагирует на программу.
В то же время, при нажатии в PLC Configuration на любом из выходов (в оффлайн режиме), у плк загорается индикатор.
Может проблема в Class-е переменной? Я выбирал VAR.

Казаков Сергей
05.05.2012, 14:19
Здравствуйте! не поможете как задовать с плк в ип320 биты?

YuriBel
05.05.2012, 15:02
Вы объясните попонятнее, что менно, где именно, и откуда именно хотите задавать, а то не очень понятно, что такое биты в панели.

Казаков Сергей
10.05.2012, 08:53
как их определить в плк конфигураторе?

Казаков Сергей
10.05.2012, 09:27
я это сделал а вот как бит определить для ип 320?

YuriBel
10.05.2012, 12:43
Если в конфигурации ПЛК есть необходимый модуль слейв и в нем есть элемент 8bit, и один из этих бит предполагается использовать в качестве ну например, индикатора, то нужно сначала высчитать ПОБИТОВЫЙ адрес этого регистра в модуле слейв с учетом выравнивания, о чем я собственно и писал раньше. Затем этот адрес нужно указать в настройках индикатора конфигураторе панели.
Ну например, если элемент 8bit в модуле слейв стоит на самом верху, то адреса его битов будут с 0 до 7, соответственно и в конфигураторе панели нужно задать один из этих адресов, например 0х0
Посмотрите вот этот пример, сваял по-быстрому, но попробовать сейчас не на чем.

vooodooo22
10.05.2012, 14:29
Добрый день.

Помогите пожалуйста с условием в программе "Счетчик"(прилагается) на SFC в блоке "MIG" для возврата к первому блоку.

Программа должна позволить оператору по нажатию кнопки (зацепленной к DI) задавать нужные параметры в станке (например: параметры под №1, №2 и т.д.), причем на выходе (DQ) лампочка будет оповещать о номере выбранных параметров (например: 1 мигание - параметры под №1, 2 мигания - параметры под №2 и т.д.)

Если можно организовать это как-то проще буду только рад лицезреть ;)

swerder
10.05.2012, 15:03
как вы с помощью t_bNP выбираете номер подпрограммы? counter обнулять совсем не надо?
условием можете использовать f_trig со входом MIG_TP_b2.Q
p.s. что-то оно у вас не очень продумано. один раз нажали - выбралась первая подпрограмма, нажали еще раз - выбралась вторая прога. а если нажали еще раз? и как выбрать после второй снова первую?
p.p.s. имхо логика кривоватая

swerder
10.05.2012, 15:16
для случая с одной кнопкой и одной лампочкой мне припоминается логика программирования таблеток от к***та - длительное нажатие кнопки - вход в режим конфигурирования, далее выбор режима несколькими нажатиями кнопки без длительных перерывов, длительный перерыв в нажатиях ведет к запоминанию номера режима по количеству нажатий. реализуется все на таймерах.

vooodooo22
10.05.2012, 16:38
как вы с помощью t_bNP выбираете номер подпрограммы?
Эта часть программы будет прицеплена к основной, в которой в зависимости от counter=1 или 2 и т.д. будут подставляться данные из массива в параметры. А t_bNP - это всего лишь кнопка (прошу прощения, в программе коммент более подробно надо было описать), которая по единому нажатию производит 1 цикл программы


counter обнулять совсем не надо?
надобы =) просто вопрос встал, как задать условие на 2 цикле, когда counter = 2, а там и можно обнулить:)



условием можете использовать f_trig со входом MIG_TP_b2.Q
спасибо, попробую ;)


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

зациклить думаю. Допустим, после 4ой будет следующая - 1ая

на счет кривоватости - не спорю:D практики нет



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

интересный пример

Flicker
10.05.2012, 21:35
Здравствуйте, подскажите назначение реальных входов и выходов в окне переменных происходить автоматически или нужно вручную прописывать входы к контактам(QI) и катушки к выходам(QX) ПЛК?

ssl
11.05.2012, 03:36
Добрый день, помогите разобраться, не могу наладить связь RS-485 между ПЛК-160 и панелью Weitek, панель выдает ошибку - нет ответа контроллера подскажите в какую сторону рыть, возможных причин масса, подскажите очевидные, кто уже работал с этой панелью

ssl
11.05.2012, 04:31
может быть у кого нибудь есть пример настройки rs-485 на панели, буду очень благодарен

Yegor
11.05.2012, 06:13
Здравствуйте, подскажите назначение реальных входов и выходов в окне переменных происходить автоматически или нужно вручную прописывать входы к контактам(QI) и катушки к выходам(QX) ПЛК?Для создания привязанных к выводам переменных пользуйтесь конфигуратором ПЛК.

http://images.devs-on.net/Image/o7DyxqGGK7geDWmU-CoDeSysSilenaCo.png

vooodooo22
11.05.2012, 09:01
условием можете использовать f_trig со входом MIG_TP_b2.Q

попробовал, все четко! еще раз хотелось поблагодарить за подсказку, спасибо большое! :)

ps. Нет на форуме кнопки благодарности конкретному человеку, это прискорбно

swerder
11.05.2012, 10:27
vooodooo22 ничего страшного, рад помочь
ssl попробуйте вместо простого MODBUS RTU драйвера использовать MODBUS RTU (zero-based addressing) драйвер, полагаю т.к. у вас в конфигурации плк добавлен всего 1 регистр, для ПЛК ОВЕН он имеет адрес 0, а панель обращается к адресу 1

ssl
11.05.2012, 11:03
пробовал и Modbus RTU и Zero-baised никакой реакции, мне бы один работающий пример и был бы счастлив!

B0BAKA
11.05.2012, 13:03
Возник вопрос, чем отличается Tcp/Ip (Level 2 Route) от обычного Tcp/Ip (Level 2)?

Казаков Сергей
11.05.2012, 14:06
[QUOTE=YuriBel;82708]Если в конфигурации ПЛК есть необходимый модуль слейв и в нем есть элемент 8bit, и один из этих бит предполагается использовать в качестве ну например, индикатора, то нужно сначала высчитать ПОБИТОВЫЙ адрес этого регистра в модуле слейв с учетом выравнивания, о чем я собственно и писал раньше. Затем этот адрес нужно указать в настройках индикатора конфигураторе панели.
Ну например, если элемент 8bit в модуле слейв стоит на самом верху, то адреса его битов будут с 0 до 7, соответственно и в конфигураторе панели нужно задать один из этих адресов, например 0х0
Посмотрите вот этот пример, сваял по-быстрому, но попробовать сейчас не на чем.
А если у меня элимент 2byta то как биты определить???

Казаков Сергей
11.05.2012, 14:36
а ставить любой что ли??

vooodooo22
11.05.2012, 16:23
Подскажите новичку.

Вход ID - кнопка, выход QD - лампа. Любой язык МЭК. Кнопку жмем 2 раза. Как сделать так, чтобы лампа зажглась только после второго нажатия на кнопку?

пардон... вроде нашел..."Функциональный блок 'декрементный счетчик' " - CTU :)


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

уважаемый swerder, не могли бы Вы подсказать, где можно подсмотреть этот пример? Гугл результатов не дал:o

swerder
11.05.2012, 16:47
vooodooo22
т.к. описание поверхностное, то и код выполняет только зажигание лампы


var
iButton at %ix0.0.0 : bool;
oLamp at %qx1.0 : bool;
ctu_ : ctu;
end_var

ctu_(CU := iButton, RESET := FALSE, PV := 2);
oLamp := ctu_.Q ;


про пример - не знаю, таблетку в руках держал, настраивал.

vooodooo22
11.05.2012, 16:50
vooodooo22
т.к. описание поверхностное, то и код выполняет только зажигание лампы


var
iButton at %ix0.0.0 : bool;
oLamp at %qx1.0 : bool;
ctu_ : ctu;
end_var

ctu_(CU := iButton, RESET := FALSE, PV := 2);
oLamp := ctu_.Q ;


про пример - не знаю, таблетку в руках держал, настраивал.

Четко! ;) Спасиб

YuriBel
11.05.2012, 16:54
Чтобы у вас следующий вопрос не возник через минуту после просмотра такого примера, продвиньтесь чуть дальше в исходных требованиях. Для того, чтобы зажечь лампочку, вполне подойдет счетчик CTU из библиотеки Standard.lib, но для того, чтобы его правильно объвязать, нежно понимать, как должна себя повести лампочка в дальнейшем. при третьем, четвертом и т.д. нажатиях она остается гореть или должна погаснуть? Или должна погаснуть через какое-то время? Или по нажатию другой кнопки? . Чуть расширьте так сказать, ТЗ, тогда и пример получтися более показательным.

ssl
12.05.2012, 06:48
Распиновка у панели вот такая, 1 подсоединяю к А, 2 подсоединяю к В, куда на контроллере подсоединять землю?

vooodooo22
12.05.2012, 09:19
...при третьем, четвертом и т.д. нажатиях она остается гореть или должна погаснуть? Или должна погаснуть через какое-то время? Или по нажатию другой кнопки? . Чуть расширьте так сказать, ТЗ, тогда и пример получтися более показательным.

Программа должна позволить оператору по нажатию кнопки (зацепленной к DI) задавать нужные параметры в станке. (например: параметры под №1, №2,... , №n ), причем на выходе (DQ) лампочка будет оповещать о номере выбранных параметров.

Пример:
• одно нажатие - 1 мигание - параметры под №1,
• еще одно нажатие - 2 мигания - параметры под №2, ... ,
• еще одно нажатие - n миганий - параметры под №n

После n-го нажатия следующее нажатие приведет к
- 1 мигание - параметры под №1 (т.е. замкнутый цикл)

Пока набросал кусок программки без учета выбора параметров. Что-то получилось громоздко :( ps. Чет я там с инверсией и NOT намудрил, их убрать надо. Перегрелся походу вчера к концу рабочего дня =)

YuriBel
12.05.2012, 10:07
Наводящие вопросы:
Чему в реальноси равно n?
Есть ли еще свободные входы и выходы?
Я к чему все это спрашиваю - если n невелико и есть n свободных выходов для лампочек, и еще 2 входа для кнопок, то мне казалось бы более эргономичным и логичным построить поцесс следующи образом:
1. Кнопка выбора параметра подает импульсы на вход счетчика.
2. По первому нажатию этой кнопки запускается таймер, который через некоторое время сбросит счетчик, если оператор начал прооцедуру выбора, но не закончил ее
3. Параллельно с этим таймером сброс счетчика может быть произведен при помощи кнопки №2 (на случай, если оператор проскочил мимо, чтобы не ждать срабатывания таймера. Таймер по нажатию этой кнопки нужно будет перезапустить.
4. n лампочек через дешифратор или семисегментный индикатор через дешифратор (или если не хватает выходов, то индикатор на RS485) покызывает текущее значение счетчика.
5. Нажатие кнопки №3 переводит программу в раздел установки нужного блока параметров в зависимости от текущего значения счетчика.
6. как поступить со счетчиком при достижении им максимального значения, можно придумать (например сбросить и запустить поцесс по новой).

Вот как-то так.
Для оператора это будет понятней, чем считать мигания лампочки.

swerder
12.05.2012, 10:43
Распиновка у панели вот такая, 1 подсоединяю к А, 2 подсоединяю к В, куда на контроллере подсоединять землю?
2 к А, 1 к В, земля не используется

vooodooo22
12.05.2012, 11:55
Наводящие вопросы:
Чему в реальноси равно n?
Есть ли еще свободные входы и выходы?
Я к чему все это спрашиваю - если n невелико и есть n свободных выходов для лампочек, и еще 2 входа для кнопок...
...Для оператора это будет понятней, чем считать мигания лампочки.

• n = 8
• входы/выходы есть, но они в дальнейшем потребуются для других целей

За пример большое спасибо! Попробую учесть некоторые нюансы. Если в моем примере упрусь в стенку, попробую реализовать Ваш;)

"Упрусь в стенку" - не продуман толком сброс счетчика "CTUprgrmN" для возврата к программе №1, был бы рад подсказке ;)
прикрепил скрин.

все решил, громоздко, но четко =) Сброс работает по 4-ому нажатию

B0BAKA
13.05.2012, 19:04
каждый для своих нужд :)
А можно по подробнее?:)

ssl
14.05.2012, 09:26
Хочу связать панель Weintec, контроллер ПЛК-160 и МВА8, контроллер МАСТЕР для МВА8, панель МАСТЕР для контроллера, подскажите по конфигурации, когда запускаю Мастер для опроса МВА8 панель начинает тупить, то выдает, что нет связи, то с большой задержкой реагирует на прикосновения

swerder
14.05.2012, 10:41
ssl другими словами, включенная панель weintek, являясь мастером для контроллера плк160, начинает подтормаживать при подаче питания на контроллер? желтое окошко о потере связи появляется?

ssl
14.05.2012, 11:04
Появляется, исчезает панель реагирует с огромной задержкой или вообще не реагирует, когда в ПЛК отключаю мастер опрашивающий МВА - все нормально

BETEP
14.05.2012, 11:43
т.е. Вы у вас на одних проводах два мастера?
или панель перенесите на 232 порт, или панель сделайте шлюзом для МВА8

swerder
14.05.2012, 12:20
ssl вы опишите структуру связи ваших приборов, а то пока не понятно кто у вас там мастер и сколько мастеров у вас там

BETEP
14.05.2012, 13:03
да и так понятно, если панель на 485 цепляет.

swerder
14.05.2012, 13:16
точно, упустил это

ssl
14.05.2012, 15:28
Подскажите, можно-ли панель сделать ведомым прибором?

BETEP
14.05.2012, 15:59
Можно, только не совсем удобно. Настройте её как MODBUS Server, как адреса панели соответствуют регистрам, есть в инструкции. Потеряете реальную скорость связи, если не воспользуетесь способом Валенка, т.е. самописный модбас в контроллере и связь пакетами.
Можно проще, но не феншуйно:
Оставьте в контроллере только слейв, Панелью опрашивайте МВА8 и пересылайте данные по времени в контроллер, там есть такая фича. адрес устройства, отличный от того что задали по умолчанию, пишут как 1# перед номером регисрта.

но по феншую, пересадить панель на 232 порт контроллера.

ssl
14.05.2012, 16:05
Дело в том, что планируется зацепить три панели на контроллер, думаю в сети они себя вести будут плохо

swerder
14.05.2012, 16:29
вы, ssl, хорошо формулируете вопросы :)
в - не работает панель с контроллером
о - сделайте так и так
в - тормозит панель на rs485
о - так у вас 2 мастера на линии - разнесите на разные порты
в - видите ли, планируется 3 панели использовать...

swerder
14.05.2012, 16:42
ssl с тремя панелями вам 2 пути:
1. настроить все три как slave приборы, контроллер-мастер будет опрашивать панели.
- не очень удобно.
+ без разницы на каком порте контроллера будут висеть.
2. соединить 3 панели цепочкой, первую настроить как мастера для ПЛК, 2 следующие настраивать по принципу "удаленный плк"
+ удобное управление в итоге
- сложная настройка, нужен свободный порт на контроллере, не уверен, что поддерживается вашей панелью

ssl
14.05.2012, 17:07
Удаленный ПЛК, насколько я понимаю, это связь по Ethernet? Если да, то этот вариант отметается, остается настроить Панели как Слейв. А на счет вопросов, прошу прощения, недостаток базового образования.

swerder
14.05.2012, 18:20
ethernet сугубо между панелями. от панели до плк любой удобный вам способ связи.

Frudor
15.05.2012, 05:47
Всем привет.

Начинаю постигать основы программирования в CodeSys. Разбираюсь с кодом одной программы.
Возник вопрос: В режиме Simulation mode без запуска алгоритма( я меняю значения переменных, записываю их (Write Values) но кода провожу Single Cycle значения переменных возвращаются к первоначальным значениям. Почему так происходит и как прогнать программу с моими заданными значениями переменных?

Спасибо

Yegor
15.05.2012, 06:05
У меня такого не наблюдается. Удостоверьтесь, что в программе (или за её пределами в случае с входами-выходами) в эту переменную ничего не записывается. Кроме этого, можете попробовать команду Force Values.

ssl
15.05.2012, 08:52
Настроил на панели Модбас - сервер, работает хорошо, только не могу разобраться в битовой адресации. Задаю битовому переключателю регистр записи 13 (в контроллере 8 bit input module c таким же адресом 13), запускаю панель нажимаю на переключатель - изменяется первый бит 8 bit input module, как управлять вторым, третьим и т.д. битами? Может там какая специальная адресация, в руководстве по программированию не нашел ничего похожего.

swerder
15.05.2012, 11:10
там в конфигурации плк добавлен 8bit unput module с настройками register 13 + read input status 0x02

ssl
15.05.2012, 11:23
Формат адреса АААА, что значит?

swerder
15.05.2012, 11:42
товарисч, с вашими вопросами можно экстрасенсом стать :)
если вы про LW_bit, то два последних символа это номер бита в регистре, а два первых (те, которые слева) это номер самого регистра

vooodooo22
15.05.2012, 15:44
Подскажите пожалуйста сработает ли "light" в представленной на скрине схеме по активации in1 будучи загруженной в ПЛК110-32?

Просто пока нет возможности проверить физически, а симуляция на компе не дает результатов ("light" не загарается)
Для заметки: вопрос задан в связи с попыткой понять возможно ли использовать в таймерах такие интервалы дабы не сидеть и гадать. Lamp вставлен для порверки работоспособности примера.

swerder
15.05.2012, 15:51
интервалы слишком мизерные, может и не сработать, надо проверить на железе

ssl
15.05.2012, 16:11
товарисч, с вашими вопросами можно экстрасенсом стать :)
если вы про LW_bit, то два последних символа это номер бита в регистре, а два первых (те, которые слева) это номер самого регистра

Нет предела совершенству! Рад что развиваю Ваши скрытые способности:)
А если серьезно, спасибо за помощь.

swerder
15.05.2012, 16:55
vooodooo22 сработает

vooodooo22
16.05.2012, 08:10
а на PLCWinNT не пробовали запустить, проверить горение лампочки с такими мизерными интервалами двух часов будет достаточно, а лучше в место лампочки поставить счетчик, который гарантированно покажет, что происходит включение/выключение


vooodooo22 сработает

Спасибо большое! ;)
ps: на счет счетчика вместо лампы возьму на заметку;)

vooodooo22
16.05.2012, 08:56
Программа должна позволить оператору по нажатию кнопки (зацепленной к DI) задавать нужные параметры в станке. (например: параметры под №1, №2,... , №n ), причем на выходе (DQ) лампочка будет оповещать о номере выбранных параметров.

Пример:
• одно нажатие - 1 мигание - параметры под №1,
• еще одно нажатие - 2 мигания - параметры под №2, ... ,
• еще одно нажатие - n миганий - параметры под №n

После n-го нажатия следующее нажатие приведет к
- 1 мигание - параметры под №1 (т.е. замкнутый цикл)


Выкладываю программку, точнее что получилось, вдруг кому пригодится (мало ли:) ). Работает как часы, но громоздкая. Сброс счетчиков организован. Рассчитана на 8 программ станка. В коде надо будет дополнительно создать массив для перем.COUNTER, в зависимости от которого будет вызываться тот или иной индекс массива с нужными параметрами программы для станка.

мысли в слух: Может если разбить на подпрограммы или действия будет казаться менее громоздкой:D

ps. Для новичков пример самое то;)

Yegor
16.05.2012, 11:59
Для новичков пример самое тоС их-то неокрепшей психикой да на такую оргию?

Тут сам человеко-машинный интерфейс можно сделать иначе: держим кнопку и ждём, пока лампочка мигнёт нужное число раз. И программа при этом будет вообще тривиальной:

http://images.devs-on.net/Image/JEkLAYjDAFqA5Yt5-CoDeSysUntitled.png

Тут пока держим кнопку, номер программы не меняется, но лампочка мигает. Когда отпускаем кнопку, номер программы приравнивается к числу срабатываний лампочки. Если номер больше допустимого, он игнорируется, а лампочка горит постоянно пока не отпустишь кнопку. Период мигания и допустимое число программ можно брать любые.

vooodooo22
16.05.2012, 13:56
С их-то неокрепшей психикой да на такую оргию?

стыдно чутка конеш было выкладывать (но все же вдруг кому пригодилось бы, пусть и маловероятно:o ). Алгоритм мне надо научится составлять перед созданием программы, да и много чего еще:o


Тут сам человеко-машинный интерфейс можно сделать иначе: держим кнопку и ждём, пока лампочка мигнёт нужное число раз. И программа при этом будет вообще тривиальной
четко! снимаю шляпу :)

Спасибо за пример!

Yegor
16.05.2012, 14:55
Ну и на десерт упрощённый вариант того подхода — нажимать, а потом смотреть на лампочку:

http://images.devs-on.net/Image/FbDEmnzIKHKmNYFp-CoDeSysUntitled.png

Между нажатиями кнопки должно быть не более timeout времени. Превышение таймаута считается завершением ввода. Контрольное мигание лампой начинается по истечении этого таймаута.

Yegor
16.05.2012, 20:50
Я это учитывал. Для INT пределом получается не 16 часов, а всего лишь 32,7 секунды. Но на практике при таком способе задания вряд ли кому-то понадобится больше 10 программ, и время одной вспышки лампочки более 1 секунды для контрольного счёта. 10*1000=10000 — вполне укладывается в INT. Если требуется в разы больше, то можно перевести всё на DWORD, но вообще тогда уж лучше пересмотреть способ выбора программы.

Казаков Сергей
21.05.2012, 11:37
Подкажите пожалуйста в чем может быть причина потери связи ИП320 с ПЛК 100??? Использую кабель КС2 и сетевые параметры проверял!

vooodooo22
22.05.2012, 10:26
Всем доброго времени суток.

Подскажите пожалуйста, есть программный ШИМ:

VAR
t_pwm: TON; (*таймер ШИМ*)
out: BOOL; (*выход ШИМ*)
t_power: TIME; (*переменная ШИМ*)
power: REAL; (*выходная мощность в диапазоне 0..1*)
END_VAR

(*запускаем таймер ШИМ*)
t_pwm(IN:=TRUE,PT:=t#10ms);
IF t_pwm.Q THEN t_pwm(IN:=FALSE); END_IF

(*преобразуем мощность во время*)
t_power := INT_TO_TIME(REAL_TO_INT(10*power));

(*управляем выходом*)
IF t_power > t_pwm.ET THEN out := TRUE; ELSE OUT := FALSE; END_IF

Период 10 мс, скважность (power) будет меняться по ходу программы.
Выше описанный программный ШИМ ограничен возможным количеством величин скважности, т.к. происходит округление переменной t_power. Например power:=0.25, тогда t_power := INT_TO_TIME(REAL_TO_INT(10*0.25)); в итоге 2.5 мс округляются до 3 мс. В итоге t_power принимает значение 3ms при скважности 0.25, и t_power может иметь только 11 значений от 0 до 10.

Вопрос: существует ли возможность задавать переменным значения меньше 1 мс?

Может кто-нибудь поделиться другим способом организации ШИМ, не страдающим таким ограничением как выше описанный?

С другой стороны:
Заказали ПЛК110-32 с Fast DO1-DO4, есть возможность их замены на PWM-модуль. Но пока честно не представляю как этот модуль себя ведет и работает. В РП скудная инфармация:(

YuriBel
22.05.2012, 11:45
Давайте разбираться.
Первое, что нужно принять, как факт, что тип данных Time представляет время в миллисекундах, то есть все ваши манипуляции с функциями и ФБ, которые работают с данными типа Time обречены на дискретность в 1 мс.
Второе. Основательно подумайте, действительно ли вам нужен период ШИМ в 10 мс, зачем так мало, неужели у вас есть столь малоэнерционные исполнительные элементы, которыми нужно управлять такими короткими импульсами?
Третье. Несколько сумбурно изложу свою мысль, но из фразы "Заказали ПЛК110-32 с Fast DO1-DO4, есть возможность их замены на PWM-модуль" мне не совсем понятно, правильно ли вы понимаете суть замены на PWM модуль. Это делается непосредственно в Codesys, в конфигурации контроллера, и соответственно это достаточно подробно описано в документе, который касается конфигурирования, а не программирования, то есть OWEN PLC Configuration, который можно скачать или найти на диске. Я бы пошел по этому пути, так как настройка займет 1 мин, и все будет работать в фоновом режиме.
И если обратите внимание, то там дискретность другая (в сотнях микросекунд)

vooodooo22
22.05.2012, 13:42
...это достаточно подробно описано в документе, который касается конфигурирования, а не программирования, то есть OWEN PLC Configuration...

owen_plc-configuration: "Модуль ШИМ является подчиненным подмодулем
модуля дискретного выхода." В ПЛК110-32 модуль ШИМ является замещающим...

РП: "Модуль ШИМ является замещающим для модуля быстрых дискретных выходов."

что в owen_plc-configuration, что в РП принцип работы не описан:(
Есть пример с использованием ПИД-регулятора, но и принцип ПИД ригулятора не совсем понятен, а там и дебри =)

...чтобы понять принцип ШИМ модуля остается только эксперементировать, когда придет ПЛК110

ps. Спасибо большо за ответы, буду дальше копать ;)

YuriBel
22.05.2012, 14:41
Про принцип работы:
Стандартный модуль быстрых выходов в конфигурации ПЛК позволяет вам работать с дискретными выходами, и управлять ими при помощи булевых переменных (условно говоря, True-выход включен, false-выход выключен).
Замещая этот модуль модулем ШИМ вы получаете те же самые дискретные выходы, управляемые по сути аналоговым сигналом (переменные, которые управляют физическими выходами, имеют формат Word) Для ПЛК 100 и ПЛК 110 организация подмодуля немного разная, но сути это не меняет. применительно к ПЛК 110- меняя это значение в диапазоне от 0 до 1000 вы получаете мощность на выходе (то есть скважность импульсов) в диапазоне от 0 до 100%.
Теперь о том, куда это все записать и как настроить. В модуле PWM вы получите 8 каналов - 4 типа word, которые свяжете со своими программными переменными, ну например с выходами ПИД регуляторов, преобразовав и отмасштабировав их предварительно. Эти каналы называются PWM power.
Четыре другие канала имеют формат Dword и предназначены для записи и чтения периода ШИМ импульсов. Они называются PWM period. Ими можно и не пользоваться.
Ну и наконец раздел параметров модуля. Там задается минимальная длительность импульса (4 параметра, для 4 выходов соответственно) и первоначальный период импульса (тоже 4 парамета, для 4 выходов). при старте программы периоды переносятся в каналы PWM period и вы их можете там менять, но обратно из каналов в параметры они не переносятся, поэтому при следующем старте программы будут взяты значения из параметров модуля. Все значения, связанные со временем (периоды, длительности) задаются в сотнях микросекунд.

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

Ну и понятное дело, ШИМ упревление дискретными выходами не очень подходит для реле.

YuriBel
22.05.2012, 19:49
Отчитаюсь о проведенном тесте.

Использовался ПЛК110-60М с релейными выходами.
Заменил Fast descret на PWM
В конфигурации появились 8 каналов, как и было обещано, но в параметрах значения по умолчанию странные (минимальная длительность импульса 3000 ед (300 мс), период импульсов 1000 ед (100 мс, хотя в руководстве по конфигурированию напосано про 10000 ед, то есть 1 сек.)
Поправил значение на 10000, посчитав что такой режим для реле вполне съедобен для полуминутного теста.
В визуализации делаем движок с пределами 0 и 1000, привязываем его к переменной, которую в конфигурации привязываем к каналу мощности одного из выходов. Рисуем индикатор, чтобы видеть величину мощности.
Запускаем, смотрим, слушаем., перемещаем движок.
При достижении значения 300 реле начинает коротко включаться с периодичностью 1 раз в секунду, по мере увеличения мощности длительность включенного состояния увеличивается, при достижении значения 700 и далее до 1000 реле остается постоянно включенным.
Таким образом минимальная длительность импульса по совместительности является минимальной длительностью паузы между импульсами, что в общем то вполне логично, потому что если кто-то все-таки захочет использовать в качестве коммутирующего элемента реле или пускатель, то ограничивать надо минимальную длительность как включенного, так и выключенного состояния, чтобы контакты успевали замыкаться и размыкаться без фатальных последствий.
Резюме- все работает так, как и написано, так что берите и пользуйтесь на здоровье, и единственое, чтоможет сподвигнуть к поиску альтернативы-это тот факт, что в режим ШИМ переводятся сразу все быстрые выходы. Но при этом никто не мешает управлять любым из них как обычным, присваивая 0 и 1000 соответствующей переменной.
А если нас читают уважаемые представители Овена и кто-либо из них найдет минутку, чтобы объяснить, почему у контроллеров 110 семейства период по умолчанию не 10000 ед а 1000, ну в смысле просто где-то кто-то нолик не дописал или в этом есть определенный смысл, то будем считать, что с режимом PWM мы разобрались.

ssl
23.05.2012, 06:35
Настроил на панели два Modus-server на СОМ1 и СОМ3, к СОМ1 подсоединил контроллер, к СОМ3 вторую панель. Вторая панель настроена как Modus-RTU. Область памяти регистров для обоих Modus-server одна. Скорость передачи приемлемая. Спасибо всем.

B0BAKA
23.05.2012, 23:56
Подскажите пожалуйста, какой тип выхода, 0-20mA или 0-10V нужно выставить в PLC Configuration для подключения печки(ЭП10)?

ssl
24.05.2012, 06:45
Руководство по эксплуатации ЭП10:
5.3. Управление нагревом ЭП10 осуществляется посредством выходного элемента терморегулятора. Следует использовать выходной элемент типа Р (э/м реле с нормально разомкнутыми контактами) или типа С (оптосимистор).

vooodooo22
24.05.2012, 08:50
Отчитаюсь о проведенном тесте...


Спасибо огромное! Вроде все встает на свои места ;)

YuriBel, а можно взглянуть на проведенный тест наглядно, так сказать воочию лицезреть сие чудо? :)

ps: Надеюсь, что когда-нибудь в техдокументации появится в каждом пункте отдельный подпункт: "Принцип работы" или создадут отдельный документ по принципам работы тех или иных модулей с примерами ;) ...мечтать не вредно

YuriBel
24.05.2012, 09:56
Не совсем понял, что значит "воочию"- если пример выложить, то не проблема, я его правда не сохранил, но сейчас повторю, это займет 5 минут, а если стенд по почте прислать-то наверное не готов так сразу...:)

vooodooo22
24.05.2012, 10:31
Не совсем понял, что значит "воочию"- если пример выложить, то не проблема, я его правда не сохранил, но сейчас повторю, это займет 5 минут, а если стенд по почте прислать-то наверное не готов так сразу...:)

всего лишь пример выложить :)

YuriBel
24.05.2012, 10:31
Собственно пример

vooodooo22
24.05.2012, 11:58
Собственно пример

Использовал в своей подпрограммке (прикрепил). Вроде все четко.

Единственное "НО"


...при старте программы периоды переносятся в каналы PWM period и вы их можете там менять...

период приходится задавать самому вручную, хоть и прицепил на QD :( или я что-то недопонял:o

YuriBel
24.05.2012, 12:43
Не совсем улавливаю суть, точнее цель.
В моем примере показано, что не написав в программе ни одной осмысленной сторчки кода режим ШИМ на быстрых выходах контролеера можно реализовать через конфигурацию. Эту конфигурацию нужно настроить и в дальнейшем передавать в каналы значения мощности в виде Word в диапазоне от 0 до 1000. И все будет работать, за это отвечает исполнительная система контроллера, самому больше ничего писать не надо. Если нужно менять период в процессе работы (для этого должны быть весомые основания) то это тоже работает, только чтопроверил, следом выложу пример.
Теперь давайте посмотрим, что делается в вашем примере.
ШИМ задан в конфигурации, и вы одновременно с этим пытаетесь еще реализовать что-то самостоятельно. Зачем, все и так работает. Я видимо не совсем понимаю, что вы хотите получить в результате. Объясните пошагово, что должно происходить, найдем оптимальное решение.

YuriBel
24.05.2012, 13:03
Добавил в пример регулировку периода от 1 до 5 сек.
Самое большое НО- это тот факт, что работу примера нужно смотреть на живом контроллере, в эмуляции вы ничего не увидите.
Просто поверьте на слово, все работает.

vooodooo22
24.05.2012, 13:34
Объясните пошагово, что должно происходить, найдем оптимальное решение.

С помощью ШИМ мне нужно добиться примерно такого графика напряжения (прикрепил). Вот кусок программки (прикрепил; значения в таймерах примерные для визуальной наглядности)

vooodooo22
24.05.2012, 13:43
...работу примера нужно смотреть на живом контроллере, в эмуляции вы ничего не увидите...

понятно :) на следующей неделе придет контроллер, опробую

B0BAKA
24.05.2012, 14:18
Руководство по эксплуатации ЭП10:
5.3. Управление нагревом ЭП10 осуществляется посредством выходного элемента терморегулятора. Следует использовать выходной элемент типа Р (э/м реле с нормально разомкнутыми контактами) или типа С (оптосимистор).

Это понятно, вопрос с какой характеристикой работает реле, с током или напряжением?

YuriBel
24.05.2012, 14:57
Ваш пример у меня закапризничал, из-за конфигурации, попозже разберусь. В предположении, что такие импульсы, как на картинке, имеют одинаковый период и длительность каждой части, я бы (опять таки с лету, не владея всеми тонкостями поставленной задачи)пошел бы по такому пути:
Считаем времена. Период, условно говоря, 1300 мс, из которых выходное напряжение первые 100 мс равно U1, вторые 100 мс равно U2, следующие 500 мс равно U3, затем 600 мс равно 0. и такая последовательность повторяется. Конфигурационный ШИМ имеет следующие ограничения - длина импульса-от 10 мс до 36 сек. минимальная длительность импульса -100 мкс. то есть, за те 100 мс, когда напряжение должно быть U1, мы подадим на физический выход самое большое 10 импульсов с периодом 10 мс и с некой длительностью, которая определит это самое напряжение U1. Некое исполнительное устройство эти десять импульсов сгладит и будет считать, что ему выдали напряжение U1. Сразу вопрос- есть ли уверенность, что исполнительное устройство на это расчитано (мы не знаем, что это именно, поэтому есть сомнения). Если по этой части все ОК, то я бы организовал Блинк с периодом 100 мс, счетчик, который циклически считал бы от 0 до 12 и сбрасывался на 13-й раз в 0, и по результатам выхода счетчика просто устанавливал бы значение мощности на выходе ШИМ: с такта 0 по такт 1- соответствующее U1, с такта 1 по такт 2 - соответствующее U2, с такта 2 по такт 7 -соответствующее U3, стакта 7 и до обнуления- равное 0. Тогда не нужно будет менять период ШИМ, потому что увеличивать его в коротких помежутках ни к чему (там и так всего 10 импульсов), а уменьшать его некуда.

Ну и если не секрет, выходы, которые с ШИМ, чем будут управлять?

YuriBel
24.05.2012, 15:12
вопрос с какой характеристикой работает реле, с током или напряжением?
Судя по первому вашему вопросу, вы пытаетесь подключить контакты ЭП10 к аналоговому выходу контроллера. Это неправильно. Для того, чтобы печка грела, нужно замкнуть эти контакты, чтобы не грела, разомкнуть. Для этого годится либо релейный, либо симисторнай выход, о чем и написано в РЭ. Можно еще использовать твердотельное реле. Вероятность угробить аналоговый выход контроллера путем подключения к нему печки достаточно высокая, так что сначала разберитесь, как все должно работать, потом подключайте, а то останетесь без контроллера.

B0BAKA
24.05.2012, 21:09
YuriBel, вы все правильно поняли. Откуда информация что нельзя подключать напрямую? В нескольких темах встречал утверждения об обратном.

ssl
25.05.2012, 03:57
ЭП10 управляется дискретным выходом контроллера или регулятора, который является эл-маг. реле, которое соответственно управляется напряжением, на величину которого Вы повлиять не можете. Если Вам необходимо определять напряжение срабатывания и отпускания реле, то ставьте его между контроллером и ЭП и подключайте к аналоговому выходу

YuriBel
25.05.2012, 10:58
[ Откуда информация что нельзя подключать напрямую? В нескольких темах встречал утверждения об обратном.
Скажем так- любой каприз за ваши деньги. Хотите подключать- подключайте, заодно дайте ссылки на те самые темы, интересно почитать.

Теперь по сути. Наверное всетаки стоит, прежде чем переходить к практике, немного изучить теорию. Аналоговые выходы контроллеров предназначены для управления устройствами, специально для этого предназначенными. Есть несколько стандартных аналоговых сигналов, например 0-10 В (управление производится напряжением), 0-5 мА, 0-20 мА, 4-20 мА (в этом случае управление производится током).
И есть исполнительные устройства, специально разработанные для управления либо тем, либо иным аналоговым сигналом, например приводы задвижек.
В то же аремя есть другая категория исполнительных устройств, которые управляются дискретными сигналами (включил-выключил), например электродвигатели, нагреватели, лампы. Ваш ЭП10 в их числе. Для этих устройств нужны дискретные выходы с выходными элементами такого типа, чтобы они могли коммутировать нагрузку в соответствии с ее мощностью и подводимым напряжением. Вы можете прикрутить к клеммам ЭП10 обычный выключатель из магазина "Свет" и включать или выключать нагреватель вручную. при этом вы скорее всего будете коммутировать напряжение 220 в переменного тока. если не лень, включите ЭП10 в розетку и померяйте напряжение на контактах, предназначенных для управления. Скорее всего, вы там увидите те самые 220 в переменного тока.
И именно поэтому вам в руководстве и написали, что для управления нужен ТРМ с выходом либо Р либо С, то есть либо реле (имеющее механический контакт, который может коммутировать 220 в и выдержит ток, который потечет через нагреватель мощностью 10Вт), либо симистор, т.е электронный прибор также предназначенный для коммутации нагрузок.

B0BAKA
26.05.2012, 20:27
ssl, YuriBel, спасибо за помощь, разобрался.
Кто нибудь владеет информацией о различиях лицензионной версии CodeSys и демо-версии? В ТП сказали, что разница во времени работы визуализации. Подробности кто нибудь знает?

Yegor
26.05.2012, 20:35
Сама среда разработки уже включена в стоимость ПЛК. Отдельно надо приобретать Codesys HMI если визуализацию вы делаете в нём. Я вот делаю её в самостоятельной проге, и потому мне нужно было заплатить только за контроллер.

Flicker
26.05.2012, 21:19
Подскажите как сделать сброс таймера или сброс выполнение программы?

сделал программу LD, в программе поставил немного таймеров TOF, итак после срабатывание таймера TOF замыкается катушка K1 на время t1 пока TOF не отключить ее, так вот если оператор нажмет стоп программа, то напряжение с катушки K1 все равно не пропадет пока не пройдет время t1, как правильно сделать сброс?

rovki
26.05.2012, 23:10
По нажатию стоп смените уставку у таймера на ноль ,тогда и на выходе таймера будет ноль .Для смены уставки используйте SEL ,как то так .

Flicker
26.05.2012, 23:14
По нажатию стоп смените уставку у таймера на ноль ,тогда и на выходе таймера будет ноль .Для смены уставки используйте SEL ,как то так .

даже если ставлю время 0 на таймер TOF то включение катушки происходит все равно, только кратковременно

rovki
26.05.2012, 23:46
Так это разные вещи ,сбросить начавший считать таймер и блокировка пуска при уставке ноль (стоп) и решения разные .Поставьте ,например блокировку по входу- если есть "стоп" то блокируйте прохождение сигнала на пуск таймера (через элемент "И") .Ну и конечно меняйте уставку ,как писал выше.

Flicker
27.05.2012, 00:05
Так это разные вещи ,сбросить начавший считать таймер и блокировка пуска при уставке ноль (стоп) и решения разные .Поставьте ,например блокировку по входу- если есть "стоп" то блокируйте прохождение сигнала на пуск таймера (через элемент "И") .Ну и конечно меняйте уставку ,как писал выше.

Спасибо, Вы правы, первый способ с элементом SEL действительно работает, а блокировка по входу не поможет если таймер уже запустился

rovki
27.05.2012, 09:36
Поможет .Если запустился ,то есть на выходе "1" ,то при нажатии стоп ,станет "0"(уставка "0") ,если не запустился ,а есть "стоп" ,то не запустится и не будет короткого импульса при наличии блокировки на входе и R триггера на пуске .Можно и без R триггера ,смотря какая вам нужна логика отработки пуска(фронт или потенциал).

Flicker
27.05.2012, 13:34
rovki Спасибо вам за помощь.:)

Еще есть один вопрос, язык LD - есть пару контактов, если они не замкнуты, то выполнение программы не возможно. Но оператор не узнает почему устанвка не работает, по этому надо сделать динамический текст на ИП320, подскажите можно ли использовать эти контакты привязанные к входам плк, для индикации ИП320? Если можно подскажите как?

B0BAKA
27.05.2012, 19:36
Yegor, да, я про Codesys HMI, нет конкретной информации в чем ограничения состоят? Точно не в количестве запусков, т.к. в 3S Licensing Manager'е в графе Runs left стоит unlimited.

Yegor
27.05.2012, 20:49
Ограничение там по времени работы. Через сколько-то (полчаса-час-два - не помню) HMI закрывается. А при запуске выскакивает соответствующее предупреждение.

razmik
28.05.2012, 23:35
подскажите пожалуйста как на плк73 указать нижний и верхний диопазон измерений? у меня датчик давления 4-20ма на 1.6мп! как задать верхний предел в програме?пишу на языке CfC

lara197a
29.05.2012, 00:39
внутреннее представление датчика(4-20ма) от 0 до 1000
вот и считайте.
1.6/1000=0.0016
умножайте это на полученное со входа.
к примеру получили значение 625*0.0016=1Мп

aris
29.05.2012, 10:21
подскажите,как вывести на панели оператора Delta dop-b10s таблицу, данные в которую заполнялись бы с плк ОВЕН 154АМ. лучше примером.

vooodooo22
29.05.2012, 11:39
...я бы организовал Блинк с периодом 100 мс, счетчик, который циклически считал бы от 0 до 12 и сбрасывался на 13-й раз в 0, и по результатам выхода счетчика просто устанавливал бы значение мощности на выходе ШИМ: с такта 0 по такт 1- соответствующее U1, с такта 1 по такт 2 - соответствующее U2, с такта 2 по такт 7 -соответствующее U3, стакта 7 и до обнуления- равное 0...


Спасибо большое за пример. Применил в своей программке, придет контроллер посмотрим как оно :)


Ну и если не секрет, выходы, которые с ШИМ, чем будут управлять?

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

vooodooo22
30.05.2012, 09:56
Всем доброго утра.
Подскажите пожалуйста в ПЛК 110-32: 14 дискретных выходов (4 фаст, 10 обычных)
Вопрос по последним 2-ум выходам на скриншоте:)

Спасибо

YuriBel
30.05.2012, 10:13
Была такая тема: http://www.owen.ru/forum/showthread.php?t=12732
Аналогично, два младших байта - следующие по счету выходы, а на остальное можно не обращать внимания.

vooodooo22
30.05.2012, 10:26
Была такая тема: http://www.owen.ru/forum/showthread.php?t=12732
Аналогично, два младших байта - следующие по счету выходы, а на остальное можно не обращать внимания.

Четко и понятно;) спасибо

YuriBel
30.05.2012, 10:29
Пардон, не байта а бита.

DIG
30.05.2012, 14:12
подскажите среднюю наработку до отказа модулей:
1.МДВВ
2.МВА
3.ТРМ-138
4.ПЛК 100
5.ПЛК 110

Валенок
30.05.2012, 18:25
1. РЭ, таб 2.1 последний пункт
2. РЭ, таб 2.1 последний пункт
3. ??
4. ??
5. РЭ, таб 2.1 предпоследний пункт

DIG
31.05.2012, 10:03
1. РЭ, таб 2.1 последний пункт
2. РЭ, таб 2.1 последний пункт
3. ??
4. ??
5. РЭ, таб 2.1 предпоследний пункт

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

А мне нужно среднюю наработку до отказа, в часах ( для расчёта надёжности системы).

Валенок
31.05.2012, 21:03
Объясните мне, тупому, на пальцах :
Произошел отказ, но срок службы не вышел - и прибор продолжает служить ?
Отказа нет, все работает, но срок службы вышел, поэтому прибор не годен ?

PS
В п. 1,3,4,5 - могут стоять релюхи. У них наработка воще в срабатываниях. А они зависят от нагрузки и т.д. Какие часы ?

Валенок
31.05.2012, 21:13
Очень много часов ...
PS
Если насморк лечить - проходит всего за неделю. А вот если не лечить - тянется семь дней.

Валенок
31.05.2012, 21:30
Энто будет "эксплуатационный отказ"
Мне вот интересно - скока человекочасов затратится на эти расчеты, и сколько у них стоит человекочас ? Может просто по 2 прибора купить ?

ssl
01.06.2012, 02:59
Из произведенной партии контроллеров делается выборка, выбранные контроллеры проходят испытания (должны проходить). В число испытываемых параметров входит в частности и наработка на отказ, затем делается статистическая обработка результатов, по результатам которой определяется наработка на отказ для данного типа контроллеров. Вообще при сертификации автоматизированных систем может потребоваться расчет надежности, который невозможен без этого параметра.

Валенок
01.06.2012, 10:11
может потребоваться расчет надежности, который невозможен без этого параметра.


1. РЭ, таб 2.1 последний пункт
2. РЭ, таб 2.1 последний пункт
3. ??
4. ??
5. РЭ, таб 2.1 предпоследний пункт
* 365 * 24

Это расчет. Или испытания ..

ssl
01.06.2012, 10:45
Дааа... Вряд ли у кого то есть такая информация

Fudz
01.06.2012, 11:20
Здравствуйте у меня есть задача нужно соединить ПЛК110 с МВ110-2А по протоколу Модбас используя RS-485 ASII интерфейс при этом не используя стандартную конфигурацию ПЛК тоесть сконфигурировать ПЛК и Модуль МВ110 с помощью программы ST. Подскажите пожалуйста как мне решить данную задачу. Если можно пример кода и какие библиотеки при этом нужно подключать.

vooodooo22
01.06.2012, 11:54
Доброго всем времени суток.
Такого рода вопрос: какой может быть минимальная длительность импульса на быстром входе (допустим Fast DI1) для того, чтобы программный счетчик, таймер или переменная активировались? 100 мкс?

Нужно знать именно минимальное значение(!)

ps в РП есть инфа, просто хотел уточнить у опытных специалистов :)