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

Cедой
11.09.2017, 18:34
Доброго времени суток!
Преамбула:
Маленький реактор (варочный котел) имеет два датчика ДТС (пт100), один температура стенок, другой - температура среды. У каждого своя уставка. Стенки нужно греть по ПИД-закону, а температуру среды - тупо вкл/выкл. Уставка стенок - всегда выше уставки среды
Есть в наличии ПЛК-73, два выхода Т.
Попытался потренироваться, собрать подобную логику на ПЛК. Можно ли таким образом (см. файл) решить вопрос? Вроде программа не ругается, в живую не "заливал", ПЛК под рукой. Не пинайте сразу, я только учусь. :)
33087

Спасибо,

Dimensy
11.09.2017, 22:51
Можно ли таким образом (см. файл) решить вопрос?
Если я правильно понял, то нужно сделать так: два регулятора, один ПИД, другой вкл - 100%, выкл - 0%. Их нужно сравнивать и на выходе брать большее значение

Осинский Алексей
12.09.2017, 08:39
Доброго времени суток!
Преамбула:
Маленький реактор (варочный котел) имеет два датчика ДТС (пт100), один температура стенок, другой - температура среды. У каждого своя уставка. Стенки нужно греть по ПИД-закону, а температуру среды - тупо вкл/выкл. Уставка стенок - всегда выше уставки среды
Есть в наличии ПЛК-73, два выхода Т.
Попытался потренироваться, собрать подобную логику на ПЛК. Можно ли таким образом (см. файл) решить вопрос? Вроде программа не ругается, в живую не "заливал", ПЛК под рукой. Не пинайте сразу, я только учусь. :)
33087

Спасибо,

Правильно ли я понял, что нагревателей 2: один для стенок, второй для среды?

Cедой
12.09.2017, 09:40
Смотрите, как сейчас работает реактор - нагреватель один, но управляется двумя ТРМ-ами, один берет температуру с датчика стенок, другой с датчика среды. За ними два ТТР (включенных последовательно, такое решение подсказали здесь, на форуме) первое отсекается темп. среды (на уровне вкл/выкл), а второе темп. стенок (вот стенки греются по ПИД закону). Нас устраивает его работа, все в порядке.
Эту логику я и попытался воссоздать на ПЛК.
Правильно программка получилась? Что-то есть подводное, о чем пока не догадываюсь?

Осинский Алексей
13.09.2017, 08:31
Смотрите, как сейчас работает реактор - нагреватель один, но управляется двумя ТРМ-ами, один берет температуру с датчика стенок, другой с датчика среды. За ними два ТТР (включенных последовательно, такое решение подсказали здесь, на форуме) первое отсекается темп. среды (на уровне вкл/выкл), а второе темп. стенок (вот стенки греются по ПИД закону). Нас устраивает его работа, все в порядке.
Эту логику я и попытался воссоздать на ПЛК.
Правильно программка получилась? Что-то есть подводное, о чем пока не догадываюсь?

Да, такой вариант должен сработать.
Есть еще вариант: на выходе ПИД-регулятора установить конструкцию
33098

