Здравствуйте. Вышлите Ваш проект на ПЛК, сделаю примерчик на иридиуме.
Вид для печати
Здравствуйте. Вышлите Ваш проект на ПЛК, сделаю примерчик на иридиуме.
В Codesys создается modbus slave с необходимыми переменными(например 8bits для 8-ми bool переменных-входов или выходов типа реле).
В iridium создается драйвер modbus tcp:
- в драйвере прописываете ip контроллера(порт оставляй 502)
- в графе Commands создаешь команды для посылки на контроллер(device id - номер slavr переменной -1, adress номер бита от 0 до 7).
- в графе Feedback прописывается аналогично commands, но для тех переменных значения которых должны возвращаться в iridium из ПЛК.
Насчет увязки переменных с входами я решал эту проблему присвоением значений промежуточных slave переменных входам/выходам по маске.
Если интересно кинь свой проект в codesys я под него помогу прописать переменные в iridium.
p.s. 1.входа опрашивай обязательно по маске ибо при обращении к стандартным входам очень тормозит их опрос.
2. обязательно проверь настройки роутера(приоритет на 502 порт. я например долго мучился с запаздыванием или потерей команд от iridium к плк.
Подскажите, что значит опрашивать по маске?
У меня сейчас как раз возникла проблема, что при нажатии на кнопку в иридиуме пауза между срабатыванием ПЛК около 5 секунд.
Может кто еще подскажет в чем косяк, есть следующий код, но он работает только когда запросы идут по Modbus, а если обращаешься напрямую к дискретным входам нет реакции:
Настройки ПЛККод:PROGRAM PLC_PRG
VAR_OUTPUT
off_all:BOOL;
off_kitchen_dining_room:BOOL;
END_VAR
VAR
HALLWAY_STEP: BYTE;
BEDROOM_STEP: BYTE;
KITCHEN_STEP: BYTE;
DINING_ROOM_STEP: BYTE;
NURSERY_STEP: BYTE;
SWITCH_HALLWAY: R_TRIG;
SWITCH_BEDROOM: R_TRIG;
SWITCH_KITCHEN: R_TRIG;
SWITCH_DINING_ROOM: R_TRIG;
SWITCH_NURSERY: R_TRIG;
TON_ALL: TON;
TON_KITCHEN_DINING_ROOM: TON;
pt: TIME := t#3s;
END_VAR
___________________________________________________
TON_ALL(IN:=input_1 , PT:=pt , Q=> , ET=> );
TON_KITCHEN_DINING_ROOM(IN:=input_4 , PT:=pt , Q=> , ET=> );
SWITCH_HALLWAY(CLK:=input_1 , Q=> );
SWITCH_BEDROOM(CLK:=input_2 , Q=> );
SWITCH_KITCHEN(CLK:=input_3 , Q=> );
SWITCH_DINING_ROOM(CLK:=input_4 , Q=> );
SWITCH_NURSERY(CLK:=input_5 , Q=> );
CASE HALLWAY_STEP OF
0:
IF SWITCH_HALLWAY.Q THEN
output_1:=TRUE;
HALLWAY_STEP:=1;
END_IF
1:
IF SWITCH_HALLWAY.Q THEN
output_1:=FALSE;
HALLWAY_STEP:=0;
END_IF
END_CASE
CASE BEDROOM_STEP OF
0:
IF SWITCH_BEDROOM.Q THEN
output_2:=TRUE;
BEDROOM_STEP:=1;
END_IF
1:
IF SWITCH_BEDROOM.Q THEN
output_2:=FALSE;
BEDROOM_STEP:=0;
END_IF
END_CASE
CASE KITCHEN_STEP OF
0:
IF SWITCH_KITCHEN.Q THEN
output_3:=TRUE;
KITCHEN_STEP:=1;
END_IF
1:
IF SWITCH_KITCHEN.Q THEN
output_3:=FALSE;
KITCHEN_STEP:=0;
END_IF
END_CASE
CASE DINING_ROOM_STEP OF
0:
IF SWITCH_DINING_ROOM.Q THEN
output_4:=TRUE;
DINING_ROOM_STEP:=1;
END_IF
1:
IF SWITCH_DINING_ROOM.Q THEN
output_4:=FALSE;
DINING_ROOM_STEP:=0;
END_IF
END_CASE
CASE NURSERY_STEP OF
0:
IF SWITCH_NURSERY.Q THEN
output_5:=TRUE;
NURSERY_STEP:=1;
END_IF
1:
IF SWITCH_NURSERY.Q THEN
output_5:=FALSE;
NURSERY_STEP:=0;
END_IF
END_CASE
(*Âûêëþ÷åíèå ñâåòà âî âñåé êâàðòèðå*)
off_all:=TON_ALL.Q;
IF off_all THEN
output_1:=FALSE;
HALLWAY_STEP:=0;
output_2:=FALSE;
BEDROOM_STEP:=0;
output_3:=FALSE;
KITCHEN_STEP:=0;
output_4:=FALSE;
DINING_ROOM_STEP:=0;
output_5:=FALSE;
NURSERY_STEP:=0;
END_IF
(*Âûêëþ÷åíèå ñâåòà â êóõíå-ñòîëîâîé*)
off_kitchen_dining_room:=TON_KITCHEN_DINING_ROOM.Q;
IF off_kitchen_dining_room THEN
output_3:=FALSE;
KITCHEN_STEP:=0;
output_4:=FALSE;
DINING_ROOM_STEP:=0;
END_IF
output_1:=ir_input_1;
output_2:=ir_input_2;
output_3:=ir_input_3;
output_4:=ir_input_4;
output_5:=ir_input_5;
Вложение 11312
В твоем случае опрос по маске может и не нужен, это имеет смысл при подключенных модулях ввода/вывода(МДВВ, МВ11х...)
Его смысл не побитно считывать переменные(input_1, input_2...), а вместо этого считать один раз байт с 8-ю битами входов.
Как это сделать?!
Необходимо ветке с входами присвоить переменную "PLCinp" типа BYTE и обращаться ко входам следующим образом:
для твоего input_1 соответственно PLCinp.0,
input_8 соответственно PLCinp.7.
такая схема существенно ускоряет опрос. Но это при работе с модулями Ввода/Вывода.
На мой взгляд немного сложновато происходит обработка нажатий.
Например вместо:
CASE HALLWAY_STEP OF
0:
IF SWITCH_HALLWAY.Q THEN
output_1:=TRUE;
HALLWAY_STEP:=1;
END_IF
1:
IF SWITCH_HALLWAY.Q THEN
output_1:=FALSE;
HALLWAY_STEP:=0;
END_IF
END_CASE
Предлагаю такой вариант:
SWITCH_HALLWAY(CLK:=PLCInp.0 , Q=> );
ir_input_1:= ir_input_1 XOR SWITCH_HALLWAY.Q;
По поводу задержки срабатывания. Проверь устанавливается ли соединение Иридиум с ПЛК. это можно сделать индикацией токена Online в параметрах ModbusTCP->driver token. проблема может быть в роутере сети.
По поводу отсутствия реакции на замыкания входов.
Этот код
output_1:=ir_input_1;
output_2:=ir_input_2;
output_3:=ir_input_3;
output_4:=ir_input_4;
output_5:=ir_input_5;
Делает следующее. При любых присвоениях переменным output_ в течение цикла, в его конце ПЛК присвоит им значения ir_input_
Чтобы это избежать лучше в течении цикла менять промежуточные переменные ir_input_, а в конце так и оставить присвоение промеж. переменной на выход ПЛК.
p.s. НЕ ПРЕТЕНДУЮ НА АБСОЛЮТНУЮ ПРАВИЛЬНОСТЬ СВОИХ ПРЕДЛОЖЕНИЙ, НО У МЕНЯ ЭТО ВСЕ РАБОТАЕТ.