Цитата Сообщение от Валенок Посмотреть сообщение
Хрень все это с перезагрузками. Т.к. обмен все одно через либы - копайте код, там косяк.
Или с МЭ проблемы - его и перезагружайте.
Да вроде в коде ломаться нечему. Может быть вы увидите слабые моменты.
Подпрограмма опроса модуля:
Код:
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