Плюс мы рекомендуем использовать ПИД-регуляторы библиотек нашей разработки.
Библиотеки доступны по ссылке (http://www.owen.ru/uploads/txtlic.php?url=http:/kipshop.ru/CoDeSys/bibl/Lib_OWEN_PLC1xx_v8.12.zip)
В зависимости от Вашего контроллера выберите библиотеку:
Библиотека PID_Reg2.lib поддержана только в ПЛК63/73.
Библиотека PID_Regulators.lib поддержана только в ПЛК1хх (в т.ч. ПЛК110 [M02]).

ФБ этих библиотек не работают в режиме отладки, но зарекомендовали себя лучше, чем стандартный ПИД-регулятор библиотеки Util, который Вы используете в своем проекте.

Cедой
13.09.2017, 09:47
Алексей, Большое спасибо!
У нас ПЛК73. Я рассматривал ПИД из библиотеки PID_Reg2.lib блок APID_PWM (там автонастройка есть + быстрый выход на уставку), понимаю что нам бы он очень подошел, но (пока) смутило большое количество входных/выходных сигналов, обязательно попробую разобраться.
Что касается конструкции на выходе ПИД-регулятора, предложенной Вами, то я как-бы пытался обойтись одним реле, сэкономить так сказать. Стоит задача "обвязать" реактор объемом побольше у которого два контура ТЭН-ов, каждый со своим ДТС на рубашке (в программе будут две ветки с блоками pid, - tenA и tenB, но управляемые одной уставкой ), хотелось бы обойтись и двумя реле, по одному на каждую ветку. Нельзя ли что-то подобно Вашей конструкции применить на входе ПИД-регулятора?

С уважением,

П.С. если я правильно понимаю Вашу конструкцию, то я могу ее "урезать" до одного реле, которое будет работать в нужном нам режиме?

strs
13.09.2017, 15:37
Подскажите пожалуйста, есть ли способ выполнить какое-либо действие один раз при запуске ПЛК? Например, имеется булева переменная, нужно сделать так, чтобы она была равна TRUE во время первого цикла после запуска, а все остальное время равна FALSE.

Мастеренко Иван
13.09.2017, 15:46
Подскажите пожалуйста, есть ли способ выполнить какое-либо действие один раз при запуске ПЛК? Например, имеется булева переменная, нужно сделать так, чтобы она была равна TRUE во время первого цикла после запуска, а все остальное время равна FALSE.

Пример ниже
33102

Dimensy
13.09.2017, 16:25
Подскажите пожалуйста, есть ли способ выполнить какое-либо действие один раз при запуске ПЛК? Например, имеется булева переменная, нужно сделать так, чтобы она была равна TRUE во время первого цикла после запуска, а все остальное время равна FALSE.
блок R_TRIG, на вход ставим константу TRUE, выход сработает один раз при запуске

Осинский Алексей
13.09.2017, 18:55
П.С. если я правильно понимаю Вашу конструкцию, то я могу ее "урезать" до одного реле, которое будет работать в нужном нам режиме?

У меня используется одно реле.
Просто значение ему присваивается в 2х местах.
Одна из веток будет активна, когда температура внутри реактора выше уставки,
вторая, когда температура внутри реактора ниже уставки.

Cедой
14.09.2017, 10:39
У меня используется одно реле.
Просто значение ему присваивается в 2х местах.
Одна из веток будет активна, когда температура внутри реактора выше уставки,
вторая, когда температура внутри реактора ниже уставки.

Точно, не внимателен был.
Еще раз благодарю за помощь!

strs
14.09.2017, 15:50
Скажите пожалуйста, как в языке LD вызывается функция? С ФБ все ясно, создал, добавил через команду "Вставить->Функциональный блок". А с функцией как? В мануале вообще как-то непонятно написано :(

petera
14.09.2017, 16:23
Скажите пожалуйста, как в языке LD вызывается функция? С ФБ все ясно, создал, добавил через команду "Вставить->Функциональный блок". А с функцией как? В мануале вообще как-то непонятно написано :(

А какая разница?
Берете элемент с EN и вставляете, а там хоть функция, хоть ФБ.

https://www.youtube.com/watch?v=mdpbbRXIGj4

strs
14.09.2017, 16:27
А какая разница?
Ну вот, созданы у меня ФБ pump и функция A1. Я нажимаю "Вставит функциональный блок", в списке Фб есть, а функции нет.
33130

UPD, ясно, спасибо.

Cедой
15.09.2017, 20:57
Есть еще вариант: на выходе ПИД-регулятора установить конструкцию
33098

Плюс мы рекомендуем использовать ПИД-регуляторы библиотек нашей разработки.
Библиотеки доступны по ссылке (http://www.owen.ru/uploads/txtlic.php?url=http:/kipshop.ru/CoDeSys/bibl/Lib_OWEN_PLC1xx_v8.12.zip)
В зависимости от Вашего контроллера выберите библиотеку:
Библиотека PID_Reg2.lib поддержана только в ПЛК63/73.
Библиотека PID_Regulators.lib поддержана только в ПЛК1хх (в т.ч. ПЛК110 [M02]).

ФБ этих библиотек не работают в режиме отладки, но зарекомендовали себя лучше, чем стандартный ПИД-регулятор библиотеки Util, который Вы используете в своем проекте.

Доброго времени суток!
Вот, использовал Ваш каскад на выходе и применил ПИД из рекомендованной библиотеки. Вроде не ругается. На неделе попробую вживую прогнать ПЛК73 на экспериментальном реакторе.
33162

С уважением,

Sheldon
18.09.2017, 20:54
Контроллер ПЛК150 + панель СП307. Почему при использовании обмена по RS485 в основной программе, перестает идти опрос устройств ModBus в Конфигурации ПЛК? Как правильно программно опрашивать панель, так что бы не прекращался обмен с ней в Конфигурации ПЛК?

Sheldon
18.09.2017, 22:18
Никогда не слышали - "Занято !" ?

Опрашиваю один раз при включении


IF POINT_FLAG THEN
IF GET_POINT() THEN POINT_FLAG:=FALSE;END_IF
END_IF

функция GET_POINT() считывает таблицу данных из панели по ModBus и после этого прекращается обмен в конфигурации ПЛК, все переменные объявлены как глобальные, потому что если объявляю их в функции, то не считывает таблицу.

(*t_voz:=WORD_TO_INT(RS_TMP2);*)

t:=t+1;
IF (t MOD 1000)=0 THEN
A := A + 1;
IF A > 9999 THEN
A := 0;
END_IF
END_IF

(*Устанавливаем настройки COM-порта*)
IF port_opened=0 THEN
Settings.Port:=com_num; (*номер COM-порта*)
Settings.dwBaudRate:=38400; (*скорость*)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=1;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE11(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE11.ready THEN
port_opened:=2;
END_IF

IF port_opened=2 THEN (*Удачно проинициализировали*)
(* функция 03 инт - ФБ считывает значение параметра типа int из прибора с адресом 2 в регистр с номером 8 по протоколу Modbus-ASCII*)
enabl:=1;
get1_modbus(
Enable:=enabl , (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=2 , (*адрес*)
FirstAddr:=10400 , (*номер регистра*)
Quantity:=10, (*количество регистров*)
ComHandle:=Settings.Port , (*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
cnt:=0;
WHILE cnt<5 DO
V1_POINT[cnt] := BYTE_TO_WORD(BUFFER[2*cnt+1]) OR SHL(BYTE_TO_WORD(BUFFER[2*cnt]),8);
cnt:=cnt+1;
END_WHILE
cnt:=0;
WHILE cnt<5 DO
V2_POINT[cnt] := BYTE_TO_WORD(BUFFER[2*cnt+11]) OR SHL(BYTE_TO_WORD(BUFFER[2*cnt+10]),8);
cnt:=cnt+1;
END_WHILE

END_IF

END_IF
END_IF
enabl:=0;
COM_SERVICE11.Delay ;
GET_POINT:= cmpl;
RETURN;

Подскажите как правильно "положить трубку" после опроса:) COM_SERVICE11.Delay; для этих целей добавил, но не помогло.

capzap
18.09.2017, 22:50
Опрашиваю один раз при включении


IF POINT_FLAG THEN
IF GET_POINT() THEN POINT_FLAG:=FALSE;END_IF
END_IF

функция GET_POINT() считывает таблицу данных из панели по ModBus и после этого прекращается обмен в конфигурации ПЛК, все переменные объявлены как глобальные, потому что если объявляю их в функции, то не считывает таблицу.

(*t_voz:=WORD_TO_INT(RS_TMP2);*)

t:=t+1;
IF (t MOD 1000)=0 THEN
A := A + 1;
IF A > 9999 THEN
A := 0;
END_IF
END_IF

(*Устанавливаем настройки COM-порта*)
IF port_opened=0 THEN
Settings.Port:=com_num; (*номер COM-порта*)
Settings.dwBaudRate:=38400; (*скорость*)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=1;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE11(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE11.ready THEN
port_opened:=2;
END_IF

IF port_opened=2 THEN (*Удачно проинициализировали*)
(* функция 03 инт - ФБ считывает значение параметра типа int из прибора с адресом 2 в регистр с номером 8 по протоколу Modbus-ASCII*)
enabl:=1;
get1_modbus(
Enable:=enabl , (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=2 , (*адрес*)
FirstAddr:=10400 , (*номер регистра*)
Quantity:=10, (*количество регистров*)
ComHandle:=Settings.Port , (*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
cnt:=0;
WHILE cnt<5 DO
V1_POINT[cnt] := BYTE_TO_WORD(BUFFER[2*cnt+1]) OR SHL(BYTE_TO_WORD(BUFFER[2*cnt]),8);
cnt:=cnt+1;
END_WHILE
cnt:=0;
WHILE cnt<5 DO
V2_POINT[cnt] := BYTE_TO_WORD(BUFFER[2*cnt+11]) OR SHL(BYTE_TO_WORD(BUFFER[2*cnt+10]),8);
cnt:=cnt+1;
END_WHILE

END_IF

END_IF
END_IF
enabl:=0;
COM_SERVICE11.Delay ;
GET_POINT:= cmpl;
RETURN;

Подскажите как правильно "положить трубку" после опроса:) COM_SERVICE11.Delay; для этих целей добавил, но не помогло.

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

Осинский Алексей
19.09.2017, 07:31
Контроллер ПЛК150 + панель СП307. Почему при использовании обмена по RS485 в основной программе, перестает идти опрос устройств ModBus в Конфигурации ПЛК? Как правильно программно опрашивать панель, так что бы не прекращался обмен с ней в Конфигурации ПЛК?

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

Sheldon
19.09.2017, 10:26
Продолжим издеваться, не приходило в голову что два мастера в сети ( конфигуратор и библиотечный) быть не должно?
В сети один мастер - ПЛК. А то что в программе при открытии порта "ручками" затыкается автоматический обмен это не значит что мастера в сети 2, а скорее всего что такое использование не предусмотрено, а как запустить автоматический обмен после того как он заткнулся - я не знать)

Это не совсем верный подход.
Какую задачу Вы решаете таким образом?
Опишите, пожалуйста, подумаем как решить.
В панели помимо переменных которые нужно считывать постоянно как это делает конфигуратор, есть еще большая таблица в ПЗУ(массив регистров PFW), которую нужно считывать очень редко (при загрузке, либо когда ее изменили в процессе работы). Даже один процесс задания переменных в количестве 50-100шт не очень прельщает. Может можно как то считать в массив в конфигураторе?

Rake Runner
19.09.2017, 10:36
Перевод всего опроса на Modbus.lib решит ваши проблемы.

Осинский Алексей
19.09.2017, 12:14
Может можно как то считать в массив в конфигураторе?

Можно:
Добавьте в конфигурацию "String input modul".
В его настройках укажите сколько байт необходимо считать.

Чтобы не считывать данные циклически: добавьте еще один Universal Modbus device.
В настройках укажите
Work mode: by command;
33207

Привяжите переменную, по изменению которой на 255 будет происходить опрос
33208

Sheldon
19.09.2017, 14:29
Можно:
Добавьте в конфигурацию "String input modul".
В его настройках укажите сколько байт необходимо считать.


Спасибо! Пошли конструктивные советы.
Пробовал раньше так, но почему-то оно в строку не считывает фиксированное количество байт, а каждый раз разное. Видимо если переменная имеет код спецсимвола, а не букву, то прием прерывается:(

Осинский Алексей
19.09.2017, 14:33
Спасибо! Пошли конструктивные советы.
Пробовал раньше так, но почему-то оно в строку не считывает фиксированное количество байт, а каждый раз разное. Видимо если переменная имеет код спецсимвола, а не букву, то прием прерывается:(

Строки в CODESYS нуль-терминированная.
Это значит, что если в считанном массиве будет байт равный 16#0, то дальнейшие байты не будут отображаться и функциями для работы со строками их невозможно будет получить.
Варианты
1) читать данные в переменную типа ARRAY [0..к-во байт] OF BYTE
2) читать данные в STRING, но разбирать через библиотеку для работы с памятью SysMem и указатели.

1й проще и предпочтительнее.

Sheldon
19.09.2017, 15:27
Строки в CODESYS нуль-терминированная.
Это значит, что если в считанном массиве будет байт равный 16#0, то дальнейшие байты не будут отображаться и функциями для работы со строками их невозможно будет получить.
Варианты
1) читать данные в переменную типа ARRAY [0..к-во байт] OF BYTE
2) читать данные в STRING, но разбирать через библиотеку для работы с памятью SysMem и указатели.

1й проще и предпочтительнее.

А как конфигуратору указать что бы он читал в мой массив ARRAY [0..к-во байт] OF BYTE? Ему же просто задаешь имя переменной в которую он читает строку и она строкового типа...
Если объявляю массив с таким же именем, то ругается при компиляции.
33211

Осинский Алексей
20.09.2017, 08:49
Мастер - это не железо, а действие.
В данном случае проблема вероятнее всего не в том, кто мастер, а в том, что COM-порт занимает библиотека и конфигурация его открыть не может.

capzap
20.09.2017, 10:28
мне тоже кажется странным, что вместо того чтоб объяснить человеку, что надо поднимать свой уровень подготовки,модератор начинает критиковать правильно ли я использую термины

Осинский Алексей
20.09.2017, 10:45
мне тоже кажется странным, что вместо того чтоб объяснить человеку, что надо поднимать свой уровень подготовки,модератор начинает критиковать правильно ли я использую термины

Общаясь на форуме Sheldon и повышает свой уровень знаний.
Отвечая на такие вопросы мы поднимаем не только его уровень знаний, но и другим, которые придут с подобными вопросами.

Осинский Алексей
20.09.2017, 11:19
А как конфигуратору указать что бы он читал в мой массив ARRAY [0..к-во байт] OF BYTE? Ему же просто задаешь имя переменной в которую он читает строку и она строкового типа...
Если объявляю массив с таким же именем, то ругается при компиляции.
33211

Вариант 1:

Объявить переменную, указав где в памяти расположены ее данные:
33231

Вариант 2:
Привязать переменную в конфигурации и работать с данными по указателю на нее:
33230

Хочу обратить внимание, что некорректная работа с указателями (вариант 2) может привести к тяжело отслеживаемым проблемам.
Поэтому:
1) Перед обращением к указателю удостоверьтесь, что он инициализирован (не равен 0);
2) Удостоверьтесь, что не выходите за границы выделенной памяти (индекс массива в данном случае не должен быть выше выделенной области памяти).

Sheldon
20.09.2017, 15:13
мне тоже кажется странным, что вместо того чтоб объяснить человеку, что надо поднимать свой уровень подготовки,модератор начинает критиковать правильно ли я использую термины
Я сюда и пришел что бы его поднять при помощи людей которые профессионалы в этой области, а Ваши уважаемый товарищ capzap ответы в стиле "машина не едет потому что колеса не крутятся" только эфир засоряют и не приближают к решению проблемы.
Осинский Алексей большое спасибо!!! Узнаю от Вас много полезного, побольше бы таких людей! Попробую с указателями, если что-то не пойдет, буду писать вручную весь опрос по старинке.

capzap
20.09.2017, 15:35
Я сюда и пришел что бы его поднять при помощи людей которые профессионалы в этой области
как Вы его подниаете, проглотили то что Вам разжевали и в рот положили. Мною Вам было дано направление, от этого и надо было начинать развиваться, а не заявлять что мастер у Вас один и это плк, Вы и дальше будете совершать подобные ошибки, потому что не хотите подумать над проблемой, а просто пользуете чужой труд,написав здесь пару строк

Rake Runner
20.09.2017, 15:45
как Вы его подниаете, проглотили то что Вам разжевали и в рот положили. Мною Вам было дано направление, от этого и надо было начинать развиваться, а не заявлять что мастер у Вас один и это плк, Вы и дальше будете совершать подобные ошибки, потому что не хотите подумать над проблемой, а просто пользуете чужой труд,написав здесь пару строк

Поддерживаю - техподдержка должна давать исключительно ответы в стиле "RTFM", "а вы пробовали перепрошить ПЛК" и т.д. - а не разжевывать и тем самым мешать пользователям самообразовываться.

Lukas
20.09.2017, 20:54
Поддерживаю - техподдержка должна давать исключительно ответы в стиле "RTFM", "а вы пробовали перепрошить ПЛК" и т.д. - а не разжевывать и тем самым мешать пользователям самообразовываться.
Откуда Вам знать как должна давать ответы техподдержка?Считаете по другому?Просто не отвечайте и все.Зачем пытаться обсуждать чужие методы.По крайней мере неприлично.

serg_ingener
23.09.2017, 02:51
Сделал макрос с таймерами . Мне нужно несколько таких макросов с одинаковым алгоритмом , но независимые . Можно ли так сделать или придётся делать с таймерами и каждому присваивать имя (36 шт) .

Осинский Алексей
25.09.2017, 11:29
Сделал макрос с таймерами . Мне нужно несколько таких макросов с одинаковым алгоритмом , но независимые . Можно ли так сделать или придётся делать с таймерами и каждому присваивать имя (36 шт) .

Правильно ли я понял, что Вы сделали функциональный блок, который работает по определенному алгоритму
и теперь Вам необходимо использовать несколько экземпляров в программе?
Если так, то самым простым вариантом будет объявить массив Ваших ФБ.


afbTimers : ARRAY [1..36] OF xxxxx;

где xxxxx - название Вашего ФБ.

обращаться к элементам массива необходимо указывая № таймера в массиве.
например:
afbTimers[1]();
вызовет 1й таймер без параметров.

Kenat
25.09.2017, 12:24
Комрады,
Правильно ли понимаю, что для universal modbus device нельзя сделать абстракцию на подобии target файла и каждое уст-во надо описывать в ручную в конфигурации ? 1

serg_ingener
26.09.2017, 15:20
Спасибо за подсказку , сделал на ФБ. Скажите , как правильно перенести проект CODESYS на другой комп ?
Сохранил отдельно , перенёс на другой комп , флешкой . Проект открылся , установил target файл , но конфигурация плк отсутствует объявленные входы и выходы , нет modbas модуля .

Rednaxel
26.09.2017, 15:36
Спасибо за подсказку , сделал на ФБ. Скажите , как правильно перенести проект CODESYS на другой комп ?
Сохранил отдельно , перенёс на другой комп , флешкой . Проект открылся , установил target файл , но конфигурация плк отсутствует объявленные входы и выходы , нет modbas модуля .

И все-же, проверьте (http://plc-blog.com.ua/owen-codesys-version-target)еще раз наличие на этом компе таргета для данной модели ПЛК (http://plc-blog.com.ua/owen-codesys-version-target). Как вариант: таргет не той версии.

Upd: Или Вы сначала открыли проект, а потом установили таргет, а не наоборот?

serg_ingener
26.09.2017, 16:32
И все-же, [URL="http://plc-blog.com.ua/owen-codesys-version-target"]

Upd: Или Вы сначала открыли проект, а потом установили таргет, а не наоборот?

Да . так и было . Что теперь делать ?

serg_ingener
26.09.2017, 19:13
Разобрался с проектом , установил . Посоветуйте как лучше сделать проект пуска 7-ми двигателей с интервалом 3с. И с разными вариантами (6 маршрутов) . Короче небольшой элеватор .

Rednaxel
26.09.2017, 20:51
Посоветуйте как лучше сделать проект пуска 7-ми двигателей с интервалом 3с. И с разными вариантами (6 маршрутов) . Короче небольшой элеватор .

Сергей, мне кажется на такой совсем не конкретный вопрос можно ответить разве что ссылкой на Видео курс "Программирование ОВЕН ПЛК" (Программирование ОВЕН ПЛК)

Rednaxel
26.09.2017, 21:15
Собственно у меня есть несколько более конкретный вопрос:
соорудил модуль для задачи "Синхронизация состояния битов ModBus и DO (переменная Lamp) с возможностью изменения этих переменных в другом месте":
33303
Все работает прекрасно, но меня не покидает ощущение, основанное, видимо на убеждении типа "я знаю что ничего не знаю" ;) что все это можно сделать как-то гораздо красивее, и/или компактнее, что-ли. Поскольку таких модулей в программе будет довольно много, оптимизировать было бы очень даже не вредно.

Как вариант думаю создать FB на ST, но пока только умею copy/past на этом языке.
Подскажите пожалуйста: существует готовое решение (блок) для подобной задачи?

PotokU
27.09.2017, 11:38
Здравтвуйте, как в ПЛК-110 М первой модификации сбросить IP-адрес?
Нажатие СБРОС не помогает, нажатие СБРОС и удержание 30сек не помогает. адрес 10.0.6.10 не пингуется
Подскажите, как сбросить?

KIPetek
27.09.2017, 12:01
Помогите, пожалуйста.
К аналоговому входу ПЛК подключен преобразователь тока. Как в программе получить переменную, которая хранила бы среднее значение тока за последние 10 секунд?
Проект на ST, переменная REAL.

petera
27.09.2017, 13:13
Помогите, пожалуйста.
К аналоговому входу ПЛК подключен преобразователь тока. Как в программе получить переменную, которая хранила бы среднее значение тока за последние 10 секунд?
Проект на ST, переменная REAL.


VAR
TON_1: TON;
AnalogIn: REAL;
Avg: REAL;
TMP: REAL;
Count: UDINT;
END_VAR

TON_1(IN:=TRUE, PT:=t#10s);
TMP:=TMP + AnalogIn;
Count:= Count + 1;
IF TON_1.Q THEN
Avg:= TMP / Count;
TMP:= 0;
Count:= 0;
TON_1(IN:=FALSE);
END_IF

KIPetek
27.09.2017, 13:22
petera, как всегда большое спасибо и низкий поклон. Можем с вами в ЛС пообщаться? Если да, напишите, пожалуйста.

sdy
28.09.2017, 00:07
VAR
TON_1: TON;
AnalogIn: REAL;
Avg: REAL;
TMP: REAL;
Count: UDINT;
END_VAR

TON_1(IN:=TRUE, PT:=t#10s);
TMP:=TMP + AnalogIn;
Count:= Count + 1;
IF TON_1.Q THEN
Avg:= TMP / Count;
TMP:= 0;
Count:= 0;
TON_1(IN:=FALSE);
END_IF

Вставлю 5 копеек, такой вариант не покажет среднюю за ПОСЛЕДНИЕ 10 секунд в ЛЮБОЙ момент.
Для накопления средней за 10 секунд понадобится как минимум 1 массив из 10 переменных ( с точностью разрешения в 1 секунду или больше при большей точности) и алгоритм заполняющий массив циклически.
Данный же вариант кода будет показывать среднюю температуру за 10 секунд с момента НАЧАЛА измерения (его исполнения).

Rednaxel
28.09.2017, 00:53
Здравтвуйте, как в ПЛК-110 М первой модификации сбросить IP-адрес?
Нажатие СБРОС не помогает, нажатие СБРОС и удержание 30сек не помогает. адрес 10.0.6.10 не пингуется
Подскажите, как сбросить?

Подключится через USB или RS485 или RS232 и выполнить команды SETIP, SETMASK, SETGATEWAY в ПЛК браузере

Rednaxel
28.09.2017, 00:57
Комрады,
Правильно ли понимаю, что для universal modbus device нельзя сделать абстракцию на подобии target файла и каждое уст-во надо описывать в ручную в конфигурации ? 1

Поддерживаю вопрос обеими руками! мне такой способ неизвестен, а было бы ну ооочень удобно, особенно при перносе проекта на другую модель ПЛК.
Может быть есть вариант, комрады, а? ;)

RV9WFJ
28.09.2017, 04:52
Здравтвуйте, как в ПЛК-110 М первой модификации сбросить IP-адрес?
Нажатие СБРОС не помогает, нажатие СБРОС и удержание 30сек не помогает. адрес 10.0.6.10 не пингуется
Подскажите, как сбросить?
Боюсь у вас проблема в том что [М01]. Это тестовая версия (со слов Овна в продажу не поступавшая) и проблемы с Ethernet там аппаратные. Я когда уперся в это пару лет назад, то менял его на [М02]. Там все ОК

DrOn55
01.10.2017, 08:15
Добрый день.
Начинаю изучать CoDeSys и ПЛК160 и сразу возник вопрос.
У ПЛК160 16 дискретных входов.
Создал проект в CoDeSys начал переименовывать входы.
В "Fast discrete inputs" 4 входа(на скрине пронумеровано №1), в "Discrete inputs" 2 блока, на одном (на скрине №2) написано 8 входов и там 8 переменных, во втором блоке(на скрине №3) 4 входа, но снова 8 переменных.
33405

Не понял почему 4 входа, но 8 переменных. Проясните?
И какие биты соответствуют каким входам на самом ПЛК, по номерам имею в виду?

Осинский Алексей
02.10.2017, 08:26
Не понял почему 4 входа, но 8 переменных. Проясните?

Переменных 8, потому что переменная, отвечающая за дискретные входы имеет тип BYTE (8 бит), типов менее 8 бит не существует.
Поэтому был применен минимальный тип данных.


И какие биты соответствуют каким входам на самом ПЛК, по номерам имею в виду?
Значащие биты 0-3.

Более подробно о соотнесении переменных со входами:
33418

DrOn55
02.10.2017, 18:27
Осинский Алексей
Огромное спасибо! Коротко и ясно.

enyuzer
03.10.2017, 09:02
Добрый день.

Проект в CoDeSys 3.5 SP7 для СПК110. В глобальных переменных объявлено 26 RETAIN переменных INT и 26 RETAIN переменных WSTRING.
В состав других объектов переменные не входят. При загрузке в режиме эмуляции получаю сообщение о недостатке энергонезависимой памяти. В сообщении также указано, что использовано 162 байта из доступных 124.

С таким, относительно большим количеством RETAIN переменных сталкиваюсь впервые. Подскажите, пожалуйста, как поправить ситуацию?

capzap
03.10.2017, 09:10
SIZEOF(arr2) сколько показывает? А при WSTRING(14)?

enyuzer
03.10.2017, 09:17
SIZEOF(arr2) не научился пользоваться (не было проблем). При WSTRING(14) загрузка выполняетсябез ошибок.

enyuzer
03.10.2017, 09:26
Во вложении текст объекта "Глобальные переменные".

enyuzer
04.10.2017, 07:59
SIZEOF(arr2) сколько показывает?

Массив не причем. Убрал его, а ситуация не изменилась совсем.
При этом, c другими типами переменных нет вопросов.

capzap
04.10.2017, 08:15
SIZEOF(arr2) сколько показывает?

Массив не причем. Убрал его, а ситуация не изменилась совсем.
При этом, c другими типами переменных нет вопросов.

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


не научился пользоваться (не было проблем)так может сесть и поизучать основы программирования

Осинский Алексей
04.10.2017, 09:30
Добрый день.

Проект в CoDeSys 3.5 SP7 для СПК110. В глобальных переменных объявлено 26 RETAIN переменных INT и 26 RETAIN переменных WSTRING.
В состав других объектов переменные не входят. При загрузке в режиме эмуляции получаю сообщение о недостатке энергонезависимой памяти. В сообщении также указано, что использовано 162 байта из доступных 124.

С таким, относительно большим количеством RETAIN переменных сталкиваюсь впервые. Подскажите, пожалуйста, как поправить ситуацию?

WSTRING переменная по умолчанию занимает 162 байт памяти (81 символ по 2 байта на символ).
В Вашем случае 26 переменных типа WSTRING займут 4212 байт.

Я проверил, ошибка действительно должна выглядеть вот так:
C0103: Out of retain memory: Variable 'm_awsTestWstrings', 4212 bytes (Largest contiguous memory gap 4064).

Не совсем понятно, почему в Вашем случае всего 162 байта?
Приложите, пожалуйста, проект.


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

enyuzer
04.10.2017, 10:58
Спасибо, capzap.
Задал длину строк, все заработало.

enyuzer
04.10.2017, 11:00
Спасибо, Алексей.
Вопрос решен.
Задача сохранять строки в энергонезависимой памяти - дать возможность оператору два-три раза в день делать краткие комментарии значениям переменных.

Алексей87
16.10.2017, 06:25
Народ, столкнулся с непонятной проблемой при работе Сп270, при переходе от экрана к экрану посредством функциональных кнопок, панель уходит в перезагрузку, при подключенном контроллере, при отключенном все работает как часы, чем может быть вызвана такая реакция?

Алексей87
16.10.2017, 11:22
Собственно вот, на суждение и замечания. Где косяк, я не вижу.

liga_blunt
16.10.2017, 13:20
Сделайте панель мастером , а плк slave. Думаю проблемы пропадут

Алексей87
17.10.2017, 04:47
Без смены мастер слейв, еще варианты может будут?

capzap
17.10.2017, 07:48
Без смены мастер слейв, еще варианты может будут?

уменьшить скорость, переделать обмен с панелью с реалов на инты, избавиться от ненужных библиотек, не использовать имена переменных в виде одного нижнего подчеркивания, разбить схему на несколько мелких ПОУ

desperadoes
17.10.2017, 20:43
Добрый день подскажите пожалуйса !
что означает треугольник на входе блока или (OR) снизу? Спасибо

Sheldon
18.10.2017, 10:51
Кто нибудь сталкивался с проблемой записи параметров в ПЧВ1 такого рода: с панели ЛПО задаю напряжение двигателя, выключаю питание, потом включаю, значение напряжения сохраняется, а если через RS485 пишу в параметр 1-22 оно меняется, но после выключения питания, сбрасывается до значения установленного ранее на ЛПО.
Задача стоит настроить ПЧВ с ПЛК по RS485(Т.е. задать основные параметры и режимы работы), но не понятно почему сбрасывается этот параметр, другие не трогаю, мощность двигателя не меняю, ничего кроме записи параметра 1-22.

Keldish
18.10.2017, 13:56
Добрый день подскажите пожалуйса !
что означает треугольник на входе блока или (OR) снизу? Спасибо

по простому треугольник в лево - задний фронт, в право - передний фронт

serg_ingener
19.10.2017, 10:29
Прошу совета . Нужно точно дозировать вес жидкости из куба (1м3) , непрерывный поток кг/ч качает насос с частотником . Думаю правильнее использовать весовое оборудование , а расход вычислять по уменьшению массы . К расходомерам нет доверия - жидкости используем разные по плотности и текучести .

Какое весовое оборудование посоветуете ? Может есть в продаже готовое оборудование (терминал с датчиками массы ) На выходе нужно 4-20ма т.е 0-100кг/ч чтобы подключить вместо расходомера .

Не будет ли проблемой дозировать такой малый расход на весах в 1т. ?

Sheldon
19.10.2017, 12:08
Прошу совета . Нужно точно дозировать вес жидкости из куба (1м3) , непрерывный поток кг/ч качает насос с частотником . Думаю правильнее использовать весовое оборудование , а расход вычислять по уменьшению массы . К расходомерам нет доверия - жидкости используем разные по плотности и текучести .

Какое весовое оборудование посоветуете ? Может есть в продаже готовое оборудование (терминал с датчиками массы ) На выходе нужно 4-20ма т.е 0-100кг/ч чтобы подключить вместо расходомера .

Не будет ли проблемой дозировать такой малый расход на весах в 1т. ?

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

RV9WFJ
20.10.2017, 08:08
Любые 4 тензодатчика номиналом на 250 кг и МВ110-1ТД

Караван
20.10.2017, 21:13
Добрый вечер! В русскоязычной версии CoDeSys в языке SFС не удаляются и не выделяются для удаления шаги и переходы.
Это недоработка или все таки это возможно? Тогда как это сделать?
Караван.

RV9WFJ
21.10.2017, 05:52
Шаг можно удалить только совместно с переходом, иначе никак. Поэтому выделяйте и шаг и переход вместе и удаляйте сколько вам влезет.

serg_ingener
26.10.2017, 23:08
Сделал программу codesys на плк100 , с ОРС (codesys) визуализация с Simple-Scada . К контроллеру подсоединён МУ110 но от отдельного питания .
При отключении питания контроллера на 2 мин и включения , перестаёт работать . Simple-Scada на кнопках (!) . Загрузочный проект создавал . Что я делаю не так ?
Ещё при загрузке проекта выскакивает окно - #2000:2000.12.16 19:19:28 # 1PLC STARTED и восклицательный знак в жёлтом треугольнике .

serg_ingener
27.10.2017, 04:56
Вот также как на видео . https://www.youtube.com/watch?v=Es3c2e8GwvI
Автор видео говорит , что при пропадании питания , нужно программу перезагружать . И ничего не поделаешь . Это действительно так ? Если да , то годятся ли плк другой серии - 110 или 160 ?

Осинский Алексей
27.10.2017, 09:27
Сделал программу codesys на плк100 , с ОРС (codesys) визуализация с Simple-Scada . К контроллеру подсоединён МУ110 но от отдельного питания .
При отключении питания контроллера на 2 мин и включения , перестаёт работать . Simple-Scada на кнопках (!) . Загрузочный проект создавал . Что я делаю не так ?
Ещё при загрузке проекта выскакивает окно - #2000:2000.12.16 19:19:28 # 1PLC STARTED и восклицательный знак в жёлтом треугольнике .

Добрый день!
После подачи питания на ПЛК программа в нем выполняется и проблема только в связи со СКАДАой?
Или же пропадает проект?

Если проект пропадает, то, вероятно, села батарейка и ее необходимо заменить.

AEV12345
28.10.2017, 09:49
Здравствуйте. Есть такой вопрос:
Имеется структура, например Control : ARRAY[1..MaxQuantityAlert] OF SMS_notification:= (Alert:= FALSE, NumMain:=0,NumSpare:= 9(0), Mode:=0, Msg:='',Count:=0);
Как можно обнулить переменные в программе NumMain, начиная от 1 и до MaxQuantityAlert?

Control[1-MaxQuantityAlert].NumMain:=0; пробовал так, но в эмуляции без ПЛК ругается на неверный индекс массива

capzap
28.10.2017, 09:55
Здравствуйте. Есть такой вопрос:
Имеется структура, например Control : ARRAY[1..MaxQuantityAlert] OF SMS_notification:= (Alert:= FALSE, NumMain:=0,NumSpare:= 9(0), Mode:=0, Msg:='',Count:=0);
Как можно обнулить переменные в программе NumMain, начиная от 1 и до MaxQuantityAlert?

Control[1-MaxQuantityAlert].NumMain:=0; пробовал так, но в эмуляции без ПЛК ругается на неверный индекс массива
объявите в константах такую же точно структуру и когда надо, просто присвойте переменной Control

AEV12345
28.10.2017, 10:12
Так мне нужно один конкретный столбик обнулить в один момент, не трогая остальные, а в другой момент другой.

serg_ingener
28.10.2017, 19:42
Добрый день!
После подачи питания на ПЛК программа в нем выполняется и проблема только в связи со СКАДАой?
Или же пропадает проект?

Если проект пропадает, то, вероятно, села батарейка и ее необходимо заменить.

Добавлю в проект генератор на свободный выход , проверю .

RV9WFJ
29.10.2017, 12:27
Control[1-MaxQuantityAlert].NumMain:=0; пробовал так, но в эмуляции без ПЛК ругается на неверный индекс массиваВсе правильно ругается, у вас индекс явно за пределом диапазона.

AEV12345
29.10.2017, 15:12
Ну и? где подвох?

Dimensy
30.10.2017, 08:18
Ну и? где подвох?
У вас объявлен диапазон [1..MaxQuantityAlert], а обращаетесь вы к [1-MaxQuantityAlert]

AEV12345
30.10.2017, 08:29
Да это я понимаю, вопрос то был что можно ли диапазону от 1 до MaxQuantityAlert присвоить допустим 0 одним действием, кроме варианта создавать обнуляющий массив

RV9WFJ
30.10.2017, 10:33
Control[1-MaxQuantityAlert].NumMain:=0; пробовал так, но в эмуляции без ПЛК ругается на неверный индекс массива

Да это я понимаю, вопрос то был что можно ли диапазону от 1 до MaxQuantityAlert присвоить допустим 0 одним действием, кроме варианта создавать обнуляющий массивВы уж определитесь!

FOR i:=1 TO MaxQuantityAlert DO

Control[i].NumMain:=0;
END_FOR

AEV12345
30.10.2017, 11:49
Вы уж определитесь!

FOR i:=1 TO MaxQuantityAlert DO

Control[i].NumMain:=0;
END_FOR

Спасибо большое

serg_ingener
02.11.2017, 11:00
После подачи питания на ПЛК100 программа в нем выполняется , скада вроде видит ОРС ( codesys ) , но не видит переменные . Действительно ли проблема плк100 с ОРС от codesys ? Напомню про видео . https://www.youtube.com/watch?v=Es3c2e8GwvI
Или попробовать другой ОРС . Какой посоветуете для новичка ?

tomas111
02.11.2017, 14:28
Подскажите мне не грамотному могу ли я писать вот так?

IF Gate_1 =0
THEN Input_1 :=1;
ELSE Input_1 :=0 AND Input_2 :=1;
END_IF;

Вопрос в том как я могу написать условие для переменной Gate_1 по состояниям? Gate_1=0 в таких условиях и Gate_1=1 в таких условиях?

capzap
02.11.2017, 14:38
Подскажите мне не грамотному могу ли я писать вот так?

IF Gate_1 =0
THEN Input_1 :=1;
ELSE Input_1 :=0 AND Input_2 :=1;
END_IF;

Вопрос в том как я могу написать условие для переменной Gate_1 по состояниям? Gate_1=0 в таких условиях и Gate_1=1 в таких условиях?
во второй половике условия ошибка

tomas111
02.11.2017, 14:56
во второй половике условия ошибка

Как мне тогда правильно написать?

разве я не могу писать состояние переменной? ((

capzap
02.11.2017, 15:25
Как мне тогда правильно написать?
правильно можно написать только разобравшись с заданием
в том что Вы выложили, как код то там ошибка. Если его сопоставить с Вашим описанием то приблизительно можно так записать
Gate_1:=NOT Input_1 AND (Input_2 OR Gate_1);

tomas111
02.11.2017, 16:32
правильно можно написать только разобравшись с заданием
в том что Вы выложили, как код то там ошибка. Если его сопоставить с Вашим описанием то приблизительно можно так записать
Gate_1:=NOT Input_1 AND (Input_2 OR Gate_1);

Что то я не совсем понял... условия кода((
Щас попробую расписать условие:
Gate_1:BOOL :=0; (* Выход. Принимает значение 1/0, начальное состояние 0*)
Input_1 :BOOL; (* Вход *)
Input_2 :BOOL; (* Вход *)
Input_3 :BOOL; (* Вход *)

Задание простое что бы переменная Gate_1 принимало значение 0 или 1 по условию.
Допустим вот такое:
* На синтаксис не обращать внимания! Пример задания:
(Gate_1=0) := (Input_1=1) AND (Input_3=0)
(Gate_1=1) := (Input_1=0) AND (Input_2=1) AND (Input_3=1)

Вот как то так ))

capzap
02.11.2017, 18:18
Что то я не совсем понял... условия кода((
Щас попробую расписать условие:
Gate_1:BOOL :=0; (* Выход. Принимает значение 1/0, начальное состояние 0*)
Input_1 :BOOL; (* Вход *)
Input_2 :BOOL; (* Вход *)
Input_3 :BOOL; (* Вход *)

Задание простое что бы переменная Gate_1 принимало значение 0 или 1 по условию.
Допустим вот такое:
* На синтаксис не обращать внимания! Пример задания:
(Gate_1=0) := (Input_1=1) AND (Input_3=0)
(Gate_1=1) := (Input_1=0) AND (Input_2=1) AND (Input_3=1)

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

по поводу нового условия с добавлением третьего элемента всёравно ни чего не меняется
Gate_1 := NOT (Input_1 AND NOT Input_3) AND (Input_2 OR Gate_1);

YuriBel
02.11.2017, 18:25
Задачу сначала самому себе постарайтесь четко объяснить, потом сюда ее написать простыми понятными словами. У вас три входа, стало быть всего возможно восемь комбинаций на входах. Каждой комбинации на входах будет соответствовать какое-то значение выхода. Вы описали две комбинации, в первой из них значение второго входа не учитывается, то есть получается, что мы знаем, как себя должен вести выход в тех случаях из восьми возможных. А что с остальными?

tomas111
03.11.2017, 08:29
даже интересно стало, какой у Вас базовый язык программирования (ну то что в школе изучали/те). По поводу как писать код см.скрин, а лучше документ целиком прочтите

по поводу нового условия с добавлением третьего элемента всёравно ни чего не меняется
Gate_1 := NOT (Input_1 AND NOT Input_3) AND (Input_2 OR Gate_1);

Базовый Verilog ))

Dimensy
03.11.2017, 08:44
Что то я не совсем понял... условия кода((
почитайте http://grishnan.ru/books/lections/221/architecture/lec2.pdf

ну, а если, в лоб, тогда будет так:
IF Input_1 AND NOT Input_3 then
Gate_1:=FALSE;
ELSIF NOT Input_1 AND Input_2 AND Input_3 THEN
Gate_1:=TRUE;
END_IF;

tomas111
03.11.2017, 12:16
почитайте http://grishnan.ru/books/lections/221/architecture/lec2.pdf

ну, а если, в лоб, тогда будет так:
IF Input_1 AND NOT Input_3 then
Gate_1:=FALSE;
ELSIF NOT Input_1 AND Input_2 AND Input_3 THEN
Gate_1:=TRUE;
END_IF;

Спасибо почитаю! Кстати нашёл выход из ситуации через SR триггер )) два условия и установка сброс ))

odekolon
04.11.2017, 15:03
Добрый день!
пишу в SFС, разбитом на блоки LD (ну вот так мне удобно)
хочу сделать присвоение константы (Word) регистру модбас (аналоговый вывод)

как это можно сделать в LD?

конечно, не вопрос, ввести промежуточный блок (IL, ST или SFC) но я как-то привык к LD...

ASo
04.11.2017, 15:37
А Вы точно пишите на LD?
Элементарно обозвать катушку.

petera
04.11.2017, 17:49
Добрый день!
пишу в SFС, разбитом на блоки LD (ну вот так мне удобно)
хочу сделать присвоение константы (Word) регистру модбас (аналоговый вывод)

как это можно сделать в LD?

конечно, не вопрос, ввести промежуточный блок (IL, ST или SFC) но я как-то привык к LD...

Просто нужно использовать "Элемент с EN"
В качестве элемента - MOVE
33983
Таким способом можно и вычисления делать, там где MOVE писать ADD, SUB, ... Или условия проверять.
Или ФБ вызывать

https://www.youtube.com/watch?v=mdpbbRXIGj4

odekolon
04.11.2017, 22:16
А Вы точно пишите на LD?
Элементарно обозвать катушку.

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

odekolon
04.11.2017, 22:21
Просто нужно использовать "Элемент с EN"
В качестве элемента - MOVE
33983
Таким способом можно и вычисления делать, там где MOVE писать ADD, SUB, ... Или условия проверять.
Или ФБ вызывать


О! Спасибо, это то что нужно, про MOVE я прочел в хелпе, просто не мог дотумкать, как его вставить.

Игорюня
07.11.2017, 09:34
Граждане! Помогите. Не работает таймер в функциональном блоке.
34004

FUNCTION_BLOCK gws_upr_pumps
VAR_INPUT
auto1: BOOL; (*Переключатель 1 насоса в автомате*)
man1: BOOL; (*Переключатель 1 насоса в ручном*)
auto2: BOOL; (*Переключатель 2 насоса в автомате*)
man2: BOOL; (*Переключатель 1 насоса в ручном*)
num: BOOL; (*Основной насос false - 1, true - 2*)
k1: BOOL; (*Контакт пускателя 1 насоса*)
k2: BOOL; (*Контакт пускателя 2 насоса*)
rdd: BOOL; (*Перепад на насосной группе*)
END_VAR
VAR_OUTPUT
out1: BOOL; (*Насос 1*)
out2: BOOL; (*Насос 2*)
al1: BOOL; (*Авария насоса 1*)
al2: BOOL; (*Авария насоса 2*)
END_VAR
VAR
g: BYTE;
gp1: pump;
gp2: pump;
t1: TON := (pt := t#10s);
g1, g2: BOOL;
END_VAR

IF man1 OR man2 THEN g := 0; (*Если хоть один насос включен в ручном режиме*)
ELSIF auto1 AND NOT auto2 THEN g := 1; (*Если включен в работу только 1 насос*)
ELSIF NOT auto1 AND auto2 THEN g := 2; (*Если включен в работу только 2 насос*)
ELSIF auto1 AND auto2 AND NOT num THEN g := 12; (*Если включены насосы 1 и 2 и 1 основной*)
ELSIF auto1 AND auto2 AND num THEN g := 21; (*Если включены насосы 1 и 2 и 2 основной*)
ELSE
g := 0;
END_IF;

CASE g OF
0: g1 := FALSE;
g2 := FALSE;
t1.IN := FALSE;

1: g1 := auto1 AND NOT al1;
g2 := FALSE;
t1.IN := FALSE;

2: g2 := auto2 AND NOT al2;
g1 := FALSE;
t1.IN := FALSE;

12: g1 := auto1 AND NOT al1;
t1.IN := al1;
g2 := auto2 AND NOT al2 AND t1.Q;

21: g2 := auto2 AND NOT al2;
t1.IN := al2;
g1 := auto1 AND NOT al1 AND t1.Q;

ELSE
out1 := FALSE;
out2 := FALSE;
END_CASE;

gp1(en := g1, res_alarm := NOT auto1 AND NOT man1, k := k1, rdd := rdd, out=> out1, alarm=> al1);
gp2(en := g2, res_alarm := NOT auto2 AND NOT man2, k := k2, rdd := rdd, out=> out2, alarm=> al2);

YuriBel
07.11.2017, 10:38
Так он, таймер, нигде не вызывается. Зачем ему работать. ему и так хорошо.

Игорюня
07.11.2017, 11:06
Так он, таймер, нигде не вызывается. Зачем ему работать. ему и так хорошо.

Как не вызывается? А в кейсе под номерами 12 и 21?

YuriBel
07.11.2017, 11:25
В кейсах входу IN таймера присваивается некое значение, но сам таймер не вызывается.

Игорюня
07.11.2017, 11:52
Почему тогда здесь работает?

VAR
p1: pump;
p2: pump;
p3: pump;
t1: TON := (pt := t#10s);
t2: TON := (pt := t#10s);
pp1, pp2, pp3: BOOL;
END_VAR

CASE num OF
0: (*Не включен ни один насос*)
pp1 := FALSE;
pp2 := FALSE;
pp3 := FALSE;
t1.IN := FALSE;
t2.IN := FALSE;
(************************************************* ************************************************** *)
1: (*Работает только сетевой-1*)
pp1 := NOT al1;
pp2 := FALSE;
pp3 := FALSE;
t1.IN := FALSE;
t2.IN := FALSE;
(************************************************* ************************************************** *)
2: (*Работает только сетевой-2*)
pp2 := NOT al2;
pp1 := FALSE;
pp3 := FALSE;
t1.IN := FALSE;
t2.IN := FALSE;
(************************************************* ************************************************** *)
3: (*Работает только сетевой-3*)
pp3 := NOT al3;
pp1 := FALSE;
pp2 := FALSE;
t1.IN := FALSE;
t2.IN := FALSE;
(************************************************* ************************************************** *)
12: (*Включены 1 и 2*)
pp1 := NOT al1;
t1.IN := al1;
pp2 := NOT al2 AND t1.Q;
pp3 := FALSE;
(************************************************* ************************************************** *)
23: (*Включены 2 и 3*)
pp2 := NOT al2;
t1.IN := al2;
pp3 := NOT al3 AND t1.Q;
pp1 := FALSE;
(************************************************* ************************************************** *)
13: (*Включены 1 и 3*)
pp1 := NOT al1;
t1.IN := al1;
pp3 := NOT al3 AND t1.Q;
pp2 := FALSE;
(************************************************* ************************************************** *)
31: (*Включены 3 и 1*)
pp3 := NOT al3;
t1.IN := al3;
pp1 := NOT al1 AND t1.Q;
pp2 := FALSE;
(************************************************* ************************************************** *)
123: (*Включены 1 и 2 и 3*)
pp1 := NOT al1;
t1.IN := al1;
pp2 := NOT al2 AND t1.Q;
t2.IN := al1 AND al2;
pp3 := NOT al3 AND t2.Q;
(************************************************* ************************************************** *)
132: (*Включены 1 и 3 и 2*)
pp1 := NOT al1;
t1.IN := al1;
pp3 := NOT al3 AND t1.Q;
t2.IN := al1 AND al3;
pp2 := NOT al2 AND t2.Q;
(************************************************* ************************************************** *)
213: (*Включены 2 и 1 и 3*)
pp2 := NOT al2;
t1.IN := al2;
pp1 := NOT al1 AND t1.Q;
t2.IN := al1 AND al2;
pp3 := NOT al3 AND t2.Q;
(************************************************* ************************************************** *)
231: (*Включены 2 и 3 и 1*)
pp2 := NOT al2;
t1.IN := al2;
pp3 := NOT al3 AND t1.Q;
t2.IN := al2 AND al3;
pp1 := NOT al1 AND t2.Q;
(************************************************* ************************************************** *)
312: (*Включены 3 и 1 и 2*)
pp3 := NOT al3;
t1.IN := al3;
pp1 := NOT al1 AND t1.Q;
t2.IN := al3 AND al1;
pp2 := NOT al2 AND t2.Q;
(************************************************* ************************************************** *)
321: (*Включены 3 и 2 и 1*)
pp3 := NOT al3;
t1.IN := al3;
pp2 := NOT al2 AND t1.Q;
t2.IN := al3 AND al2;
pp1 := NOT al1 AND t2.Q;
ELSE
out1 := FALSE;
out2 := FALSE;
out3 := FALSE;
END_CASE;

p1 (en:= pp1, res_alarm:= res1, k:= k1, rdd:= rdd, out=> out1, alarm=> al1);
p2 (en:= pp2, res_alarm:= res2, k:= k2, rdd:= rdd, out=> out2, alarm=> al2);
p3 (en:= pp3, res_alarm:= res3, k:= k1, rdd:= rdd, out=> out3, alarm=> al3);

Игорюня
07.11.2017, 13:02
34006 Пожалуйста. С тремя насосами работает, с двумя нет.

Игорюня
07.11.2017, 13:21
Все разобрался. Переделал конструкцию с t1.in на t1(in := bool, pt := t#10s) и все заработало

YuriBel
07.11.2017, 13:39
Осталось только понять, как работало с тремя насосами.

Игорюня
07.11.2017, 14:25
Так работает же. Вот в чем вопрос?

YuriBel
07.11.2017, 14:31
И что, в онлайн можно увидеть работающие таймеры с бегущими циферками?

Игорюня
07.11.2017, 15:01
И что, в онлайн можно увидеть работающие таймеры с бегущими циферками?

Конечно. см. картинку. Параметр ЕТ

Игорюня
07.11.2017, 15:03
Работает же... Где, почему - это не важно )))

Вопрос что в одном функциональном блоке работает, в другом нет.

Игорюня
07.11.2017, 16:06
Да и переключение насосов при аварии предыдущего

Игорюня
07.11.2017, 17:59
Дык на отопление стоят разные по мощности насосы (и только не спрашивайте почему? это гл.инженеру видней) Приходящий оператор их включает по усмотрению по погоде. вот такую байду и приходится лепить. Желания начальства не обсуждаются.

Игорюня
07.11.2017, 19:51
Боюсь переключаться будут часто. На кубани погода такая, что утром по колено в снегу а вечером по уши в грязи. уж лучше пенсионер время от времени переключает сам (по распоряжению начальника).

GTS
08.11.2017, 13:44
Добрый день! Есть несколько расходомеров подключенных к ПЛК, считаю мгновенный расход и накопленный. Задача накопленный расход разбить на Расход за час, за сутки, за месяц. ПЛК подключен к панели, архив находится в ней же. Единственное что пришло в голову, считать расход в течении часа, затем по истечении часа по управляющему биту писать в архив панели, обнулять часовой расход и считать заново. Заморочился с часами ПЛК получил реальное время, но как зафиксировать изменение часа что-то не соображу. В ST не силен, пишу на CFS. Понимаю что нужно сравнивать текущий час H с H+1 (как 100 лет назад в школе на Паскале учили), но чего-то зациклился. Буду признателен за помощь!

Dimensy
08.11.2017, 15:06
Буду признателен за помощь!
Такой вопросик - к часу надо привязываться, т.е. расход с часу до двух, с двух до трех и т.д. или просто от момента включения?

GTS
08.11.2017, 15:30
Да, расход за час, ну то-есть с часу до двух, с двух до трех и т.д., общий накопленный уже есть.

Dimensy
08.11.2017, 15:43
Ну, как вариант
34031

GTS
08.11.2017, 21:38
Ну, как вариант
34031


Понял ваш вариант, но у меня немного другие обстоятельства. У меня час, день, месяц - ваша minute всегда будет больше 0. Я беру время из плк с помощью библиотеки. Мне нужно фиксировать изменение времени, прошу прощения за туфтологию. Например переменная hour (час) увеличилась на 1 час (то есть прошел 1 час) срабатывает бит, по которому я пишу в архив накопленный расход за этот час, далее часовой расход обнуляется и накапливается на следующий час и т.д. Точно также мне нужно фиксировать изменение суток и месяца. Вроде все просто но никак не дойду,как это провернуть. Кто делал архив расхода, может есть другие способы?

petera
08.11.2017, 23:21
Я беру время из плк с помощью библиотеки. Мне нужно фиксировать изменение времени, прошу прощения за туфтологию. Например переменная hour (час) увеличилась на 1 час (то есть прошел 1 час) срабатывает бит, по которому я пишу в архив накопленный расход за этот час, далее часовой расход обнуляется и накапливается на следующий час и т.д. Такие вещи элементарно делаются если вместо отдельно взятых ЧЧ ММ СС использовать время в формате TOD (TIME_OF_DAY).
Соберите время суток в секунды, результат разделите по модулю 86400. Получите нолик строго в момент начала очередного часа. Т.к. длительность нолика - 1 сек, то нужно еще добавить F_TRIGGEG - получите нужный импульс.
А начало суток получите в момент когда TOD = 0.
34034
А для того, чтобы фиксировать изменение недели, месяца, или года нужно использовать время в формате TD(TIME_AND_DATE).
Только упаковка времени в TOD немного по хитрее будет.

ЗЫ.
Почитайте на досуге статью И.Петрова "Программируем временные сложности" http://prolog-plc.ru/docs/TimeExperience.pdf
Я думаю, что это Вам поможет :)

Dimensy
09.11.2017, 08:15
Хорошо, тогда так
34040
как только час поменяется, будет импульс. Аналогично можно сделать для дня, недели, месяца и года. Только здесь важен порядок блоков - MOVE должен исполняться последним

GTS
09.11.2017, 08:33
Всем спасибо за помощь, буду пробовать.

Max_Shepard
12.11.2017, 12:53
как в кодесис можно реализовать резервирование подсетей? Ситуация следующая. У меня на одном компьютере трудится ОРС сервер кодесис, и проект АРМ мастер скада. В ОРС сервере настроены две подсети до одного контрлоллера.34081 Мастер скада не позволяет резервировать подстеи в таком случае, только когда используется удалённый ОРС. можно ли в кодесис настроить одну группу тегов которая бы общалась с двумя подсетями и при выдёргивании одного из шнурков из адаптера автоматически подтягивал данные с другого адаптера?

Rednaxel
14.11.2017, 15:05
Довольно часто встречается вроде бы несложная ситуация: нужно управлять одним выходом по сигналу с 2х и более битовых переменных (например DI или ModBus), а также синхронизировать состояние этого выхода с управляющими переменными.
Сейчас решаю следующим способом:
34125

Оно конечно работает, но как то уж очень громоздко выходит: куча переменных и триггеров, а когда таких выходов много, разбираться становится тяжело, невольно вспоминается слово "быдлокод" ;)

Может быть есть более элегантное (эффективное) решение, подскажите пожалуйста?

Rednaxel
15.11.2017, 12:14
....
Сейчас решаю следующим способом: 34125

Оно конечно работает, но как то уж очень громоздко выходит: куча переменных и триггеров, а когда таких выходов много, разбираться становится тяжело, невольно вспоминается слово "быдлокод" ;)


Иногда достаточно спросить у кого-нибудь, чтобы додуматься самому ;)
В результате переделал алгоритм на ST и оформил в виде блока:
34130
Получилось 20 переменных и 20 строк -- уже веселее, хотя на мой взгляд все еще как на кировце огород пахать...
Let it be, поскольку других идей все равно больше нет.

(*Задаем начальные значения*)
Q_Set:=FALSE;
Q_SetBit:=FALSE;
Q_ReSet:=FALSE;
Q_ReSetBit:=FALSE;
(*Устанавливаем триггеры*)
RT01(CLK:=SwIn); (*Передний фронт SwIn*)
FT01(CLK:=SwIn); (*Задний фронт SwIn*)
RT01in(clk:=BitIn); (*Передний фронт BitIn*)
FT01in(clk:=BitIn); (*Задний фронт BitIn*)
RT01Sync(clk:=Sync_In); (*Передний фронт управляющей переменной для синхизации*)
FT01Sync(clk:=Sync_In); (*Задний фронт управляющей переменной для синхизаци*)

(*Анализируем триггеры*)
IF RT01.Q THEN Q_Set:=TRUE;
ELSIF FT01.Q THEN Q_ReSet:=TRUE;
ELSIF RT01in.Q THEN Q_Set:=TRUE;
ELSIF FT01in.Q THEN Q_ReSet:=TRUE;
ELSIF RT01Sync.Q THEN Q_SetBit:=TRUE;
ELSIF FT01Sync.Q THEN Q_ReSetBit:=TRUE;
END_IF

sosna
15.11.2017, 15:37
Добрый день. Имеем панель оператора СП 307, ПЛК 150 и ПЧВ-1 Овен. Плк используем в качестве мастера. Проблем со связью между ПЛК и СП нет, а вот
между ПЛК и ПЧВ нет. Настройки порта одинаковые. Лампочка на ПЧВ мигает, но при этом в конфигураторе кодесиса постоянно горит last error 81. Куда копать?34132

Rednaxel
15.11.2017, 16:56
Добрый день. Имеем панель оператора СП 307, ПЛК 150 и ПЧВ-1 Овен. Плк используем в качестве мастера. Проблем со связью между ПЛК и СП нет, а вот
между ПЛК и ПЧВ нет. Настройки порта одинаковые. Лампочка на ПЧВ мигает, но при этом в конфигураторе кодесиса постоянно горит last error 81. Куда копать?34132

Предлагаю копать в сторону проверки:
1) адрес устройства в настройках RS485 ПЛК и ПЧВ - должны совпадать, адрес ПЧВ должен быть уникальным, отличаться от адреса панели
2) скорость связи, битность, четность в настройках RS485 ПЛК и ПЧВ - должны совпадать
3) наличия оконечного резистора линии

