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

Тема: пробую разобраться

  1. #1

    По умолчанию пробую разобраться

    Привет! Не понимаю, как получить реальное значение.. Поясню:

    Опрашиваю PLC датчик темературы через ТРМ. В ПЛК Конфигурации вижу свой регистр, тип WORD, там цифра 256. На ТРМ светится цифирка 25,6. (температура в офисе).

    Объявляю переменную Temp типа REAL.

    В программе делю значение регистра на 10, получаю Temp = 25. А где дробная часть?

  2. #2

    По умолчанию

    надо сначала присвоить Temp:=reg;
    Temp:=temp /10.0;
    а потом поделить иначе выполняется целочисленная операция а остаток отбрасывается
    Часто задаваемые вопросы по кодесис
    1) Почему программа не работает - Следует выполнить "Онлайн ->Старт"
    2) Где скачать CoDeSys, таргеты, прошивки, библиотеки - http://www.owen.ru/catalog/codesys_v3/opisanie

  3. #3

    По умолчанию

    присвоить temp=reg мы сразу присвоили . А вот додуматься, что делить нужно не на "10" как в русской школе учили, а на "10.1" - это мощно! И много в кодесисах таких эксклюзивов? (Или REAL нужно только так делить? В якагавах деляться на целые) Но.. Заработала запятая .. спс!

    Новый глобальный вопрос. А как вообще стартует программа на выполнение? C какого момента?

    Поясню. Положим, надо выждать время после включения ПЛК, пока включатся ТРМ-ы, и запустить весело программу их опроса.

    Можно первым шагом поставить генератор сигнала - он сгенерирует на таймер, таймер отщелкает секунд 10 и поехали...
    Генератор искать долго, так, чтобы попроще - добавляем в ПЛК Конфигурацию модуль "статистика". Там есть PoweOn - он есмь Истина.

    Эту "истину" подаем на вход таймера.


    Запускаем. Работает.

    Внимание - вопрос. Загружаю программу без ее выполнения - таймер работает. Простите, а как он работает, если программа не запущена на выполнение?
    Последний раз редактировалось Irasha; 27.11.2009 в 19:55.

  4. #4

    По умолчанию

    Вообще-то область ввода-вывода независима от программы, но ее можно запускать по команде. см документацию PLC Configuration
    Часто задаваемые вопросы по кодесис
    1) Почему программа не работает - Следует выполнить "Онлайн ->Старт"
    2) Где скачать CoDeSys, таргеты, прошивки, библиотеки - http://www.owen.ru/catalog/codesys_v3/opisanie

  5. #5

    По умолчанию

    Цитата Сообщение от Irasha Посмотреть сообщение
    ... додуматься, что делить нужно не на "10" как в русской школе учили, а на "10.1" - это мощно! И много в кодесисах таких эксклюзивов?
    Много, как и во всех современных языках программирования. Программист должен иметь возможность заставлять транслятор делать четко то, что надо (с напряжением 1 извилины мозга на 1 мс). Хочу делить в целых – беру целые константы. Хочу делить в реал – беру реал. Общепринятые типизированные константы (информатика в русской школе была? Бейсик там, Паскаль?). Все просто и технично. Если система программирования будет все чесать под одну гребенку (встречается в примитивных средах, для упрощения внутренней реализации), то возможно в 8 из 10 случаев это будет хорошо. Зато в оставшихся 2 выхода не будет.
    Можно писать 10.0 или REAL#10.
    Цитата Сообщение от Irasha Посмотреть сообщение
    ... А как вообще стартует программа на выполнение? C какого момента?
    С включения питания и работает по циклу, четко по стандарту МЭК.
    Цитата Сообщение от Irasha Посмотреть сообщение
    Положим, надо выждать время после включения ПЛК...генератор сигнала.. таймер..PoweOn...
    Зачем так сложно?
    Делаем PLC-PRG на SFC. На первый шаг Init ставим атрибут минимального времени выполнения, какой надо. Ниже Init переход всегда TRUE. Далее добавляем шаг в котором будет сидеть рабочая программа (на любом языке). Мышкой 4 клика и все дела.

    Кстати, стандартные таймеры МЭК запускаются не уровнем, а именно фронтом! Т.е. чтобы по признаку вкл. питания его запустить, надо исхитриться запустить программу еще до включения питания.
    Цитата Сообщение от Irasha Посмотреть сообщение
    Загружаю программу без ее выполнения - таймер работает.
    Не может быть. Где видно что он работает?

  6. #6

    По умолчанию

    Игорь, мерси, что ответили!

    Работу определили по тому, что все шаги TRUE были синенькие. Т.е. таймер уже отработал.

    Передача от начального init - это мысль.

    У SFC есть внутренняя, не объявляемая переменная "t" - время. Условие перехода, с шага под названием, например, Step1 можно написать по идее так: Step1.t > T#10s

    Но компилятор ругается на меня, и на этот переход, говорит "." needs structure variable

    Не пойму, чего ему не хватает - переменная внутренняя по MЭК-у..

  7. #7

    По умолчанию

    Irasha, мой совет:
    прежде чем связываться с SFC следует подробней изучить документацию на него, тотому как помимо времен шага и флага активности там ещё много вещей и подводных камней которые необходимо знать для разработки (и просто понимания что там делается) программ... Хорошо язык SFC и вообще КоДеСис описан у Петрова "Программируемые контроллеры.Стандартные языки и приёмы прикладного проектирования".

    А при инициализации ,лично меня, вполне удовлетворяет TON. На ПЛК150 я делаю так(вдруг вам пригодится):
    Код:
    VAR
    	ton_power:TON;
    	tof_power:TOF;
    END_VAR
    tof_power(IN:=power_on,PT:=T#1s);
    ton_power(IN:=tof_power.q,PT:=T#30s);
    IF ton_power.Q THEN
    	check_errore();(*нормальная работа, вкл проверка ошибок*)
    ELSE
    	IF tof_power.Q THEN(*включение*)
    		mashina.status:=1;
    	ELSE(*авария по питанию*)
    		mashina.dw_error:=PUTBIT(x:=mashina.dw_error,n:=10,b:=TRUE);
    		mashina.status:=4000;
    	END_IF
    END_IF
    mashina.status - переменная задающая режим работы машины.
    power_on - статическая переменная ПЛК, true - питание есть.
    tof_power нивелирует кратковременное отключения питания.
    в режиме "включения" происходит инициализация и ожидание пока все датчики включатся с последующим переходом в "Ожидания"(сдесь не видно) и включением контроль ошибок.
    при аварии по питанию(power_on=false) записывается во внутреннюю переменную код ошибки и машина переводится в режим аварии с обработчиком ошибок...
    Правда ошибка по питанию будет видна только если отключился тока ПЛК, а панель и все остальное работает. Если пользователь отключит и включит сеть - произойдет просто перегрузка машины... хотя можно и запомнить эту ошибку и заставить пользователя её квитировать)))
    Последний раз редактировалось Crusash; 30.11.2009 в 15:04.

  8. #8

    По умолчанию

    Цитата Сообщение от Irasha Посмотреть сообщение
    У SFC есть внутренняя, не объявляемая переменная "t" - время. Условие перехода, с шага под названием, например, Step1 можно написать по идее так: Step1.t > T#10s
    Не надо .t
    Еще проще – см. в хелпе 'редактор SFC' - 'Дополнения' - 'Атрибуты шага' - Мин. время. Ставим в окошке мин. время T#10s и все.
    .t работает только в полном МЭК SFC (см. МЭК шаги). В полном можно Step1.t > T#10s.

    У вас стоит режим упрощенного SFC. Поэтому компилятор ругается на отсутствующую структурную переменную. Для МЭК SFC в код включается более развитый (и объемный) исполнитель SFC с поддержкой всяких хитрых действий отложенных, задержанных и пр. Тут такая мощь избыточна.

    Ничего особо сложного в SFC нет. Въехать в него стоит очень красивые и легко читаемые программы получаются.
    Цитата Сообщение от Irasha Посмотреть сообщение
    Работу определили по тому, что все шаги TRUE были синенькие. Т.е. таймер уже отработал.
    Возможно, он еще и не начинал работать. В таймеры МЭК надо аккуратно вникнуть. Подробно тут.

  9. #9

    По умолчанию

    Crusash и Игорь, Спасибо вам большое ребята! Очень помогли - буду разбираться дальше

  10. #10

    По умолчанию

    Наверно дурацкий вопрос, но - задам, а то как-то нет уверенности..

    Пишу программу, по мере необходимости - делаю компиляцию, и загружаю в контроллер изменения. Контроллер 150, прошивка - последняя. Протокол ModbusRTU.

    Время от времени, непонятно из-за чего, контроллер с ТРМ-м теряют связь (лампочка на ТРМ перестает моргать, в PLC Conf.Universal modbus device - нолики). В настройки PLC Connfiguration не лезем, ничего там не меняем.

    Один раз связь восстановилась сама-собой, после повторной компиляции и загрузки.

    Второй раз, первый рецепт не помог, сделали Clear All, загрузили - связь подхватилась.

    Третий раз не помогло не первое ни второе, отключили контроллер, через минут 5-10 включили - связь появилась, температура передается!

    В документации вроде нет никаких особых рецептов, кроме скоростей, и таймаутов, но это когда много приборов, линия связи протяженная. Тем более, поставив 100 ms - первое время работало отлично. Наверно то-то нами упущено? Как правильно нужно с ним обращаться, чтобы связь периодически не пропадала?

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

Ваши права

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