syslibstr, в справке
Вид для печати
syslibstr, в справке
+ Справка/содержание/биб-ки/системные/..
Да, видимо
Эта библиотека вам всё равно не подойдёт, там во всех блоках указано STRING (80), см. скрин Вложение 61903
А не работает наверно в эмуляции, надо на железе проверять.
Обычный оператор LEN работает, длина 8.
Мне вот интересно где строки используются длиннее 255 ?
Может вам лучше с файлами начать работать?
026099 1217 164<0x0D><0x0A>026096 1114 174<0x0D><0x0A>026087 1019 182<0x0D><0x0A>026081 726 188<0x0D><0x0A>026029 929 203<0x0D><0x0A>026084 821 215<0x0D><0x0A>026119 1219 395<0x0D><0x0A>026118 1119 399<0x0D><0x0A>026102 729 418<0x0D><0x0A>026117 1027 418<0x0D><0x0A>026104 926 436<0x0D><0x0A>026103 824 443<0x0D><0x0A>026125 1238 618<0x0D><0x0A>026124 1141 624<0x0D><0x0A>026123 1039 636<0x0D><0x0A>026120 738 646<0x0D><0x0A>026122 940 664<0x0D><0x0A>026121 842 669<0x0D><0x0A>026116 1246 844<0x0D><0x0A>026114 1044 856<0x0D><0x0A>026115 1142 856<0x0D><0x0A>026113 944 866<0x0D><0x0A>026111 743 873<0x0D><0x0A>026112 853 881<0x0D><0x0A>026110 1246 1064<0x0D><0x0A>026109 1148 1077<0x0D><0x0A>026108 1051 1082<0x0D><0x0A>026107 954 1083<0x0D><0x0A>026105 755 1091<0x0D><0x0A>026106 853 1095
В этой строке содержимое штрихкода+координата X штрихода+координата Y штрихода и таких групп до 32 штук. Длина строковой переменной до 580 символов. Применяется в системе помарочного учёта алкогольной промышленности.
Вложение 61904
Посмотрел по живому. Syslibstr хочет какие-то неразрешенные ссылки на внешние поу. В общем syslibstr в топку.
while + pointer решат проблему длины длинной строки.
Но !
Разовью тему от kondor3000, с его позволения, надеюсь))
По приведенному примеру Вам пока нафик не нужны длинные строки. Можно обойтись standart'ом. Это же очевидно )) #13#10 говорят об этом.
Anton441 <0x0D><0x0A> Валенок вам про это говорит, делите и побеждайте...
psКод:VAR CONSTANT
(*"делите и побеждайте.." (С) melky*)
DELIM : STRING := '<0x0D><0x0A>'; (*в натуре видимо нужно '$R$N', оно же '$0D$0A'*)
END_VAR
VAR
L_DELIM : DWORD;
longstr : STRING(1000) := (*1000: любое тупо большее макс ожидаемого (580?) + sizeof(тип под pstr), ниже*)
//из примера выше - как есть
'026099 1217 164<0x0D><0x0A>....<0x0D><0x0A>026106 853 1095';
cnt : INT; (*сколько строк после парсинга*)
result : ARRAY[1..40] OF STRING; (*40: любое >= чем макс кол-во "тегов", string(x) - X заведомо вмещающее "тег"*)
(*в результ класть DELIM не вижу смысла*)
i : DWORD;
pstr : POINTER TO STRING; (*string(x) - X заведомо вмещающее "тег" + DELIM*)
pz : POINTER TO BYTE;
z : BYTE;
END_VAR
-------------------------------------------------
L_DELIM := LEN(DELIM);
cnt := 0;
pstr := ADR(longstr);
REPEAT
cnt := cnt + 1;
i := FIND(pstr^, DELIM (*заместо DELIM достаточно 1-ый символ DELIM'а*));
(*//тупо быстрее MID'а*)
IF i > 0 THEN (*ненужно здесь SEL вставлять, т.к. каждый цикл LEN выполнять незачем*)
pz := pstr + i - 1;
ELSE
pz := pstr + INT_TO_DWORD(LEN(pstr^));
END_IF
z := pz^; (*либо 1-й символ DELIM'а либо #0*)
pz^ := 0;
result[cnt] := pstr^;
pz^ := z;
(*//*)
pstr := pz + L_DELIM;
UNTIL i = 0 //проверять cnt на превышение макс кол-ва строк - сами
END_REPEAT
вообще задача непонятна - как можно длину длиной строки просрать если она не возникает в ПЛК из ниоткуда
END_VAR из раздела объявлений, с наглой мордой, переселился в конец программы.
Она сама, это глюк КДС !!!
))
Спасибо, убрал
и добавил (рука дрогнула когда копипастил)
Добрый день. Так сложилось, что сначала изучил OWEN Logic, теперь дошла очередь до Codesys.
Вопрос. Как реализовать промежуточное сохранение значения входа или переменной, часто это называют термином "защелка"?
В лоджике это было примерно такВложение 62013
Спасибо, все получилось. По крайней мере, с CFC, ST тоже, конечно, безусловно пригодится, но он пока только в планах.
Здравствуйте!
К МВА подключен расходомер сигналом 4-40.
Требуется посчитать сколько воды проходит в течении 10, 30, 1 час. Можно конечно каждую секунду суммировать значения и делить на интервал времени.
Не нашел готовый блок, возможно плохо искал и есть готовый блок для подобной задачи.
Подскажите пожалуйста есть для подобной задачи готовые блоки учета нарастающим итогом за заданный интервал времени?
Integral из util.liv
Здравствуйте, заинтересовала такая задача. На фабрике есть сеть датчиков влажности которые передают в свой специализированный контроллер данные (допустим по Modbus RTU), можно ли как то "присосаться" к этой сети с помощью ПЛК110? Я так полагаю в режиме слейв он данные запрашивать не может, и два мастера в сети тоже не могут существовать. Специализированный контроллер тоже не сможет передать данные в ПЛК110 он такой функции не имеет.
ПЛК не могут прослушивать сеть, если вам нужно 1-2 регистра прослушать, можно применить СМИ-2М, в режиме Spy (прослушивание сети). Для 10 параметров, понадобиться 10 штук. https://owen.ru/product/smi2_m
Либо применить ПЛК110 вместо спец. контроллера.
ПЛК110 может сам опрашивать все ваши датчики. Тогда будет один мастер. Далее можно передать хоть в Скаду, хоть куда вам надо. А спец контроллер, подключить как мастер, можно к другому порту контроллера.
С помощью ПЛК110 - можно.
Только с использованием библиотек для работы с портами.
Соответственно анализировать принятые пакеты придется на уровне программы.
На диске с ПЛК110 есть описание такой библиотеки
06. Документация\05. Библиотеки\02. Библиотеки ОВЕН для всех ПЛК\Библиотека UNM.pdf
Эта библиотека работает с портами на прямую. Есть возможность реализовать собственный протокол.
Предлагаю для ознакомления ветку https://owen.ru/forum/showthread.php?t=22498
Это давно прочитал и даже реализовал пару раз. Тут всё равно контроллер выступает в роли Мастера сети и думаю со спец контроллером (он тоже мастер) будет конфликт. Да, опросить всякие счётчики по нестандартным протоколам можно. По крайней мере подключиться в готовую сеть мне не удавалось.
А разве с помощью функции GETBYTE не видны пакеты Мастера и пакеты Ведомых?
После захвата интерфейса LOCKDEVICE порт находится в режиме приема.
Не знаю размер входного буфера, но GETBYTE возвращает 0 если буфер пуст, т.е. можно организовать цикл ожидания.
А дальше побайтно принимать и анализировать - отделять запросы от ответов, а из ответом брать нужное. (снифить)
Все функции не тестировал, если сделаете рабочий пример, могу проверить. А пока это только догадки.
Например ПЛК опрашивает модуль МВ110-8А (адрес 16) по модбас RTU (115200, 8N1), надо написать программу для второго ПЛК, которая будет считывать данные с действующей линии опроса.
Да Вы правы. Стоит сначала проверить. Пожалуй у меня будет такая возможность. Продолжим чуть позже насчет UNM.
Однако хочу поймать Вас на слове, что ПЛК не может прослушивать сеть.
Вот выдержка из РП на ПЛК110:
Вложение 62059
Хорошо. Последний аргумент.
Здесь отрывок кода, который реализует, со слов автора, режим ПЛК-slave.
https://owen.ru/forum/showthread.php?t=23870
Т.е. после захвата порт прослушивается на запросы от ПК, а это значит, что порт может так же прослушивать и ответы от ведомых.
Так что уважаемый Dzherenov ищите подробное описание протокола обмена с датчиками и вперед!!!
Подскажите, пытаемся открыть программу в кодесисе и выдает такую ошибку
Невозможно создать модуль Rs-232
Вложение 62101
Какой у вас ПЛК ?
Вы случайно не переносите с одного ПЛК на другой программу? Возможно таргеты криво установлены. Выложите программу, в расширенном режиме, добавить файл, посмотрим.
Попробуйте с сайта пример открыть любой https://owen.ru/product/codesys_v2/example_program
Откуда такие размытые скрины у вас ? Скрины делайте нормальные, тем же Paint в формате jpg получаются скрины во всю страницу.
Понял благодарю. Проверим.
Всем привет. Ситуация следующая:
В проекте есть ФБ отвечающие за обработку сигналов AI, за работу насосов, за работу приводов, за работу задвижек и т.д., есть экземпляры ФБ для самого оборудования. Есть также переменные которые используются для связи между ПЛК 160 М02 и панелью СП315. Если переменная может быть изменены по коду в ПЛК то в ФБ она объявляется в разделе VAR_IN_OUT и это отлично работает. На переменную ФБ подкидывается переменная для связи и мы можем менять ее как с панели, так и в ПЛК.
Однако теперь ситуация следующая, что нужно к этим двум переменным добавить третью (для связи с вышестоящей АСУТП), чтобы все три переменные (ПЛК, панель, АСУТП) могли взаимно изменяться.
Например. Есть переменная отвечающая за уставку HHH_SP: REAL; Она находится в VAR_IN_OUT функционального блока, на нее подается переменная HHH_TCP: REAL, которая выводит эту самую уставку на панель и с панели же мы ее можем менять. Теперь к ПЛК 160 М02 по RS-485(Modbus RTU) будет подключена АСУТП, которая будет писать например в новую переменную HHH_RTU. И теперь все три переменные HHH_TCP, HHH_RTU, HHH_SP должны изменяться независимо от того, пришло ли новое значение от АСУТП, панели или ПЛК.
Каким образом можно это реализовать?
С ПЛК Schneider или Siemens проблем нет. Можно адресно накладывать переменные друг на друга. Как быть на ПЛК-160-М02 и Codesys 2.3?
Есть несколько вариантов:
1) убрать эти переменные из ФБ (HHH_TCP, HHH_RTU, HHH_SP) и сделать одну глобальную HHH, её можно объявить либо в глобальных, либо вставить в конфигурацию.
2) сделать один слейв вставив туда TCP, RS485-1, RS485-2 и все переменные будут доступны по всем каналам.
3) вставить один слейв в другой, все переменные с первого будут общими.
Варианты можно комбинировать.
зы: есть и ещё варианты, 4 и 5, если этих мало))
Добрый день!
ПЛК110-60МК2. Не могу передать сигнал на быстрые выходы. Логика в нутри программы Timer по прерыванию работает, и выдает необходимое количество импульсов (светодиоды выходов DQ1, DQ2 работаю одекватно), а до выходной клемы (винт присоединения) сигнал не доходит. Как подключить. Если можно прошу приммитивный пример данного кода в CFC.
физический светодиод на самом ПЛК или в конфигурации ПЛК в онлайне квадратик мигает?Цитата:
светодиоды выходов DQ1, DQ2 работаю одекватно
4 и 5, касаются мастера в слейве, вам сейчас не надо.
А также все переменные должны быть общими или часть, короче задание не ясно пока.
Правда, по вашему посту вам 2 вариант нужен, если все переменные общие, а настройки будут меняться независимо, порты то разные. Тут скрин слейва со вставленными TCP и Debag 232, вставить можно любые. И ещё прочитайте два след. поста по ссылке.
https://owen.ru/forum/showthread.php...&page=890#8900
Светодиод на самом ПЛК.