
Сообщение от
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