У меня используется одно реле.
Просто значение ему присваивается в 2х местах.
Одна из веток будет активна, когда температура внутри реактора выше уставки,
вторая, когда температура внутри реактора ниже уставки.
Точно, не внимателен был.
Еще раз благодарю за помощь!
Скажите пожалуйста, как в языке LD вызывается функция? С ФБ все ясно, создал, добавил через команду "Вставить->Функциональный блок". А с функцией как? В мануале вообще как-то непонятно написано
Скажите пожалуйста, как в языке LD вызывается функция? С ФБ все ясно, создал, добавил через команду "Вставить->Функциональный блок". А с функцией как? В мануале вообще как-то непонятно написано
А какая разница?
Берете элемент с EN и вставляете, а там хоть функция, хоть ФБ.
Есть еще вариант: на выходе ПИД-регулятора установить конструкцию Вложение 33098
Плюс мы рекомендуем использовать ПИД-регуляторы библиотек нашей разработки.
Библиотеки доступны по ссылке
В зависимости от Вашего контроллера выберите библиотеку:
Библиотека PID_Reg2.lib поддержана только в ПЛК63/73.
Библиотека PID_Regulators.lib поддержана только в ПЛК1хх (в т.ч. ПЛК110 [M02]).
ФБ этих библиотек не работают в режиме отладки, но зарекомендовали себя лучше, чем стандартный ПИД-регулятор библиотеки Util, который Вы используете в своем проекте.
Доброго времени суток!
Вот, использовал Ваш каскад на выходе и применил ПИД из рекомендованной библиотеки. Вроде не ругается. На неделе попробую вживую прогнать ПЛК73 на экспериментальном реакторе. Вложение 33162
Контроллер ПЛК150 + панель СП307. Почему при использовании обмена по RS485 в основной программе, перестает идти опрос устройств ModBus в Конфигурации ПЛК? Как правильно программно опрашивать панель, так что бы не прекращался обмен с ней в Конфигурации ПЛК?
IF POINT_FLAG THEN
IF GET_POINT() THEN POINT_FLAG:=FALSE;END_IF
END_IF
функция GET_POINT() считывает таблицу данных из панели по ModBus и после этого прекращается обмен в конфигурации ПЛК, все переменные объявлены как глобальные, потому что если объявляю их в функции, то не считывает таблицу.
Код функции GET_POINT:
(*t_voz:=WORD_TO_INT(RS_TMP2);*)
t:=t+1;
IF (t MOD 1000)=0 THEN
A := A + 1;
IF A > 9999 THEN
A := 0;
END_IF
END_IF
(*Устанавливаем настройки COM-порта*)
IF port_opened=0 THEN
Settings.Port:=com_num; (*номер COM-порта*)
Settings.dwBaudRate:=38400; (*скорость*)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=1;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF
COM_SERVICE11(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE11.ready THEN
port_opened:=2;
END_IF
IF port_opened=2 THEN (*Удачно проинициализировали*)
(* функция 03 инт - ФБ считывает значение параметра типа int из прибора с адресом 2 в регистр с номером 8 по протоколу Modbus-ASCII*)
enabl:=1;
get1_modbus(
Enable:=enabl , (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=2 , (*адрес*)
FirstAddr:=10400 , (*номер регистра*)
Quantity:=10, (*количество регистров*)
ComHandle:=Settings.Port , (*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
cnt:=0;
WHILE cnt<5 DO
V1_POINT[cnt] := BYTE_TO_WORD(BUFFER[2*cnt+1]) OR SHL(BYTE_TO_WORD(BUFFER[2*cnt]),8);
cnt:=cnt+1;
END_WHILE
cnt:=0;
WHILE cnt<5 DO
V2_POINT[cnt] := BYTE_TO_WORD(BUFFER[2*cnt+11]) OR SHL(BYTE_TO_WORD(BUFFER[2*cnt+10]),8);
cnt:=cnt+1;
END_WHILE
IF POINT_FLAG THEN
IF GET_POINT() THEN POINT_FLAG:=FALSE;END_IF
END_IF
функция GET_POINT() считывает таблицу данных из панели по ModBus и после этого прекращается обмен в конфигурации ПЛК, все переменные объявлены как глобальные, потому что если объявляю их в функции, то не считывает таблицу.
Код функции GET_POINT:
(*t_voz:=WORD_TO_INT(RS_TMP2);*)
t:=t+1;
IF (t MOD 1000)=0 THEN
A := A + 1;
IF A > 9999 THEN
A := 0;
END_IF
END_IF
(*Устанавливаем настройки COM-порта*)
IF port_opened=0 THEN
Settings.Port:=com_num; (*номер COM-порта*)
Settings.dwBaudRate:=38400; (*скорость*)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=1;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF
COM_SERVICE11(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE11.ready THEN
port_opened:=2;
END_IF
IF port_opened=2 THEN (*Удачно проинициализировали*)
(* функция 03 инт - ФБ считывает значение параметра типа int из прибора с адресом 2 в регистр с номером 8 по протоколу Modbus-ASCII*)
enabl:=1;
get1_modbus(
Enable:=enabl , (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=2 , (*адрес*)
FirstAddr:=10400 , (*номер регистра*)
Quantity:=10, (*количество регистров*)
ComHandle:=Settings.Port , (*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
cnt:=0;
WHILE cnt<5 DO
V1_POINT[cnt] := BYTE_TO_WORD(BUFFER[2*cnt+1]) OR SHL(BYTE_TO_WORD(BUFFER[2*cnt]),8);
cnt:=cnt+1;
END_WHILE
cnt:=0;
WHILE cnt<5 DO
V2_POINT[cnt] := BYTE_TO_WORD(BUFFER[2*cnt+11]) OR SHL(BYTE_TO_WORD(BUFFER[2*cnt+10]),8);
cnt:=cnt+1;
END_WHILE
Контроллер ПЛК150 + панель СП307. Почему при использовании обмена по RS485 в основной программе, перестает идти опрос устройств ModBus в Конфигурации ПЛК? Как правильно программно опрашивать панель, так что бы не прекращался обмен с ней в Конфигурации ПЛК?
Это не совсем верный подход.
Какую задачу Вы решаете таким образом?
Опишите, пожалуйста, подумаем как решить.
Продолжим издеваться, не приходило в голову что два мастера в сети ( конфигуратор и библиотечный) быть не должно?
В сети один мастер - ПЛК. А то что в программе при открытии порта "ручками" затыкается автоматический обмен это не значит что мастера в сети 2, а скорее всего что такое использование не предусмотрено, а как запустить автоматический обмен после того как он заткнулся - я не знать)
Сообщение от Осинский Алексей
Это не совсем верный подход.
Какую задачу Вы решаете таким образом?
Опишите, пожалуйста, подумаем как решить.
В панели помимо переменных которые нужно считывать постоянно как это делает конфигуратор, есть еще большая таблица в ПЗУ(массив регистров PFW), которую нужно считывать очень редко (при загрузке, либо когда ее изменили в процессе работы). Даже один процесс задания переменных в количестве 50-100шт не очень прельщает. Может можно как то считать в массив в конфигураторе?