PDA

Просмотр полной версии : CODESYS V3.5. Вопросы и ответы



Страницы : 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

Yegor
08.12.2015, 08:47
Автоматическое скачивание отсутствующих библиотек у всех работает? У меня не пашет что-то.Если кто ещё столкнётся, то поменяйте https:// на http:// в файле AppData/Roaming/CoDeSys/CoDeSys.opt.

Yegor
08.12.2015, 14:12
Если кто ещё столкнётся, то поменяйте https:// на http:// в файле AppData/Roaming/CoDeSys/CoDeSys.opt3S подтвердили (http://forum.codesys.com/viewtopic.php?f=11&t=6572#p13592) наличие проблемы в самом кодесисе. Советуют либо обновиться, либо подождать исправления.

ntro123
10.12.2015, 17:45
Функции библиотеки CAA DTutil должны вам помочь, как мне кажется.

http://www.owen.ru/forum/showthread.php?t=21476&p=174357&viewfull=1#post174357

Спасибо! то что нужно! И конкатенация даты есть из чисел ;)

Vitorgan
13.12.2015, 17:59
Уважаемые форумчане, подскажите начинающему, версия CODESYS V3.5 SP4 Patch 5, при попытке соединить СПК с ЧП Веспер, создаю каналы с нужными мне регистрами, и встречаюсь с такой проблемой, что не могу добавить их больше 10, т.к. кнопка "добавить канал" становиться "каменной". Подскажите что делать. Заранее благодарен за помощь.

Евгений Кислов
13.12.2015, 19:31
Уважаемые форумчане, подскажите начинающему, версия CODESYS V3.5 SP4 Patch 5, при попытке соединить СПК с ЧП Веспер, создаю каналы с нужными мне регистрами, и встречаюсь с такой проблемой, что не могу добавить их больше 10, т.к. кнопка "добавить канал" становиться "каменной". Подскажите что делать. Заранее благодарен за помощь.

Можно либо поставить версию 3.5 SP5 Patch5 или выше, либо же пропатчить вашу:
http://www.owen.ru/forum/showthread.php?t=21365&page=24&p=187909&viewfull=1#post187909

SokolovA
13.12.2015, 19:52
Добрый вечер!

А как сделать в элементах управления Label или TextField автоматический перенос строк?
Есть Text List, некоторые значения которого заведомо не помещаются на одну строку TextField, разбивать сам он их не хочет.

Евгений Кислов
13.12.2015, 20:00
Добрый вечер!

А как сделать в элементах управления Label или TextField автоматический перенос строк?
Есть Text List, некоторые значения которого заведомо не помещаются на одну строку TextField, разбивать сам он их не хочет.

В Text List используйте Ctrl+Enter, чтобы делать многострочные тексты.

SokolovA
13.12.2015, 21:29
В Text List используйте Ctrl+Enter, чтобы делать многострочные тексты.
Спасибо! До WordWrap видимо доберемся к четвертой версии CDS.

SokolovA
14.12.2015, 16:20
Добрый день!

Как сделать перенос строки в переменной, что-то навроде Str:STRING:='Line1' + crLf + 'Line2'; ?

Евгений Кислов
14.12.2015, 18:02
Добрый день!

Как сделать перенос строки в переменной, что-то навроде Str:STRING:='Line1' + crLf + 'Line2'; ?

Str:STRING:='Line1$R$NLine2';

SokolovA
15.12.2015, 01:35
Str:STRING:='Line1$R$NLine2';

Опять же большое спасибо!

Другой вопрос - по реализации конечных автоматов в CDS.

Суть вопроса - как производить некое действие (показ визуализации в моем случае) однократно при наступлении заданного события (перехода КА в определенный статус)?

Пример - есть два статуса КА - State1 и State2. Когда КА в первом, то пользователь должен видеть Vis1, для Статуса2 - Vis2. Но из Vis1 можно перейти в VisN посредством нажатия кнопки, например.

Тогда имеем примерно такой код:
Case System.State OF
State1:
<код, связанный со статусом>
VisuElems.CurrentVisu:='Vis1';
State2:
<код, связанный со статусом>
VisuElems.CurrentVisu:='Vis2';
END_CASE

Проблема тут в том, что это код будет выполнятся постоянно благодаря парадигме CDS и из Vis1 мы никогда не перейдем в VisN, поскольку VisN будет в следующем цикле затерта Vis1.
Эта же проблема делает очень затруднительной отладку в симуляции, когда нельзя вручную выбрать визуализацию.
Решение, которое напрашивается - это блокировка навроде:

Case System.State OF
State1:
<код, связанный со статусом>
IF DrawOnlyOnce = True Then
VisuElems.CurrentVisu:='Vis1';
DrawOnlyOnce :=False;
END_IF
State2:
<код, связанный со статусом>
VisuElems.CurrentVisu:='Vis2';
END_CASE

Но это какой-то громоздкий и неправильный выход.

Как надо в этом случае поступать?

Евгений Кислов
15.12.2015, 08:07
Но это какой-то громоздкий и неправильный выход.

Как надо в этом случае поступать?

По-моему, вполне разумная реализация. Я бы, наверное, сделал чуть иначе:


IF VisuElems.CurrentVisu='Vis1' OR VisuElems.CurrentVisu='Vis2' THEN
Case System.State OF
State1:
<код, связанный со статусом>
VisuElems.CurrentVisu:='Vis1';
State2:
<код, связанный со статусом>
VisuElems.CurrentVisu:='Vis2';
END_CASE
END_IF

SokolovA
15.12.2015, 23:55
По-моему, вполне разумная реализация. Я бы, наверное, сделал чуть иначе:

Спасибо, сделал вот так:
Error:
StateIdle();
StateError();
IF DEBUG.Enabled=FALSE THEN
IF VisuElems.CurrentVisu<>Vis.Error.Name THEN
VisuElems.CurrentVisu:=Vis.Error.Name;
END_IF
END_IF

И отладке не мешает и достаточно компактно.

Следующие вопросы по GUI:
1. Визуализация, в ней N однотипных объектов (Rectangle). Цвет и текст меняется динамически, соответственно я создаю массив из N структур; структура содержит переменные для хранения параметров каждого объекта. Доступа к объектной модели визуализации и ее контролам нет, правильно?
ТЗ предусматривается выделение активного объекта (рамочкой например). Собственно вопрос - выделяю я первый объект, он меняет статус (с Normal на Alarm State), выделяю второй... а как сбросить выделение первого, если в Event On_Click и прочее никаких аргументов не передается и вообще понятие Event Handler в CDS, как я понимаю, отсутствует?
2. Как изменить размер и тип шрифта в ComboBox Integer?

Евгений Кислов
16.12.2015, 07:46
Доступа к объектной модели визуализации и ее контролам нет, правильно?

Верно.



Собственно вопрос - выделяю я первый объект, он меняет статус (с Normal на Alarm State), выделяю второй... а как сбросить выделение первого, если в Event On_Click и прочее никаких аргументов не передается

Если есть какое-то изящное решение, я о нем не в курсе. Очевидный вариант - для каждого прямоугольника в Event On_Click написать ST-код, который будет сбрасывать выделение со всех остальных.




и вообще понятие Event Handler в CDS, как я понимаю, отсутствует?

Оно, в принципе, есть, но используется в более узком контексте. Прикладываю пример от 3S. Больше примеров можно найти на http://store.codesys.com/.



2. Как изменить размер и тип шрифта в ComboBox Integer?

21340

Шрифт и тип менять не советую - на СПК в этом случае он может отображаться иначе, чем в редакторе CODESYS.

RV9WFJ
16.12.2015, 08:16
Собственно вопрос - выделяю я первый объект, он меняет статус (с Normal на Alarm State), выделяю второй... а как сбросить выделение первого, если в Event On_Click и прочее никаких аргументов не передается и вообще понятие Event Handler в CDS, как я понимаю, отсутствует?
2. Как изменить размер и тип шрифта в ComboBox Integer?В действиях каждого объекта объекта вызываете сначала функцию, которая меняем все объекты с Alarm State на Normal, вторым действием ставите активному объекту Alarm State. Таким образом функция для всех объектов будет одна и та же.

SokolovA
16.12.2015, 18:07
В действиях каждого объекта объекта вызываете сначала функцию, которая меняем все объекты с Alarm State на Normal, вторым действием ставите активному объекту Alarm State. Таким образом функция для всех объектов будет одна и та же.
Вопрос как определить активный объект? Нет ни аналога this ни какого-либо еще указателя на объект.

Еще про Retain-переменные.
1. При компиляции получаю вот такие вот ворнинги:
[WARNING] Stacker v1: Globals [Device: PLC Logic: Application](Line 34): C0244: No VAR_PERSISTENT-list is part of the application to enter instance path for variable Globals.Config

Globals - это список с глобальными переменными, структура Config в нем объявлена вот так:
VAR_GLOBAL PERSISTENT RETAIN
Config: ConfigStruct;

В этом же Globals есть блоки:
VAR_GLOBAL CONSTANT PERSISTENT RETAIN
VAR_GLOBAL PERSISTENT RETAIN
VAR_GLOBAL

2. Есть массив структур RackData 3х8, состоящий из переменных: BYTE, BYTE, BYTE, ENUM, BYTE, BYTE, WSTRING, BOOL.
При операции Login в симуляции получаю такую ошибку:
[ERROR] Stacker v1: Globals [Device: PLC Logic: Application](Line 7): C0103: Out of retain memory: Variable 'RackData', 4176 bytes (Largest contiguous memory gap 4064) (Incremental compilation may produce fragmented memory. Perform "Build, Clean" to force a reallocation of all data and code.)
Build complete -- 1 errors, 8 warnings : no download possible!

Что за блоки по 4 кб и почему ему не хватает памяти? На СПК110 ее должны быть мегабайты!

RV9WFJ
16.12.2015, 21:13
Вопрос как определить активный объект? Нет ни аналога this ни какого-либо еще указателя на объект.
А зачем? В каждом объекте есть событие OnClick и т.д. в них и записываем вызов функции и изменение битовой переменной Alarm, главное последовательность не перепутать.


Еще про Retain-переменные.
1. При компиляции получаю вот такие вот ворнинги:
[WARNING] Stacker v1: Globals [Device: PLC Logic: Application](Line 34): C0244: No VAR_PERSISTENT-list is part of the application to enter instance path for variable Globals.Config

Лучше напишите что у вас в строке 34 написано. А то такой винегрет, что ничего не понятно. К чему например это VAR_GLOBAL CONSTANT PERSISTENT RETAIN? Константа она и есть константа.


Что за блоки по 4 кб и почему ему не хватает памяти? На СПК110 ее должны быть мегабайты!
А тут привет Овну, они зачем-то ограничили Retain 4мя кБ. В новой прошивке обещали исправить, но это когда еще будет :-)

ASo
16.12.2015, 21:18
А тут привет Овну, они зачем-то ограничили Retain 4мя кБ.Например, гарантированностью записи энергетическим возможностям конденсаторов БП.

SokolovA
16.12.2015, 22:30
А зачем? В каждом объекте есть событие OnClick и т.д. в них и записываем вызов функции и изменение битовой переменной Alarm, главное последовательность не перепутать.
Не допер про последовательность, спасибо!



Лучше напишите что у вас в строке 34 написано.

Config: ConfigStruct;

ConfigStruct выглядит так:
TYPE ConfigStruct :
STRUCT
ParkPositionX:BYTE:=0;
ParkPositionY:BYTE:=0;
ImpulseCountPerLevelX:BYTE:=4;
ImpulseCountPerLevelY:BYTE:=4;
DriveHorizontalBrakeReleaseDelay:TIME:=T#3000MS;
DriveVorizontalBrakeReleaseDelay:TIME:=T#3000MS;
END_STRUCT
END_TYPE




А тут привет Овну, они зачем-то ограничили Retain 4мя кБ. В новой прошивке обещали исправить, но это когда еще будет :-)

Как это обойти? AlarmStorage занимает в Retain место? Можно строки объявить фиксированной длины типа WSTRING[20] или в STRING писать русский текст?

Я от Овна вообще в шоке, в железке за такие деньги 4 кб. Конденсаторы в БП? Ну сделайте как 10 лет назад делали в ПЛК - SD-слот для карточки, на скорость в этом случае пофигу, GUI может обновляться и раз в секунду.

energvk
17.12.2015, 00:21
Доброго вечера!
Решил заморочиться передачей данных не через конфигурацию, а через библиотеку. Пытаюсь разобраться в правильном ли я направлении. Создал структуру

TYPE test :
STRUCT
x1 :DWORD;
x2 :WORD;
x3 :WORD;
x4 :REAL;
x5 :REAL;
END_STRUCT
END_TYPE

В переменных указал

buf_read_pr :read_pr200;

from_pr :POINTER TO test;
Buffer :ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)


В теле программы



from_pr:=ADR(Buffer);
buf_read_pr:=from_pr^;
x11:=test.x1;
................
x15:=test.x5;


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

SokolovA
17.12.2015, 00:40
И еще дурацкий вопрос - как делать конкантенкацию строк?

Ап - конкантенкация WSTRING, потому что в STRING нельзя хранить русский текст.

RV9WFJ
17.12.2015, 06:18
Например, гарантированностью записи энергетическим возможностям конденсаторов БП.

Вы не путайте старые ПЛК и СПК. На счет СПК1хх точно не скажу, но в СПК2хх эта проблема как класс отсутствует, там хоть в каждом цикле в Retain можно писать и никакими конденсаторами там Retain не питается. А 4 кб и там ограничение.

Евгений Кислов
17.12.2015, 07:25
И еще дурацкий вопрос - как делать конкантенкацию строк?

Ап - конкантенкация WSTRING, потому что в STRING нельзя хранить русский текст.

WCONCAT из библиотеки Standard64.library, входит в состав CODESYS.

energvk
17.12.2015, 13:02
В продолжение поста http://www.owen.ru/forum/showthread.php?t=20069&p=190030&viewfull=1#post190030

Связь вроде как установилась (СПК107+ПР200). Но не могу понять следующее:
Из 46 опрашиваемых регистров получаю только 17 байт (видно из скриншота), при опросе 1 регистра опять же получаю 17 байт. Плюс постоянно проскакивает ошибка 255. то я делаю не так?
21385
21386

Ну и не понятно почему размер скопированного буфера всегда равен 4

SokolovA
17.12.2015, 19:04
WCONCAT из библиотеки Standard64.library, входит в состав CODESYS.

Ок, спасибо.

Про массивы структуры и инициализацию их элементов.

Есть структура S1 с элементами A1, A2, A3. Есть структура S2 с элементами S1, B1, B2.
Есть массив M[n,m], состоящий из S2. Элементы M[n,m].B1, B2, инициализируются прекрасно при создании массива:
S2:ARRAY [1..n, 1..m] OF S2:= [(B1:=1, B2:=1, S1.A1:=1)]

А вот на S1.A1:=1 компилятор ругается. А мне очень надо тоже проинициализировать этот элемент. Подскажите, как это сделать?

Евгений Кислов
17.12.2015, 20:04
Ок, спасибо.

Про массивы структуры и инициализацию их элементов.

Есть структура S1 с элементами A1, A2, A3. Есть структура S2 с элементами S1, B1, B2.
Есть массив M[n,m], состоящий из S2. Элементы M[n,m].B1, B2, инициализируются прекрасно при создании массива:
S2:ARRAY [1..n, 1..m] OF S2:= [(B1:=1, B2:=1, S1.A1:=1)]

А вот на S1.A1:=1 компилятор ругается. А мне очень надо тоже проинициализировать этот элемент. Подскажите, как это сделать?

