Вот кусок из рабочего проекта для ПЛК73. Вкраце что тут происходит...
Два устройства поочередно опрашиваются по 232 и 485. Тут только кусок от 485 оставил. Опрашиваются они через равные промежутки времени!!! Интервал опроса задается в переменной tMessInterval. Как только коммуникационный ФБ выдает COMPLETE по триггеру отключается флаг enableRsSend и коммуникационный ФБ отключается!!! Как только таймер отсчитает tMessInterval и enableRsSend отключен, смениться шаг в цикле CASE и отключится таймер (чтобы заново стал считать) и так по кругу.
Еще следует помнить что в библиотеке модбаса есть ошибка из-за которой через пачку в порт мусор идет. Для ее починки следует сделать следующееКод:(*ТАЙМЕР СМЕНЫ ШАГОВ КОММУНИКАЦИИ*) tmrStepRs(IN:= com_ready1 AND com_ready2, PT:= tMessInterval); (*как только открылись оба порта запускаем отсчет шагов опроса*) (*ОТПРАВКА И ЧТЕНИЕ КОМАНД RS232 и RS485*) IF (com_ready1 = TRUE AND com_ready2 = TRUE)THEN CASE stepRs OF 1: бла бла бла 2: (*ПЕРЕДАЧА ЧАСТОТЫ ПЧВ*) send1_modbus( Enable := enableRsSend, Mode := MB_RTU, DevAddr := 2, RegAddr := 50009, (*РЕГИСТР ЗАДАНИЯ ПО ИНТЕРФЕЙСУ*) Value := freq1, (*ЧАСТОТА*) ComHandle := Settings1.Port, TimeOut := tWorkBlock, Complete => cmpl3, Exception => err3 ); rt_step_2(CLK:= cmpl3); (*По завершению работы ФБ включаем триггер*) IF rt_step_2.Q THEN enableRsSend := FALSE; END_IF (*Если завершили отключаем работу ФБ*) IF tmrStepRs.Q AND enableRsSend = FALSE THEN (*Как только досчитал таймер смены шага и блок отправки уже отработал*) stepRs := 3; (*Меняем шаг*) tmrStepRs(IN:= FALSE); (*Отключаем таймер*) IF enableRsSend = FALSE THEN enableRsSend := TRUE; END_IF (*Ставим флаг для запуска следующего блока*) END_IF 3: (*ОТПРАВКА КОМАНДНОГО СЛОВА*) IF freq < 0.09 THEN (*если частота ниже 1Hz то двигатель отключен*) pcv_com_word := 1268; (*двигатель отключен (торможение с выбегом)*) IF v1 < 2500 THEN pcv_com_word := 1212; (*если скорость ниже 25м/c то используем быструю остановку*) END_IF ELSE pcv_com_word := 1148 ; (*запуск двигателя*) END_IF send1_modbus( Enable := enableRsSend, Mode := MB_RTU, DevAddr := 2, RegAddr := 49999, (*РЕГИСТР КОМАНДНОГО СЛОВА ПРИВОДА*) Value := pcv_com_word, (*КОМАНДНОЕ СЛОВО*) ComHandle := Settings1.Port, TimeOut := tWorkBlock, Complete => cmpl4, Exception => err4 ); rt_step_3(CLK:= cmpl4); IF rt_step_3.Q THEN enableRsSend := FALSE; END_IF IF tmrStepRs.Q AND enableRsSend = FALSE THEN stepRs := 4; tmrStepRs(IN:= FALSE); IF enableRsSend = FALSE THEN enableRsSend := TRUE; END_IF END_IF 4: (*ЗАПРОС СОСТОЯНИЯ ЭЛЕКТРОДВИГАТЕЛЯ*) get3_modbus( Enable := enableRsSend, Mode := MB_RTU, DevAddr := 2, FirstAddr := 50199, (*РЕГИСТР СЛОВА СОСТ. ПРИВОДА*) Quantity := 1, ComHandle := Settings1.Port, TimeOut := tWorkBlock, Buffer := buffer1, Complete => cmpl5, Exception => err5, ByteCnt => dataSize1 ); rt_step_4(CLK:= cmpl5); IF rt_step_4.Q THEN IF err5 = 0 THEN pcv_state_word := BYTE_TO_WORD(buffer1[1]) OR SHL (BYTE_TO_WORD(buffer1[0]),8); END_IF enableRsSend := FALSE; END_IF IF tmrStepRs.Q AND enableRsSend = FALSE THEN stepRs := 1; tmrStepRs(IN := FALSE); IF enableRsSend = FALSE THEN enableRsSend := TRUE; END_IF END_IF END_CASE
Код:(* В БИБЛИОТЕКЕ OWEN MODBUS.LIB В ФБ MB_UNI_IO ЗАМЕНЯЕМ СТРОКУ 7 НА WHILE SysComRead(ComHandle, ADR(DataBuf)+DataSize, SIZEOF(DataBuf)-DataSize, 0) <> 0 DO; инче в случае получения ошибки таймаута FF в след пачке пойдем мусор. Также для скорости 9600 необходимо установить значение таймера T_FRTU = ~5ms *)




Ответить с цитированием