99% случаев помогает. Если не помогает, можно применить метод "прослушки" линии с помощью RS485-RS232 преобразователя в компе + терминал.

sosna
16.11.2017, 07:56
Пункты 1 и 2 перепроверены 100 раз. Проблема не в этом. Валенок "С биб-ками - как 2 пальца." Можно поподробней.

sosna
16.11.2017, 09:14
ПЧВ имеет трудно реализуемые (при наличии еще кого-нить на линии) в штатном мастере особенности - такие же как и в ИП320 (см. там)

Валенок, скажите "трудно реализуемые" это значит, что с помощью штатного мастера не получится организовать связь между ПЛК и ПЧВ или
все таки каким то образом можно? Очень странно, что нет никакой информации от производителя по этому вопросу.

sosna
16.11.2017, 15:44
Всем спасибо. Если ПЧВ конфигурировать отдельным Modbus Master как это сделал я то связи нет. Если в состав Modbas Master панели оператора сконфигурировать Universal Modbus device с данными ПЧВ то связь с частотником начинает работать. Вот такие дела. Как то все кривовато.

ma4etos
21.11.2017, 08:53
Здравствуйте! Имеется проект на плк-110-24.30.к-м и 12 модулей. Организовано через модбас и 12 Universal modbas device. В определенный момент возникает ошибка 81 (last error) на одном из адресов. Помогает сброс плк на заводской и загрузка программы заново. Подскажите как это сделать в ПО. Заранее спасибо!

