Просмотр полной версии : пробую разобраться
Привет! Не понимаю, как получить реальное значение..:D Поясню:
Опрашиваю PLC датчик темературы через ТРМ. В ПЛК Конфигурации вижу свой регистр, тип WORD, там цифра 256. На ТРМ светится цифирка 25,6. (температура в офисе).
Объявляю переменную Temp типа REAL.
В программе делю значение регистра на 10, получаю Temp = 25. А где дробная часть? :rolleyes:
Малышев Олег
27.11.2009, 18:28
надо сначала присвоить Temp:=reg;
Temp:=temp /10.0;
а потом поделить иначе выполняется целочисленная операция а остаток отбрасывается
присвоить temp=reg мы сразу присвоили ;) . А вот додуматься, что делить нужно не на "10" как в русской школе учили, а на "10.1" - это мощно! И много в кодесисах таких эксклюзивов? :rolleyes: (Или REAL нужно только так делить? В якагавах деляться на целые) Но.. Заработала запятая .. спс!
Новый глобальный вопрос. А как вообще стартует программа на выполнение? C какого момента? :D
Поясню. Положим, надо выждать время после включения ПЛК, пока включатся ТРМ-ы, и запустить весело программу их опроса.
Можно первым шагом поставить генератор сигнала - он сгенерирует на таймер, таймер отщелкает секунд 10 и поехали...
Генератор искать долго, так, чтобы попроще - добавляем в ПЛК Конфигурацию модуль "статистика". Там есть PoweOn - он есмь Истина.
Эту "истину" подаем на вход таймера.
Запускаем. Работает.
Внимание - вопрос. Загружаю программу без ее выполнения - таймер работает. Простите, а как он работает, если программа не запущена на выполнение? :confused:
Малышев Олег
27.11.2009, 22:18
Вообще-то область ввода-вывода независима от программы, но ее можно запускать по команде. см документацию PLC Configuration
Игорь Петров
30.11.2009, 11:55
... додуматься, что делить нужно не на "10" как в русской школе учили, а на "10.1" - это мощно! И много в кодесисах таких эксклюзивов?
:) Много, как и во всех современных языках программирования. Программист должен иметь возможность заставлять транслятор делать четко то, что надо (с напряжением 1 извилины мозга на 1 мс). Хочу делить в целых – беру целые константы. Хочу делить в реал – беру реал. Общепринятые типизированные константы (информатика в русской школе была? Бейсик там, Паскаль?). Все просто и технично. Если система программирования будет все чесать под одну гребенку (встречается в примитивных средах, для упрощения внутренней реализации), то возможно в 8 из 10 случаев это будет хорошо. Зато в оставшихся 2 выхода не будет.
Можно писать 10.0 или REAL#10.
... А как вообще стартует программа на выполнение? C какого момента?
С включения питания и работает по циклу, четко по стандарту МЭК.
Положим, надо выждать время после включения ПЛК...генератор сигнала.. таймер..PoweOn...
Зачем так сложно?
Делаем PLC-PRG на SFC. На первый шаг Init ставим атрибут минимального времени выполнения, какой надо. Ниже Init переход всегда TRUE. Далее добавляем шаг в котором будет сидеть рабочая программа (на любом языке). Мышкой 4 клика и все дела.
Кстати, стандартные таймеры МЭК запускаются не уровнем, а именно фронтом! Т.е. чтобы по признаку вкл. питания его запустить, надо исхитриться запустить программу еще до включения питания.
Загружаю программу без ее выполнения - таймер работает.
Не может быть. Где видно что он работает?
Игорь, мерси, что ответили! :)
Работу определили по тому, что все шаги TRUE были синенькие. Т.е. таймер уже отработал.
Передача от начального init - это мысль.
У SFC есть внутренняя, не объявляемая переменная "t" - время. Условие перехода, с шага под названием, например, Step1 можно написать по идее так: Step1.t > T#10s
Но компилятор ругается на меня, и на этот переход, говорит "." needs structure variable :(
Не пойму, чего ему не хватает - переменная внутренняя по MЭК-у..
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) записывается во внутреннюю переменную код ошибки и машина переводится в режим аварии с обработчиком ошибок...
Правда ошибка по питанию будет видна только если отключился тока ПЛК, а панель и все остальное работает. Если пользователь отключит и включит сеть - произойдет просто перегрузка машины... хотя можно и запомнить эту ошибку и заставить пользователя её квитировать)))
Игорь Петров
30.11.2009, 14:33
У SFC есть внутренняя, не объявляемая переменная "t" - время. Условие перехода, с шага под названием, например, Step1 можно написать по идее так: Step1.t > T#10s
Не надо .t
Еще проще – см. в хелпе 'редактор SFC' - 'Дополнения' - 'Атрибуты шага' - Мин. время. Ставим в окошке мин. время T#10s и все.
.t работает только в полном МЭК SFC (см. МЭК шаги). В полном можно Step1.t > T#10s.
У вас стоит режим упрощенного SFC. Поэтому компилятор ругается на отсутствующую структурную переменную. Для МЭК SFC в код включается более развитый (и объемный) исполнитель SFC с поддержкой всяких хитрых действий отложенных, задержанных и пр. Тут такая мощь избыточна.
Ничего особо сложного в SFC нет. Въехать в него стоит очень красивые и легко читаемые программы получаются.
Работу определили по тому, что все шаги TRUE были синенькие. Т.е. таймер уже отработал.
Возможно, он еще и не начинал работать. В таймеры МЭК надо аккуратно вникнуть. Подробно тут.
(http://www.prolog-plc.ru/3s/docs/codesys_sp_rte.pdf)
Crusash и Игорь, Спасибо вам большое ребята! Очень помогли - буду разбираться дальше :)
Наверно дурацкий вопрос, но - задам, а то как-то нет уверенности..:rolleyes:
Пишу программу, по мере необходимости - делаю компиляцию, и загружаю в контроллер изменения. Контроллер 150, прошивка - последняя. Протокол ModbusRTU.
Время от времени, непонятно из-за чего, контроллер с ТРМ-м теряют связь (лампочка на ТРМ перестает моргать, в PLC Conf.Universal modbus device - нолики). В настройки PLC Connfiguration не лезем, ничего там не меняем. :confused:
Один раз связь восстановилась сама-собой, после повторной компиляции и загрузки.
Второй раз, первый рецепт не помог, сделали Clear All, загрузили - связь подхватилась.
Третий раз не помогло не первое ни второе, отключили контроллер, через минут 5-10 включили - связь появилась, температура передается! :eek:
В документации вроде нет никаких особых рецептов, кроме скоростей, и таймаутов, но это когда много приборов, линия связи протяженная. Тем более, поставив 100 ms - первое время работало отлично. Наверно то-то нами упущено? Как правильно нужно с ним обращаться, чтобы связь периодически не пропадала?
Александр Ч.
30.11.2009, 22:28
проверить надежность соединения интерфейсного кабеля по 485?
соединен крепко-накрепко. витой парой длинной 1 метр.
Николаев Андрей
02.12.2009, 14:20
Полное название контроллера, версия прошивки и Target файла?
Филоненко Владислав
02.12.2009, 14:58
проект выложите
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot