Предлагаю быть так:
Код:buf:ARRAY [0..100000] OF STRING;
...
IF buf[j]='1' THEN
...
Вид для печати
Не подходит, у меня 524288 байт (0.5 МБ) так как целый файл считываю в буфер (по мои подсчетам это его максимальный размер с запасом).
Если сделать как вы предложили:
buf:ARRAY [0..524288] OF STRING;
то ПЛК выдает что памяти не достаточно.
Ладно, не проблема, буду ASCII коды юзать, все равно не так часто приходиться так сравнивать.
Все равно спасибо!
CS не подднрживает строки более 255 символов, или что-то изменилось?Цитата:
buf:STRING(100000);
Поддерживает, просто стандартные ф-ции работают со строками до 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
А касательно вашего вопроса, мне кажется уместно использовать указатель. Например так:Можно наверно даже сократить код, но так понятнее.Цитата:
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
Спасибо, действительно вариант, но накладный, лучше уж ASCII коды и в комментариях рядом писать что за символ.
Товарищи программисты, пытаюсь разобраться с модемом на ПЛК 323, получилось его активировать (по FAQ на сайте овена) мигает красным лампочка GSM.
Пытаюсь на 3 ком порт отправить команду AT, ответа не получаю. Выкладываю проект (CDS3.5).
Настройки подключения к ком порту:
для тех кто не хочет качать проект PLC_PRG:Цитата:
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)
];
Что я делаю не так?Цитата:
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 я получаю ответ ОК.
Не могу найти, что означает в режиме мониторинга в Конфигурации задач статус "Valid, Активный"?
Вложение 23093
Понятно, спасибо. А почему при этом статус висит постоянно и циклы останавливаются? Я так понимаю, что происходит остановка на каком-то моменте внутри программы и она дальше не выполняется? Тогда непонятно почему не происходит исключение по сторожевому таймеру...
Ставил 2000 мс и 10000 мс
Перестает выполняться одна программа и при этом перестает выполняться задача, в которой эта программа находится. Происходит это на 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
Спасибо за ответ.
Да они не получают false, а зачем (там жеш step дальше идет)? мне же нужно чтобы они работали им TRUE даю, если еще write можно после выполнения сделать xExecute:= false, то read точно должен быть true пока не получит ответ, а ответ я не получаю.
Строку изменил с 'AT' на 'ATZ$R' как я это увидел у другом проекте.
Может быть проблема в том, что я использую:
write:COM.Write;
read:COM.Read;
а нужно SysCom.* ???
UPD:
Разобрался, заработало.
И хочу сказать: это пи*ц какой-то этот FAQ на овене, и эта документация на ПЛК323, везде пишут по разному, и везде 1/10 пользы. Приходиться по форуму 50 топиков просмотреть чтобы понять что к чему и найти хоть какой-то рабочий проект. Всем кто отвечал спасибо.
подскажите как в проект засунуть экспортный файл SPK_PCV.export.
Выделяете кликом Application, вверху выбираете меню Проект, в нем выбираете команду Импорт и указываете путь к файлу.
Вложение 23103
Это единственный способ передавать данные через модем?
1) Можно как-то просто получить дескриптор на открытое AT командами соединение с сервером через модем и уже передавать данные используя сокеты?Цитата:
6.6.3 Обмен данными с ТСP/IP сервером по GPRS
...
AT+CIPSEND <данные> <0x0A> – передача данных по установленному соединению.
...
цитата из офф. документации к ПЛК 323
2) ИЛИ можно ли получить указатель/дескриптор на модем, открыть соединение с сервером по средствам сокетов и передавать данные с помощью них? Или единственный вариант это AT команда для передачи данных?
Как сделать так чтобы код (функция) выполнялся только один раз при запуске? Язык ST Нужно проверить значения переменных, задать начальные значения и т.п.
bFlag: BOOL;
IF NOT bFlag THEN
(*Ваш код, исполняемый один раз*)
bFlag:=TRUE;
END_IF;
Здравствуйте. Прошу помощи: есть энкодер ARCOM SP40\6 (24VDC), СПК107, МВ110-32ДН, МВ110-8АС. К какому модулю лучше подключить энкодер (максимальная рабочая скорость около 2х оборотов в сек. = 2048 имп\сек). МВ110-32ДН с блоком INC_DEC не тянет, возможно ли подключить его к МВ110-8АС?
Лучше энкодер к СПК107 не цеплять вовсе, или использовать для этого или специализированный модуль (не овен) или ПЛК110 М02 и с них уже читать данные по интерфейсу. Но временная задержка будет большая, надо это учитывать.
Как вариант СИ8-RS? И показания выкинуть в сеть?
Можно и так, про счетчики то я и забыл. Только интерфейс кривенький в СИ8, сначала почитайте про него, устроит ли он вас.
А к МВ110-8АС не удастся? У этого блока вход до 10кГц.
А то что этот модуль аналоговый вас не смущает? :) Даже если вы зацепите какой-то резистор и будете сравнивать числа, то на передачу и обработку одного импульса у вас уйдет несколько сотен мс. Возьмем даже идеальный вариант в р-не 120..150 мс, думаю это вас никак не устроит. Это все при том что мы теряем направление вращения, а с ним еще тише. Ставьте СИ8 или СИ30.
Ясно, спасибо большое, так и думал что придётся СИ8 городить. Просто была надежда, запитать энкодер 10В (позволяет), а вход МВ110 настроить 0-10В. Смысл тогда продавать "скоростные" входы?
Очень часто codesys не видит ПЛК323 (точнее он не выходит в сеть, т.к. даже не пингуется) и так приходиться его по 1-3 раза переподключать и если повезет он выйдет в сеть, уже надоело этим заниматься, что я делаю не так? кабель коннечусь через эзернет.
Здравствуйте. Может кто нибудь подсказать подключение СИ-8 к СПК (КДС3.5 сп.5). А то у меня одна какая-то "грязь" летит.
И как обычно никого...
Хочу вас морально поддержать, на 70% моих вопросов тоже никто не отвечает, приходиться читать мануалы (если бы их можно было просто прочитать, и сделать как написано, это было бы чудо), дело в том, что если в разделе FAQ и в мануале ОФИЦИАЛЬНОМ указана совсем противоречивая информация, а когда задаешь вопрос здесь, то молчок - это трудно. Бывает на элементарные вопросы по 1-2 дня убиваю. Видимо наши вопросы слишком сложны или слишком глупы. Удачи вам
Работаю слесарем КипиА на производстве, хочу оборудовать
станок СПК107 и ПР200. Минимальную визуализацию делать научился, вопрос в том,
что необходимо для управления станком сделать 5 программ, в каждой по 3 уставки.
С одной программой понятно, привязываю к переменным типа word каждую уставку и
отправляю на ПР200, а как сделать 5 программ никак не знаю. Чтоб при выборе программы
значения переменных менялись в соответствии с уставкой на экране и отправлялись на ПР Подскажите кто знает.
Например, так:
Оператор вводит номер программы в переменную programma, в зависимости от номера переменным уставок присваиваются разные значения.Код: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
5 программ по 3 уставки получается 15 уставок. Как оператору с экрана задавать значения этим уставкам?
Тогда вот так:
Оператор выбирает номер программы, в которой он будет задавать уставки (ProgramForChange). К трем полям ввода будут привязаны переменные ustavki[ProgramForChange,1], ustavki[ProgramForChange,2] и ustavki[ProgramForChange,3]. После этого оператор выбирает номер программы, которую нужно записать в ПР (ProgramForWrite) и нажимает кнопку WriteProgram, которая генерирует единичный импульс.Код: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
Даю ПОЛНОСТЬЮ всю информацию как и ранее:
у меня ПЛК 323, подключаю codesys с уже проложенным путем до ПЛК 323, открываю device вкладку,
ПЛК в этот момент выключен
лампочка на вкладке device красная
включаю ПЛК
лампочка на вкладке device красная, и жду когда загорится на самом ПЛК красная лампочка "работа"
и тогда в самом codesys с вероятностью 30% загорится зеленая лампочка, которая будет говорить что ПЛК законнектился
ТО ЕСТЬ меня интересует, почему этот ПЛК 323 не всегда коннектиться? это брак? или нужен какой-то ОСОБЫЙ алгоритм подачи питания на ПЛК?
Подскажите пожалуйста как работать с временем и датами на ST.
Интересует объявление и сравнение.
Например я хочу сделать автозапуск в 5 утра каждый будний день, и не запускать 8 марта 1 января.
Для начала я хочу понять как объявить дату. Вроде можно так
stime: DATE:=D#2017-03-08;
Далее нужно узнать какая сегодня дата как это сделать я не нашел
И наконец сравнить. Этого тоже не нашел.
С временем нашел как делать в визуализации #t[MM:dd] и на экран выводится то что надо а как в ST с временем работать не нашел.