alex55
21.11.2017, 10:50
Адресацию сделать кратно 8, скорость опроса?,время цикла-5мс хотя бы? в конце линии резистор 100-120 Ом стоит? Какие типы модулей? Надо оптимизировать опрос, а сброс-последнее дело, зачем лишние проблемы..

ma4etos
21.11.2017, 13:37
Адресацию поменяю. Скорость опроса 115200 на всех модулях. Время цикла была 1мс сделал 10мс. Резистора нет - поставлю. Модули дискретные ввода/вывода МВ110-16Д(ДН), аналоговый модуль ввода МВ110-24.8АС.

alex55
21.11.2017, 15:36
Все верно,ну и как результат? Да, если модули далеко от плк (100метров). то скорость опроса лучше понизить.

эндрю
21.11.2017, 15:43
Добрый день!Решил попробовать управллять ПЧВ 103 4К0 ОВЕН через RS-485.Создал три регистра в Конфигурации ПЛК 34243, установил с диска библиотеку для работы с ПЧВ, в проекте использовал только два функциональных блока: блок командного слова и слова состояния 34244. Компилируеться нормально без ошибок но при попытке загрузить в ПЛК выскакивает вот это 34245 и после это 34246. И все . Что я не доделал или сделал не так?

эндрю
22.11.2017, 15:44
Подскажите, где взять функциональный блок Bits_to_Word?34267

