Последний раз редактировалось Евгений Кислов; 06.03.2016 в 12:59.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
Не подходит, у меня 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
Последний раз редактировалось ntro123; 05.03.2016 в 19:45.
А касательно вашего вопроса, мне кажется уместно использовать указатель. Например так:Можно наверно даже сократить код, но так понятнее.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 я получаю ответ ОК.
Последний раз редактировалось ntro123; 10.03.2016 в 19:24.
Не могу найти, что означает в режиме мониторинга в Конфигурации задач статус "Valid, Активный"?
05.PNG
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
Понятно, спасибо. А почему при этом статус висит постоянно и циклы останавливаются? Я так понимаю, что происходит остановка на каком-то моменте внутри программы и она дальше не выполняется? Тогда непонятно почему не происходит исключение по сторожевому таймеру...