Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: Значения переменных не загружаются в контроллер

  1. #1

    По умолчанию Значения переменных не загружаются в контроллер

    Добрый день!
    Мне надо, чтобы до запуска программы в контроллере, переменные уже имели какие-то определенные значения.
    В поле объявления, для некоторых переменных задаю нужные значения.
    при загрузки программы в контроллер, значения переменных остаются теми же, что и были при остановке контроллера от предыдущего запуска.
    В чём может быть ошибка и как это сделать?

    (вставил бы скриншоты для наглядности, но почему-то здесь ввели неудобные ограничения на разрешение и размер картинки)
    заранее спасибо за ответ

  2. #2

    По умолчанию

    Вы не как Retain их объявляете?

  3. #3

    По умолчанию

    Объявляю так:
    VAR beg:BOOL:=TRUE;
    ...
    а как по другому объявить?

  4. #4

    По умолчанию

    опишите пожалуйста более подробно порядок ваших действий: что вы подразумеваете под "предыдущего запуска" и чем новый запуск отличается от нового. Просто те значения которые вы указываете при объявлении вступают в силу при самом первом запуске и после ресета. Если вы просто отключились и подключились обратно к ПЛК или сделали старт/стоп то значение сохранит свое предыдущее значение и сбрасываться в "значение по умолчанию" не будет.

  5. #5

    По умолчанию

    включаю контроллер в разетку, загружаю на него программу, запускаю контроллер (кнопкой на верхней панели), он пытается открыть КОМ порт (у него это не получатся), считает количество попыток, я останавливаю его, немного меняю программу, загружаю её контроллер, смотрю на значения переменных, а количество попыток не навно нулю, ну и флаг режима начала программы FALSE (должен быть TRUE)

  6. #6

    Exclamation

    Цитата Сообщение от alhoresm Посмотреть сообщение
    включаю контроллер в разетку, загружаю на него программу, запускаю контроллер (кнопкой на верхней панели), он пытается открыть КОМ порт (у него это не получатся), считает количество попыток, я останавливаю его, немного меняю программу, загружаю её контроллер, смотрю на значения переменных, а количество попыток не навно нулю, ну и флаг режима начала программы FALSE (должен быть TRUE)
    1) Обновите Codesys до 2.3.9.26
    http://www.owen.ru/catalog/55710393
    2) При изменении проекта и подключении к ПЛК выбирайте Загрузить все. Если нажимаете загрузить только изменения, то программа не переставая выполняться принимает часть измененного кода, но при этом переменные не сбросятся.
    Последний раз редактировалось Евгений Сергеевич; 30.06.2011 в 12:03.

  7. #7

    По умолчанию

    спасибо, завтра попробую

  8. #8

    По умолчанию

    Со значениями переменных разобрался
    теперь другая проблема:
    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
    openComPortWORD;
    closeComPort:BOOL;
    inp:BOOL;
    outp:BOOL;
    xOutput:fOutput;
    ok:BOOL;
    ComSet:comsettings;
    ComSetEx:comsettingsEx;
    bytesReadWORD;
    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?

  9. #9

    По умолчанию

    PROGRAM PLC_PRG
    VAR
    closeComPort:BOOL;
    inp:BOOL;
    outp:BOOL;
    xOutput:fOutput;
    ok:BOOL;
    ComSet:comsettings;
    ComSetEx:comsettingsEx;
    bytesReadWORD;
    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;
    openComPortWORD:=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:32.

  10. #10

    По умолчанию

    Кажется разобрался
    оказывается SysComSetSettings выдаёт FALSE в случае успешного завершения

Страница 1 из 2 12 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •