Предлагаю быть так:
Код: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
Понятно, спасибо. А почему при этом статус висит постоянно и циклы останавливаются? Я так понимаю, что происходит остановка на каком-то моменте внутри программы и она дальше не выполняется? Тогда непонятно почему не происходит исключение по сторожевому таймеру...