Показано с 1 по 5 из 5

Тема: Перезагрузка ПЛК73 из программы с сохранением переменных

  1. #1
    Пользователь Аватар для Солнечный заяц
    Регистрация
    16.08.2009
    Адрес
    г. Рыбинск, Яр.обл.
    Сообщений
    167

    По умолчанию Перезагрузка ПЛК73 из программы с сохранением переменных

    Имеем:
    Электрический котел с управлением на ПЛК73
    + Модуль измерения параметров электрической сети МЭ110 на RS-1
    + GSM-Модем ПМ01 на RS-2
    все рядом, в одном щите.

    Проблема:
    Примерно через год эксплуатации потерялась связь с МЭ110. Обмен с модемом сохранился. Больше ничего о проблеме неизвестно. По данным пользователя, проблему удалось вылечить перезагрузкой контроллера с модулем МЭ110 (висят на одном автомате). Предположительно, завис интерфейс RS-1 на ПЛК. Усиливать помехозащищенность линии заказчик пока не хочет.

    Предполагаемое решение:
    Перезагрузка ПЛК73 по СМС-команде с модема.

    Вопрос:
    Как лучше реализовать перезагрузку? В библиотеках ничего похожего не нашел. При перезагрузке сторожевым таймером, не сохраняются измененные переменные в энергонезависимой памяти. Может быть есть возможность сохранить энергонезависимые переменные принудительно?

    Всем добра

  2. #2

    По умолчанию

    Цитата Сообщение от Солнечный заяц Посмотреть сообщение
    Имеем:
    Электрический котел с управлением на ПЛК73
    + Модуль измерения параметров электрической сети МЭ110 на RS-1
    + GSM-Модем ПМ01 на RS-2
    все рядом, в одном щите.

    Проблема:
    Примерно через год эксплуатации потерялась связь с МЭ110. Обмен с модемом сохранился. Больше ничего о проблеме неизвестно. По данным пользователя, проблему удалось вылечить перезагрузкой контроллера с модулем МЭ110 (висят на одном автомате). Предположительно, завис интерфейс RS-1 на ПЛК. Усиливать помехозащищенность линии заказчик пока не хочет.

    Предполагаемое решение:
    Перезагрузка ПЛК73 по СМС-команде с модема.

    Вопрос:
    Как лучше реализовать перезагрузку? В библиотеках ничего похожего не нашел. При перезагрузке сторожевым таймером, не сохраняются измененные переменные в энергонезависимой памяти. Может быть есть возможность сохранить энергонезависимые переменные принудительно?

    Всем добра
    А батарейка в ПЛК73 живая ?

  3. #3
    Пользователь Аватар для Солнечный заяц
    Регистрация
    16.08.2009
    Адрес
    г. Рыбинск, Яр.обл.
    Сообщений
    167

    По умолчанию

    Цитата Сообщение от IVM Посмотреть сообщение
    А батарейка в ПЛК73 живая ?
    Да, батарейка живая. При отключении питания переменные сохраняются нормально.

  4. #4
    Пользователь Аватар для Солнечный заяц
    Регистрация
    16.08.2009
    Адрес
    г. Рыбинск, Яр.обл.
    Сообщений
    167

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Хрень все это с перезагрузками. Т.к. обмен все одно через либы - копайте код, там косяк.
    Или с МЭ проблемы - его и перезагружайте.
    Да вроде в коде ломаться нечему. Может быть вы увидите слабые моменты.
    Подпрограмма опроса модуля:
    Код:
    VAR
    	phase_rs1: BYTE;		(*фаза обмена по rs-485-1*)
    	OWEN_GET_REAL_1: OWEN_GET_REAL;	(*блок чтения переменной типа REAL*)
    	Com_settings_1: comsettings := (Port:=0,dwBaudRate:=9600,byStopBits:=0,byParity:=0,dwTimeout:=0,dwBufferSize:=0);		(*настройки порта 2*)
    	COM_SERVICE_1: COM_SERVICE;	(*Блок операций с портом*)
    	OWEN_SET_REAL_1: OWEN_SET_REAL;		(*Блок записи переменной Real*)
    	Connection_Error_TON: TON;		(*Таймер индикации обрыва связи*)
    	Connection_Error_TON_2: TON;		(*Таймер индикации обрыва связи*)
    	OWEN_GET_DINT_1: OWEN_GET_DINT;	(*блок чтения переменной типа DINT*)
    	OWEN_GET_DINT_2: OWEN_GET_DINT;	(*блок чтения переменной типа DINT*)
    END_VAR
    
    CASE phase_rs1 OF
    	0:(*открываем порт*)
    		COM_SERVICE_1(Enable:=TRUE , Settings:=Com_settings_1 , Task:=OPEN_TSK  );
    		IF COM_SERVICE_1.Ready THEN
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	1:	(*записываем коэффициент трансформации тока*)
    		OWEN_SET_REAL_1(
    			Enable:=TRUE ,
    			Addr:=16 ,
    			AddrLen:=8 ,
    			Name:='n.i' ,
    			Index:=16#FFFF ,
    			RealType:=float32 ,
    			Value:=Ktri ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms);
    		IF OWEN_SET_REAL_1.Complete THEN	(*ответ пришел?*)
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	2:	(*читаем ток по фазе А*)
    		OWEN_GET_REAL_1(
    			Enable:=TRUE ,
    			Addr:=16 ,
    			AddrLen:=8 ,
    			Name:='in.i1' ,
    			Index:=16#FFFF ,
    			RealType:=float32 ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms );
    		IF OWEN_GET_REAL_1.Complete THEN	(*ответ пришел?*)
    			IF OWEN_GET_REAL_1.Error=0 THEN	(*нет ошибок?*)
    				Ia:=OWEN_GET_REAL_1.Value;
    			END_IF
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	3:	(*читаем ток по фазе В*)
    		OWEN_GET_REAL_1(
    			Enable:=TRUE ,
    			Addr:=16 ,
    			AddrLen:=8 ,
    			Name:='in.i2' ,
    			Index:=16#FFFF ,
    			RealType:=float32 ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms );
    		IF OWEN_GET_REAL_1.Complete THEN	(*ответ пришел?*)
    			IF OWEN_GET_REAL_1.Error=0 THEN	(*нет ошибок?*)
    				Ib:=OWEN_GET_REAL_1.Value;
    			END_IF
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	4:	(*читаем ток по фазе С*)
    		OWEN_GET_REAL_1(
    			Enable:=TRUE ,
    			Addr:=16 ,
    			AddrLen:=8 ,
    			Name:='in.i3' ,
    			Index:=16#FFFF ,
    			RealType:=float32 ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms );
    		IF OWEN_GET_REAL_1.Complete THEN	(*ответ пришел?*)
    			IF OWEN_GET_REAL_1.Error=0 THEN	(*нет ошибок?*)
    				Ic:=OWEN_GET_REAL_1.Value;
    			END_IF
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	5:	(*читаем режим работы*)
    		OWEN_GET_DINT_1(
    			Enable:=TRUE ,
    			Addr:=16 ,
    			AddrLen:=8 ,
    			Name:='Mode' ,
    			Index:=16#FFFF ,
    			IntType:=UINT_FRM ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms ,
    			Complete=> ,
    			Value=> ,
    			Error=> );
    		IF OWEN_GET_DINT_1.Complete THEN	(*ответ пришел?*)
    			IF OWEN_GET_DINT_1.Error=0 THEN	(*нет ошибок?*)
    				Phase_Rotation_Error := OWEN_GET_DINT_1.Value.14;	(*читаем бит ошибки чередования фаз*)
    			END_IF
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	6:	(*записываем коэффициент трансформации напряжения*)
    		OWEN_SET_REAL_1(
    			Enable:=TRUE ,
    			Addr:=16 ,
    			AddrLen:=8 ,
    			Name:='n.u' ,
    			Index:=16#FFFF ,
    			RealType:=float32 ,
    			Value:=Ktru ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms);
    		IF OWEN_SET_REAL_1.Complete THEN	(*ответ пришел?*)
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	7:	(*читаем напряжение по фазе А*)
    		OWEN_GET_REAL_1(
    			Enable:=TRUE ,
    			Addr:=16 ,
    			AddrLen:=8 ,
    			Name:='in.u1' ,
    			Index:=16#FFFF ,
    			RealType:=float32 ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms );
    		IF OWEN_GET_REAL_1.Complete THEN	(*ответ пришел?*)
    			IF OWEN_GET_REAL_1.Error=0 THEN	(*нет ошибок?*)
    				Ua:=OWEN_GET_REAL_1.Value;
    			END_IF
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	8:	(*читаем напряжение по фазе В*)
    		OWEN_GET_REAL_1(
    			Enable:=TRUE ,
    			Addr:=16 ,
    			AddrLen:=8 ,
    			Name:='in.u2' ,
    			Index:=16#FFFF ,
    			RealType:=float32 ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms );
    		IF OWEN_GET_REAL_1.Complete THEN	(*ответ пришел?*)
    			IF OWEN_GET_REAL_1.Error=0 THEN	(*нет ошибок?*)
    				Ub:=OWEN_GET_REAL_1.Value;
    			END_IF
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	9:	(*читаем напряжение по фазе С*)
    		OWEN_GET_REAL_1(
    			Enable:=TRUE ,
    			Addr:=16 ,
    			AddrLen:=8 ,
    			Name:='in.u3' ,
    			Index:=16#FFFF ,
    			RealType:=float32 ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms );
    		IF OWEN_GET_REAL_1.Complete THEN	(*ответ пришел?*)
    			IF OWEN_GET_REAL_1.Error=0 THEN	(*нет ошибок?*)
    				Uc:=OWEN_GET_REAL_1.Value;
    			END_IF
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	10:	(*читаем состояние дискретных входов модуля МК110-8Д.4Р*)
    		IF Configuration<>3 THEN	(*если это не конфигурация 3, пропускаем этот опрос*)
    			phase_rs1:=phase_rs1+1;	(*переходим к следующему опросу*)
    			RETURN;	(*выходим из подпрограммы*)
    		END_IF
    		OWEN_GET_DINT_2(
    			Enable:=TRUE ,
    			Addr:=1 ,
    			AddrLen:=8 ,
    			Name:='r.Cn' ,
    			Index:=16#FFFF ,
    			IntType:=UINT_FRM ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms);
    		IF OWEN_GET_DINT_2.Complete THEN	(*ответ пришел?*)
    			IF OWEN_GET_DINT_2.Error=0 THEN	(*нет ошибок?*)
    				MK110_8D_4R_1_Inputs := OWEN_GET_DINT_2.Value;	(*читаем бит ошибки чередования фаз*)
    			END_IF
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	11:(*пишем дискретный выход в модуль МК110-8Д.4Р*)
    		IF Configuration<>3 THEN	(*если это не конфигурация 3, пропускаем этот опрос*)
    			phase_rs1:=phase_rs1+1;	(*переходим к следующему опросу*)
    			RETURN;	(*выходим из подпрограммы*)
    		END_IF
    		OWEN_SET_REAL_1(
    			Enable:=TRUE ,
    			Addr:=1 ,
    			AddrLen:=8 ,
    			Name:='r.OE' ,
    			Index:=16#FFFF ,
    			RealType:=FLOAT24 ,
    			Value:=MK110_8D_4R_1_Output[1] ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms);
    		IF OWEN_SET_REAL_1.Complete THEN	(*ответ пришел?*)
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	12:	(*пишем дискретный выход в модуль МК110-8Д.4Р*)
    		IF Configuration<>3 THEN	(*если это не конфигурация 3, пропускаем этот опрос*)
    			phase_rs1:=phase_rs1+1;	(*переходим к следующему опросу*)
    			RETURN;	(*выходим из подпрограммы*)
    		END_IF
    		OWEN_SET_REAL_1(
    			Enable:=TRUE ,
    			Addr:=2 ,
    			AddrLen:=8 ,
    			Name:='r.OE' ,
    			Index:=16#FFFF ,
    			RealType:=FLOAT24 ,
    			Value:=MK110_8D_4R_1_Output[2] ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms);
    		IF OWEN_SET_REAL_1.Complete THEN	(*ответ пришел?*)
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	13:(*пишем дискретный выход в модуль МК110-8Д.4Р*)
    		IF Configuration<>3 THEN	(*если это не конфигурация 3, пропускаем этот опрос*)
    			phase_rs1:=phase_rs1+1;	(*переходим к следующему опросу*)
    			RETURN;	(*выходим из подпрограммы*)
    		END_IF
    		OWEN_SET_REAL_1(
    			Enable:=TRUE ,
    			Addr:=3 ,
    			AddrLen:=8 ,
    			Name:='r.OE' ,
    			Index:=16#FFFF ,
    			RealType:=FLOAT24 ,
    			Value:=MK110_8D_4R_1_Output[3] ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms);
    		IF OWEN_SET_REAL_1.Complete THEN	(*ответ пришел?*)
    			phase_rs1:=phase_rs1+1;
    		END_IF
    	14:	(*пишем дискретный выход в модуль МК110-8Д.4Р*)
    		IF Configuration<>3 THEN	(*если это не конфигурация 3, пропускаем этот опрос*)
    			phase_rs1:=phase_rs1+1;	(*переходим к следующему опросу*)
    			RETURN;	(*выходим из подпрограммы*)
    		END_IF
    		OWEN_SET_REAL_1(
    			Enable:=TRUE ,
    			Addr:=4 ,
    			AddrLen:=8 ,
    			Name:='r.OE' ,
    			Index:=16#FFFF ,
    			RealType:=FLOAT24 ,
    			Value:=MK110_8D_4R_1_Output[4] ,
    			ComHandle:=Com_settings_1.Port ,
    			TimeOut:=T#100ms);
    		IF OWEN_SET_REAL_1.Complete THEN	(*ответ пришел?*)
    			phase_rs1:=phase_rs1+1;
    		END_IF
    ELSE
    	phase_rs1:=1;
    END_CASE
    
    (*контроль связи*)
    IF OWEN_GET_REAL_1.Complete THEN
    	Connection_Error_TON(IN:=OWEN_GET_REAL_1.Error<>0 , PT:=Modul_Timeout , Q=>Modul_Connection_Error );
    END_IF
    IF OWEN_GET_DINT_2.Complete THEN
    	Connection_Error_TON_2(IN:=OWEN_GET_DINT_2.Error<>0 , PT:=Modul_Timeout , Q=>MK110_8D_4R_1_Connection_Error );
    END_IF

  5. #5
    Пользователь Аватар для Солнечный заяц
    Регистрация
    16.08.2009
    Адрес
    г. Рыбинск, Яр.обл.
    Сообщений
    167

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Регулярный 1 и 6 всё время - норм ? они конфигурационные
    Как говорится, "Практичность, важнее безупречности" )

    Цитата Сообщение от Валенок Посмотреть сообщение
    Configuration <> 3 wtf ? полный код с окружением ?
    Configuration устанавливается один раз при сборке щита, в зависимости от модификации. В нашем случае всегда Configuration<>3.

    Цитата Сообщение от Валенок Посмотреть сообщение
    И рекомендую на старте закрывать порт (фича для 63/73) и переоткрывать при полном цикле таймаутов.
    Полный цикл таймаутов, это сколько?

Похожие темы

  1. Перезагрузка СПК207 из программы
    от gensek1 в разделе СПК2хх
    Ответов: 6
    Последнее сообщение: 15.01.2021, 11:22
  2. ПЛК73 + УБЗ-302. ПОСТОЯННАЯ ПЕРЕЗАГРУЗКА
    от xzadmanx в разделе ПЛК63/73
    Ответов: 0
    Последнее сообщение: 20.11.2018, 17:45
  3. Перезагрузка после останова программы
    от Солнечный заяц в разделе ПЛК1хх
    Ответов: 5
    Последнее сообщение: 06.07.2011, 09:41
  4. Ответов: 1
    Последнее сообщение: 07.06.2011, 17:21
  5. Ответов: 3
    Последнее сообщение: 18.12.2010, 21:14

Метки этой темы

Ваши права

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