capzap
22.11.2017, 15:55
Подскажите, где взять функциональный блок Bits_to_Word?34267

открыть документацию http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf и прочитать раздел: доступ к битам переменных и далее самостоятельно написать такой блок если понадобится

эндрю
22.11.2017, 16:26
Для не опытных как я прилагаю "бумагу" с подробной инструкцией как подключить частотник к ПЛК в пошаговом исполнении

tomas111
23.11.2017, 19:30
Подскажите как можно сделать регистрацию изменения состояния "true"-"false"-"true" и при втором "true" выходил сигнал с переменной "true".
Примерно схема и "алгоритм" следующий:
Ик приёмник, для состояния движения с перехода "true"-"false"-"true" на "true" выдавал сигнал в "true"
Ик всегда светит и приходит на ПЛК "true" если проходит движение (не важной какой длины) сигнал "false" при последующем появлении объекта "true" на переменной должен проходит "true" когда второй раз появился "true" в остальных случаях "false"... Что то както не понятно я написал...
Может данная схема поможет.
Самое главное начальное значение в переменной оно должно быть всегда в "false" а уже после регистрации меняться на "true"
Пока писал подумал может сделать счетчик и при каждом втором появлении "true" с ИК на выход "Q".... Или может есть какой то другой подход к данной задачи?
Спасибо.

amn
24.11.2017, 00:28
VAR
ik: BOOL;
peremen: BOOL;
f_trig_start: F_TRIG;
start: BOOL;
END_VAR


f_trig_start(CLK:=ik);
IF start THEN
peremen:=ik;
ELSE
peremen:=FALSE;
END_IF

IF f_trig_start.Q THEN
start:=TRUE;
END_IF

Dimensy
24.11.2017, 08:35
tomas111
Мой вариант
34282

tomas111
24.11.2017, 10:16
VAR
ik: BOOL;
peremen: BOOL;
f_trig_start: F_TRIG;
start: BOOL;
END_VAR


f_trig_start(CLK:=ik);
IF start THEN
peremen:=ik;
ELSE
peremen:=FALSE;
END_IF

IF f_trig_start.Q THEN
start:=TRUE;
END_IF


Мой вариант
34282

Спасибо!
Я сделал как и писал через счетчик! Хотя оба варианта оказались полезными! Буду иметь их ввиду!

Newcomer
29.11.2017, 20:49
Как отцепит верхний вход SUB от выхода AND и прицепить туда нижний вход SUB ?

petera
29.11.2017, 22:54
Форум БСДМ ? Математика на CFC.
Ткни мышом в место входа палок.

Не, это Математика на FBD.
Там палки не удаляются
34375

Ткнуть мышом на нижний вход SUB и вставить еще один AND. А верхний AND удалить

Newcomer
30.11.2017, 10:36
Спасибо, petera.

Cедой
30.11.2017, 21:21
Доброго времени суток!
Столкнулся вот с какой проблемой. ПЛК-73 в момент запуска начинает "перебирать" экран, как бы моргает, перебирает строки, плавно, спокойно, в отношении датчиков и исполнительных устройств - нет проблем. Успокаивается. И работает потом грамотно, все отлично, все значения соответствуют заданным и ожидаемым параметрам. Потом опять, время от времени, начинает "перемаргивать" экран (за час работы - раз пять/шесть). Для работы - не мешает, но как-то напрягает. Что-то с функцией очистки экрана? Намекните направление, вроде как чисто программный нюанс, которого не знаю.
Спасибо!

Newcomer
04.12.2017, 19:01
Как вычленить ФБ CTRL_PI из библиотеки OSCAT чтобы не тащить в проект всю библиотеку ? Иначе при компиляции возникает ошибка по причине большого количества ФБ.

serg_ingener
04.12.2017, 21:13
В конфигураторе ПЛК есть подэлемент Button . Для чего он ?

