Цитата Сообщение от capzap Посмотреть сообщение
По аналогии нужно смотреть, если панель общается с плк по периодичному опросу, то зачем заставлять плк работать по команде а не по времени?
Команда на отправку данных ПЛК выдается с определенным периодом. По сути, никакой разницы нет. Т.е. можно считать, что передача работает по времени, просто это реализуется программным путем.

Цитата Сообщение от krollcbas Посмотреть сообщение
Ангелина, всегда в подобных ситуациях стоит обращать внимание на детали.
Например:
Как проложен кабель?
Какая марка кабеля?
Метраж?
Как обжат?

Стоит вынести ПЛК временно из того места где он стоит и соединить с чем-то еще, например Modbus Pool или какой-то другой OPC.
Возникает ощущение, что опрос идет с большим количеством ошибок. Драйвер ПЛК уверен имеет какой-то лимит на "неответы"
Попробуйте для выяснения причины что-то менять местами, вычленять проблему.
Проект стоит выложить, приложить скрин с ПЛК браузер о сетевых соединениях.

Чтобы устранить причину ее надо сначала найти.
Конфигурация ПЛК:
1.PNG
2.PNG
3.PNG

Листинг программы (ConnectAndSend) (часть программы, отвечающая за отправку данных):
Код:
(* Минимальное время цикла ПЛК 10 мс *)

TimConnect := TimConnect + 1;

CASE ConnectCykl OF
	0:
		IF (MMDDFromArch <> 0) OR (HHMMFromArch <> 0) THEN
			TimConnect := 0;
			ConnectCykl := 1;
		END_IF

	1:
		(* Вырезала кусок кода. Заполнение массива на отправку. *)

		RStart := 255;
		StrO_u:=255;
		MLerr:=0;
		TimConnect:=0;
		ConnectCykl:=2;

	2:
		IF (TimConnect >= 1300) THEN
			ptw := ADR(StrI);
			ptw^ := 65535;
			RStart := 255;
			StrI_u := 255;
			MLerr:=0;
			StrIDone := FALSE;
			ConnectCykl:= 3;
			TimConnect	:=	0;
		END_IF

	3:
		IF NOT(StrIDone) THEN
			ptw := ADR(StrI);
			IF (ptw^ <> 65535)  THEN
				StrIDone := TRUE;
			END_IF
		END_IF

		IF (StrIDone) THEN
			ConnectCykl:= 4;
			TimConnect	:=	0;
		ELSE
			IF  (TimConnect >= 1000) THEN
				ConnectCykl := 0;
				TimConnect	:=	0;
			END_IF
		 END_IF

	4:
		IF (TimConnect >= 100) THEN
			ConnectCykl	:=	5;
			TimConnect	:=	0;
		END_IF

	5:
		ptwi := ADR(StrI) + 16;
		IF (idSent = ptwi^) THEN
			ptwi := ADR(StrI) + 6;
			IF (ptwi^ > 0) THEN
				IF (ptwi^ > (cur_hour * 100 + cur_min)) THEN
					IF ((ptwi^ - (cur_hour * 100 + cur_min)) > 2) THEN
						ptwi := ADR(StrI);
						Par1 := ptwi^;
						ptwi := ptwi + 2;
						Par2 := ptwi^;
						ptwi := ptwi + 2;
						Par3 := ptwi^;
						ptwi := ptwi + 2;
						Par4 := 30;
						Par5 := ptwi^ / 100;
						Par6 := ptwi^ MOD 100;
						SetDateTime();
					END_IF
					IF (((cur_hour * 100 + cur_min) - ptwi^) > 2) THEN
						ptwi := ADR(StrI);
						Par1 := ptwi^;
						ptwi := ptwi + 2;
						Par2 := ptwi^;
						ptwi := ptwi + 2;
						Par3 := ptwi^;
						ptwi := ptwi+2;
						Par4 := 30;
						Par5 := ptwi^ / 100;
						Par6 := ptwi^ MOD 100;
						SetDateTime();
					END_IF
				END_IF
			END_IF
			ConnectCykl:=6;
			TimConnect:=0;
		ELSE
			ConnectCykl := 7;
			TimConnect	:=	0;
		END_IF

	6:
		MMDDFromArch := 0;
		HHMMFromArch := 0;
		(* Вырезала кусок кода. Обнуление массива на отправку. *)
		ConnectCykl := 7;
		TimConnect	:=	0;

	7:
		IF (TimConnect >= 100) THEN
			ConnectCykl := 0;
			TimConnect := 0;
		END_IF

END_CASE