PDA

Просмотр полной версии : ПЛК, MODBUS, Web server



webage
28.01.2015, 11:54
Добрый день, наваял не без помощи участников форума некого "Франкенштейна". Свет работает отлично, датчики воды не очень (что бы не создавать отделенную тему, электрокраны должны включаться и выключаться 2 раза в месяц, но на практики в скрипте, что-то не срабатывает, если кто-то может подсказать в чем дело буду благодарен).

Глобальная проблема в следующем. Я могу управлять светом или только с помощью физических кнопок или только из web интерфейса, т.к. состояние в котором в данный момент находится лампа не передается в web интерфейс и наоборот, если я выключаю свет через web интерфейс то на физическую кнопку нужно нажимать 2 раза, т.к. состояние лампы тоже не передается.

Посмотрите пожалуйста код и подскажите, что необходимо подкрутить.

Так-же из-за того, что проблемы с управлением, подключением и правильной обработкой событий для электрокранов, 2 я успешно спалил (как выяснилось сегодня). Данные эксперименты довольно дорого стоят, по этой причине я и обращаюсь за помощью к профессионалам.

приборист
28.01.2015, 12:48
Бегло просмотрел.
Какой смысл в таком:

CASE Kuhnja_led_STEP OF
0:
IF SWITCH_Kuhnja_led.Q THEN
DI_OU.0:=TRUE;
Kuhnja_led_STEP:=1;
END_IF
1:
IF SWITCH_Kuhnja_led.Q THEN
DI_OU.0:=FALSE;
Kuhnja_led_STEP:=0;
END_IF
END_CASE

Если нужно просто изменять состояние, то проще так:
IF SWITCH_Kuhnja_led.Q THEN
DI_OU.0:=NOT DI_OU.0;
END_IF

Про веб интерфейс - нужны файлы, чтобы понять.
Смотря что Вы оттуда пытаетесь включить.

webage
28.01.2015, 13:24
Использую https://code.google.com/p/phpmodbus/ библиотеку, а какие именно файлы нужны?

Вольд
28.01.2015, 13:51
А электрокраны по какой причине сгорели ?

webage
28.01.2015, 14:06
Бегло просмотрел.
Какой смысл в таком:


Если нужно просто изменять состояние, то проще так:
IF SWITCH_Kuhnja_led.Q THEN
DI_OU.0:=NOT DI_OU.0;
END_IF

Про веб интерфейс - нужны файлы, чтобы понять.
Смотря что Вы оттуда пытаетесь включить.

Планировалось, что на одну физическую клавишу будет повешено несколько действий - включить свет, затем вытяжку, выключить все, но из-за неудобства использования такой схемы на практики, было решено на каждый прибор поставить отдельный выключатель.

lara197a
28.01.2015, 14:13
так присвойте переменной в веб интерфесе и кнопке разные имена.
а в программе используйте их через ИЛИ.

A:=А_web OR A_knopka

webage
28.01.2015, 15:28
С первым вопросом разобрался, теперь осталось понять по какой причине не срабатывает данный код.
Sys_DateTime := Z;
GetTime (SystemTime:=Sys_Time , TimeDate:= Sys_DateTime);

IF (Sys_DateTime.Day = 1 OR Sys_DateTime.Day = 28) AND Sys_DateTime.Hour = 15 AND Sys_DateTime.Minute = 27 THEN
out3 := TRUE;
out4 := TRUE;
ELSE
out3 := FALSE;
out4 := FALSE;
END_IF;

IF (Sys_DateTime.Day = 1 OR Sys_DateTime.Day = 28) AND Sys_DateTime.Hour = 15 AND Sys_DateTime.Minute = 28 THEN
out1 := TRUE;
out2 := TRUE;
ELSE
out1 := FALSE;
out2 := FALSE;
END_IF;

приборист
28.01.2015, 16:22
В примере есть такое:
(*Текущее время*)
Sys_DateTime.Day :=0;
Sys_DateTime.DayOfWeek :=0;
Sys_DateTime.dwHighMsec :=0;
Sys_DateTime.dwLowMSecs :=0;
Sys_DateTime.Milliseconds :=0;
Sys_DateTime.Minute :=0;
Sys_DateTime.Second :=0;
Sys_DateTime.Hour :=0;
Sys_DateTime.Year :=0;
Sys_DateTime.Month :=0;
Sys_time.ulHigh :=0;
Sys_time.ulLow :=0;
GetTime (SystemTime:=Sys_Time , TimeDate:= Sys_DateTime);

Обнулять переменные надо.
Визуально в блоке GetTime видно что время не меняется.

webage
28.01.2015, 16:51
В примере есть такое:
(*Текущее время*)
Sys_DateTime.Day :=0;
Sys_DateTime.DayOfWeek :=0;
Sys_DateTime.dwHighMsec :=0;
Sys_DateTime.dwLowMSecs :=0;
Sys_DateTime.Milliseconds :=0;
Sys_DateTime.Minute :=0;
Sys_DateTime.Second :=0;
Sys_DateTime.Hour :=0;
Sys_DateTime.Year :=0;
Sys_DateTime.Month :=0;
Sys_time.ulHigh :=0;
Sys_time.ulLow :=0;
GetTime (SystemTime:=Sys_Time , TimeDate:= Sys_DateTime);

Обнулять переменные надо.
Визуально в блоке GetTime видно что время не меняется.
Это уже есть
Sys_DateTime,Z:SystemTimeDate;
GetTime:CurTimeEx;
Sys_Time: SysTime64;

приборист
28.01.2015, 17:55
Это уже есть
Sys_DateTime,Z:SystemTimeDate;
GetTime:CurTimeEx;
Sys_Time: SysTime64;

А где это:
Sys_DateTime.Day :=0;
Sys_DateTime.DayOfWeek :=0;
Sys_DateTime.dwHighMsec :=0;
Sys_DateTime.dwLowMSecs :=0;
Sys_DateTime.Milliseconds :=0;
Sys_DateTime.Minute :=0;
Sys_DateTime.Second :=0;
Sys_DateTime.Hour :=0;
Sys_DateTime.Year :=0;
Sys_DateTime.Month :=0;
Sys_time.ulHigh :=0;
Sys_time.ulLow :=0;


Я только что попробовал код в контроллере, без обнуления GetTime не меняет свои значения, с обнулением - все хорошо и код отрабатывает.

webage
28.01.2015, 18:25
А где это:
Sys_DateTime.Day :=0;
Sys_DateTime.DayOfWeek :=0;
Sys_DateTime.dwHighMsec :=0;
Sys_DateTime.dwLowMSecs :=0;
Sys_DateTime.Milliseconds :=0;
Sys_DateTime.Minute :=0;
Sys_DateTime.Second :=0;
Sys_DateTime.Hour :=0;
Sys_DateTime.Year :=0;
Sys_DateTime.Month :=0;
Sys_time.ulHigh :=0;
Sys_time.ulLow :=0;


Я только что попробовал код в контроллере, без обнуления GetTime не меняет свои значения, с обнулением - все хорошо и код отрабатывает.

Да, так работает, дальше в коде была ошибка

lomtik
22.06.2015, 22:31
webage, подскажите, каким образом реализована передача данных от modbas к web-серверу?