Dimensy
04.12.2017, 22:46
Как вычленить ФБ CTRL_PI из библиотеки OSCAT чтобы не тащить в проект всю библиотеку ? Иначе при компиляции возникает ошибка по причине большого количества ФБ.
Открыть в Codesys файл библиотеки и выполнить экспорт следующих ФБ: CTRL_PI, FT_PIWL и CTRL_OUT. А в своем проекте сделать импорт

Newcomer
05.12.2017, 11:18
Открыть в Codesys файл библиотеки и выполнить экспорт следующих ФБ: CTRL_PI, FT_PIWL и CTRL_OUT. А в своем проекте сделать импорт

Спасибо за ответ, только импортировать надо не 3, а 6 ФБ (см.вложение).

Rednaxel
07.12.2017, 13:12
В конфигураторе ПЛК есть подэлемент Button . Для чего он ?

Это кнопка "Старт/Cтоп" на передней панели ПЛК.
Добавление в конфигуратор элемента Button отключает функцию "Старт/Cтоп" и превращает кнопку в еще один вход, на который можно повесить какую-либо свою функцию.
Во избежание глюков (http://plc-blog.com.ua/owen-plc-110-60-bag-n2)и саботажа настоятельно рекомендуется добавлять элемент Button в КАЖДЫЙ проект.

serg_ingener
07.12.2017, 18:23
Это кнопка "Старт/Cтоп" на передней панели ПЛК.

Спасибо . У меня проблема , если отключить питание ПЛК100 на 2 мин. и включить , то simple-scada не востанавливает связь . Я так понял не стартует ПЛК . Поможет ли подэлемент Button .
Всё делал , согласно https://forum-ru.codesys.com/viewtopic.php?t=883 , кроме MatrikonOPC Explorer .

serg_ingener
09.12.2017, 21:10
Да всё сделал ! Ещё к ПЛК100 подключён МУ110-224.16Р но от другого БП . Может ли это повлиять ? ПЛК подключён к компу через Ethernet . Через модем к которому подключены ещё видеокамеры . Но при подключении к ПЛК программой CODESYS связь работает без проблем .

Алексей КИПОВЕЦ
10.12.2017, 19:34
Уважаемые специалисты форума. Никак не могу разобраться с функциональным блоком HEAT METER из бибилиотеки OSCAT. Есть ли у кого нибудь опыт работы с данным блоком. Применяю расходомер не импульсным входом а 4-20 мА. Не подскажите как адаптировать данный блок к моей задаче?

razv
14.12.2017, 09:55
Извиняюсь за банальный вопрос но что то меня заклинило
Могут ли два или более мастера обращаться к одному слейву Modbus TCP в ПЛК?
Поделят один порт?

petera
14.12.2017, 10:11
Извиняюсь за банальный вопрос но что то меня заклинило
Могут ли два или более мастера обращаться к одному слейву Modbus TCP в ПЛК?
Поделят один порт?

Можно в одном слейве сделать два и более портов TCP, и не только TCP, но и разных (RS232, RS485...)
34677

34678 34679

И оба мастера будут обращаться к одному слейву.

razv
14.12.2017, 10:24
Можно в одном слейве сделать два и более портов TCP, и не только TCP, но и разных (RS232, RS485...)

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

razv
14.12.2017, 11:14
И вот еще вопрос о иерархи областей ввода/вывода
34681
Я так понимаю что область ААА будет доступна из Modbus Master и Slave
А область BBB будет доступна только из Slave?

Rednaxel
14.12.2017, 13:16
Я так понимаю что область ААА будет доступна из Modbus Master и Slave
А область BBB будет доступна только из Slave?

Вот тут я не понял: Slave -- это когда ваш ПЛК "слушает" сеть и отвечает на запросы мастера, а Master -- это наоборот: опрос другого устройства. Как их можно объединить в одно?

petera
14.12.2017, 15:11
И вот еще вопрос о иерархи областей ввода/вывода
34681
Я так понимаю что область ААА будет доступна из Modbus Master и Slave
А область BBB будет доступна только из Slave?

Мастер в Слейв вставить можно, как впрочем и один Слейв в другой Слейв
Слейв в слейве работает "на ура"
Но если мастер встроить в слейв, то слейв реально видит(и читает и пишет) во вложенном мастере только модули Register output, а Register input всегда отображаются в слейве с нулевым содержимым
Вот тут более подробно описал
http://www.owen.ru/forum/showthread.php?t=14199&p=146969&viewfull=1#post146969

В вашем примере внешний мастер будет иметь доступ и к области ААА и к области ВВВ


Вот тут я не понял: Slave -- это когда ваш ПЛК "слушает" сеть и отвечает на запросы мастера, а Master -- это наоборот: опрос другого устройства. Как их можно объединить в одно?
Например данный ПЛК подключен в качестве слейва к SCADA.
Для SCADA слейв ПЛК будет межсетевым шлюзом, с помощью которого, SCADA сможет напрямую писать регистры модуля ВВ, подключенного к ПЛК (Область ААА). В этом случае не требуются какие-либо программные способы копирования данных между портом RS485 и портом TCP

razv
15.12.2017, 05:19
Вот тут я не понял: Slave -- это когда ваш ПЛК "слушает" сеть и отвечает на запросы мастера, а Master -- это наоборот: опрос другого устройства. Как их можно объединить в одно?

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

RV9WFJ
15.12.2017, 06:07
Раньше вложенность одного модуля в другой была описана в описании PLC Configuration от Овен. Но Master вложенный в Slave совершенно точно не работал и Овен это подтверждал. Возможно сейчас что-то изменилось - проверяйте. Я проверял еще на прошивке 2.14, с тех пор больше не экспериментировал с этим.

razv
15.12.2017, 09:23
Раньше вложенность одного модуля в другой была описана в описании PLC Configuration от Овен. Но Master вложенный в Slave совершенно точно не работал и Овен это подтверждал. Возможно сейчас что-то изменилось - проверяйте. Я проверял еще на прошивке 2.14, с тех пор больше не экспериментировал с этим.

Постараюсь проверить ближайшее время
Если это не работает то грустно - придется разносить мастер и слэйв по разным модулям и тратить процессорное время на присваивание одних переменных другим чтобы получить их в обоих модулях

razv
15.12.2017, 09:28
Мастер в Слейв вставить можно, как впрочем и один Слейв в другой Слейв

Вот тут более подробно описал
http://www.owen.ru/forum/showthread.php?t=14199&p=146969&viewfull=1#post146969



Не заметил сообщение сразу
Спасибо полезно
Но если верить инструкции то слейв без проблем должен видеть данный встроенного мастера

capzap
15.12.2017, 09:32
Постараюсь проверить ближайшее время
Если это не работает то грустно - придется разносить мастер и слэйв по разным модулям и тратить процессорное время на присваивание одних переменных другим чтобы получить их в обоих модулях

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

razv
15.12.2017, 09:39
зря Вы беспокоитесь за процессорное время, такая конструкция конфигуратора просто делает эту работу за программиста, а присвоение всё равно существует. Если хочется подумать над решением как сократить расходы, используйте указатель чтоб скопировать одной строчкой все переменные

В случае встроенности модулей друг в друга данные есть только в одном экземпляре внутри одного модуля и имеют конкретный адрес но доступны из нескольких модулей. Мне думается копирование в этом случае не происходит
А за указатели спасибо - это было бы проще

petera
15.12.2017, 09:42
Не заметил сообщение сразу
Спасибо полезно
Но если верить инструкции то слейв без проблем должен видеть данный встроенного мастера

Проблемы однако могут быть

если мастер встроить в слейв, то слейв реально видит(и читает и пишет) во вложенном мастере только модули Register output, а Register input всегда отображаются в слейве с нулевым содержимым
В мастере без проблем будет только все, что имеет в названии ...output

Иван2
15.12.2017, 23:01
Доброй ночи!
Может кто подскажет (потому как не могу найти) ссылку или пример работы с тревогами? В руководстве по программированию написано очень мало. Спасибо!

Rednaxel
17.12.2017, 13:06
Доброй ночи!
Может кто подскажет (потому как не могу найти) ссылку или пример работы с тревогами? В руководстве по программированию написано очень мало. Спасибо!

Иван, Вы не указали какой прибор используете? Поскольку исключительные события обычно требуют внимания оператора, обработка тревог делается в панели оператора. Свойства элементов "Окно тревог" и "Таблица тревог" довольно подробно описано в Руководстве пользователя для панелей СП3хх (http://www.owen.ru/uploads/sp3xx._rukovodstvo_polzovatelya_[1.1].pdf)". Для других панелей есть аналогичное описание.

Иван2
17.12.2017, 16:04
Rednaxel, спасибо!
У меня в наличии СПК207. Я думаю, если и будут отличия, то незначительные.

nartiwin
21.12.2017, 01:12
Помогите пожалуйста при использовании библиотеки ПЛК_ПЧВ не могу загрузить прект в ПЛК 150 И-М, выдаёт ошибку "неразрешённые ссылки на внешние POU"

RAF
21.12.2017, 10:05
Добрый день, приобрели оборудование с ПЛК-63. Возможно ли с помощью ПО скопировать и сохранить программу на компьютере, без ущерба работы ПЛК.
Спасибо.

Мастеренко Иван
21.12.2017, 10:08
Помогите пожалуйста при использовании библиотеки ПЛК_ПЧВ не могу загрузить прект в ПЛК 150 И-М, выдаёт ошибку "неразрешённые ссылки на внешние POU"

Необходимо открыть библиотеку ПЛК_ПЧВ.lib и сохранить её как внутреннюю (она сохранена как внешняя). После чего добавить её в менеджере библиотек.

nartiwin
21.12.2017, 10:26
Необходимо открыть библиотеку ПЛК_ПЧВ.lib и сохранить её как внутреннюю (она сохранена как внешняя). После чего добавить её в менеджере библиотек.

Спасибо большое, просто не давно начал работать с codesys, как сделать библиотеку внутренней? Потому что в менеджере библиотек я её добавил

Мастеренко Иван
21.12.2017, 11:27
Спасибо большое, просто не давно начал работать с codesys, как сделать библиотеку внутренней? Потому что в менеджере библиотек я её добавил

1. удалить текущую библиотеку ПЛК_ПЧВ.lib из менеджера библиотек
2. открыть ПЛК_ПЧВ.lib через приложение Codesys v2
3. нажать Файл >> Сохранить как >> Внутренняя биб-ка (*.lib)
4. добавить её в менеджер библиотек

Мастеренко Иван
21.12.2017, 16:27
Добрый день, приобрели оборудование с ПЛК-63. Возможно ли с помощью ПО скопировать и сохранить программу на компьютере, без ущерба работы ПЛК.
Спасибо.

На ПЛК63 можно получить только компилированный файл через программу тиражирования - ссылка: http://www.owen.ru/catalog/codesys_v2/72830689. Исходник в формате .pro выкачать нельзя.

ittriy
21.12.2017, 20:54
Всем здравствуйте! стоит задача по модернизации электрооборудования станка, и застрял я на узле задания скорости: необходима плавная регулировка скорости (аналоговое задание от переменных резисторов) раздельная для хода вперед и хода назад, снижение скорости движения по командам от концевых выключателей 0-25-30-50-75-100%.
Как выполнить изменение задания контроллером по команде от дискретных входов? Управление частотником планирую по Modbus, т.е. на входе сигналы: раздельное задание ход вперед/ход назад (REAL), команды замедления и реверса(BOOL), на выходе задание для частотника (WORD или REAL). Подскажите в каком направлении двигаться, какие стандартные блоки использовать - буду рад любому совету.

sosna
22.12.2017, 14:00
Всем здравствуйте! стоит задача по модернизации электрооборудования станка, и застрял я на узле задания скорости: необходима плавная регулировка скорости (аналоговое задание от переменных резисторов) раздельная для хода вперед и хода назад, снижение скорости движения по командам от концевых выключателей 0-25-30-50-75-100%.
Как выполнить изменение задания контроллером по команде от дискретных входов? Управление частотником планирую по Modbus, т.е. на входе сигналы: раздельное задание ход вперед/ход назад (REAL), команды замедления и реверса(BOOL), на выходе задание для частотника (WORD или REAL). Подскажите в каком направлении двигаться, какие стандартные блоки использовать - буду рад любому совету.

Для изменения задания скорости в частотнике используйте элементы SEL и MOVE

ittriy
22.12.2017, 19:37
Попробую может будет интереснее чем получилось у меня, сегодня сделал блок на языке ST в общем то получилось все как хотел, на эмуляторе работает.

never77
03.01.2018, 02:48
Доброго времени суток!
Возможно ли в codesys 2.3 изменить размеры значков или масштаб самой программы? Проблема - на ноутбуке 12.5 дюймов и 1920х1080
Заранее Спасибо!

ASo
03.01.2018, 11:23
Можно. Колесико мышки при нажатом Ctrl.

never77
03.01.2018, 18:47
Можно. Колесико мышки при нажатом Ctrl.
Я имел ввиду не рабочую область, а сам интерфейс...
34920

never77
06.01.2018, 00:31
Ладно, с интерфейсом вопрос не решить...

Купил плк100 для автоматизации самодельной покрасочной камеры и горелки в ней...
На данный момент застрял на моменте, может быть кто поможет - имеем два воздушных компрессора, первый производительный и макс. давление 7 бар.
Второй менее производительный, но макс. давление - 10 бар.
Алгоритм вижу такой - выбираем приоритет одного из двух компрессоров, управляю фб гистерезиса из oscat_333.
Далее, циклически, смотрим давление и записываем в переменную prs1, через n секунд записываем актуальное значение давления в prs2 и сравниваем prs1 и prs2 - если (prs2 - prs1) > x, тогда подключаем второй "не приоритетный" компрессор, пока не накачаем до уставки.
Вот на этом моменте встрял, может быть кто-нибудь реализовывал подобный алгоритм?

П.с. прошу сильно не пинать, до этого имел опыт только с avr в виде ардуины, но это совсем не пром. решение..

_Mikhail
06.01.2018, 15:20
посмотри библиотеку cascade.lib

never77
06.01.2018, 17:35
посмотри библиотеку cascade.lib

Не могу ее найти.

ахметыч
10.01.2018, 23:29
Уважаемы друзья, всех с наступившими праздниками. В наступившем году всем удачных и хорошо оплачиваемых проектов .
Ув. знатоки подскажите, что значит эта ошибка или предупреждение ? плк 110 скрин во вложении

Rednaxel
12.01.2018, 10:12
Уважаемы друзья, всех с наступившими праздниками. В наступившем году всем удачных и хорошо оплачиваемых проектов .
Ув. знатоки подскажите, что значит эта ошибка или предупреждение ? плк 110 скрин во вложении

В принципе ничего страшного. Просто ваши изменения в программе (например в конфигурации ПЛК) затронули адресацию памяти. Выполните команду Онлайн - Сброс и все будет в порядке.


T0D0: Переменные онлайн-изменения
T0D0: 1 перемещаются в новые позиции памяти! Указатели на сдвинутых переменных указывают на нездоровую память.
Вы хотите продолжить?
Список затронутых переменных: - PLC_PRG.wegfwege

ахметыч
12.01.2018, 21:29
В принципе ничего страшного. Просто ваши изменения в программе (например в конфигурации ПЛК) затронули адресацию памяти. Выполните команду Онлайн - Сброс и все будет в порядке.


T0D0: Переменные онлайн-изменения
T0D0: 1 перемещаются в новые позиции памяти! Указатели на сдвинутых переменных указывают на нездоровую память.
Вы хотите продолжить?
Список затронутых переменных: - PLC_PRG.wegfwege

спасибо...

ахметыч
14.01.2018, 13:36
доброго дня, подскажите можно ли программно отключать опрос по Modbus RS-485.?

ASo
14.01.2018, 13:51
В конфигураторе? Невозможно.

Sargon
19.01.2018, 09:48
Здравствуйте, подскажите, в проекте планирую использовать модуль ввода МВ 110-224.ХTД (модуль ввода аналогового сигнала тензодатчика). Проект связан с автоматизацией весового терминала. Сигнал с модуля должен приходить на счетчик CTU. Согласно Руководства пользователя модуля ввода, сигнал выходящий из него -аналоговый, а тип данных - REAL ( данные в формате с плавающей запятой) , правильно ли я понимаю изложенное? Как преобразовать REAL в BOOL, что бы счетчик принимал данные от модуля ввода и их обрабатывал?

capzap
19.01.2018, 10:00
Здравствуйте, подскажите, в проекте планирую использовать модуль ввода МВ 110-224.ХTД (модуль ввода аналогового сигнала тензодатчика). Проект связан с автоматизацией весового терминала. Сигнал с модуля должен приходить на счетчик CTU. Согласно Руководства пользователя модуля ввода, сигнал выходящий из него -аналоговый, а тип данных - REAL ( данные в формате с плавающей запятой) , правильно ли я понимаю изложенное? Как преобразовать REAL в BOOL, что бы счетчик принимал данные от модуля ввода и их обрабатывал?

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

Rednaxel
19.01.2018, 10:10
... Сигнал с модуля должен приходить на счетчик CTU. ...
Полагаю человеку нужно подсчитывать количество измерений или отслеживать момент когда вес больше определенного значения?
И в какое устройство подключен модуль? Sargon уточните задание.

Sargon
19.01.2018, 10:17
Полагаю человеку нужно подсчитывать количество измерений или отслеживать момент когда вес больше определенного значения?
И в какое устройство подключен модуль? Sargon уточните задание.

Совершенно верно, отмерить вес и остановить загрузку. Модуль -ПЛК110.

Rednaxel
19.01.2018, 10:56
Совершенно верно, отмерить вес и остановить загрузку
А еще подробнее, можно? Вот вы видимо получаете из модуля в ПЛК по RS485 значения измерений типа REAL, так?
В какой момент фиксировать показания? Что дальше с ними делать, с чем сравнить, нужно ли записывать, показывать?
Что значит "остановить загрузку"? У вас там что-то засыпается/наливается и нужно перекрыть заслонку когда "хватит"?
И на каком языке программу пишете в ПЛК?
Телепатически способности что-то еще не проснулись сегодня :)

Sargon
19.01.2018, 11:18
Задача такая - из бункера с инертным материалом. после открытия сегментного затвора, в корыто скипа насыпается материал, рама скипа, на которой в момент погрузки стоит корыто, подвешена на S -образных тензодатчиках. Сигнал с тензодатчика приходит на Модуль ввода и оттуда в ПЛК, который принимает сигнал от модуля, сравнивает его с уставкой и дает команду на закрытие затвора на пневмораспределитель. Редактор CFC. Возможно я ошибаюсь в подборе аппаратных средств или алгоритма реализации в программе, опыта практически нет в этой области, но желание освоить эту область знаний есть. Поэтому прошу подсказать как реализовать мою задачу.

Rednaxel
19.01.2018, 13:06
Из того что вы описали у меня получилось что-то типа такого:
35201
для простоты предполагается что затвор закрывается когда Zatvor=TRUE и открывается когда Zatvor=FALSE.

Счетчик CTU здесь действительно ни к чему. Разве только Вы захотите подсчитать сколько, было загрузок за смену, например.

Sargon
19.01.2018, 13:22
Согласен с вами. Вместо счетчика нужно использовать оператор сравнения, "больше или равно".А с модуля ввода сигнал как я понимаю аналоговый по типу REAL?

Rednaxel
19.01.2018, 13:43
А с модуля ввода сигнал как я понимаю аналоговый по типу REAL?
Точнее модуль оцифровывает аналоговый сигнал от тензодатчиков и передает его по RS-485 дальше в формате с плавающей запятой REAL (http://plc24.ru/elementarnye-tipy-dannyx-codesys/).
Советую также изучить примеры применений приборов в каталоге owen, в частности пример
Автоматизация линии весового дозирования сыпучих материалов (http://www.owen.ru/projects/85669582/about)

Sargon
19.01.2018, 13:53
Благодарю.

never77
20.01.2018, 00:44
Доброго времени суток, как писал ранее - пытаюсь автоматизировать работу двух воздушных компрессоров, если один не справляется(Основной выбирается переключателем, Comp1_pr и Comp2_pr), то второй подхватывает. Те если за CYCLE_TIME давление не поднимется больше, чем PRESSURE_DELTA, тогда включаем второй компрессор. Счетчики в скриншотах для отладки.
Этот ФБ работает, но я уверен, что это "быдлокод" и задача решается намного проще. Есть идеи/наработки?
35213
35214
35215

PS ввод аналогового сигнала с модуля icp I_7017, пример смотрел, все настройки выставил как в примере, единственное - в примере analog output, у меня соответственно - analog input, поставил float, значения не меняются....
Мб есть у кого пример считывания аналоговых сигналов по dcon с icp? В поиске про аналоговые сигналы пусто.

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

bard177
20.01.2018, 02:26
Доброго дня! знаю, что в визуализации Codesys 2.3 можно запустить файл exe или bat путём нажатия на кнопку или другой элемент. Подскажите, возможно ли сделать то же самое одним лишь изменением значения переменной типа BOOL в программе, либо иным подобным способом, и как это сделать ? Заранее спасибо.

RV9WFJ
20.01.2018, 06:08
А зачем вам в CS2.3 это делать? Там нет Linux-a у ПЛК. Боюсь вы путаете с CS3.5

bard177
21.01.2018, 01:41
Спасибо за ответ. Существует необходимость периодически чистить архив файлов .trd , которые создаёт элемент trend, т.к. более 50 дней истории cs2.3 не поддерживает. Т.е. каждые 50 дней нужно запускать батник, автоматически удобнее, чем через кнопку. Через планировщик windows тоже не везде удобно, хотелось бы всё делать из кодесиса.

capzap
21.01.2018, 08:27
Спасибо за ответ. Существует необходимость периодически чистить архив файлов .trd , которые создаёт элемент trend, т.к. более 50 дней истории cs2.3 не поддерживает. Т.е. каждые 50 дней нужно запускать батник, автоматически удобнее, чем через кнопку. Через планировщик windows тоже не везде удобно, хотелось бы всё делать из кодесиса.

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

Rednaxel
23.01.2018, 09:24
Здравствуйте! Столкнулся с некоторыми трудностями в реализации FB, связанными, очевидно с непониманием особенностей его работы и отличиями от PRG.

В частности озадачила фраза из CodeSys manual:
Функциональный блок - это POU, который принимает и возвращает произвольное число значений. В отличие от функции функциональный блок не формирует возвращаемое значение. Первая часть понятна, а вот что означает "не формирует значение"? А кто его формирует? :eek:
Подскажите пожалуйста: на какие основные отличия и особенности ФБ стоит обратить внимание новичку?

capzap
23.01.2018, 09:33
а вот что означает "не формирует значение"? А кто его формирует? :eek:
Подскажите пожалуйста: на какие основные отличия и особенности ФБ стоит обратить внимание новичку?
в функции, кроме раздела VAR_OUTPUT, выставляется возвращаемое значение и поэтому можно переменной присвоить его, например value := getFunction(). С ФБ такая конструкция не будет работать

Дмитрий021
23.01.2018, 09:55
Добрый день. ПЛК 160 слейв, ОПС-Мастер опс. Нужно считать 16 переменных, с 0 по 16-17 регистры (15 переменных по 2 байта и 1 на 4 байта). С выравниванием памяти разобрался, а вот какой тип регистра вписывать не пойму - INPUT или HOLDING?

capzap
23.01.2018, 10:00
Добрый день. ПЛК 160 слейв, ОПС-Мастер опс. Нужно считать 16 переменных, с 0 по 16-17 регистры (15 переменных по 2 байта и 1 на 4 байта). С выравниванием памяти разобрался, а вот какой тип регистра вписывать не пойму - INPUT или HOLDING?

плк откликается на обе функции, но правильнее HOLDING

kost2
23.01.2018, 11:46
Есть два стенда абсолютно одинаковых, но на одном плк-110 старый, на другом плк-110 м02, приходится поддерживать две программы различающиеся только целевой платформой, поскольку при смене платформы конфигурация плк очищается. Есть ли более удобный и правильный путь?

capzap
23.01.2018, 11:51
Есть два стенда абсолютно одинаковых, но на одном плк-110 старый, на другом плк-110 м02, приходится поддерживать две программы различающиеся только целевой платформой, поскольку при смене платформы конфигурация плк очищается. Есть ли более удобный и правильный путь?

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

GTS
25.01.2018, 11:31
Добрый день. Подскажите как с помощью широковещательной команды записать на несколько СМИ-2? Вроде сделал все правильно (причем на контроллере другого производителя работает) но выдает ошибку 81. Может у кого есть пример, буду благодарен.35278

Виталий Михайлик
26.01.2018, 07:08
Добрый день, подскажите пожалуйста
Имеется контроллер ПЛК110-60 и панель Weintek, контроллер Slave панель Master
Задача задавать некое количество уставок по току и времени и передавать их в ПЛК,
Первоначально задачи ввода уставок с панели не было и уставка типа REAL задавалась в самой программе ПЛК
как первоначальное значение с записью в память (поставил галочку RETAIN) у переменной и все было хорошо.
Теперь когда появилась задача задать уставку с панели, попробовал через MOVIE передать значение с панели в переменную
уставки в панели, но возникает такая проблема, так как уставка с панели имеет нулевое значение и записывает это нулевое значение
в переменную уставки и таким образом пока мы не ввели уставку с панели имеем нулевое значение в программе

capzap
26.01.2018, 07:36
Добрый день, подскажите пожалуйста
Имеется контроллер ПЛК110-60 и панель Weintek, контроллер Slave панель Master
Задача задавать некое количество уставок по току и времени и передавать их в ПЛК,
Первоначально задачи ввода уставок с панели не было и уставка типа REAL задавалась в самой программе ПЛК
как первоначальное значение с записью в память (поставил галочку RETAIN) у переменной и все было хорошо.
Теперь когда появилась задача задать уставку с панели, попробовал через MOVIE передать значение с панели в переменную
уставки в панели, но возникает такая проблема, так как уставка с панели имеет нулевое значение и записывает это нулевое значение
в переменную уставки и таким образом пока мы не ввели уставку с панели имеем нулевое значение в программе

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

Виталий Михайлик
26.01.2018, 08:15
MOVIE это команда присвоения в кодесис, этой командой я присваиваю значение глобальной переменной из области памяти контроллера,
которую использую для обмена с панелью в локальную переменную в программе, проблема в том что после запуска программы значение этой
глобальной переменной равно 0, так как уставка с панели не введена, вопрос тогда можно ли задать в изибилдере значение по умолчанию (которое)
будет передано в контроллер сразу после запуска?

capzap
26.01.2018, 08:18
тогда какой смысл в ретайнах? Не пишите из панели если это не нужно, а только читайте постоянно, когда оператору потребуется сменить показания, тогда и осуществляйте запись

Виталий Михайлик
26.01.2018, 09:28
Спасибо всем, вопрос решил
Данные после ввода в панель в ней же и сохраняются даже после отключения питания

Sargon
29.01.2018, 08:37
Прошу помощи в вопросе программной реализации задачи по созданию каталога рецептов и их выбора с последующим занесением в ячейку уставки. Предварительно: планирую автоматизировать собственное БСУ, программа CFC, задача - создать список рецептов бет.смеси, выбор рецепта и перенос данных из рецепта в ячейки уставки. Как решить программно?

petera
29.01.2018, 09:45
Прошу помощи в вопросе программной реализации задачи по созданию каталога рецептов и их выбора с последующим занесением в ячейку уставки. Предварительно: планирую автоматизировать собственное БСУ, программа CFC, задача - создать список рецептов бет.смеси, выбор рецепта и перенос данных из рецепта в ячейки уставки. Как решить программно?

Может поможет http://www.owen.ru/forum/showthread.php?t=22665&p=186999&viewfull=1#post186999

Rednaxel
29.01.2018, 12:13
Прошу помощи в вопросе программной реализации задачи по созданию каталога рецептов и их выбора с последующим занесением в ячейку уставки....
Petera предложил интересный вариант, пригодится спасибо! Но выглядит немного страшновато для новичка ИМХО.
Есть вариант попроще, пожалуй: в новых сенсорных панелях ОВЕН СП3хх реализована работа с рецептами, если есть панель конечно.
Смотри примеры (http://www.owen.ru/catalog/sensornie_paneli_operatora_oven_sp3xx/95184166).

Sargon
29.01.2018, 12:52
Да уж, без 100 грамм не разберешься.

petera
29.01.2018, 12:59
Petera предложил интересный вариант, пригодится спасибо! Но выглядит немного страшновато для новичка ИМХО.
Есть вариант попроще, пожалуй: в новых сенсорных панелях ОВЕН СП3хх реализована работа с рецептами, если есть панель конечно.
Смотри примеры (http://www.owen.ru/catalog/sensornie_paneli_operatora_oven_sp3xx/95184166).

Я бы не советовал пример работы с рецептами от ОВЕН.
Мутный он, и в нем есть существенные ошибки.

Rake Runner
29.01.2018, 13:05
А пример от петеры - образец кристальной ясности, лол.

Sargon
29.01.2018, 13:12
Прошу прощения за дурацкий вопрос, но объясните мне структуру ((алгоритм), если можно схематично), всего того что написано. Т.е. откуда все начинается, и чем заканчивается, чтобы понять принцип формирования алгоритма решения моей задачи.

petera
29.01.2018, 13:13
А пример от петеры - образец кристальной ясности, лол.

Мои примеры по крайней мере работают и никого не вводят в заблуждение.

Rake Runner
29.01.2018, 13:54
Мои примеры по крайней мере работают и никого не вводят в заблуждение.

Т.е. пример от Овена не работает? Насколько помню - запускал его в эмуляторе, ничего неожиданного не увидел.

petera
29.01.2018, 14:59
Т.е. пример от Овена не работает? Насколько помню - запускал его в эмуляторе, ничего неожиданного не увидел.

Что касается примера для работы с рецептами от ОВЕН, то в нем никакой практической пользы нет - гоняются данные между регистрами PSW и PFW. А ведь в самой панели нет никаких проблем обращаться сразу к нужным регистрам PFW.
Само предназначение механизма работы с рецептами трактуется не верно.
Кроме того перепутаны назначения кнопок Запись в рецепт и Чтение из рецепта. А это точно введет в ступор начинающего.
А мои замечания пятилетней давности по этому поводу еще для СП270 просто похерили и удалили пример с описанием после выхода СП3хх http://www.owen.ru/forum/showthread.php?p=90620#post90620
35324

Практический пример работы с рецептами.
Рецепты в панели хранятся в выделенной пользователем памяти PFW в виде непрерывной области регистров
(1-ый параметр 1-ого рецепта)
(2-ой параметр 1-ого рецепта)
......................................
(N-ый параметр 1-ого рецепта)
========================
(1-ый параметр 2-ого рецепта)
(2-ой параметр 2-ого рецепта)
......................................
(N-ый параметр 2-ого рецепта);
========================
...........................................
...........................................
(1-ый параметр K-ого рецепта)
(2-ой параметр K-ого рецепта)
......................................
(N-ый параметр K-ого рецепта);

Размер памяти PFW для рецептов N*K

Имеется системный регистр PSW40 в котором хранится индекс (номер рецепта) от 0 до K-1.
PSW40 задействован в работе кнопок и функций Запись в рецепт и Чтение из рецепта.
35323
В слейве ПЛК нужен набор регистров только для одного рецепта.
Например
35325

Панель.
Экране редактирования рецептов
35326
Для указанного набора параметров для одного рецепта понадобится 24 регистра PFW
Пусть рецепты хранятся в регистрах PFW начиная с PFW300. Всего рецептов - 9
Тогда
первый рецепт PFW300..PFW323
второй рецепт PFW324..PFW347
третий рецепт PFW348..PFW371
............................
девятый рецепт PFW468..PFW491

Вывод и редактирования значения параметров текущего рецепта осуществляется непосредственно на экране панели.
В элементах ц.ввода используется "базовые" адреса регистров первого рецепта и динамическая адресация через индексный регистр PSW40. Коэффициент(множитель) индексной адресации - 24(число единичных регистров в одном рецепте)
35327
Таким образом изменяя индексный регистр PSW40 от 0 до 8 можно вывести любой из 9 рецептов на экран.
Менять индексный регистр(номер рецепта) можно например кнопками "Операции с данными"

35328 35329

Названия рецептов тоже хранятся в PFW, но за областью самих рецептов, начиная с PFW492. Для каждого названия отводится 10 регистров(длина строки - 20 символов)
Здесь тоже используется динамическая адресация через PSW40, но коэффициент(множитель) индексной адресации - 10(длина строки - 20 символов). Напоминаю, что названия рецептов находятся в другом блоке регистров PFW - вне области данных самих рецептов.
35333

Запись выбранного рецепта в ПЛК
35334 35335

Rake Runner
29.01.2018, 15:07
Что касается примера для работы с рецептами от ОВЕН, то в нем никакой практической пользы нет - гоняются данные между регистрами PSW и PFW. А ведь в самой панели нет никаких проблем обращаться сразу к нужным регистрам PFW.
Само предназначение механизма работы с рецептами трактуется не верно.
Кроме того перепутаны назначения кнопок Запись в рецепт и Чтение из рецепта. А это точно введет в ступор начинающего.

Так он не работает или вы не видите в нем практической пользы? Это все же, согласитесь, разные вещи.
По поводу практической пользы - по-моему, глядя на пример нет сложности поменять в нужном месте регистры панели на регистры ПЛК или наоборот.
Кому-то удобнее хранить рецепты в ПЛК, кому-то в панели (и загружать их с флэшек, как я, например), кому-то может быть - вообще в обоих устройства сразу. Универсальный пример был бы, скорее всего, сложен и непонятен для новичков.

По поводу названий кнопок - я сейчас ради интереса скачал пример овена, и вижу, что при нажатии на кнопку Записать рецепт добавляются данные в таблицу (которая видимо представляет собой отображение данных всех рецептов).
С чтением не разбирался, как оно в примере реализовано, но вроде тоже работает.

Поэтому ваши плевки в сторону Овен выглядят, мягко говоря, странновато.

За альтернативный пример спасибо - на досуге поизучаю.

petera
29.01.2018, 15:19
Так он не работает или вы не видите в нем практической пользы? Это все же, согласитесь, разные вещи.
По поводу практической пользы - по-моему, глядя на пример нет сложности поменять в нужном месте регистры панели на регистры ПЛК или наоборот.
Кому-то удобнее хранить рецепты в ПЛК, кому-то в панели (и загружать их с флэшек, как я, например), кому-то может быть - вообще в обоих устройства сразу. Универсальный пример был бы, скорее всего, сложен и непонятен для новичков.

По поводу названий кнопок - я сейчас ради интереса скачал пример овена, и вижу, что при нажатии на кнопку Записать рецепт добавляются данные в таблицу (которая видимо представляет собой отображение данных всех рецептов).
С чтением не разбирался, как оно в примере реализовано, но вроде тоже работает.

Поэтому ваши плевки в сторону Овен выглядят, мягко говоря, странновато.

За альтернативный пример спасибо - на досуге поизучаю.

В таблице как раз и находятся рецепты в PFW регистрах
35336
Так что куда кого загружаем?
И если заменить PSW на 4х, то полная фигня получится.
Из ПЛК в рецепты панели? А смысл где?
Это не плевки, а констатация факта

Само предназначение механизма работы с рецептами трактуется не верно.
Кроме того перепутаны назначения кнопок Запись в рецепт и Чтение из рецепта

Rake Runner
29.01.2018, 15:25
Я это вижу как рабочий пример создания оператором рецептов с дисплея панели и сохранения (записи) их в память панели.
А также отображения рецептов, хранимых в панели на ее дисплее (чтение рецетов).

Передать их куда-то еще - не составит труда.

Рецепты у меня в первую очередь ассоциируются со способом хранения и представления данных, а вопрос обмена с ПЛК - это уже отдельная история.

Rednaxel
30.01.2018, 21:33
Прошу прощения за дурацкий вопрос, но объясните мне структуру ((алгоритм), если можно схематично), всего того что написано. Т.е. откуда все начинается, и чем заканчивается, чтобы понять принцип формирования алгоритма решения моей задачи.
Думается, пока не применишь теорию, мало что поймешь. Посему предлагаю разобрать конкретно вашу задачу, заодно может быть и спор на тему какое решение лучше разрешится ко всеобщей пользе. Согласны?

Если "Да", то приведите конкретный пример вашего рецепта (ов). Сколько и какие компоненты задействованы? Что подразумевается под уставкой? Есть ли в проекте панель оператора и какая? Какой ПЛК? Ну и т.д

Sargon
02.02.2018, 09:09
А почему нельзя сделать выбор рецептов через операцию MUX, т.е. на вход подаем номер компонента блока (количество компонентов любое, и в них занесены данные в числовом формате), выбрав компонент, он попадает на выход и далее на обработку в блок "=" или ">=" и далее на следующий блок в обработку. В принципе эту схему я реализовал. скрин выложу позже, он на другом компе. Кстати, в CFC как создать массив данных? Ну то, что его нужно объявить в области объявлений это понятно, а как в области размещения схем. В принципе блок MUX схож с массивом по структуре. Почему интересуюсь массивом, хочу его вставить в визуализацию, в таблицу. Поправьте если не прав.

obivan133
04.02.2018, 11:11
Здравствуйте, уважаемы коллеги, помогите, не знаю, в какой раздел обратиться. Не могли бы вы предоставить рабочую программу с PID-регулятором в программной среде STEP-7?

IVM
04.02.2018, 12:48
Здравствуйте, уважаемы коллеги, помогите, не знаю, в какой раздел обратиться. Не могли бы вы предоставить рабочую программу с PID-регулятором в программной среде STEP-7?

Тебе лучше сюда: http://asutpforum.ru/viewforum.php?f=159

Sargon
04.02.2018, 22:03
По поводу таблицы рецептов. Вот пример (переменные условные, графика тоже,но за основу взять можно.)Если в ПП процессе небольшое количество рецептов. Реализация на основе внутренней визуализации . Без панели оператора.

https://yadi.sk/i/bq2drQYY3S5zMX

fren
05.02.2018, 19:53
Как настроить обмен плк100 с УРЖ2км?
Через modbus?

_Mikhail
05.02.2018, 22:16
Как настроить обмен плк100 с УРЖ2км?
Через modbus?

А что, Modbus не устраивает? карта регистров у производителя есть. Подключай и опрашивай

kot.shrodingera
06.02.2018, 06:50
Можно ли в CoDeSys V2.3 используя модуль Modbus Slave отвечать на запросы по функции 0x03, а не 0x04, как по умолчанию?

petera
06.02.2018, 10:28
Можно ли в CoDeSys V2.3 используя модуль Modbus Slave отвечать на запросы по функции 0x03, а не 0x04, как по умолчанию?
В модуле слейв ПЛК поддерживаются обе функции.
Т.е. мастер может читать регистры и функцией 0x03 и функцией 0x04, слейву - все равно.

kot.shrodingera
06.02.2018, 11:03
В модуле слейв ПЛК поддерживаются обе функции.
Т.е. мастер может читать регистры и функцией 0x03 и функцией 0x04, слейву - все равно.

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

Зинько Владислав
06.02.2018, 11:23
Можно ли в CoDeSys V2.3 используя модуль Modbus Slave отвечать на запросы по функции 0x03, а не 0x04, как по умолчанию?

Добрый день.

Да, можно. Модуль отвечает как на функцию 0x04, так и на функцию 0x03.

capzap
06.02.2018, 11:24
Но тогда разные адресные пространства для функций 3 и 4 нельзя реализовать?
нет желания прояснить, зачем этот маразм?

kot.shrodingera
06.02.2018, 11:34
нет желания прояснить, зачем этот маразм?

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

capzap
06.02.2018, 11:48
Потребности такой нет, просто интересуюсь. Как я понял из описания протокола, под разные функции выделяются разные регистры. Ну и вдруг будет ситуация, когда у слейва должны быть регистры, в которые можно записывать, и в которые нельзя

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

petera
06.02.2018, 11:50
Потребности такой нет, просто интересуюсь. Как я понял из описания протокола, под разные функции выделяются разные регистры. Ну и вдруг будет ситуация, когда у слейва должны быть регистры, в которые можно записывать, и в которые нельзя

Не всегда разные, https://sites.google.com/site/fieldbusbook/seti/modbus/modbuseducation

MBAP определяет вобщем 4-ре зоны (области) данных (переменных):
- Discrete Inputs (начиная с 10001), или область дискретных входов (входных битов)
- Coils (начиная с 00001), или область дискретных выходов (выходных битов)
- Input Registers (начиная с 30001), или область входных регистров (аналоговых входов)
- Holding Registers (начиная с 40001), или область выходных регистров (аналоговых выходов)
Таким образом, согласно MODBUS можно прочитать значение входных регистров и битов, прочитать или записать значение выходных регистров и битов. Следует отметить, что эти зоны памяти были доступны в ранних контроллерах MODICON, для которых и был разработан протокол. В этих контроллерах непривязаные к физическим выходам выходные перемнные (Coils и Holding Registers) можно было использовать как внутренние.
НО: в разных реализациях MODBUS, эти зоны могут интерпритироваться по разному, это не запрещается стандартами MODBUS.ORG
ПО-ЭТОМУ: для каждого конкретного устройства в документации определено отображение областей переменных MODBUS на его область данных.
Иными словами стандарт не определяет, к каким именно данным в конкретном устройстве вы будете доступаться, обращаясь к одной из зон памяти, это будут определять правила отображения, придуманные ... разработчиком устройства.
35425

В ПЛК ОВЕН сделано именно по 2 варианту - Все зоны накладываются на одно адресное пространство.
35427
Так например, записывая значение 2 в переменную (ячейку) 4x0001 вы одновременно меняете 3x0001=2 и 0x0002=TRUE и 1x0002=TRUE.

Про эту особенность есть замечательная картинка из руководства по конфигурированию ПЛК ОВЕН
http://www.owen.ru/forum/attachment.php?attachmentid=12345&d=1395648726