Просмотр полной версии : Значения переменных не загружаются в контроллер
alhoresm
22.06.2011, 07:47
Добрый день!
Мне надо, чтобы до запуска программы в контроллере, переменные уже имели какие-то определенные значения.
В поле объявления, для некоторых переменных задаю нужные значения.
при загрузки программы в контроллер, значения переменных остаются теми же, что и были при остановке контроллера от предыдущего запуска.
В чём может быть ошибка и как это сделать?
(вставил бы скриншоты для наглядности, но почему-то здесь ввели неудобные ограничения на разрешение и размер картинки)
заранее спасибо за ответ
Николаев Андрей
22.06.2011, 07:58
Вы не как Retain их объявляете?
alhoresm
22.06.2011, 08:07
Объявляю так:
VAR beg:BOOL:=TRUE;
...
а как по другому объявить?
Евгений Сергеевич
22.06.2011, 09:59
опишите пожалуйста более подробно порядок ваших действий: что вы подразумеваете под "предыдущего запуска" и чем новый запуск отличается от нового. Просто те значения которые вы указываете при объявлении вступают в силу при самом первом запуске и после ресета. Если вы просто отключились и подключились обратно к ПЛК или сделали старт/стоп то значение сохранит свое предыдущее значение и сбрасываться в "значение по умолчанию" не будет.
alhoresm
22.06.2011, 11:02
включаю контроллер в разетку, загружаю на него программу, запускаю контроллер (кнопкой на верхней панели), он пытается открыть КОМ порт (у него это не получатся), считает количество попыток, я останавливаю его, немного меняю программу, загружаю её контроллер, смотрю на значения переменных, а количество попыток не навно нулю, ну и флаг режима начала программы FALSE (должен быть TRUE)
Александр Приходько
22.06.2011, 12:15
включаю контроллер в разетку, загружаю на него программу, запускаю контроллер (кнопкой на верхней панели), он пытается открыть КОМ порт (у него это не получатся), считает количество попыток, я останавливаю его, немного меняю программу, загружаю её контроллер, смотрю на значения переменных, а количество попыток не навно нулю, ну и флаг режима начала программы FALSE (должен быть TRUE)
1) Обновите Codesys до 2.3.9.26
http://www.owen.ru/catalog/55710393
2) При изменении проекта и подключении к ПЛК выбирайте Загрузить все. Если нажимаете загрузить только изменения, то программа не переставая выполняться принимает часть измененного кода, но при этом переменные не сбросятся.
alhoresm
22.06.2011, 15:40
спасибо, завтра попробую
alhoresm
23.06.2011, 09:53
Со значениями переменных разобрался
теперь другая проблема:
VAR_GLOBAL
I1 AT %QD7.0:REAL;
I2 AT %QD8.0:REAL;
di0 AT %IX0.0:BOOL;
di1 AT %IX0.1:BOOL;
do0 AT %QX1.0:BOOL;
do1 AT %QX1.1:BOOL;
do2 AT %QX1.2:BOOL;
do3 AT %QX1.3:BOOL;
beg:BOOL:=TRUE;
comPort:PORTS:=1;
popytka:INT:=0;
vI:REAL:=0.0;
END_VAR
PROGRAM PLC_PRG
VAR
openComPort:DWORD;
closeComPort:BOOL;
inp:BOOL;
outp:BOOL;
xOutput:fOutput;
ok:BOOL;
ComSet:comsettings;
ComSetEx:comsettingsEx;
bytesRead:DWORD;
buf,bufold: REAL;
END_VAR
(*программа принимает число через COM порт (с компьютера) и выдаёт его на аналоговый выход 1*)
IF di0 THEN
(*завершение*)
closeComPort:=SysComClose(opencomport);
do0:=FALSE;
do1:=FALSE;
do2:=FALSE;
do3:=FALSE;
i1:=4.1;
ELSE
IF beg THEN
(*инициализация*)
bufold:=0;
comPort:=0;(*RS-485*)
openComPort:=SysComOpen(comPort); (*выдаёт openComPort=0 *)
IF openComPort=INVALID_HANDLE THEN
i1:=5.1;
closeComPort:=SysComClose(comPort);
popytka:=(popytka+1) MOD 500;
IF popytka=0 THEN
do0:=NOT do0;
END_IF;
ELSE
i1:=10.1;
ComSet.dwBaudRate:=(*9600;*) 115200;
ComSet.byParity:=0;
ComSet.byStopBits:=0; (*1,5*)
ComSet.dwBufferSize:=5;
ComSet.dwScan:=0;
ComSet.dwTimeout :=100;
ComSet.Port:=comPort;
ok:=SysComSetSettings(openComPort,ADR(ComSet)); (*выдаёт ok=FALSE *)
IF ok THEN
do3:=TRUE;
vI:=0.001;
END_IF;
beg:=FALSE;
END_IF;
ELSE
(*цикл пока не нажата кнопка di0*)
bytesread:=SysComRead(opencomport,ADR(buf),4,300);
IF bytesread=4 THEN
I1:=buf;
I2:=4;
bufold:=buf;
END_IF;
IF bytesread>0 THEN
do0:=((bytesread MOD 2)=1);
do1:=(((bytesread/2) MOD 2)=1);
do2:=(((bytesread/4) MOD 2)=1);
END_IF;
END_IF; (* IF beg ELSE*)
END_IF; (*IF di0 ELSE*)
Если функция SysComOpen выдаёт значение 0, означает ли это, что порт открыт?
Почему SysComSetSettings выдаёт FALSE?
alhoresm
27.06.2011, 11:29
PROGRAM PLC_PRG
VAR
closeComPort:BOOL;
inp:BOOL;
outp:BOOL;
xOutput:fOutput;
ok:BOOL;
ComSet:comsettings;
ComSetEx:comsettingsEx;
bytesRead:DWORD;
buf,bufold: REAL;
END_VAR
(*-----------------------------------*)
VAR_GLOBAL
I1 AT %QD7.0:REAL;
I2 AT %QD8.0:REAL;
di0 AT %IX0.0:BOOL;
di1 AT %IX0.1:BOOL;
do0 AT %QX1.0:BOOL;
do1 AT %QX1.1:BOOL;
do2 AT %QX1.2:BOOL;
do3 AT %QX1.3:BOOL;
beg:BOOL:=TRUE;
comPort:PORTS:=0;
popytka:INT:=0;
vI:REAL:=0.0;
openComPort:DWORD:=INVALID_HANDLE;
END_VAR
IF di0 THEN
closeComPort:=SysComClose(opencomport);
do0:=FALSE;
do1:=FALSE;
do2:=FALSE;
do3:=FALSE;
i1:=4.1;
ELSE
IF beg THEN
IF openComPort=INVALID_HANDLE THEN
bufold:=0;
comPort:=0;(*RS-485*)
openComPort:=SysComOpen(comPort);
END_IF;
IF openComPort=INVALID_HANDLE(*( ( (255*256+255)*256+255)*256 + 255 )*) THEN
i1:=5.1;
closeComPort:=SysComClose(comPort);
popytka:=(popytka+1) MOD 500;
IF popytka=0 THEN
do0:=NOT do0;
END_IF;
ELSE
i1:=10.1;
ComSet.dwBaudRate:=115200;(*9600;*)
ComSet.byParity:=0;
ComSet.byStopBits:=0; (*1 stop bit*)
ComSet.dwBufferSize:=4;
ComSet.dwScan:=0;
ComSet.dwTimeout :=10;
ComSet.Port:=comPort;
ok:=SysComSetSettings(openComPort,ADR(ComSet));
IF ok THEN
do3:=TRUE;
vI:=0.001;
beg:=FALSE;
do0:=FALSE;
ELSE
popytka:=(popytka+1) MOD 1000;
IF popytka=0 THEN
do0:=NOT do0;
END_IF;
END_IF;
END_IF;
ELSE
bytesread:=SysComRead(opencomport,ADR(buf),4,300);
IF (bytesread=4) OR (bytesread=1) THEN
I1:=buf;
I2:=4;
bufold:=buf;
END_IF;
IF bytesread>0 THEN
do0:=((bytesread MOD 2)=1);
do1:=(((bytesread/2) MOD 2)=1);
do2:=(((bytesread/4) MOD 2)=1);
END_IF;
END_IF; (* IF beg ELSE*)
END_IF; (*IF di0 ELSE*)
Программа запинается на ok:=SysComSetSettings(openComPort,ADR(ComSet));
постоянно выдаёт FALSE
(openComPort=0)
где я ошибся?
alhoresm
27.06.2011, 12:12
Кажется разобрался
оказывается SysComSetSettings выдаёт FALSE в случае успешного завершения
Пробовали саму функцию запихнуть в условие, вместо присвоения её переменной ок
В трактовке булевых значении 0 принимает значение ЛОЖЬ, в системных функциях ошибки и невыполнение функции есть -1, а ноль это положительный результат
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot