Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 29

Тема: Задание контроллеру из двух мест

  1. #1

    По умолчанию Задание контроллеру из двух мест

    Уважаемы, помогите решить задачу. Имеется контроллера ПЛК-154, сенсорная панель, СКАДА. Панель (modbus мастер) подключена к ПЛК по RS485. Контроллер подключен к СКАДе по Modbus TCP и является slave. Как навести мосты, чтобы уствавки можно было менять из двух мест?

  2. #2
    Пользователь
    Регистрация
    03.03.2008
    Адрес
    Новосибирск
    Сообщений
    238

    По умолчанию

    Для уставки заведите переменные: значение с панели, значение со скады и значение для ПЛК. Если Значение с панели не равно значению для ПЛК, то значению для ПЛК и для скады присваивается значение с панели. И наоборот. Как то так...

  3. #3

    По умолчанию

    Много мороки, единственно, что пока работает - дополнительная кнопка "Записать"

  4. #4

    По умолчанию

    Цитата Сообщение от kgsh82 Посмотреть сообщение
    Для уставки заведите переменные: значение с панели, значение со скады и значение для ПЛК. Если Значение с панели не равно значению для ПЛК, то значению для ПЛК и для скады присваивается значение с панели. И наоборот. Как то так...
    Реально не получается у меня это реализовать:/
    Есть панель мастер (по 232) и opc слэйв (по 485 gprs). Пишу
    Код:
    IF NOT strt_panel THEN
       IF mm_day<>p_mm_day THEN
           mm_day:=p_mm_day;
           os_mm_day:=mm_day;
       END_IF;
    	IF  b_modemLine=3 THEN
    		bl2(ENABLE:=TRUE , TIMELOW:=T#30s , TIMEHIGH:=T#30s);
    			IF bl2.OUT  THEN
    				comm2:=255;
    			    IF mm_day<>is_mm_day THEN
                                  mm_day:=is_mm_day;
                                  p_mm_day:=mm_day;
                                END_IF;
                                   os_mm_day:=mm_day;
    				ELSE
    				   bl2(ENABLE:=FALSE , TIMELOW:=T#5s , TIMEHIGH:=T#5s);
    				   comm2:=254;
    			END_IF;
    	END_IF;
    END_IF;
    Работает очень коряво, во время работы gprs нельзя поменять уставку с панели. Уже несколько вариантов пробовал, но прямо чтобы адекватная работа получилось - не выходит. Как правильнее это можно реализовать? Адреса mm_day, p_mm_day, os_mm_day и is_mm_day на последний вариант одинаковы.
    Последний раз редактировалось energvk; 26.09.2014 в 17:09.

  5. #5

    По умолчанию

    Просто же! Как и писал kgsh82, сделайте переменную, в которую панель может записывать своё значение (r_panel), аналогично, переменную, в которую пишет скада (r_scada), и дополнительную переменную в ПЛК (r_plc), и пишете например так:

    Код:
    IF r_panel<>r_plc THEN
        r_plc:=r_panel;
        r_scada:=r_panel;
    END_IF;
    IF r_scada<>r_plc THEN
        r_plc:=r_scada;
        r_panel:=r_scada;
    END_IF;
    Тут даже не надо заводить переменные для значений от предыдущего цикла ПЛК.
    Последний раз редактировалось Boris_K; 27.09.2014 в 16:01.

  6. #6
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Просто же!
    Ну хз. Переменные на ввод и на вывод у слейва как правило разные.

    Я обычно систему команд делаю. Три-пять записываемых регистров идут на код команды и её параметры, а остальные читаемые — на передачу текущего состояния. Панель или скада однократно записывает в свой или чужой регистр код и параметры, а состояние считывает постоянно. Можно хоть десять панелей подключить, и без разницы мастер или слейв.

    Код:
    (* Панели А и Б, для каждой свой набор читаемых и записываемых регистров *)
    
    IF КодКомандыА <> 0 THEN
        CASE КодКомандыА OF
            КомандаОткрытьКлапан:
                ОткрытьКлапан(ПараметрА0);
            КомандаЗакрытьКлапан:
                ЗакрытьКлапан(ПараметрА0);
        END_CASE
        (* Чтобы только один раз выполнилось *)
        КодКомандыА := 0;
    END_IF
    
    
    IF КодКомандыБ <> 0 THEN
        CASE КодКомандыБ OF
            КомандаОткрытьКлапан:
                ОткрытьКлапан(ПараметрБ0);
            КомандаЗакрытьКлапан:
                ЗакрытьКлапан(ПараметрБ0);
        END_CASE
        КодКомандыБ := 0;
    END_IF
    Как видно, по вкусу можно оформить в виде ФБ или наоборот пропускать разные наборы команд (типа: с одного поста можно открывать и закрывать, а со второго — только закрывать). Уже проверял с двумя СПК110 (обе — мастер) и ПЛК110 (слейв по двум портам). Сейчас так делаю на установку с двумя постами.
    Последний раз редактировалось Yegor; 27.09.2014 в 10:37.

  7. #7

    По умолчанию

    Ну хз. Переменные на ввод и на вывод у слейва как правило разные.
    Зачем так? Я сейчас успешно веду проект, там как раз СП270 - мастер, ПЛК100 - слейв (Модбас), и есть много регистров которые пишут и читают как панель, так и ПЛК, и часто это удобно.

  8. #8

    По умолчанию

    Цитата Сообщение от Boris_K Посмотреть сообщение
    Просто же! Как и писал kgsh82, сделайте переменную, в которую панель может записывать своё значение (r_panel), аналогично, переменную, в которую пишет скада (r_scada), и дополнительную переменную в ПЛК (r_plc), и пишете например так:

    Код:
    IF r_panel<>r_plc THEN
        r_plc:=r_panel;
        r_scada:=r_panel;
    END_IF;
    IF r_scada<>r_plc THEN
        r_plc:=r_scada;
        r_panel:=r_scada;
    END_IF;
    Тут даже не надо заводить переменные для значений от предыдущего цикла ПЛК.
    В том то и дело, что данный код не работает как надо. То есть при
    IF NOT strt_panel THEN
    hh_day:=p_hh_day;
    IF p_mm_day<>mm_day THEN
    mm_day:=p_mm_day;
    os_mm_day:=p_mm_day;
    END_IF;
    END_IF;

    IF b_modemLine=3 THEN
    comm2:=255;
    IF is_mm_day<>mm_day THEN
    mm_day:=is_mm_day;
    p_mm_day:=is_mm_day;
    END_IF;
    os_mm_day:=mm_day;
    ELSE comm2:=254;
    END_IF;
    уставка меняется только со скады, с панели поменять уже не получается.
    p_mm_day - слэйв
    os_mm_day, is_mm_day - мастер
    mm_day - внутр. глоб. переменная

    Похоже придется разбираться с CASE...

  9. #9

    По умолчанию

    Я показал сам принцип, который работает 100%, это очевидно. У вас где-то какие-то грабли:

    1) В вашем примере 4 переменных, в моём - 3. Не понятно, чем у вас различаются os_mm_day и is_mm_day (и зачем os_mm_day присваивается ещё и после условного оператора (третья снизу строчка)). И вообще, эти дополнительные условия (на модем) которые у вас там, я не могу проверить, т. к. не знаю полной логики работы вашей программы. Блок, отвечающий за обновление уставок, должен вообще выполняться безусловно, выделите его в отдельный блок. Возможно, какие-то дополнительные условия и мешают его нормальной работе.
    2) Проверьте внимательно, нужные ли команды на запись вы используете в панели и скаде: префикс для команд на запись регистра - "4х", возможно, у вас где-то стоит "3х" (это только чтение).

    И дело тут не в CASE. Это уже чисто эстетический вопрос. Я например вообще CASE не юзаю, даже в программах по 5 тысяч строк. Потому что по функциональности IF-ELSE-END_IF ничем не хуже.

    P. S. Лучше структурировать код для условных операторов (клавишей Tab), удобнее читать будет, это общепринятый признак хорошего тона в программировании
    Последний раз редактировалось Boris_K; 29.09.2014 в 16:53.

  10. #10

    По умолчанию

    Boris_K
    Не могу понять как прописать команду на запись уставки. Код
    Код:
    IF ust1<>0 THEN
    	CASE ust1 OF
    	sm_ust_hh:
    	hh_day:=ip_hh_day;
    	p_hh_day:= hh_day;
    	os_hh_day:= hh_day;
    	END_CASE;
    ust1:=0;
    END_IF
    выдает ошибку:
    Требуется целое число или символьная константа
    Необходимо Число, 'ELSE' или 'END_CASE'

    Пробовал разные варианты, но ни один не работает. Что не правильно я прописываю, с CASE ещё не сталкивался особо, плохо понимаю принцип кода
    ip_hh_day, p_hh_day, os_hh_day - сделал разные регистры
    Последний раз редактировалось energvk; 29.09.2014 в 16:51.

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

Похожие темы

  1. Управление из 2-х мест
    от Солнечный заяц в разделе СПК2хх
    Ответов: 16
    Последнее сообщение: 21.09.2014, 15:33
  2. Задание IP-адреса ПЛК
    от Frayl в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 21.08.2012, 10:46
  3. Ответов: 2
    Последнее сообщение: 30.05.2012, 14:27
  4. подключение трм-32 к своему контроллеру
    от Кирилюк Виктор в разделе Помощь Разработчикам
    Ответов: 6
    Последнее сообщение: 11.11.2010, 17:00
  5. тех задание
    от Алексей Zagen в разделе Наши проекты
    Ответов: 3
    Последнее сообщение: 06.06.2010, 20:13

Ваши права

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