Добрый день. Имеется подпрограмма для чтения 8 аналоговых входов МВА8 и записи их в оперативные переменные на ПЛК63.
Обнаружил что примерно раз в неделю или чуть чаще, происходит обмен соседними значениями - например МВА8_5 получает значение МВА8_4, МВА8_4 получает значение МВА8_3. Обнаружил это совершенно случайно, когда поставил к этим переменным сбор статистики за сутки (Минимальное максимальное среднее) - увидел что переменная приняла минимальное значение, которое никогда не могло быть, но зато очень похоже на диапазон значений соседнего входа.
Замечено такое за МВА8? Или дело в коде:
Код:
tNext(IN:=TRUE,PT:=T#3s);
IF tNext.Q THEN

(*Устанавливаем настройки COM-порта*)
IF port_opened=0 THEN
		Settings.Port:=com_num;               (*номер COM-порта*)(*0 - RS-485, 1 - RS-232*)
		Settings.dwBaudRate:=9600;    (*скорость*)
		Settings.byParity:=0;
		Settings.dwTimeout:=0;
		Settings.byStopBits:=1;
		Settings.dwBufferSize:=0;
		Settings.dwScan:=0;
END_IF


COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK  );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready THEN
	port_opened:=2;
END_IF

IF port_opened=2 THEN (*Удачно проинициализировали*)

	CASE master1 OF
	0:
		CurAddr:=4;
	1:
		CurAddr:=10;
	2:
		CurAddr:=16;
	3:
		CurAddr:=22;
	4:
		CurAddr:=28;
	5:
		CurAddr:=34;
	6:
		CurAddr:=40;
	7:
		CurAddr:=46;
	END_CASE
	(* функция 03 флоат - ФБ считывает значение параметра  типа real из прибора с адресом 16 в регистр с номаром CurAddr по протоколу Modbus-RTU *)
	get3_modbus(
		Enable:=enabl ,			(* разрешение работы блока *)
		Mode:=MB_RTU ,		(*режим передачи*)
		DevAddr:=16 ,				(*адрес*)
		FirstAddr:=CurAddr ,				(*номер регистра*)
		Quantity:=2,				(*количество регистров*)
		ComHandle:=Settings.Port ,(*номер COM-порта*)
		TimeOut:=TimeOut , 		(*Таймаут T#50ms*)
		Buffer:=Buffer ,			(* буфер данных *)
		Complete=>cmpl ,		(* скопировать признак завершения операции *)
		Exception=>err ,			(* скопировать регистр ошибок *)
		ByteCnt=>DataSize );		(*кол-во считанных байтов *)
		(*если установлен признак завершения операции, то *)
		IF cmpl THEN
			IF err=0 THEN (*Если нет ошибок, то получаем  данные из буфера типа FLOAT*)
				ptr_D:=ADR(d);
				ptr_D^:=buffer[3];
				ptr_D:=ptr_D+1;
				ptr_D^:=buffer[2];
				ptr_D:=ptr_D+1;
				ptr_D^:=buffer[1];
				ptr_D:=ptr_D+1;
				ptr_D^:=buffer[0];
				d:=slROUND1(d);
				IF d<>0 THEN
					CASE master1 OF
					0:
						MVA8_1:=d;
					1:
						MVA8_2:=d;
					2:
						MVA8_3:=d;
					3:
						MVA8_4:=d;
					4:
						MVA8_5:=d;
					5:
						MVA8_6:=d;
					6:
						MVA8_7:=d;
					7:
						MVA8_8:=d;
					END_CASE
				END_IF
			END_IF
			master1:=master1+1;
			IF master1=8 THEN
				master1:=0;
				tNext(IN:=FALSE,PT:=T#3s);
			END_IF
		END_IF

	IF  enabl = FALSE THEN
	 	enabl := TRUE;
	END_IF
	
	IF  err <> 0 THEN
	 	enabl := FALSE;
	END_IF

END_IF
END_IF