Попробуйте в таком стиле:

arrTest: ARRAY [1..10, 1..10] OF S2:=[(B1:=1, B2:=2, S1:=(A1:=10,A2:=20,A3:=30))];

ASo
17.12.2015, 20:12
Вы не путайте старые ПЛК и СПК. На счет СПК1хх точно не скажу, но в СПК2хх эта проблема как класс отсутствует, там хоть в каждом цикле в Retain можно писать и никакими конденсаторами там Retain не питается. А 4 кб и там ограничение.А если питание исчезает в момент НАЧАЛА записи ретайл во флешь?

Hoblin
21.12.2015, 16:18
Здравствуйте,
не смог на форуме найти ответ на вопрос: Как преобразовать string в wstring?

GoodLuck
21.12.2015, 16:52
Функция STRING_TO_WSTRING.

Стас 1
21.12.2015, 21:21
Подскажите пожалуйста новичку. На codesys 3.5 выскакивает ошибка компиляции.Что делать?

Yegor
21.12.2015, 21:29
Ошибку показать как вариант.

Алексей Серг
22.12.2015, 15:00
У меня следующая проблема. Есть плк100 и есть расходомер питерфлоу.Протокол, по которому работает расходомер -modbus ascii. Надо считывать данные в плк, который является мастером.Но в питерфлоу значение расхода воды представлено типом double float, а плк не считывает double, а только float. как быть. Считать как string, но тогда как преобразовать. Если есть пример , скиньте пожалуйста.

RV9WFJ
23.12.2015, 11:55
У меня следующая проблема. Есть плк100 и есть расходомер питерфлоу.Протокол, по которому работает расходомер -modbus ascii. Надо считывать данные в плк, который является мастером.Но в питерфлоу значение расхода воды представлено типом double float, а плк не считывает double, а только float. как быть. Считать как string, но тогда как преобразовать. Если есть пример , скиньте пожалуйста.Я так понимаю вы интеграл считываете? А не проще modbus.lib использовать? Пример в личку могу кинуть.

