И еще дурацкий вопрос - как делать конкантенкацию строк?
Ап - конкантенкация WSTRING, потому что в STRING нельзя хранить русский текст.
Вид для печати
И еще дурацкий вопрос - как делать конкантенкацию строк?
Ап - конкантенкация WSTRING, потому что в STRING нельзя хранить русский текст.
В продолжение поста http://www.owen.ru/forum/showthread....l=1#post190030
Связь вроде как установилась (СПК107+ПР200). Но не могу понять следующее:
Из 46 опрашиваемых регистров получаю только 17 байт (видно из скриншота), при опросе 1 регистра опять же получаю 17 байт. Плюс постоянно проскакивает ошибка 255. то я делаю не так?
Вложение 21385
Вложение 21386
Ну и не понятно почему размер скопированного буфера всегда равен 4
Ок, спасибо.
Про массивы структуры и инициализацию их элементов.
Есть структура 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 компилятор ругается. А мне очень надо тоже проинициализировать этот элемент. Подскажите, как это сделать?
Здравствуйте,
не смог на форуме найти ответ на вопрос: Как преобразовать string в wstring?
Функция STRING_TO_WSTRING.
Подскажите пожалуйста новичку. На codesys 3.5 выскакивает ошибка компиляции.Что делать?
Ошибку показать как вариант.
У меня следующая проблема. Есть плк100 и есть расходомер питерфлоу.Протокол, по которому работает расходомер -modbus ascii. Надо считывать данные в плк, который является мастером.Но в питерфлоу значение расхода воды представлено типом double float, а плк не считывает double, а только float. как быть. Считать как string, но тогда как преобразовать. Если есть пример , скиньте пожалуйста.
в теме Модули "МХ110 для CODESYS 3.5" молчат :( продублирую сюда свою проблему.
После добавления символьной конфигурации в проект с модулем MV110-8A (определено опытным путем) при попытке загрузки проекта в ПЛК получаю следующую ошибку:
Скрытый текст:
Все модули не стал проверять, но с остальными (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
как решить сие недоразумение?
как запустить эмуляцию без контроллера спк107 это возможно?
Здравствуйте, а можно ли как-то программно обратиться к параметрам визуальных компонентов, например, к координатам x и y линии.
Некоторые компоненты позволяют привязывать к своим параметрам переменные из программы, но их очень мало.
Здравствуйте! Подскажите, пожалуйста, почему на обучающих видео при визуализации, скажем, на SP4, объекта "Индикатор", на экран выводится лампа. Но в реальности, на SP5, выводится стрелочный индикатор? Поправимо ли это недоразумение?
Добрый день, я немного покалечил ПЛК 323 своим кодом, решил разобраться с динамической памятью, после чего в один из прекрасных моментов как залил программу и нажал "запустить" у меня сразу ПЛК вылетел с "Ошибка сети : сетевой вызов не удался" и теперь так все время. При этом счетчик висит в локалке по адресу 192.168.0.77 и пингуется без проблем. НО все время "Ошибка сети : сетевой вызов не удался" создавал новый проект, нажимал "очистить все", отключал от питания ничего не помогает. Как его ресетнуть? Только перепрошивать заново?
PS при этом все лампочки (ошибка - она всегда горела и до и после, связь, питание) кроме РАБОТА - горят.
UPD: пришлось перепрошить, помогло.
Можно ли в одни ФБ передать другой ФБ, но любого типа?
вот что-то типо того есть в codesys 3.5?Цитата:
FUNCTION_BLOCK first_fb
VAR_INPUT
anyfb:ANY_FB;
...
Про указатели я знаю, и использую очень активно, вот выдержка из мануала для 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^();
Если он и работает то похож на костыль, не?
Есть функция, скажем запись времени в счетчик:
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 ну если нельзя, то нельзя, просто очень интересно стало =)
подходов куча, если пришли из других языков, то можно через ООП один родитель, а реализация методов разная в каждом конкретном случае, если по стандартному, то наличие множества блоков ни как не должно мешать, повторяющийся код укладывайте в функцию и используете одну везде
Да пришел из с/с++ и конечно же как вы указали JS +прочии веб языки. Да использую ООП, читал на тему ООП в codesys, пришел к выводу, что не нужно его использовать + очень мало документации по синтаксису ООП в codesys, вообще ладно оставлю все как есть, разумеется повторяющийся код уже давно по максимуму запихнул в функции.
Спасибо за ответ!
добрый день!
Подскажите, с FBD никогда не сталкивался и возник вопрос:
например на st код
Элементарный код.... как его оформить на FBD?Цитата:
if mv.rRead1 > 25 then
mv.wOut1:=TRUE;
ELSE
mv.wOut1:=FALSE;
:) ну да, SEL сложновато для Вас, тогда просто EQ, на входы mv.rRead1 и 25, на выход mv.wOut1
Добрый день! Объясните, пожалуйста, новичку - Имею ПЛК 160, подключил к входам аналоговые датчики, по RS485 МВ110, ТРМ101. Всем входам назначил имена в CodeSys в Конфигурации ПЛК. Добавил Modbus Slave для связи с Lectus OPC.
Вопрос: Чтобы передать в Lectus OPC все значения с датчиков - нужно создать переменные для каждого из значений входов ПЛК в подэлементе Modbus slave, а затем в программе присваивать значения входов? Или можно использовать имена переменных присвоенных входам ПЛК и других устройств, которые ПЛК опрашивает (КАК?)?
Другими словами можно ли получить доступ из Lectus к переменным и входам контроллера и по какому адресу?
День добрый. Есть мысли по оптимизации программы выполненной в С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
Будте добры опытные "автоматчики" высказать своё мнение на счет целесообразности данного решения?)
Мысля такая была. вот посему и задал влпрос чтоб убедиться.
Т.к. для одного см.узла применял один функциональный блок для регулирования по подаче и защиты от превышения обратки, но там определения для чего применять блок построено на условиях. и данное решение регулирует очень хорошо.
В общем, благодарю capzar за грамотное обьяснение!
Есть ещё вопросик. Пытаюсь сделать аналог RETAIN. Т.е. сохранять данные после изменения в фаил на флешке( это будет позже на СПК- когда отработаю программу на "столе" в Win V3).
при первоначально при запуске будет активен один блок для чтения данных из файла, а когда загрузит без ошибок влючится основная программа( но это будующее). Библиотека CAA.FILE
Вопрос: не получается создать фаил на диске компа, а так же записать в ручками созданный фаил, как задается путь для файла расположенного например в D:\test_dir\?
оказывается первое сообщение прошло)
есть много других способов записи в файл, а не только через CAA, например http://www.owen.ru/forum/attachment....3&d=1396183120
во вторых в контроллерах стоит линукс, там нет такого понятия как диск D:\
да начал с САА разбираться вот думаю и добью её. а "эксперементы делаю на вирт контроллере Win V3. соответсвенно писать (пробывать) могу ток в файлы расположенные на диске компа.. потому как ток не задавал путь не хочет писать в фаил и все... для начала брал простой пример из справки.. думаю на спк он заработал бы.. но нет сейчас под рукой её...