Шевцов Игорь
24.12.2015, 12:41
в теме Модули "МХ110 для CODESYS 3.5" молчат :( продублирую сюда свою проблему.

После добавления символьной конфигурации в проект с модулем MV110-8A (определено опытным путем) при попытке загрузки проекта в ПЛК получаю следующую ошибку:

------ Компиляция : Приложение: Device.Application -------
Приложение актуально
[INFORMATION] Общий размер выделенной памяти для кода и данных: 15670 байт
[INFORMATION] Область памяти 0 содержит Данные, Вход, Выход, Память и Код: высший используемый адрес: 6000000, самый большой промежуток памяти: 15658 (5984342 %)
[INFORMATION] Область памяти 1 содержит Retain-данные: высший используемый адрес: 4064, самый большой промежуток памяти: 0 (4064 %)
[ERROR] Internal error:System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в _3S.CoDeSys.SymbolConfigObject.SymbolExport.AddTyp es(ICompileContext comcon, LList`1 types, IScope scope, SymbolConfigSignatureTable datatypesSignsTable) в _3S.CoDeSys.SymbolConfigObject.SymbolConfigObject. AddLanguageModel(Boolean& bObjectModified) в _3S.CoDeSys.SymbolConfigObject.SymbolConfigWatcher .OnLanguageModelMgr_AddLateLanguageModel(Object sender, AddLanguageModelEventArgs e) в _3S.CoDeSys.Core.LanguageModel.AddLanguageModelEve ntHandler.Invoke(Object sender, AddLanguageModelEventArgs e) в _3S.CoDeSys.LanguageModelManager.LanguageModelMana ger.OnAddLateLanguageModel(AddLanguageModelEventAr gs e) в _3S.CoDeSys.LanguageModelManager.LanguageModelMana ger.DoLocation(Guid guidApplication, Boolean bOnlineChange, Boolean bTestOnly, Boolean bAddLateLanguageModel, Boolean bBootProject, Boolean& bCodeChanged, Boolean& bInterfacesChanged, Boolean& bInitValueChanged) в _3S.CoDeSys.LanguageModelManager.LanguageModelMana ger.(Guid , Boolean , Boolean , Boolean , IOnlineChangeDetails& , IMessage[]& , IMessage[]& )
Компиляция завершена -- 1 ошибок, 0 предупреждений : загрузка невозможна!

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

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

CDS: v3.5 SP5 Patch5
Таргет: owen_plc304_m01_cds3.5.3.40.devdesc
Modbus_COM: 3.4.0.0
Modbus_Master_COM_Port: 3.5.3.0

как решить сие недоразумение?

Beard
24.12.2015, 23:53
как запустить эмуляцию без контроллера спк107 это возможно?

Евгений Кислов
25.12.2015, 09:58
как запустить эмуляцию без контроллера спк107 это возможно?

См. п. 9.8 документа СПК.FAQ.

Valentine
01.01.2016, 04:16
Здравствуйте, а можно ли как-то программно обратиться к параметрам визуальных компонентов, например, к координатам x и y линии.
Некоторые компоненты позволяют привязывать к своим параметрам переменные из программы, но их очень мало.

Евгений Кислов
01.01.2016, 11:28
Здравствуйте, а можно ли как-то программно обратиться к параметрам визуальных компонентов, например, к координатам x и y линии.
Некоторые компоненты позволяют привязывать к своим параметрам переменные из программы, но их очень мало.

Про координаты линии см. пример 11.4.2. в документе СПК. Визуализация.

Lenta69
01.01.2016, 23:18
Здравствуйте! Подскажите, пожалуйста, почему на обучающих видео при визуализации, скажем, на SP4, объекта "Индикатор", на экран выводится лампа. Но в реальности, на SP5, выводится стрелочный индикатор? Поправимо ли это недоразумение?

Евгений Кислов
01.01.2016, 23:58
Здравствуйте! Подскажите, пожалуйста, почему на обучающих видео при визуализации, скажем, на SP4, объекта "Индикатор", на экран выводится лампа. Но в реальности, на SP5, выводится стрелочный индикатор? Поправимо ли это недоразумение?

Не зажимайте и перетаскивайте, а кликните один раз на индикатор на Панели элементов, затем - кликните на рабочее поле.

Lenta69
02.01.2016, 09:18
Не зажимайте и перетаскивайте, а кликните один раз на индикатор на Панели элементов, затем - кликните на рабочее поле.

Большое спасибо! Получилось!

ntro123
07.01.2016, 16:33
Добрый день, я немного покалечил ПЛК 323 своим кодом, решил разобраться с динамической памятью, после чего в один из прекрасных моментов как залил программу и нажал "запустить" у меня сразу ПЛК вылетел с "Ошибка сети : сетевой вызов не удался" и теперь так все время. При этом счетчик висит в локалке по адресу 192.168.0.77 и пингуется без проблем. НО все время "Ошибка сети : сетевой вызов не удался" создавал новый проект, нажимал "очистить все", отключал от питания ничего не помогает. Как его ресетнуть? Только перепрошивать заново?

PS при этом все лампочки (ошибка - она всегда горела и до и после, связь, питание) кроме РАБОТА - горят.

UPD: пришлось перепрошить, помогло.

ntro123
13.01.2016, 21:15
Можно ли в одни ФБ передать другой ФБ, но любого типа?


FUNCTION_BLOCK first_fb
VAR_INPUT
anyfb:ANY_FB;
...

вот что-то типо того есть в codesys 3.5?

capzap
13.01.2016, 22:42
Можно ли в одни ФБ передать другой ФБ, но любого типа?


вот что-то типо того есть в codesys 3.5?

можно, читайте про указатели

ntro123
14.01.2016, 00:16
Про указатели я знаю, и использую очень активно, вот выдержка из мануала для cds 2.5:

Указатели позволяют работать с адресами переменных или функциональных блоков.
Синтаксис:
<Имя_указателя>: POINTER TO <Тип данных/Функциональный блок>;

И как мне указатель использовать для объявления ЛЮБОГО типа?

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

VAR
var1:fb1;
var2:fb2;
cmd:execution;
END_VAR

КОД:
cmd(var1); // или через указатели т.е. передать адрес ФБ, каким-то хитрым образом передать адрес ФБ и потом узнать что за ФБ через его SIZEOF и как-то вызвать?
cmd(var2);


PS просто вариант:
VAR_INPUT
in_fb:POINTER TO BYTE;
VAR_END

КОД:
in_fb^();


Если он и работает то похож на костыль, не?

capzap
14.01.2016, 07:37
Про указатели я знаю, и использую очень активно, вот выдержка из мануала для cds 2.5:
...
Если он и работает то похож на костыль, не?
назовите причину, по которой Вы занимаетесь такми глупостями в среде разработки промышленной автоматизации, работали раньше на яваскрипте, так и оставайтесь там

ntro123
14.01.2016, 12:51
Есть функция, скажем запись времени в счетчик:

write_meterDT(addr:=123123, datetime:=DT#2016-1-1-1:1:1);

Запишет время DT#2016-1-1-1:1:1 в счетчик с номером 123123, т.е. подготовит запрос и отправит его через ФБ send()

Если addr=0 то значит широковещательная команда, и подготовит запрос и отправит его через send_broadcast()

Сейчас это реализовано так, минусы:
Используя другие ФБ для записи/чтения в счетчики у меня куча избыточных повторяющихся операций/кода которые не получается все полностью вынести в отдельные функции и действия, а хотелось бы в таких ФБ как запись врмени, тарифов и тп, сделать просто самый обычный send, без условий "IF addr=0 THEN send_broadcast() ELSE send() END_IF" - т.к. в связи с особенностями библиотеки (она универсальная для всех моделей), не получить сделать вот такой простое и красивое условие, обязательно нужно еще кучу кода добавить, а хотелось бы все это дело убрать от туда и отправлять все тупо на 1 счетчик, и пусть send_broadcast() сама подставляет addr других счетчиков.

Поэтому я решил сделать так:

VAR
wdt:write_meterDT;
END_VAR

КОД:
Есть ФБ для отправки широковещательного запроса, send_broadcast

wdt.datetime:=DT#2016-1-1-1:1:1;

send_broadcast(any_action:=wdt);

И тогда он по циклу из всего списка счетчиков в addr будет автоматом подставлять и выполнять этот запрос для всех счетчиков. Т.е. у всех ФБ был бы одинаковый входной параметр addr, а все другие параметры инициализировались до отправки в send_broadcast().


PS ну если нельзя, то нельзя, просто очень интересно стало =)

capzap
14.01.2016, 13:04
подходов куча, если пришли из других языков, то можно через ООП один родитель, а реализация методов разная в каждом конкретном случае, если по стандартному, то наличие множества блоков ни как не должно мешать, повторяющийся код укладывайте в функцию и используете одну везде

ntro123
14.01.2016, 15:26
Да пришел из с/с++ и конечно же как вы указали JS +прочии веб языки. Да использую ООП, читал на тему ООП в codesys, пришел к выводу, что не нужно его использовать + очень мало документации по синтаксису ООП в codesys, вообще ладно оставлю все как есть, разумеется повторяющийся код уже давно по максимуму запихнул в функции.

Спасибо за ответ!

fedotov_andrey
20.01.2016, 12:00
добрый день!
Подскажите, с FBD никогда не сталкивался и возник вопрос:
например на st код

if mv.rRead1 > 25 then
mv.wOut1:=TRUE;
ELSE
mv.wOut1:=FALSE;

Элементарный код.... как его оформить на FBD?

fedotov_andrey
20.01.2016, 13:17
смотрите в документации на SEL
Честно посмотрел, почитал и не понял... Для меня ST попроще, но хочется разобраться с FBD.
Может есть какая возможность написать код, а потом конвертировать его и посмотреть на результат?

capzap
20.01.2016, 13:20
:) ну да, SEL сложновато для Вас, тогда просто EQ, на входы mv.rRead1 и 25, на выход mv.wOut1

spymf
21.01.2016, 13:42
Добрый день! Объясните, пожалуйста, новичку - Имею ПЛК 160, подключил к входам аналоговые датчики, по RS485 МВ110, ТРМ101. Всем входам назначил имена в CodeSys в Конфигурации ПЛК. Добавил Modbus Slave для связи с Lectus OPC.
Вопрос: Чтобы передать в Lectus OPC все значения с датчиков - нужно создать переменные для каждого из значений входов ПЛК в подэлементе Modbus slave, а затем в программе присваивать значения входов? Или можно использовать имена переменных присвоенных входам ПЛК и других устройств, которые ПЛК опрашивает (КАК?)?

Другими словами можно ли получить доступ из Lectus к переменным и входам контроллера и по какому адресу?

Hiromatik
22.01.2016, 08:06
День добрый. Есть мысли по оптимизации программы выполненной в СS3.5 для СПК207(М02). итак. Цикл программы 40ms. Присутствует 6 ПИД регуляторов для смесительных зональных узлов. Думаю следующее- использовать 1 ФБ ПиД регулятора и через CASE в каждом цикле на его входа подавать задание для каждого из смесителя и брать с выхода данные для привода?

Например:

PID_reg0();

CASE nom_pid OF
0: (*смесит1*)
PID_reg0 (ACTUAL:=dt1, SET_POINT:=t_zad1, KP:=KP_1, TN:=TN_1, TV:=TV_1, Y_MIN:=Y_min_1, Y_MAX:=Y_max_1);
SP_1:=PID_reg0.Y;
nom_pid:=1;
1: ...........
2: ...........
3: ...........
4: ...........
5: (*смесит6*)
PID_reg0 (ACTUAL:=dt6, SET_POINT:=t_zad6, KP:=KP_6, TN:=TN_6, TV:=TV_6, Y_MIN:=Y_min_6, Y_MAX:=Y_max_6);
SP_6:=PID_reg0.Y;
nom_pid:=0;
AND_CASE

Будте добры опытные "автоматчики" высказать своё мнение на счет целесообразности данного решения?)

Hiromatik
22.01.2016, 08:29
если было бы всё так просто использовалась бы функция а не ФБ, не задумывались, что в нем идут вычисления используя значения с предыдущей итерации? Таким образом каждый новый цикл каждый регулятор будет сравнивать текущее своё показание с предыдущим от предыдущего регулятора

Мысля такая была. вот посему и задал влпрос чтоб убедиться.
Т.к. для одного см.узла применял один функциональный блок для регулирования по подаче и защиты от превышения обратки, но там определения для чего применять блок построено на условиях. и данное решение регулирует очень хорошо.
В общем, благодарю capzar за грамотное обьяснение!

Hiromatik
22.01.2016, 08:37
Есть ещё вопросик. Пытаюсь сделать аналог RETAIN. Т.е. сохранять данные после изменения в фаил на флешке( это будет позже на СПК- когда отработаю программу на "столе" в Win V3).
при первоначально при запуске будет активен один блок для чтения данных из файла, а когда загрузит без ошибок влючится основная программа( но это будующее). Библиотека CAA.FILE
Вопрос: не получается создать фаил на диске компа, а так же записать в ручками созданный фаил, как задается путь для файла расположенного например в D:\test_dir\?

Hiromatik
22.01.2016, 08:43
оказывается первое сообщение прошло)

capzap
22.01.2016, 08:45
есть много других способов записи в файл, а не только через CAA, например http://www.owen.ru/forum/attachment.php?attachmentid=12433&d=1396183120
во вторых в контроллерах стоит линукс, там нет такого понятия как диск D:\

Hiromatik
22.01.2016, 08:54
да начал с САА разбираться вот думаю и добью её. а "эксперементы делаю на вирт контроллере Win V3. соответсвенно писать (пробывать) могу ток в файлы расположенные на диске компа.. потому как ток не задавал путь не хочет писать в фаил и все... для начала брал простой пример из справки.. думаю на спк он заработал бы.. но нет сейчас под рукой её...

Hiromatik
22.01.2016, 08:56
есть много других способов записи в файл, а не только через CAA, например http://www.owen.ru/forum/attachment.php?attachmentid=12433&d=1396183120
во вторых в контроллерах стоит линукс, там нет такого понятия как диск D:\


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

capzap
22.01.2016, 09:00
sysfile работает и с контроллером win, путь просто ни какой не указывайте, просто потом в винде найдите поиском куда этот файл записался

Hiromatik
22.01.2016, 09:06
Т.е. САА не работает на Win получается? печалька..
значит буду мучать sysfile...
ещё раз благодарствую за ответы))
Кстати а есть где нить описание на эту бибку?

capzap
22.01.2016, 09:07
мне не понравилась САА с самого начала, когда потребовала кучу дополнительных библиотек, поэтому я с ней и не работал ни когда

Hiromatik
22.01.2016, 09:16
мне не понравилась САА с самого начала, когда потребовала кучу дополнительных библиотек, поэтому я с ней и не работал ни когда
Вы имеете ввиду, что внутри CAA.FILE много вложенно библиотек?
Мне пришлось ток помима её добавить ещё TYPES и при этом функции работы с String переприсваивать. и ещё представители ОВЕНА на форуме где то писали что лучше использовать CAA т.к. она прощает ошибки некоторые... а желания запороть спк у мя нет)

firetester
28.01.2016, 07:12
Доброго времени суток! Хочу опросить МК110, но не получается. Буду благодарен если ткнете где я свернул не туда...
Шаблонами не могу пользоваться потому что "отваливаются" они у меня от сети то один то другой. Вот конфиг:
22075
22076
22077
З.Ы. 2 и 4 входы включены.

Евгений Кислов
28.01.2016, 07:33
Доброго времени суток! Хочу опросить МК110, но не получается. Буду благодарен если ткнете где я свернул не туда...
Шаблонами не могу пользоваться потому что "отваливаются" они у меня от сети то один то другой. Вот конфиг:
22075
22076
22077
З.Ы. 2 и 4 входы включены.

Для начала в параметре Always update variables (второй скрин) выберите значение Enabled 2.

22096

firetester
28.01.2016, 08:01
[QUOTE=Евгений Кислов;194379]Для начала в параметре Always update variables (второй скрин) выберите значение Enabled 2.
Заработало, спасибо! Только мапинг поправил ещё. Я так понимаю, это для всех приборов, в которых нет параметра частоты опроса?

Евгений Кислов
28.01.2016, 08:07
Заработало, спасибо! Только мапинг поправил ещё. Я так понимаю, это для всех приборов, в которых нет параметра частоты опроса?

Рекомендуется всегда использовать именно Enabled 2.

Пьер
28.01.2016, 14:06
Вопрос на букву "Д" не могу найти ответа.
СПК 207-220.03.00-CS. версия прошивки 3302
CS v3.5 SP5
версия таргета 3.5.0.4
простой проект, без подключения каких либо ус-в по Modbus, просто хочу запустить панель с простейшей визуализацией.
при компиляции выдает ошибку на версию визуализации

------ Компиляция : Приложение: Device.Application -------
типизировать код...
[ERROR] visuelembase, 3.5.5.0 (system): Visu_PRG: Your current visualization profile does not work correctly with your current compiler version. Please update the visualization profile or decrease your compiler version.
Компиляция завершена -- 1 ошибок, 0 предупреждений
Компиляция завершена -- 1 ошибок, 0 предупреждений : загрузка невозможна!
Подскажите, спасибо!

Евгений Кислов
28.01.2016, 14:14
Вопрос на букву "Д" не могу найти ответа.
СПК 207-220.03.00-CS. версия прошивки 3302
CS v3.5 SP5
версия таргета 3.5.0.4
простой проект, без подключения каких либо ус-в по Modbus, просто хочу запустить панель с простейшей визуализацией.
при компиляции выдает ошибку на версию визуализации

------ Компиляция : Приложение: Device.Application -------
типизировать код...
[ERROR] visuelembase, 3.5.5.0 (system): Visu_PRG: Your current visualization profile does not work correctly with your current compiler version. Please update the visualization profile or decrease your compiler version.
Компиляция завершена -- 1 ошибок, 0 предупреждений
Компиляция завершена -- 1 ошибок, 0 предупреждений : загрузка невозможна!
Подскажите, спасибо!

Обновите прошивку и таргет:
http://www.owen.ru/catalog/codesys_v3/35283604

У вас, видимо, М01 - внизу страницы раскройте вкладку Архив прошивок.

Пьер
28.01.2016, 14:19
А какую выбрать, у меня процессор 200 МГц?

Евгений Кислов
28.01.2016, 14:20
А какую выбрать, у меня процессор 200 МГц?

Внизу страницы раскройте вкладку Архив прошивок.

Пьер
28.01.2016, 14:54
Написано в "Инструкция по обновлению прошивки на СПК2хх.ATM (Процессор 200МГц) "
пункт "Подготовка контроллера"
1. Выключить питание прибора и отсоеденить все подключенное оборудование
2. Открутить винты и снять заднюю крышку
3. Найти перемычку (джампер) xp12
4. Кабель KC2 (из комплекта) подключить в порт Debug
5. Подключить кабель Ethernet
6. Тумблер на СПК перевести в состояние Работа/1 (верхнее положение)


3. Найти перемычку (джампер) xp12 и что дальше, больше про него не слова.
Нашел, стоит перемычка как на картинке, в итоге то что делать с ней?

Евгений Кислов
28.01.2016, 15:01
Написано в "Инструкция по обновлению прошивки на СПК2хх.ATM (Процессор 200МГц) "
пункт "Подготовка контроллера"
1. Выключить питание прибора и отсоеденить все подключенное оборудование
2. Открутить винты и снять заднюю крышку
3. Найти перемычку (джампер) xp12
4. Кабель KC2 (из комплекта) подключить в порт Debug
5. Подключить кабель Ethernet
6. Тумблер на СПК перевести в состояние Работа/1 (верхнее положение)


3. Найти перемычку (джампер) xp12 и что дальше, больше про него не слова.
Нашел, стоит перемычка как на картинке, в итоге то что делать с ней?

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

Пьер
28.01.2016, 15:12
Евгений Кислов, спасибо, буду прошивать.

Maria
29.01.2016, 13:33
Здравствуйте! Подскажите, пожалуйста, как поменять в CoDeSys v3 одно устройство на другое. Я скачала пример, для работы с библиотекой SysCom и мне необходимо заменить PLC 30x на СПК207.

Евгений Кислов
29.01.2016, 13:35
Здравствуйте! Подскажите, пожалуйста, как поменять в CoDeSys v3 одно устройство на другое. Я скачала пример, для работы с библиотекой SysCom и мне необходимо заменить PLC 30x на СПК207.

Установить таргет-файл для СПК.
http://www.owen.ru/catalog/codesys_v3/35283604

После этого нажимаете правой кнопкой мыши на устройство PLC30x и выбираете команду Обновить устройство.

Maria
29.01.2016, 14:17
Спасибо за ответ!

energvk
29.01.2016, 16:52
В ModBus TCP Slave реализована. Но из вашего вопроса не понятно где именно вы хотите использовать эту функцию (Master/Slave, RS/TCP).


Именно ее я и имею в виду, когда пишу про 20ю функцию. Есть только там момент неприятный. На плохих каналах связи (3G + OpenVPN) библиотека подвисает возвращая статус ОК. Пока придумал такой костыль - сбрасывать флаг Enable раз в час на пару секунд. Думаю это связано с тем что открытые сокеты при разрывах не закрываются и библиотека зависает достигнув MaxClients.

А вы случайно не пользовались функциональностью MasterOpc для считывания файла? Для плк у меня всё реализовано и работает, а для СПК мне не понятно каким образом можно привязать файл. Если в ПЛК1хх в конфигурацию я просто добавлял файлы в нужном порядке и в опс уже соответственно указывал порядковый номер (начиная с нуля), то с СПК непонятно каким образом указывать номер. Допустим я пишу файлы в СПК /mnt/ufs/avar.log, /mnt/ufs/event.log и т.п.и как их последовательно считывать ума пока не приложу. Буду очень благодарен за подсказку.

Lenta69
30.01.2016, 14:08
Добрый день! Ткните носом, пожалуйста, что я делаю не так? Сама программа пробная. Связка СПК107 и МВ110-32ДН. СПК в упор не видит модуль ввода.

Евгений Кислов
30.01.2016, 14:46
Добрый день! Ткните носом, пожалуйста, что я делаю не так? Сама программа пробная. Связка СПК107 и МВ110-32ДН. СПК в упор не видит модуль ввода.

Для начала посмотрите п. 11.2 и 11.3 документа СПК. FAQ, а также это:
http://www.owen.ru/forum/showthread.php?t=20069&p=194379&viewfull=1#post194379

Lenta69
01.02.2016, 07:56
Для начала посмотрите п. 11.2 и 11.3 документа СПК. FAQ, а также это:
http://www.owen.ru/forum/showthread.php?t=20069&p=194379&viewfull=1#post194379

Спасибо! Каким то чудом получилось! Вопрос такой еще- почему не активно окошко "Авто перезапуск соединения"?

Евгений Кислов
01.02.2016, 08:10
Спасибо! Каким то чудом получилось! Вопрос такой еще- почему не активно окошко "Авто перезапуск соединения"?

Вероятно, используете старую версию Modbus Master. Галочка стала доступной в 3.5.5.0.

Lenta69
01.02.2016, 08:11
Вероятно, используете старую версию Modbus Master. Галочка стала доступной в 3.5.5.0.

Да, действительно. 3.5.4.0.

Александр_67
01.02.2016, 08:45
Прошу помощи задача чисто теоретическая (экспериментирую) у меня плк 110-24 у него 4 быстрых выхода и 2 быстрых входа. Имеем в наличие датчик давления ОВЕН ПД100 и двигатель постоянного тока как сделать что бы скважность на выходе шим с плк менялось в зависимости от значения давления на датчике?

firetester
01.02.2016, 11:04
И снова здравия всем! Возник ещё один вопрос: Если вставляю в проект этот код
IF err.0 OR err.1 OR condenser_err.0 OR condenser_err.4 OR condenser_err.6 OR tech_err.0 OR tech_err.1
THEN err_exist:=TRUE;
END_IF

errBlink(enable:=err_exist, timelow:=T#500MS, timehigh:=T#500MS);

IF errBlink.OUT=TRUE AND err_exist=TRUE THEN
sysExecute('echo "1" > /sys/class/leds/sv2/brightness');
END_IF

IF errBlink.OUT=FALSE AND err_exist=TRUE THEN
sysExecute('echo "0" > /sys/class/leds/sv2/brightness');
END_IF;
то на СПК мрёт Modbus и она начинает дико тормозить, при этом равномерно мигающий диод кнопки F1 единственно исправно работающий элемент проекта. Что я сделал не так?

Евгений Кислов
01.02.2016, 11:11
И снова здравия всем! Возник ещё один вопрос: Если вставляю в проект этот код
IF err.0 OR err.1 OR condenser_err.0 OR condenser_err.4 OR condenser_err.6 OR tech_err.0 OR tech_err.1
THEN err_exist:=TRUE;
END_IF

errBlink(enable:=err_exist, timelow:=T#500MS, timehigh:=T#500MS);

IF errBlink.OUT=TRUE AND err_exist=TRUE THEN
sysExecute('echo "1" > /sys/class/leds/sv2/brightness');
END_IF

IF errBlink.OUT=FALSE AND err_exist=TRUE THEN
sysExecute('echo "0" > /sys/class/leds/sv2/brightness');
END_IF;
то на СПК мрёт Modbus и она начинает дико тормозить, при этом равномерно мигающий диод кнопки F1 единственно исправно работающий элемент проекта. Что я сделал не так?

Предположу, что у вас SysExecute начинает выполняться в цикле, и происходит локальный апокалипсис. SysExecute должна выполняться строго по условию, в стиле:

1) сработал триггер
2) выполнили SysExecute
3) сбросили триггер, чтобы SysExecute не выполнялся дальше

Время цикла задачи чему у вас равно?

firetester
01.02.2016, 11:49
Предположу, что у вас SysExecute начинает выполняться в цикле, и происходит локальный апокалипсис.
Вы как всегда правы, сделал по триггерам - все отлично.
И ещё один вопрос, если можно:
Хочу воспользоваться IoDrvModbusComPort для индикации состояния сети, объявляю внутри FB как Modbus_Master_COM_Port (соотв.имени в проекте):IoDrvModbusComPort; И, как Вы уже догадались, .uiNumberOfCommunicatingSlaves=0 и .xAllSlavesOk=FALSE при живом-то модбасе... Тут тоже на самом деле все просто?

Евгений Кислов
01.02.2016, 11:51
Вы как всегда правы, сделал по триггерам - все отлично.
И ещё один вопрос, если можно:
Хочу воспользоваться IoDrvModbusComPort для индикации состояния сети, объявляю внутри FB как Modbus_Master_COM_Port (соотв.имени в проекте):IoDrvModbusComPort; И, как Вы уже догадались, .uiNumberOfCommunicatingSlaves=0 и .xAllSlavesOk=FALSE при живом-то модбасе... Тут тоже на самом деле все просто?

Не надо ничего объявлять. У вас же есть Modbus Master в дереве проекта - это по сути и есть объявление соответствующего функционального блока. Просто добавляете его имя в программу, ставите точку и выбираете нужные переменные.

firetester
01.02.2016, 12:06
Благодарю. Поправил.

влад30
02.02.2016, 11:17
ЗДРАВСТВУЙТЕ КАК ПЕРЕВЕСТИ ЭТО В ЯЗЫК ST????? http://www.owen.ru/forum/attachment.php?attachmentid=15718&d=1418580667

Николаев Андрей
02.02.2016, 11:39
а вот прям так все и пишите.
Название операторов что на st что на fbd пишется одинаково.

energvk
02.02.2016, 12:11
Удалил в Конфигурации задач в VISU_TASK вызор программы визуализации, никак не могу найти как её вернуть обратно

Евгений Кислов
02.02.2016, 12:15
Удалил в Конфигурации задач в VISU_TASK вызор программы визуализации, никак не могу найти как её вернуть обратно

Добавьте еще один экран визуализации в проект.

влад30
02.02.2016, 12:32
как как написать твой пример в st

energvk
02.02.2016, 12:53
Добавьте еще один экран визуализации в проект.

Спасибо, помогло

Hiromatik
02.02.2016, 23:17
Есть ещё вопросик. Пытаюсь сделать аналог RETAIN. Т.е. сохранять данные после изменения в файл на флэшке( это будет позже на СПК- когда отработаю программу на "столе" в Win V3).
при первоначально при запуске будет активен один блок для чтения данных из файла, а когда загрузит без ошибок влючится основная программа( но это будущее). Библиотека CAA.FILE
Вопрос: не получается создать файл на диске компа, а так же записать в ручками созданный фаил, как задается путь для файла расположенного например в D:\test_dir\?
,
Здравствуйте. с записью и чтением файлов разобрался через sysfile. все работает отлично( пишется 4 файла и при запуске они же читаются при наличии флэшки), с одним "НО"- не совсем четко представляю каким образом увидеть что первый файл действительно прочитался и можно переходить к прочтению следующего или что он не прочитался?? решение которое применено для определения завершения чтения или записи меня смущает.. т.к. при отсутствии флэшки библиотека не выдает ошибок.. в общем есть ли у кого расшифровка состояния handle что файл открылся, что файл прочитался(записался) и что файл закрылся без ошибок? описание не смог наити(((

Вот кусок кода который работает, но к которому хотелось бы добавить уточнения правильности процесса:

(*чтение файла графиков*)
IF NOT init_rf1 THEN

handle_rf1:=SysFileOpen(szFile:=file_GD , am:=AM_READ , pResult:=error_rf1 );
(*здесь проверку что открылся файл*)
SysFileRead(hFile:=handle_rf1 , pbyBuffer:=ADR(STR_GDr) , ulSize:=SIZEOF(STR_GDr) , pResult:=error_rf1 );
(*здесь что прочитался*)
SysFileClose(hFile:=handle_rf1 );

count_r1:=count_r1+1;
IF error_rf1=0 AND handle_rf1=F#16******** THEN init_rf1:=TRUE; (*а здесь что закрылся. выделенное красным в рабочем коде нет*)

ELSE init_rf1:=FALSE;
END_IF
(*присвоение данных буфера чтения - графикам дня *)
************************************************** ****
END_IF

Или же это ересь и без проверок будет работать стабильно?

energvk
03.02.2016, 00:12
Насколько я понял, то если файл не открылся (не существует например, либо что еще), то handle выдаст значение 16#FFFFFFFF, по идее pResult должен выдавать какие то ошибки, но я их у себя не видел

Hiromatik
03.02.2016, 06:36
Насколько я понял, то если файл не открылся (не существует например, либо что еще), то handle выдаст значение 16#FFFFFFFF, по идее pResult должен выдавать какие то ошибки, но я их у себя не видел

Да, когда не открывается из-за отсутствия файла то ошибки действительно не появляются почему-то... и значение handle как вы написали...
теперь бы с проверкой определиться правильности чтения и закрытия( все же у меня читается 5 файлов подряд). да и пишется 4 по нажатию кнопок в визуализации, а 5-й с периодичностью 1 час.
посему хочется более детально в этой ситуации разобраться... да и вообще сделал бы через CASE но отсутствие именно понимания что происходит работе бибки не дает мне поля для деятельности с обработкой ошибок.. как то так

Hiromatik
03.02.2016, 07:19
а нельзя сперва узнать размер запрашиваемого файла, а потом его вычитывать и сравнивать сколько должно быть и сколько получено

размер файла при записи узнаю при помощи SIZEOF(например получаем 200). при чтении выход функции sysfileread( как я понял из описания выдает размер количества прочитанных байт) составляет 170. или это не так?. при этом проверка SIZEOF после чтения выдает 200.

Hiromatik
03.02.2016, 07:22
размер файла при записи узнаю при помощи SIZEOF(например получаем 200). при чтении выход функции sysfileread( как я понял из описания выдает размер количества прочитанных байт) составляет 170. или это не так?. при этом проверка SIZEOF после чтения выдает 200.

вы не эту ли функцию имели ввиду для проверки размера файла SysFileGetSize?

Hiromatik
03.02.2016, 07:30
вы не эту ли функцию имели ввиду для проверки размера файла SysFileGetSize?
capzar благодарю за наводку на правильные мысли. получилось определять правильность записи и чтения по размеру байт))

selinka
03.02.2016, 19:54
Здравствуйте. Программирую на языке CFC. Возник вопрос по поводу типов переменных, а точнее date_and_time. Как сконвертировать переменную такого типа в текстовый формат, для отображения в таблице или текстовом поле? Переменную такого формата снимаю с выхода функционального блока RTC.
22275
И вопрос по смс-оповещениям. Какие функциональные блоки надо использовать, чтобы работать с GSM-модемом ПМ01? Если их нет в стандартных библиотеках, то подскажите, пожалуйста, где их скачать.

Евгений Кислов
03.02.2016, 20:15
Здравствуйте. Программирую на языке CFC. Возник вопрос по поводу типов переменных, а точнее date_and_time. Как сконвертировать переменную такого типа в текстовый формат, для отображения в таблице или текстовом поле? Переменную такого формата снимаю с выхода функционального блока RTC.
22275
И вопрос по смс-оповещениям. Какие функциональные блоки надо использовать, чтобы работать с GSM-модемом ПМ01? Если их нет в стандартных библиотеках, то подскажите, пожалуйста, где их скачать.

1. http://www.owen.ru/forum/showthread.php?t=21476&p=174357&viewfull=1#post174357
2. http://www.owen.ru/forum/showthread.php?t=20465

selinka
03.02.2016, 21:33
Евгений Кислов, спасибо, получилось.:)
В визуализации мне необходимо вести статистику по датам и времени в таблице. Как правильно задать массив и его тип, чтобы записать текущее время и дату в ячейки? Таблица состоит из двух столбцов. В первом хочу записать время с датой, а во втором другая измеряемая величина. И так последовательно заполнять таблицу.
Надо конвертировать полученные данные dtu.dtsplit или как-то по-другому работать с date_and_time?

Евгений Кислов
03.02.2016, 21:35
Евгений Кислов, спасибо, получилось.:)
В визуализации мне необходимо вести статистику по датам и времени в таблице. Как правильно задать массив и его тип, чтобы записать текущее время и дату в ячейки? Таблица состоит из двух столбцов. В первом хочу записать время с датой, а во втором другая измеряемая величина. И так последовательно заполнять таблицу.
Надо конвертировать полученные данные dtu.dtsplit или как-то по-другому работать с date_and_time?

Посмотрите в документе СПК. Визуализация пример 11.2.5.

selinka
03.02.2016, 23:38
Евгений Кислов, а куда надо вставлять код функционирования таблицы? Переменные я прописала в VAR. Я делаю в codesys 3.5 sp5 на CFC, а проект в примере сделан в sp6.

Вот как выглядит проект у меня:
22287

А там вот так:
22289

Где найти такое поле, куда ввести оставшийся код?

Евгений Кислов
04.02.2016, 07:30
Евгений Кислов, а куда надо вставлять код функционирования таблицы? Переменные я прописала в VAR. Я делаю в codesys 3.5 sp5 на CFC, а проект в примере сделан в sp6.

Вот как выглядит проект у меня:
22287

А там вот так:
22289

Где найти такое поле, куда ввести оставшийся код?

Пример сделан на языке ST. Соответственно, вам надо создать программу на языке ST или переписать код из примера на CFC.
Кроме того, вы можете либо поставить SP6 и запустить пример, либо с помощью описания в документе пошагово воспроизвести его на SP5.

capzap
04.02.2016, 07:35
Евгений Кислов, а куда надо вставлять код функционирования таблицы? Переменные я прописала в VAR. Я делаю в codesys 3.5 sp5 на CFC, а проект в примере сделан в sp6.

Вот как выглядит проект у меня:
22287

А там вот так:
22289

Где найти такое поле, куда ввести оставшийся код?

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

selinka
04.02.2016, 14:10
Попробовала создать действие act в текущей программе plc_prg и там на ST написать текст программы для таблицы. Потом добавила функциональный блок с этим действием.
Получилось следующее:
22311
Но при компиляции выдаёт следующие ошибки и ругается на delete.
22313

Евгений Кислов
04.02.2016, 14:31
Попробовала создать действие act в текущей программе plc_prg и там на ST написать текст программы для таблицы. Потом добавила функциональный блок с этим действием.
Получилось следующее:
22311
Но при компиляции выдаёт следующие ошибки и ругается на delete.
22313

В коде действия вместо MyTable используйте ArrTable.

selinka
04.02.2016, 14:47
Исправила, теперь ругается только лишь на delete. В чём может быть проблема?

Евгений Кислов
04.02.2016, 14:51
Исправила, теперь ругается только лишь на delete. В чём может быть проблема?

Выложите архив проекта, пожалуйста.

selinka
04.02.2016, 15:12
22317 Вот архив проекта

Евгений Кислов
04.02.2016, 15:17
22317 Вот архив проекта

Замените DELETE на Standard.DELETE. Видимо, среди множества библиотек, которые вы добавили в свой проект, есть та, которая использует такое же название для одной из своих функций - поэтому надо помочь компилятору понять, какую из них вы хотите использовать.

selinka
04.02.2016, 16:13
Спасибо, получилось. Единственное, что в таблицу программа всегда заносит одну и ту же стандартную дату с 70-м годом. Как это можно исправить? Второй столбец заполняется правильно.
Вот изменённый архив: 22321

Евгений Кислов
04.02.2016, 20:05
Спасибо, получилось. Единственное, что в таблицу программа всегда заносит одну и ту же стандартную дату с 70-м годом. Как это можно исправить? Второй столбец заполняется правильно.
Вот изменённый архив: 22321

1. Удалите из CFC программы блок считывания времени. Т.е. в итоге у вас в CFC программе останется один блок - вызов действия ACT.
2. Для MainTask поставьте время цикла t#100ms, для VISU_TASK - t#200ms.

Я, на всякий случай, прокомментирую использование DELETE - это было сделано в примере для его упрощения. В реальных проектах разумнее вырезать из времени разряды с помощью DTsplit, конвертировать их в STRING'и и склеивать функцией CONCAT в строку с нужным форматированием даты-времени.

firetester
08.02.2016, 07:18
Здравствуйте! Что-то с подсветкой на СПК207 у меня ничего не выходит... Делаю так


(*touch_sens:Touch_Activity;
turnOn:r_trig; turnOff:f_trig; *)

Touch_sens( timeout:=T#30s);
turnOn(CLK:=touch_sens.Out);
turnOff(CLK:=touch_sens.Out);

IF turnOn.Q=TRUE THEN
sysExecute('echo "200" > /sys/class/backlight/backlight/brightness');
END_IF

IF turnOff.Q=TRUE THEN
sysExecute('echo "50" > /sys/class/backlight/backlight/brightness');
END_IF

и ничего не происходит. Попробовал через блок Brightness с тем же результатом... Не подскажете где я ошибся?

Евгений Кислов
08.02.2016, 08:09
Здравствуйте! Что-то с подсветкой на СПК207 у меня ничего не выходит... Делаю так


(*touch_sens:Touch_Activity;
turnOn:r_trig; turnOff:f_trig; *)

Touch_sens( timeout:=T#30s);
turnOn(CLK:=touch_sens.Out);
turnOff(CLK:=touch_sens.Out);

IF turnOn.Q=TRUE THEN
sysExecute('echo "200" > /sys/class/backlight/backlight/brightness');
END_IF

IF turnOff.Q=TRUE THEN
sysExecute('echo "50" > /sys/class/backlight/backlight/brightness');
END_IF

и ничего не происходит. Попробовал через блок Brightness с тем же результатом... Не подскажете где я ошибся?

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


/sys/class/backlight/pwm-backlight/brightness

или как-то иначе.

firetester
08.02.2016, 10:17
Подключитесь к СПК через WinSCP и проверьте путь к файлу brightness. Возможно, он будет выглядеть как
или как-то иначе.
Да, так и есть )) Моя рулетка выкинула /sys/class/backlight/som02-backlight/brightness )))

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

Имеется среда CODESYS V.3.4, ПЛК МОДУС 5684 с интерфейсным модулем 5672, с помощью которого ПЛК (мастер) по ModBus опрашивает ПЧ (слейв).
Проблема заключается в том, что ПЛК не видит частотник, хотя видит и общается с другими слейв-устройствами. Также запускал программу ModbusPoll, она регистры ПЧ видит. Возможно, в программе ПЛК формируется неправильный modbus-запрос к частотнику? Можно ли это проверить?

Ссылка на мою тему с описанием проблемы и проектом: http://www.owen.ru/forum/showthread.php?t=22964

firetester
10.02.2016, 08:18
Может, тут подскажете... как такое лечить? При использовании библиотеки ArchiverSPK 22521 SP5 Patch 5, библиотека устанавливается с ошибками и из репозитория СПК и отдельно. Ошибка: 22523

Andrew_Stranger
15.02.2016, 23:02
Господа, возникло 2 вопроса. Как можно повернуть элемент, изображение на мнемосхеме на 90 градусов для 'красоты'. И еще как реализовать открытие/закрытие к примеру 6 клапанов с подтверждением типа да/нет. Надо создавать диалог на каждый клапан?

Yegor
16.02.2016, 06:30
И еще как реализовать открытие/закрытие к примеру 6 клапанов с подтверждением типа да/нет. Надо создавать диалог на каждый клапан?Не обязательно. Была у меня такая задача.

Создаём диалог с параметрами имяКлапана, идКлапана:

22649

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

22651

Там, где изображены клапаны, вызываем этот диалог с нужными параметрами для каждого клапана:

22650

Под значками клапанов удобно использовать невидимые кнопки чуть крупнее значков:

22652

Евгений Кислов
16.02.2016, 07:27
Как можно повернуть элемент, изображение на мнемосхеме на 90 градусов для 'красоты'.

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

Andrew_Stranger
16.02.2016, 11:32
Yegor спасибо, а можно еще на функцию посмотреть.
Евгений Кислов, т.е просто так повернуть элемент нельзя с целью удобного расположения?

Yegor
16.02.2016, 11:41
Сами попросили.


FUNCTION SendPlcCmd : BOOL
VAR_INPUT
Cmd: SCommand;
Arg0, Arg1: WORD;
END_VAR


IF CMD_CTRL.cmdCount < 51 THEN

CMD_CTRL.cmdQueue[CMD_CTRL.cmdCount][0] := Cmd;
CMD_CTRL.cmdQueue[CMD_CTRL.cmdCount][1] := Arg0;
CMD_CTRL.cmdQueue[CMD_CTRL.cmdCount][2] := Arg1;
CMD_CTRL.cmdCount := CMD_CTRL.cmdCount + 1;
END_IF


PROGRAM CMD_CTRL (* Sends commands to the PLC *)
VAR_INPUT
Cmd, Arg0, Arg1: WORD;
cmdQueue: ARRAY[0..50] OF ARRAY [0..2] OF WORD;
cmdCount: INT;
END_VAR
VAR
Checksum: WORD;
Pulse: TON := (PT := T#300MS);
tx: BOOL;
cmdIdx: INT;
edge: R_TRIG;
END_VAR

(* Command conveyor, up to 50 commands in queue *)
tx := FALSE;
edge(CLK := cmdCount > 0);
Pulse(IN := NOT Pulse.Q AND cmdCount > 0);
IF (Pulse.Q OR edge.Q) AND cmdIdx < cmdCount THEN
Cmd := cmdQueue[cmdIdx][0];
Arg0 := cmdQueue[cmdIdx][1];
Arg1 := cmdQueue[cmdIdx][2];
Checksum := Cmd + Arg0 + Arg1;
tx := TRUE;
cmdIdx := cmdIdx + 1;
ELSIF Pulse.Q THEN
Cmd := 0;
cmdIdx := cmdCount := 0;
END_IF

22666

Это уже на ПЛК110, к которому подключены две СПК:

PROGRAM CMD_CTRL
VAR_INPUT
awaitingStop1, awaitingStop2, timeEditable1, timeEditable2: BOOL;
timeLim1, timeLim2: TIME;
auto: BOOL;
END_VAR
VAR
cmdCount: INT;
pOut: POINTER TO BOOL;
dummy: BOOL;
cmdStat: ARRAY [Idle..LastCmd] OF INT;


b3online, b4online, b6online, b7online, b8online, uf1online: BOOL;
END_VAR
VAR_OUTPUT
resetNeeded: BOOL;
END_VAR

resetNeeded := FALSE;


IF SACmd <> Idle THEN
IF SACmd + SAArg0 + SAArg1 <> SACmdChecksum THEN
SACmd := Idle;
END_IF
cmdCount := cmdCount + 1;
END_IF


(* Select corresponding output *)
pOut := MUX(SAArg0,
ADR(k1), ADR(k2), ADR(k3), ADR(k4),
ADR(k5), ADR(k6), ADR(k7), ADR(k8),
ADR(k9), ADR(k10), ADR(k11), ADR(k12),
ADR(k13), ADR(kdv), ADR(npp1), ADR(npp2),
ADR(npp3), ADR(kez4), ADR(k14), ADR(k15),
ADR(k16), ADR(k17), ADR(k18), ADR(k19),
ADR(k20), ADR(k21), ADR(k22), ADR(k23),
ADR(k24), ADR(k25), ADR(k26), ADR(k27),
ADR(k28), ADR(npp4), ADR(ni1), ADR(ni2),
ADR(chiller2), ADR(usnd_start), ADR(kdv2),
ADR(chiller), ADR(k29), ADR(k30), ADR(k31)
);


(* &#206;&#242;&#234;&#235;&#254;&#247;&#232;&#242;&#252; &#240;&#243;&#247;&#237;&#238;&#229; &#243;&#239;&#240;&#224;&#226;&#235;&#229;&#237;&#232;&#229; &#226; &#224;&#226;&#242;&#238;&#236;&#224;&#242;&#232;&#247;&#229;&#241;&#234;&#238;&#236; &#240;&#229;&#230;&#232;&#236;&#229; *)
IF auto THEN
pOut := ADR(dummy);
END_IF


IF NOT auto THEN
CASE SACmd OF
Open:
pOut^ := TRUE;
Close:
pOut^ := FALSE;
Toggle:
pOut^ := NOT pOut^;
SetATG:
IF SAArg1 = 0 THEN
PLC_PRG.ATG_SP := SAArg0;
ELSE
AUTO1.atgtemp := SAArg0;
END_IF
SetGPL:
IF SAArg1 = 0 THEN
INVControl.1 := SAArg0 > 0;
INVFreq := SAArg0 * 100;
ELSE
AUTO1.gplfreq := SAArg0;
END_IF
END_CASE
END_IF


CASE SACmd OF
SetTemp:
PLC_PRG.PID_SP := SAArg0;
SetTimers:
IF NOT SAArg0.0 THEN
AUTO1.time1 := WORD_TO_TIME(SAArg1 * 1000);
ELSE
AUTO2.time1 := WORD_TO_TIME(SAArg1 * 1000);
END_IF
StartAuto:
resetNeeded := NOT auto;
IF NOT SAArg1.0 AND AUTO1.step = 0 THEN
AUTO1.process := SAArg0;
ELSIF SAArg1.0 AND AUTO2.step = 0 THEN
AUTO2.process := SAArg0;
END_IF
StopAuto:
IF NOT SAArg1.0 THEN
AUTO1.stop := TRUE;
ELSE
AUTO2.stop := TRUE;
END_IF
AbortAuto:
IF NOT SAArg0.0 THEN
AUTO1.process := 0;
ELSE
AUTO2.process := 0;
END_IF
SetRegen:
PLC_PRG.RegenEnabled := SAArg0.0;
END_CASE
IF SACmd > 0 AND SACmd < SIZEOF(cmdStat) THEN
cmdStat[SACmd] := cmdStat[SACmd] + 1;
END_IF
SACmd := Idle;Очень вероятно, что ничего этого в вашем случае не требуется, и можно обойтись телом первой функции, то есть сразу там исполнять команду.

Евгений Кислов
16.02.2016, 12:10
Евгений Кислов, т.е просто так повернуть элемент нельзя с целью удобного расположения?

Можно ввести туда константу. Если вопрос о том, можно ли повернуть изображение в редакторе CODESYS - то, вероятно, нет.

Andrew_Stranger
16.02.2016, 13:23
Yegor, да зря попросил:).
С поворотом понятно.
Еще вопрос, у всех СПК1xx, c сенсором проблемы или только у меня? На 3 моделях уже при работе, то промахиваешься мимо кнопки, то жмется она со второго раза. Разница по сравнению с работой различных панелей оператора сразу заметна.

Евгений Кислов
16.02.2016, 13:27
Yegor, да зря попросил:).
С поворотом понятно.
Еще вопрос, у всех СПК1xx, c сенсором проблемы или только у меня? На 3 моделях уже при работе, то промахиваешься мимо кнопки, то жмется она со второго раза. Разница по сравнению с работой различных панелей оператора сразу заметна.

Попробуйте сделать калибровку экрана.

sendsay
16.02.2016, 21:16
Добрый вечер. Я никак не могу подключить СПК107 и ПЛК110. Я посмотрел видео от Вас (два видео), на втором видео не показано как настраивается СПК107, но на видео видно что в дереве объектов есть модуль Модбас. Как его туда добавить и где его взять? И если можно, то как это все настроить что бы, я на СПК нажимал кнопку, а на контроллере включался выход и на панели загоралась лампа привязанная к этому выходу. Покажите где это искать хотя бы, но лучше если все объяснить, я быстро пойму. Спасибо.

З.Ы. У меня не переключается среда в режим Эксперт, все время возвращается на Стандарт, это как вылечить?

Евгений Кислов
17.02.2016, 07:36
З.Ы. У меня не переключается среда в режим Эксперт, все время возвращается на Стандарт, это как вылечить?

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



Я посмотрел видео от Вас (два видео), на втором видео не показано как настраивается СПК107, но на видео видно что в дереве объектов есть модуль Модбас. Как его туда добавить и где его взять?

Правой кнопкой на Device - команда Добавить устройство.

22693

В Modbus COM добавляете Modbus Master, в Modbus Master - Modbus Slave. Версии компонентов не должны превышать версию таргета СПК. Настройки компонентов в примере видны.
https://www.youtube.com/watch?v=VI8Ox28tFdg

sendsay
17.02.2016, 08:02
Большое спасибо, надо было указать <All vendors> (этот пункт просто не виден надо покрутить список повыше) тогда все появляется. Настройки отображения данных делать так же как и на ПЛК, верно? Или тут какой то секрет есть?

Евгений Кислов
17.02.2016, 08:11
Большое спасибо, надо было указать <All vendors> (этот пункт просто не виден надо покрутить список повыше) тогда все появляется. Настройки отображения данных делать так же как и на ПЛК, верно? Или тут какой то секрет есть?

Секрета, в принципе, нет.

1. В Modbus COM выставляете настройки порта (должны совпадать с настройками порта ПЛК). Обратите внимание, что номера портов в CODESYS смещены на +1 по сравнению с маркировкой на СПК - т.е. первому порту СПК соответствует номер 2, второму - номер 3 и т.д.

2. В Modbus Master достаточно поставить галочку Автореконнект.

3. В Modbus Slave указываете адрес ПЛК, добавляете каналы, привязываете к ним переменные, в параметре Всегда обновлять переменные ставите значение Включено 2. Стоит обратить внимание, что к каналам вы сможете привязать только переменные типов BOOL и WORD. Если необходимо передать переменную другого типа (например, REAL), то надо ее собирать в программе.

sendsay
17.02.2016, 23:34
Секрета, в принципе, нет.

1. В Modbus COM выставляете настройки порта (должны совпадать с настройками порта ПЛК). Обратите внимание, что номера портов в CODESYS смещены на +1 по сравнению с маркировкой на СПК - т.е. первому порту СПК соответствует номер 2, второму - номер 3 и т.д.

2. В Modbus Master достаточно поставить галочку Автореконнект.

3. В Modbus Slave указываете адрес ПЛК, добавляете каналы, привязываете к ним переменные, в параметре Всегда обновлять переменные ставите значение Включено 2. Стоит обратить внимание, что к каналам вы сможете привязать только переменные типов BOOL и WORD. Если необходимо передать переменную другого типа (например, REAL), то надо ее собирать в программе.

Евгений, спасибо за помощь, но все же я не пойму как это все собрать "до кучи".
Я на строил к-анал добавил переменную но все равно ничего не работает. В режиме ОНЛАЙН поле "текущее значение" типа BOOL выглядит сереньким.

Вот фото настройки ПЛК и переменной в КДС, красным я выделил то что считаю ошибочным, потому что номера не совпадают, подскажите как это исправить.

22718

22719

З.Ы. Мне надо отобразить что выход out_1 включен. Я так понимаю что цифры, обведенные красным должны совпадать.

Спасибо.

Евгений Кислов
18.02.2016, 07:18
Евгений, спасибо за помощь, но все же я не пойму как это все собрать "до кучи".
Я на строил к-анал добавил переменную но все равно ничего не работает. В режиме ОНЛАЙН поле "текущее значение" типа BOOL выглядит сереньким.

Вот фото настройки ПЛК и переменной в КДС, красным я выделил то что считаю ошибочным, потому что номера не совпадают, подскажите как это исправить.

22718

22719

З.Ы. Мне надо отобразить что выход out_1 включен. Я так понимаю что цифры, обведенные красным должны совпадать.

Спасибо.

Выложите оба проекта, пожалуйста.

sendsay
18.02.2016, 09:22
Хорош, но только вечером,спасибо вам за терпение.

sendsay
18.02.2016, 19:45
Добрый вечер, вот файлы проекта. Посмотрите пожалуйста, буду вам признателен. Спасибо.

Евгений Кислов
19.02.2016, 07:30
Добрый вечер, вот файлы проекта. Посмотрите пожалуйста, буду вам признателен. Спасибо.

1. Проверьте, что у вас в Конфигураторе СПК выбран правильный режим порта (RS-485).
2. Для СПК в Modbus Slave в параметре Всегда обновлять переменные поставьте значение Включено 2.

22747

3. В проекте СПК вы пытаетесь записать переменную типа BOOL с помощью функции Write Multiple Registers. Так делать не стоит. Объявите переменную типа WORD и работайте с выходами с помощью битовой маски:

22748


Я так понимаю что цифры, обведенные красным должны совпадать.

Нет, не должны, не обращайте вообще внимания на эти цифры.

firetester
19.02.2016, 10:11
Доброго дня! Проблема: Не удается воспользоваться retain в СПК207. Объявляю в PROGRAM PLC_PRG
VAR RETAIN
....
end_var
После отключения питания данные не сохраняются. Надеюсь, это не от того что я работаю в SP8? ))

UPD: Разобрался. Через
init_trig:r_trig
init_trig(CLK:=controller_on) \\controller_on в var объявлен как true
IF init_trig.Q then
...
END_IF

не хочет почему-то возвращать retain в визуализацию. Через
IF bInit=false THEN
....
...
bInit:=true
end_if

почему-то кладет на место исправно. Так и не понял почему.

sendsay
21.02.2016, 20:02
1. Проверьте, что у вас в Конфигураторе СПК выбран правильный режим порта (RS-485).
2. Для СПК в Modbus Slave в параметре Всегда обновлять переменные поставьте значение Включено 2.

22747

3. В проекте СПК вы пытаетесь записать переменную типа BOOL с помощью функции Write Multiple Registers. Так делать не стоит. Объявите переменную типа WORD и работайте с выходами с помощью битовой маски:

22748


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

З.Ы. Лампа СОМ на СПК мигает, т.е. обмен идет, верно?

Евгений Кислов
21.02.2016, 20:23
Добрый вечер. Евгений, спасибо за ответы. Все работало еще в пятницу, но сейчас опять не работает. Я уверен что это просто мелочь где то надо переключить. Гляньте пожалуйста и ткните носом что бы впредь так не делать. Спасибо.

З.Ы. Лампа СОМ на СПК мигает, т.е. обмен идет, верно?

Мигание лампы означает работу порта.

У СПК в настройках слэйва, на вкладке соотнесения переменных для параметра Всегда обновлять переменные поставьте Вкл. 2 вместо Вкл. 1.

На вкладке Modbus Slave Init вы пытаетесь что-то записать в шестой регистр слэйва, который у ПЛК не объявлен.

Есть еще один момент - вы используете достаточно старую версию компонента Modbus Master, где еще не поддержано восстановление обмена при разрыве. Используйте версию 3.5.5.0 - там доступна галочка Автовосстановление соединения.

sendsay
21.02.2016, 21:07
У СПК в настройках слэйва, на вкладке соотнесения переменных для параметра Всегда обновлять переменные поставьте Вкл. 2 вместо Вкл. 1.

Дело в том что у меня, этот параметр не меняется, там стоит чекбокс, а не листвью. Это наверное надо установить другую версию КДС. Сейчас стоит 3.5 SP4 patch 4. Пойду искать какую вы сказали.



На вкладке Modbus Slave Init вы пытаетесь что-то записать в шестой регистр слэйва, который у ПЛК не объявлен.


Опляяяя, а это когда я поставил?

Евгений Кислов
21.02.2016, 21:11
Дело в том что у меня, этот параметр не меняется, там стоит чекбокс, а не листвью. Это наверное надо установить другую версию КДС. Сейчас стоит 3.5 SP4 patch 4. У вас какая версия и где взяли?



Опляяяя, а это когда я поставил?

Скачайте 3.5 SP5 Patch5:
http://www.owen.ru/catalog/codesys_v3/opisanie

sendsay
21.02.2016, 22:12
Есть еще один момент - вы используете достаточно старую версию компонента Modbus Master, где еще не поддержано восстановление обмена при разрыве. Используйте версию 3.5.5.0 - там доступна галочка Автовосстановление соединения.

Это вот этот что ли? Так оно у меня заблокировано. Уже поставил 3.5.5.5

22787

И все равно не работает. Если в ручную указываю по маске, то работает, а с ПЛК нет.

Евгений Кислов
21.02.2016, 22:35
Это вот этот что ли? Так оно у меня заблокировано. Уже поставил 3.5.5.5


Чтобы галочка стала активной, надо правой кнопкой на Modbus Master - Обновить устройство - выбрать версию 3.5.5.0.


И все равно не работает. Если в ручную указываю по маске, то работает, а с ПЛК нет.

Подробно, опишите, пожалуйста, что у вас работает и что не работает.

sendsay
21.02.2016, 23:01
Спасибо за Ваше терпение.
Начну все сначала. Проект вы уже видели. Я подключил ПЛК110 к СПК107, посредством протокола модбас. В режиме ОНЛАЙН, в контроллере я переключаю переменные, они переключают выходы. На контроллере происходят изменения т.е. загораются соответствующие выходы и щелкают реле. На СПК показаны 4 лампочки, которые должны подсвечивать соответствующий выход. Эти лампочки не загораются когда происходят изменения на контроллере, но загораются когда я в режиме ОНЛАЙН переключаю битовую маску, т.е. в поле Подготовленное значение я вписываю например 16, у меня загорается соответствующая лампочка, а вот из контроллера НЕТ. Лампа СОМ на СПК мигает, т.е. обмен идет, а вот результат НЕТ. В пятницу все работало, после ваших советов, сегодня я открыл не тот проект, закрыл его, открыл нужный, и оказалось что ничего не работает, т.е. нет связи наверное. КДС я переустановил на 3.5.5.5. все новые рекомендации выполнил, но не помогает. Вот такая проблема. Я уверен что это из за не опытности работы с системой ОВЕН, потому что с Дельтой именно с модбас, у меня тоже были проблемы. Но через время я уже советовал людям что и как. Проблема наверное в мелочи, как всегда. Спасибо. Если что то еще надо пишите, все дам что надо.

sendsay
21.02.2016, 23:03
Чтобы галочка стала активной, надо правой кнопкой на Modbus Master - Обновить устройство - выбрать версию 3.5.5.0.


Вот это, вообще подвох из подвохов. Никогда бы не подумал так сделать. :)

Кстати, а можно подключить СПК к ПЛК по СОМ протоколу и как с этим потом работать, тоже как через мод бас?

Евгений Кислов
21.02.2016, 23:09
Если я правильно уловил вашу проблему, то ее причина очевидна - вы же в СПК используете только функцию Write Multiple Registers, т.е. только записываете. Если надо отобразить состояние переменных ПЛК, то добавьте еще один канал с функцией Read Input Registers, считывайте нулевой регистр из ПЛК в новую переменную и привязывайте ее биты к визуализации.

sendsay
21.02.2016, 23:13
Попробую, хоть и поздно уже. Спасибо.
А как тогда произвести передачу нажатия кнопки? Именно функцией №16?

sendsay
21.02.2016, 23:18
Урааа!! Заработало. СПАСИБО. Скажите как передать нажатие, я так понимаю также только через Write Multiple Registers. Правильно?

Евгений Кислов
21.02.2016, 23:41
Урааа!! Заработало. СПАСИБО. Скажите как передать нажатие, я так понимаю также только через Write Multiple Registers. Правильно?

Да, как вариант. На самом деле, для записи бит подходит любая функция со словом Write в названии, но в большинстве случаев удобнее записывать биты через регистры с помощью маски.

Anton441
27.02.2016, 21:57
Вопрос про ПИД-регулятор из библиотеки UTIL v 0.0.0.0 (CoDeSys).
Создаю проект в CODESYS V3.5 SP5 Patch 3.
Использую функциональный блок PID из библиотеки UTIL.
При компиляции получаю несколько ошибок из-за неверно объявленного функционального блока таймера TON в строке 23 библиотечного функционального блока PID (см. рис. 2).
Куда делся таймер?!
В чём дело? Помогите! Я - новичок.

22867

22868

Евгений Кислов
27.02.2016, 22:09
Вопрос про ПИД-регулятор из библиотеки UTIL v 0.0.0.0 (CoDeSys).
Создаю проект в CODESYS V3.5 SP5 Patch 3.
Использую функциональный блок PID из библиотеки UTIL.
При компиляции получаю несколько ошибок из-за неверно объявленного функционального блока таймера TON в строке 23 библиотечного функционального блока PID (см. рис. 2).
Куда делся таймер?!
В чём дело? Помогите! Я - новичок.

22867

22868

У вас что-то не так с библиотекой Util. Каким образом вы ее установили и добавили в проект? Выложите скриншот Менеджера библиотек.

Anton441
27.02.2016, 22:42
У вас что-то не так с библиотекой Util. Каким образом вы ее установили и добавили в проект? Выложите скриншот Менеджера библиотек.

Скриншот Менеджера библиотек с установленной библиотекой UTIL.

22869

Евгений Кислов
27.02.2016, 22:52
Скриншот Менеджера библиотек с установленной библиотекой UTIL.

22869

Вы, очевидно, подключили к CODESYS V3 библиотеку Util от CODESYS 2.3. Так делать не надо. В CODESYS V3 точно также есть встроенная библиотека Util - добавьте в ваш проект ее.

Anton441
27.02.2016, 23:03
Каким образом вы ее установили и добавили в проект?


Добавил следующим образом:
Менеджер библиотек-Добавить библиотеку-(Смешан.)-UTIL-OK

Перед этим распаковал Репозиторий:

http://www.owen.ru/uploads/txtlic.php?url=http:/ftp.owen.ru/index.html/CoDeSys3/02_Repository_Archiv/Repository_OWEN_SPK_3.5.4.20.package

Евгений Кислов
27.02.2016, 23:05
Добавил следующим образом:
Менеджер библиотек-Добавить библиотеку-(Смешан.)-UTIL-OK

Перед этим распаковал Репозиторий:

http://www.owen.ru/uploads/txtlic.php?url=http:/ftp.owen.ru/index.html/CoDeSys3/02_Repository_Archiv/Repository_OWEN_SPK_3.5.4.20.package

Выбирайте не из Смешан., а из Aplication - Common.

Anton441
27.02.2016, 23:10
Выбирайте не из Смешан., а из Aplication - Common.

Ура!
Всё заработало. Компиляция без ошибок!
Ранее была добавлена устаревшая версия библиотеки UTIL.
Спасибо!

Andrew_Stranger
01.03.2016, 11:39
После удаления визуализаций в проекте появились ошибки:
[ERROR] ZKT_3_4_v1: C0077: Unknown type: 'Visualization_9__vis'
[ERROR] ZKT_3_4_v1: C0077: Unknown type: 'Visualization_12__vis'
[ERROR] ZKT_3_4_v1: C0077: Unknown type: 'Visualization_4__vis'
Ссылок на данные визуализации в проекте нет. Как быть.

Евгений Кислов
01.03.2016, 12:03
После удаления визуализаций в проекте появились ошибки:
[ERROR] ZKT_3_4_v1: C0077: Unknown type: 'Visualization_9__vis'
[ERROR] ZKT_3_4_v1: C0077: Unknown type: 'Visualization_12__vis'
[ERROR] ZKT_3_4_v1: C0077: Unknown type: 'Visualization_4__vis'
Ссылок на данные визуализации в проекте нет. Как быть.

Очистить все - Перекомпиляция не помогает? Есть возможность выложить архив проекта?

Andrew_Stranger
01.03.2016, 12:36
Не помогло. Как можно в личном сообщении отправить?

Евгений Кислов
01.03.2016, 13:05
Не помогло. Как можно в личном сообщении отправить?

Отправьте на e.kislov@owen.ru

Евгений Кислов
03.03.2016, 07:39
Не помогло. Как можно в личном сообщении отправить?

Ответил вам на почту, на всякий случай, продублирую и здесь: ошибки при компиляции, подобные упомянутым в посте #676, возникают по той причине, что на некоторых экранах проекта к кнопкам привязано действие Закрыть диалог с выбранным системным диалогом FileOpenSave. При удалении этого действия и добавления его заново, ошибки исчезают.

22953

Sanchez72
03.03.2016, 09:44
Добрый день!
Требуется программист фриланс codesys 3.5 под спк207!

Не нашел ветки для поиска программистов на форуме, или плохо искал ?)


rishatovich@gmail.com
89224866346

ntro123
03.03.2016, 17:25
Не получается подключить через WinSCP к ПЛК 323:

22968
22967

Требует пароль. Пытался разные пароли: 12345, 54321 и пустой пароль.

Евгений Кислов
03.03.2016, 17:42
Не получается подключить через WinSCP к ПЛК 323:

22968
22967

Требует пароль. Пытался разные пароли: 12345, 54321 и пустой пароль.

Вместо протокола SFTP выберите SCP. Поле пароля оставьте пустым.

ntro123
03.03.2016, 17:49
Выбрал SCP, тоже самое:
22969

Евгений Кислов
03.03.2016, 17:56
Выбрал SCP, тоже самое:
22969

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

ntro123
03.03.2016, 17:57
Он БУ (но насколько я понял он вообще не был использован), также он был перепрошит лично мной. Доступ к web-интерфейсу есть по адресу 192.168.0.77.

Евгений Кислов
03.03.2016, 18:02
Он БУ (но насколько я понял он вообще не был использован), также он был перепрошит лично мной. Доступ к web-интерфейсу есть по адресу 192.168.0.77.

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

ntro123
03.03.2016, 18:06
1) Putty настройки:
22970
Ввод логина root и пустого пароля, результат:
22971

2) WinSCP с логином root и пустым паролем:
22972


PS прошивал вот этим:
сначала 1_setup_plc_firmware_v1.025.exe , затем сразу 2_usr_fw_setup_plc323web_v3.212

Евгений Кислов
03.03.2016, 18:10
1) Putty настройки:
22970
Ввод логина root и пустого пароля, результат:
22971

2) WinSCP с логином root и пустым паролем:
22972


PS прошивал вот этим:
сначала 1_setup_plc_firmware_v1.025.exe , затем сразу 2_usr_fw_setup_plc323web_v3.212

В процессе прошивки подразумевается подключение через Putty с логином root и пустым паролем. Это было произведено? Или проблема наблюдалась уже в тот момент?

ntro123
03.03.2016, 18:21
В процессе прошивки подразумевается подключение через Putty с логином root и пустым паролем. Это было произведено? Или проблема наблюдалась уже в тот момент?

Честно говоря через putty никакого подключения на прямую не было (если только в самих файлах устанавливающих прошивку это не реализована, я говорю про лог который напоминает putty диалог см. скрин):
22973

Я устанавливал тупо методом тыка "далее-далее-далее" когда спрашивали какие-либо настройки (шлюз, MAC адрес, ip ПЛК) и т.д. я вводил. НО я точно ничего не вводил руками, никаких root'ов и паролей.

UPD:
Помог мне тов. Евгений Кислов, все оказалось куда проще, откуда-то в поле пароля попадали лишние символы (возможно от программы puntoswitcher) лечиться очень просто:
Нажимаем на поле пароля и много раз бэкспейс (удаление символа).

Спасибо за помощь.

ntro123
04.03.2016, 17:12
Как объявить перевод строки? просто в строке \n не помогает =) компилятор видит это как простое символы.
"\n" - так объявляет WSTRING. Остается только вариант насильно записать ASCII кода 16#0A в нужное место строки? Гуглил, читал мануалы не соображу никак как работать со спец символами в codesys.

str:STRING:='123123123\n'; // нужно чтобы они видел здесь спец символ, как сделать?

Кроме костылей в голову ничего не приходит:
str[LEN(str)+1]:=16#00;
str[LEN(str)]:=16#0A;

Евгений Кислов
04.03.2016, 18:02
Как объявить перевод строки? просто в строке \n не помогает =) компилятор видит это как простое символы.
"\n" - так объявляет WSTRING. Остается только вариант насильно записать ASCII кода 16#0A в нужное место строки? Гуглил, читал мануалы не соображу никак как работать со спец символами в codesys.

str:STRING:='123123123\n'; // нужно чтобы они видел здесь спец символ, как сделать?

Кроме костылей в голову ничего не приходит:
str[LEN(str)+1]:=16#00;
str[LEN(str)]:=16#0A;

Не уверен, что правильно понял вопрос, но если речь об управляющих последовательностях в CODESYS (например, отображать STRING переменную в визуализации в несколько строк), то см. п. 9.3 документа СПК. Визуализация.

23012

ntro123
04.03.2016, 18:04
Нет, есть строка '2353454674757756' ее я записываю в файл, но хочу чтобы записалась эта строка + знак новой(перевод) строки \n.

capzap
04.03.2016, 18:18
Нет, есть строка '2353454674757756' ее я записываю в файл, но хочу чтобы записалась эта строка + знак новой(перевод) строки \n.

$R$N попробуйте

ntro123
04.03.2016, 19:02
Спасибо, понял, экранирование не как в СИ через обратный слеш) а через $. Помогло.

ntro123
05.03.2016, 18:40
buf:STRING(100000);

...

FOR j:=0 TO sz DO
IF buf[j]=16#31 THEN // 31h ASCII код единицы '1'
n:=n+1;
END_IF
END_FOR



Я не хочу писать ASCII коды, я хочу чето типо:
IF buf[j]='1' THEN
...

Но он жалуется что разные типы, тогда делаю STRING_TO_BYTE('1') но тогда равенство не выполняется. Т.е. он просто преобразует '1' в 01d
при этом если взять BYTE_TO_STRING(buf[j]) тоже не помогает.

Как быть? Не нашел ничего в документации как сделать так, чтобы работало по человечески?

Евгений Кислов
05.03.2016, 18:50
buf:STRING(100000); // переменная buf

...

FOR j:=0 TO sz DO
IF buf[j]=16#31 THEN // попытка обращения к массиву переменных buf
n:=n+1;
END_IF
END_FOR



Я не хочу писать ASCII коды, я хочу чето типо:
IF buf[j]='1' THEN
...

Но он жалуется что разные типы, тогда делаю STRING_TO_BYTE('1') но тогда равенство не выполняется. Т.е. он прото преобразует '1' в 01d
при этом если взять BYTE_TO_STRING(buf[j]) тоже не помогает.

Как быть? Не нашел ничего в документации как сделать так, чтобы работа по человечески?

Предлагаю быть так:


buf:ARRAY [0..100000] OF STRING;

...

IF buf[j]='1' THEN
...

ntro123
05.03.2016, 19:06
Не подходит, у меня 524288 байт (0.5 МБ) так как целый файл считываю в буфер (по мои подсчетам это его максимальный размер с запасом).

Если сделать как вы предложили:
buf:ARRAY [0..524288] OF STRING;
то ПЛК выдает что памяти не достаточно.

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

Все равно спасибо!

RV9WFJ
05.03.2016, 19:29
buf:STRING(100000);
CS не подднрживает строки более 255 символов, или что-то изменилось?

ntro123
05.03.2016, 19:35
Поддерживает, просто стандартные ф-ции работают со строками до 255 символов, но нужные мне я написал заново:
пример (вычисляем длину, для строк до 1024 символа, очень легко расширить до других значений):



FUNCTION LEN_BIG : UINT
VAR_INPUT
str:STRING(1024);
END_VAR
VAR
p:POINTER TO BYTE;
END_VAR
-----------------------------------------------
p:=ADR(str);

LEN_BIG:=0;

WHILE p^<>0 AND LEN_BIG<=1024 DO
LEN_BIG:=LEN_BIG+1;
p:=p+1;
END_WHILE

RV9WFJ
06.03.2016, 12:40
А касательно вашего вопроса, мне кажется уместно использовать указатель. Например так:

buf:STRING(100000);
sChr:STRING(1):='1';
bNum:BYTE;
pNum:POINTER_TO_BYTE;
pChr: POINTER_TO_STRING;

...

pChr:=ADR(sChr);
pNum:=pChr
bNum:=pNum^;
FOR j:=0 TO sz DO
IF buf[j]=bNum THEN
n:=n+1;
END_IF
END_FOR
Можно наверно даже сократить код, но так понятнее.

ntro123
06.03.2016, 14:11
Спасибо, действительно вариант, но накладный, лучше уж ASCII коды и в комментариях рядом писать что за символ.

ntro123
10.03.2016, 19:11
Товарищи программисты, пытаюсь разобраться с модемом на ПЛК 323, получилось его активировать (по FAQ на сайте овена) мигает красным лампочка GSM.
Пытаюсь на 3 ком порт отправить команду AT, ответа не получаю. Выкладываю проект (CDS3.5).

Настройки подключения к ком порту:

com_settings:ARRAY [1..7] OF COM.PARAMETER:=[
(udiParameterId := COM.CAA_Parameter_Constants.udiPort, udiValue:=3),
(udiParameterId := COM.CAA_Parameter_Constants.udiBaudrate, udiValue:=9600),
(udiParameterId := COM.CAA_Parameter_Constants.udiParity, udiValue:=COM.PARITY.NONE),
(udiParameterId := COM.CAA_Parameter_Constants.udiStopBits, udiValue:=COM.STOPBIT.ONESTOPBIT),
(udiParameterId := COM.CAA_Parameter_Constants.udiTimeout, udiValue:=0),
(udiParameterId := COM.CAA_Parameter_Constants.udiByteSize, udiValue:=8),
(udiParameterId := COM.CAA_Parameter_Constants.udiBinary, udiValue:=0)
];

для тех кто не хочет качать проект PLC_PRG:

CASE step OF
0:
Power:=TRUE; // включаем GSM модем
IF Status=TRUE THEN
;
END_IF

port_open(port:=3);

IF port_open.status=1 THEN
step:=1;
ELSIF port_open.status<0 THEN
step:=99;
END_IF

buf:='AT';
1:
write(xExecute:=TRUE, hCom:=gbHD, pBuffer:=ADR(buf), szSize:=LEN(buf));

IF write.xDone THEN
step:=2;
ELSIF write.xError THEN
step:=200;
END_IF
2:
read(xExecute:=TRUE, hCom:=gbHD, pBuffer:=ADR(buf2),
szSize=>len_res);

IF read.xDone AND len_res>0 THEN
step:=3;
ELSIF read.xError THEN
step:=200;
END_IF
3:
port_close();

IF port_close.status=1 THEN
step:=100;
ELSIF port_close.status<0 THEN
step:=200;
END_IF
END_CASE

Что я делаю не так?

PS через putty я получаю ответ ОК.

energvk
11.03.2016, 14:42
Не могу найти, что означает в режиме мониторинга в Конфигурации задач статус "Valid, Активный"?
23093

Евгений Кислов
11.03.2016, 14:59
Не могу найти, что означает в режиме мониторинга в Конфигурации задач статус "Valid, Активный"?
23093

Valid - то, что задача нормально выполняется (иначе здесь может быть, например, Exception)
Active - то, что эта задача выполняется конкретно в данный момент.

energvk
11.03.2016, 15:05
Понятно, спасибо. А почему при этом статус висит постоянно и циклы останавливаются? Я так понимаю, что происходит остановка на каком-то моменте внутри программы и она дальше не выполняется? Тогда непонятно почему не происходит исключение по сторожевому таймеру...

Евгений Кислов
11.03.2016, 15:22
Понятно, спасибо. А почему при этом статус висит постоянно и циклы останавливаются? Я так понимаю, что происходит остановка на каком-то моменте внутри программы и она дальше не выполняется? Тогда непонятно почему не происходит исключение по сторожевому таймеру...

Какие настройки у Watchdog?

energvk
11.03.2016, 15:28
Ставил 2000 мс и 10000 мс

Евгений Кислов
11.03.2016, 15:31
Ставил 2000 мс и 10000 мс

У вас конкретно одна задача перестает выполняться? Или одна из программ в этой задаче? Оба счетчика циклов останавливаются? В какой момент времени это происходит?
Вообще, без проекта и описания, как воспроизвести проблему, трудно подсказать что-то конкректное.

energvk
11.03.2016, 15:44
Перестает выполняться одна программа и при этом перестает выполняться задача, в которой эта программа находится. Происходит это на 501 или 502 цикле. Ссылку на программу сейчас скину

energvk
11.03.2016, 17:28
Понятно, спасибо. А почему при этом статус висит постоянно и циклы останавливаются? Я так понимаю, что происходит остановка на каком-то моменте внутри программы и она дальше не выполняется? Тогда непонятно почему не происходит исключение по сторожевому таймеру...


Перестает выполняться одна программа и при этом перестает выполняться задача, в которой эта программа находится. Происходит это на 501 или 502 цикле. Ссылку на программу сейчас скину

Как я понял в итоге после разбора программы - происходит зависание на выполнении функциональных блоков:
этого


rtr_a1(CLK:= in1, Q=> ); b1:=rtr_a1.Q;
rtr_a2(CLK:= in2, Q=> ); b2:=rtr_a2.Q;
rtr_a3(CLK:= in3, Q=> ); b3:=rtr_a3.Q;
rtr_a4(CLK:= in4, Q=> ); b4:=rtr_a4.Q;
rtr_a5(CLK:= in5, Q=> ); b5:=rtr_a5.Q;
rtr_a6(CLK:= in6, Q=> ); b6:=rtr_a6.Q;
rtr_a7(CLK:= in7, Q=> ); b7:=rtr_a7.Q;
rtr_a8(CLK:= in8, Q=> ); b8:=rtr_a8.Q;
rtr_a9(CLK:= in9, Q=> ); b9:=rtr_a9.Q;
rtr_a10(CLK:= in10, Q=> ); b10:=rtr_a10.Q;
rtr_a11(CLK:= in11, Q=> ); b11:=rtr_a11.Q;
rtr_a12(CLK:= in12, Q=> ); b12:=rtr_a12.Q;
rtr_a13(CLK:= in13, Q=> ); b13:=rtr_a13.Q;
rtr_a14(CLK:= in14, Q=> ); b14:=rtr_a14.Q;
rtr_a15(CLK:= in15, Q=> ); b15:=rtr_a15.Q;
rtr_a16(CLK:= in16, Q=> ); b16:=rtr_a16.Q;

rtr_out (CLK:=(b1 OR b2 OR b3 OR b4 OR b5 OR b6 OR b7 OR b8 OR b9 OR b10 OR b11 OR b12 OR b13 OR b14 OR b15 OR b16), Q=>out);


либо



//регистрация вкл/выкл события
rtr_1(CLK:= in1, Q=> ); rtr_2(CLK:= in2, Q=> ); rtr_3(CLK:= in3, Q=> ); rtr_4(CLK:= in4, Q=> ); rtr_5(CLK:= in5, Q=> );
rtr_6(CLK:= in6, Q=> ); rtr_7(CLK:= in7, Q=> ); rtr_8(CLK:= in8, Q=> ); rtr_9(CLK:= in9, Q=> ); rtr_10(CLK:= in10, Q=> );

on_1:=rtr_1.Q; on_2:=rtr_2.Q; on_3:=rtr_3.Q; on_4:=rtr_4.Q; on_5:=rtr_5.Q;
on_6:=rtr_6.Q; on_7:=rtr_7.Q; on_8:=rtr_8.Q; on_9:=rtr_9.Q; on_10:=rtr_10.Q;

ftr_1(CLK:= in1, Q=> ); ftr_2(CLK:= in2, Q=> ); ftr_3(CLK:= in3, Q=> ); ftr_4(CLK:= in4, Q=> ); ftr_5(CLK:= in5, Q=> );
ftr_6(CLK:= in6, Q=> ); ftr_7(CLK:= in7, Q=> ); ftr_8(CLK:= in8, Q=> ); ftr_9(CLK:= in9, Q=> ); ftr_10(CLK:= in10, Q=> );

off_1:=ftr_1.Q; off_2:=ftr_2.Q; off_3:=ftr_3.Q; off_4:=ftr_4.Q; off_5:=ftr_5.Q;
off_6:=ftr_6.Q; off_7:=ftr_7.Q; off_8:=ftr_8.Q; off_9:=ftr_9.Q; off_10:=ftr_10.Q;

//упаковка в биты
actions.0:=on_1;
actions.1:=off_1;
actions.2:=on_2;
actions.3:=off_2;
actions.4:=on_3;
actions.5:=off_3;
actions.6:=on_4;
actions.7:=off_4;
actions.8:=on_5;
actions.9:=off_5;
//выходные переменные
IF rtr_1.Q OR ftr_1.Q OR rtr_2.Q OR ftr_2.Q OR rtr_3.Q OR ftr_3.Q OR rtr_4.Q OR ftr_4.Q OR rtr_5.Q OR ftr_5.Q
OR rtr_6.Q OR ftr_6.Q OR rtr_7.Q OR ftr_7.Q OR rtr_8.Q OR ftr_8.Q OR rtr_9.Q OR ftr_9.Q OR rtr_10.Q OR ftr_10.Q THEN
event:= actions;
save:= TRUE;
ELSE save:= FALSE;
END_IF


Ранее периодически происходило исключение на первых строках этих блоков, в причине так и не разобрался. Вроде зависать не на чем. Закомментировав вызовы программ, где они используются, останов задач прекратился. Только не ясно почему перестало происходит Исключение - останов программы...

ntro123
11.03.2016, 17:52
как мне кажется команды read и write не получают на вход xExecute:= false

Спасибо за ответ.

Да они не получают false, а зачем (там жеш step дальше идет)? мне же нужно чтобы они работали им TRUE даю, если еще write можно после выполнения сделать xExecute:= false, то read точно должен быть true пока не получит ответ, а ответ я не получаю.

Строку изменил с 'AT' на 'ATZ$R' как я это увидел у другом проекте.

Может быть проблема в том, что я использую:
write:COM.Write;
read:COM.Read;

а нужно SysCom.* ???

UPD:
Разобрался, заработало.
И хочу сказать: это пи*ц какой-то этот FAQ на овене, и эта документация на ПЛК323, везде пишут по разному, и везде 1/10 пользы. Приходиться по форуму 50 топиков просмотреть чтобы понять что к чему и найти хоть какой-то рабочий проект. Всем кто отвечал спасибо.

александр 64
11.03.2016, 19:45
подскажите как в проект засунуть экспортный файл SPK_PCV.export.

Евгений Кислов
11.03.2016, 20:57
подскажите как в проект засунуть экспортный файл SPK_PCV.export.

Выделяете кликом Application, вверху выбираете меню Проект, в нем выбираете команду Импорт и указываете путь к файлу.

23103

ntro123
12.03.2016, 16:08
Это единственный способ передавать данные через модем?


6.6.3 Обмен данными с ТСP/IP сервером по GPRS
...
AT+CIPSEND <данные> <0x0A> – передача данных по установленному соединению.
...

цитата из офф. документации к ПЛК 323

1) Можно как-то просто получить дескриптор на открытое AT командами соединение с сервером через модем и уже передавать данные используя сокеты?
2) ИЛИ можно ли получить указатель/дескриптор на модем, открыть соединение с сервером по средствам сокетов и передавать данные с помощью них? Или единственный вариант это AT команда для передачи данных?

Инженер23
14.03.2016, 10:03
Как сделать так чтобы код (функция) выполнялся только один раз при запуске? Язык ST Нужно проверить значения переменных, задать начальные значения и т.п.

RV9WFJ
14.03.2016, 10:15
bFlag: BOOL;

IF NOT bFlag THEN
(*Ваш код, исполняемый один раз*)
bFlag:=TRUE;
END_IF;

npu3pak
14.03.2016, 13:28
Здравствуйте. Прошу помощи: есть энкодер ARCOM SP40\6 (24VDC), СПК107, МВ110-32ДН, МВ110-8АС. К какому модулю лучше подключить энкодер (максимальная рабочая скорость около 2х оборотов в сек. = 2048 имп\сек). МВ110-32ДН с блоком INC_DEC не тянет, возможно ли подключить его к МВ110-8АС?

RV9WFJ
14.03.2016, 13:34
Лучше энкодер к СПК107 не цеплять вовсе, или использовать для этого или специализированный модуль (не овен) или ПЛК110 М02 и с них уже читать данные по интерфейсу. Но временная задержка будет большая, надо это учитывать.

npu3pak
14.03.2016, 13:57
Как вариант СИ8-RS? И показания выкинуть в сеть?

RV9WFJ
14.03.2016, 14:07
Можно и так, про счетчики то я и забыл. Только интерфейс кривенький в СИ8, сначала почитайте про него, устроит ли он вас.

npu3pak
14.03.2016, 14:09
А к МВ110-8АС не удастся? У этого блока вход до 10кГц.

RV9WFJ
14.03.2016, 14:23
А то что этот модуль аналоговый вас не смущает? :) Даже если вы зацепите какой-то резистор и будете сравнивать числа, то на передачу и обработку одного импульса у вас уйдет несколько сотен мс. Возьмем даже идеальный вариант в р-не 120..150 мс, думаю это вас никак не устроит. Это все при том что мы теряем направление вращения, а с ним еще тише. Ставьте СИ8 или СИ30.

npu3pak
14.03.2016, 14:50
Ясно, спасибо большое, так и думал что придётся СИ8 городить. Просто была надежда, запитать энкодер 10В (позволяет), а вход МВ110 настроить 0-10В. Смысл тогда продавать "скоростные" входы?

ntro123
15.03.2016, 11:07
Очень часто codesys не видит ПЛК323 (точнее он не выходит в сеть, т.к. даже не пингуется) и так приходиться его по 1-3 раза переподключать и если повезет он выйдет в сеть, уже надоело этим заниматься, что я делаю не так? кабель коннечусь через эзернет.

npu3pak
15.03.2016, 15:26
Здравствуйте. Может кто нибудь подсказать подключение СИ-8 к СПК (КДС3.5 сп.5). А то у меня одна какая-то "грязь" летит.

npu3pak
16.03.2016, 15:52
И как обычно никого...

ntro123
16.03.2016, 16:32
Хочу вас морально поддержать, на 70% моих вопросов тоже никто не отвечает, приходиться читать мануалы (если бы их можно было просто прочитать, и сделать как написано, это было бы чудо), дело в том, что если в разделе FAQ и в мануале ОФИЦИАЛЬНОМ указана совсем противоречивая информация, а когда задаешь вопрос здесь, то молчок - это трудно. Бывает на элементарные вопросы по 1-2 дня убиваю. Видимо наши вопросы слишком сложны или слишком глупы. Удачи вам

Andrew_Stranger
16.03.2016, 19:01
Хочу вас морально поддержать, на 70% моих вопросов тоже никто не отвечает, приходиться читать мануалы (если бы их можно было просто прочитать, и сделать как написано, это было бы чудо), дело в том, что если в разделе FAQ и в мануале ОФИЦИАЛЬНОМ указана совсем противоречивая информация, а когда задаешь вопрос здесь, то молчок - это трудно. Бывает на элементарные вопросы по 1-2 дня убиваю. Видимо наши вопросы слишком сложны или слишком глупы. Удачи вам А что можно ответить на слова "спасите, грязь летит"? Конкретики ноль.

Alex8
16.03.2016, 21:22
Работаю слесарем КипиА на производстве, хочу оборудовать
станок СПК107 и ПР200. Минимальную визуализацию делать научился, вопрос в том,
что необходимо для управления станком сделать 5 программ, в каждой по 3 уставки.
С одной программой понятно, привязываю к переменным типа word каждую уставку и
отправляю на ПР200, а как сделать 5 программ никак не знаю. Чтоб при выборе программы
значения переменных менялись в соответствии с уставкой на экране и отправлялись на ПР Подскажите кто знает.

Евгений Кислов
16.03.2016, 21:41
Работаю слесарем КипиА на производстве, хочу оборудовать
станок СПК107 и ПР200. Минимальную визуализацию делать научился, вопрос в том,
что необходимо для управления станком сделать 5 программ, в каждой по 3 уставки.
С одной программой понятно, привязываю к переменным типа word каждую уставку и
отправляю на ПР200, а как сделать 5 программ никак не знаю. Чтоб при выборе программы
значения переменных менялись в соответствии с уставкой на экране и отправлялись на ПР Подскажите кто знает.

Например, так:


programma:INT; // номер программы
ustavka1:WORD;
ustavka2:WORD;
ustavka3:WORD;

CASE programma OF
1: ustavka1:=1, ustavka2:=5, ustavka3:=10;
...
5: ustavka1:=5, ustavka2:=15, ustavka3:=35;
END_CASE

Оператор вводит номер программы в переменную programma, в зависимости от номера переменным уставок присваиваются разные значения.

Alex8
16.03.2016, 22:05
5 программ по 3 уставки получается 15 уставок. Как оператору с экрана задавать значения этим уставкам?

Евгений Кислов
17.03.2016, 07:33
5 программ по 3 уставки получается 15 уставок. Как оператору с экрана задавать значения этим уставкам?

Тогда вот так:



PROGRAM PLC_PRG
VAR
ProgramForWrite:INT; // выбор программы, записываемой в ПР
WriteProgram:BOOL; // триггер записи программы в ПР
ProgramForChange:INT; // выбор программы, уставки которой меняются оператором
ustavki: ARRAY [1..5, 1..3] OF WORD; // уставки, 5 - число программ, 3 - число уставок в программе
END_VAR


IF WriteProgram THEN
CASE ProgramForWrite OF
1: ustavki[ProgramForWrite,1]:=1; ustavki[ProgramForWrite,2]:=5; ustavki[ProgramForWrite,3]:=10;
...
5: ustavki[ProgramForWrite,1]:=4; ustavki[ProgramForWrite,2]:=8; ustavki[ProgramForWrite,3]:=16;
END_CASE
END_IF


Оператор выбирает номер программы, в которой он будет задавать уставки (ProgramForChange). К трем полям ввода будут привязаны переменные ustavki[ProgramForChange,1], ustavki[ProgramForChange,2] и ustavki[ProgramForChange,3]. После этого оператор выбирает номер программы, которую нужно записать в ПР (ProgramForWrite) и нажимает кнопку WriteProgram, которая генерирует единичный импульс.

ntro123
17.03.2016, 14:48
А что можно ответить на слова "спасите, грязь летит"? Конкретики ноль.

Даю ПОЛНОСТЬЮ всю информацию как и ранее:
у меня ПЛК 323, подключаю codesys с уже проложенным путем до ПЛК 323, открываю device вкладку,
ПЛК в этот момент выключен
лампочка на вкладке device красная
включаю ПЛК
лампочка на вкладке device красная, и жду когда загорится на самом ПЛК красная лампочка "работа"
и тогда в самом codesys с вероятностью 30% загорится зеленая лампочка, которая будет говорить что ПЛК законнектился

ТО ЕСТЬ меня интересует, почему этот ПЛК 323 не всегда коннектиться? это брак? или нужен какой-то ОСОБЫЙ алгоритм подачи питания на ПЛК?

npu3pak
18.03.2016, 16:19
Здравствуйте. Может кто нибудь подсказать подключение СИ-8 к СПК (КДС3.5 сп.5). А то у меня одна какая-то "грязь" летит.
Какая конкретика? Попросил пример для СПК и устройства с протоколом OWEN.

Инженер23
21.03.2016, 11:54
Подскажите пожалуйста как работать с временем и датами на ST.
Интересует объявление и сравнение.
Например я хочу сделать автозапуск в 5 утра каждый будний день, и не запускать 8 марта 1 января.
Для начала я хочу понять как объявить дату. Вроде можно так
stime: DATE:=D#2017-03-08;
Далее нужно узнать какая сегодня дата как это сделать я не нашел
И наконец сравнить. Этого тоже не нашел.
С временем нашел как делать в визуализации #t[MM:dd] и на экран выводится то что надо а как в ST с временем работать не нашел.

Евгений Кислов
21.03.2016, 12:05
Подскажите пожалуйста как работать с временем и датами на ST.
Интересует объявление и сравнение.
Например я хочу сделать автозапуск в 5 утра каждый будний день, и не запускать 8 марта 1 января.
Для начала я хочу понять как объявить дату. Вроде можно так
stime: DATE:=D#2017-03-08;
Далее нужно узнать какая сегодня дата как это сделать я не нашел
И наконец сравнить. Этого тоже не нашел.
С временем нашел как делать в визуализации #t[MM:dd] и на экран выводится то что надо а как в ST с временем работать не нашел.

Воспользуйтесь библиотекой CAA DTutil Extern (входит в состав CODESYS).

Конкретно вам понадобится ФБ GetDateAndTime.
Посмотреть пример можно тут:
http://www.owen.ru/forum/showthread.php?t=21476

Инженер23
21.03.2016, 13:48
Воспользуйтесь библиотекой CAA DTutil Extern (входит в состав CODESYS).

Конкретно вам понадобится ФБ GetDateAndTime.
Посмотреть пример можно тут:
http://www.owen.ru/forum/showthread.php?t=21476
с помощью асистента ввода Написал следующее (назвал da)
data_time : DATE_AND_TIME;
da: RTCLK;
da.GetDateAndTime(
// xExecute:= ,
// xDone=> ,
// xBusy=> ,
// xError=> ,
// eError=> ,
dtDateAndTime=> data_time);
// eTimezone=> );

Компилятор пишет ошибки
RTCLK неизвестный тип
функциональный блок должен иметь экземпляр устройства

Евгений Кислов
21.03.2016, 14:15
с помощью асистента ввода Написал следующее (назвал da)
data_time : DATE_AND_TIME;
da: RTCLK;
da.GetDateAndTime(
// xExecute:= ,
// xDone=> ,
// xBusy=> ,
// xError=> ,
// eError=> ,
dtDateAndTime=> data_time);
// eTimezone=> );

Компилятор пишет ошибки
RTCLK неизвестный тип
функциональный блок должен иметь экземпляр устройства

Добавьте библиотеку CAA DTutil Extern и сделайте так:



data_time : DATE_AND_TIME;
da: DTU.GetDateAndTime;



da
(
xExecute:= ,
xDone=> ,
xBusy=> ,
xError=> ,
dtDateAndTime=> data_time,
);


В справке CODESYS есть информация, как работать с этой библиотекой.

RV9WFJ
21.03.2016, 23:14
Победил AlarmManager. Научился вытаскивать флаг наличия Alarm-ов. Если кого заинтересовало, вот код 23297 В примере анализируется наличие активных или не квитированных аварий в менеджере аварий и при их наличии загорается красный прямоугольник.
Пока не нашел простых путей отделить активные аварии от не квитированных. Да мне это и не требовалось. Через одно место можно и это сделать - путем перебора всех имеющихся аварий.
Можно при желании разделить аварии на группы и анализировать их по отдельности или в сочетании (мне так же не требовалось).
P.S. Пример в CS3.5 SP8.1

sendsay
22.03.2016, 14:44
Здравствуйте Евгений, помогите пожалуйста, вот в таком деле. Я делаю проект где на СПК есть кнопка, нажатие этой кнопки нужно передать в контроллер, я раньше сделал так два проекта и все работало, а вот здесь почему то не работает, гляньте что я там не так сделал. Я уверен что опять мелочь просто. Спасибо.

Евгений Кислов
22.03.2016, 14:57
Здравствуйте Евгений, помогите пожалуйста, вот в таком деле. Я делаю проект где на СПК есть кнопка, нажатие этой кнопки нужно передать в контроллер, я раньше сделал так два проекта и все работало, а вот здесь почему то не работает, гляньте что я там не так сделал. Я уверен что опять мелочь просто. Спасибо.

Какой у вас ПЛК? В проекте СПК включен режим эмуляции - проверка осуществлялась в нем?

sendsay
22.03.2016, 21:04
Нет, это я просто забыл выключить. СПК 107

Евгений Кислов
22.03.2016, 21:30
Нет, это я просто забыл выключить. СПК 107

Я спросил про тип ПЛК (.pro), а не СПК.

sendsay
22.03.2016, 21:35
ААА сорри, уже устал, ПЛК 110-26.60 Р-М

Евгений Кислов
23.03.2016, 07:47
ААА сорри, уже устал, ПЛК 110-26.60 Р-М

Настройки правильные. Нужно проверить, что вы используете нужный COM-порт СПК (в проекте CODESYS указан COM-порт номер 2 - физически это соответствует первому COM-порту в СПК, т.к. в CODESYS номера портов смещены на +1). Убедитесь, что для порта выбран режим RS-485 в конфигураторе.

Еще, если я правильно понимаю, то у вас ошибка в адресации. Вы записываете press_button в регистр 1 ПЛК - т.е. в его Lamps 2. Вам нужно писать во второй регистр (16#0002), чтобы попасть в Button.

firetester
23.03.2016, 08:45
Доброго дня! Подскажите, можно ли сделать так чтоб ФБ вызывался с определенной цикличностью (например, раз в 3 секунды) везде где он используется, а не каждый цикл?

Евгений Кислов
23.03.2016, 08:58
Доброго дня! Подскажите, можно ли сделать так чтоб ФБ вызывался с определенной цикличностью (например, раз в 3 секунды) везде где он используется, а не каждый цикл?

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

sendsay
23.03.2016, 18:40
Настройки правильные. Нужно проверить, что вы используете нужный COM-порт СПК (в проекте CODESYS указан COM-порт номер 2 - физически это соответствует первому COM-порту в СПК, т.к. в CODESYS номера портов смещены на +1). Убедитесь, что для порта выбран режим RS-485 в конфигураторе.

Еще, если я правильно понимаю, то у вас ошибка в адресации. Вы записываете press_button в регистр 1 ПЛК - т.е. в его Lamps 2. Вам нужно писать во второй регистр (16#0002), чтобы попасть в Button.

Спасибо, Евгений! Теперь я все понял. Спасибо.

Anton441
24.03.2016, 13:40
Какую библиотеку следует применять для архивирования данных? В частности для СПК105.

ntro123
24.03.2016, 19:01
Как получить в codesys 3.5 заводской номер ПЛК323?

developer_nordis2
25.03.2016, 09:44
Добрый день.
У меня СПК207, пишу первый проект на языке ST.
Опыт программирования хороший, а вот с СПК - два месяца с нуля.
Вкратце, проект представляет из себя монитор состояния станка с общением с сервером посредством сокета.
Требуется при отключении питания СПК произвести некоторые действия (послать сообщение об отключении).

Поиском нашел решения только для ПЛК - "в кофигураторе" включить модуль статистики и использовать параметр power status.
В конфигураторе СПК я не нашел место подключения этого модуля.
Еще одно решение - подключение модуля дискретного ввода и пропажу питания определять при пропадании сигнала на нем.

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

developer_nordis2
25.03.2016, 09:58
Вопрос как раз про это - реализуемо или нет.
Гаснет-то не сразу - не хватит времени чтобы "крикнуть в последний раз"?

Евгений Кислов
25.03.2016, 10:49
Вопрос как раз про это - реализуемо или нет.
Гаснет-то не сразу - не хватит времени чтобы "крикнуть в последний раз"?

Не хватит. При необходимости используйте ИБП.

Cthulhu34
25.03.2016, 12:03
Извиняюсь если уже было, но 76 страниц просмотреть нелегко. У меня такая проблема:
arr : ARRAY [0..1] OF WORD
t1 : REAL;
ptr : POINTER TO REAL;



arr[0]:=%IW1;
arr[1]:=%IW2;
ptr:=ADR(arr);

t1:=ptr^;


Выдает ошибку AccessViolation при разыменовывании указателя. Не подскажете в чем проблема?

Yegor
25.03.2016, 14:18
Указатели разыменовываются только по кратным своему типу адресам. Массив с элементами WORD с большой вероятностью оказывается на некратном 4 байтам (REAL) адресе. Используйте SysMemCpy из SysLibMem.

Alex8
26.03.2016, 00:00
Скажите, кто знает как сделать так, чтобы на экране СПК двумя кнопками + - листать визуализации, одной вперед, другой назад. Нашел в конфигурации ввода изменить отображаемую визуализацию, там можно выбрать "предыдущая визуализация" и "следующая визуализация" Что то никак не освоить как они работают и являются ли они тем, что мне нужно.

Евгений Кислов
26.03.2016, 10:50
Скажите, кто знает как сделать так, чтобы на экране СПК двумя кнопками + - листать визуализации, одной вперед, другой назад. Нашел в конфигурации ввода изменить отображаемую визуализацию, там можно выбрать "предыдущая визуализация" и "следующая визуализация" Что то никак не освоить как они работают и являются ли они тем, что мне нужно.

Это не то, что вам нужно. Можно привязать к кнопке переход на конкретный экран.

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

Т.е. у вас в проекте на всех экранах будет одна пара кнопок, по нажатию на которые (через действие Выполнить ST-код) будет происходить инкремент/декремент счетчика (i), потом вы собираете имя экрана визуализации в стиле CONCAT('Visu', INT_TO_STRING(i) ) и переходите на этот экран. Соответственно, экраны визуализации в проекте должны называться 'Visu1', 'Visu2' и т.д.

Кроме того, в ST-коде нужно учесть, что на последнем экране нажатие на кнопку "+" должно возвращать пользователя на первый экран, а нажатие на "-" на первом экране - отправлять на последний.

Alex8
26.03.2016, 11:33
Большое спасибо, попробую как Вы сказали.

ntro123
26.03.2016, 21:20
товарищи, как программно перезапустить ПЛК323?

Евгений Кислов
26.03.2016, 21:31
товарищи, как программно перезапустить ПЛК323?

Подключите библиотеку CmpSysExec. Через функцию SysExecute выполняйте команду /sbin/reboot.

Alex8
27.03.2016, 10:19
Евгений, спасибо, сделал как Вы написали, все получилось, за исключение того, что когда нажимаю на "+" визуализации перелистываются по нарастанию при достижении последней, переключается на первую. С кнопкой "-" все то же самое. При этом счет начинает сбиваться, когда листаю сначала в + а затем в -. Посмотрите, если не сложно.

Евгений Кислов
27.03.2016, 11:36
Евгений, спасибо, сделал как Вы написали, все получилось, за исключение того, что когда нажимаю на "+" визуализации перелистываются по нарастанию при достижении последней, переключается на первую. С кнопкой "-" все то же самое. При этом счет начинает сбиваться, когда листаю сначала в + а затем в -. Посмотрите, если не сложно.

ST-код надо исполнять не в цикле, а вешать прямо на кнопку.

Зададим переменным начальные значения - пусть по умолчанию мы находимся на первом экране:

23394

По нажатию на кнопку сначала выполняем код - проверяем, не находимся ли мы на последнем (для кнопки "+") / на первом (для кнопки "-") экране. Если мы на нем, то сбрасываем счетчик на минимум / максимум и склеиваем имя экрана, после чего переходим на него. Если мы не на этом экране, то делаем инкремент/декремент, склеиваем имя экрана, переходим.

Таким образом, по текущему значению i вы четко будете понимать, на каком экране находитесь в данный момент.

Вот код для кнопки "+" в случае четырех экранов визуализации в проекте.

23395

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

Alex8
27.03.2016, 12:54
Извиняюсь, немного неточно написал, при переключении с "+" на "-" и наоборот фактический счет не сбивается, склеивается Vis1 Vis2 Vis3 Vis4 и наоборот Vis4 Vis3 Vis2 Vis1 а с отображаемыми визуализациями происходит такая штука при нажатии на "+" отображается 1-я 2-я 3-я затем когда нажимаю на минус вместо обратного счета отображается 4-я потом 3-я 2-я и тд.

Евгений Кислов
27.03.2016, 13:06
Извиняюсь, немного неточно написал, при переключении с "+" на "-" и наоборот фактический счет не сбивается, склеивается Vis1 Vis2 Vis3 Vis4 и наоборот Vis4 Vis3 Vis2 Vis1 а с отображаемыми визуализациями происходит такая штука при нажатии на "+" отображается 1-я 2-я 3-я затем когда нажимаю на минус вместо обратного счета отображается 4-я потом 3-я 2-я и тд.

Это происходит потому, что по нажатию на кнопку вы сначала переходите на экран, а потом что-то делаете со счетчиком. Надо - наоборот. Прочитайте внимательно мой предыдущий пост.

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

Alex8
27.03.2016, 16:57
Все сделал как Вы сказали, но ничего не изменилось. i и Vis принимают нужные значения, не сбиваются. А визуализации при переходе с "-" на "+" отображается 1-я 2-я 3-я затем когда нажимаю на минус вместо обратного счета отображается 4-я потом 3-я 2-я и тд.