PDA

Просмотр полной версии : ПЛК63+RS485



uvwxyz
27.06.2012, 22:35
Уважаемые специалисты! Помогите разобраться со следующей проблемой.
ПЛК63-РРРРРР-М пытаюсь соединить с МДВВ по интерфейсу RS485. Протокол Modbus RTU. 9600N1.
Я воспользовался примерами и написал пробную программу, которая раз в 200 мс читает состояние регистра дискретных входов(0х33) МДВВ и раз в следующие 200 мс записывает это состояние в регистр дискретных выходов(0х32) МДВВ.
Но к сожалению:

1) функция
(*Открываем COM-порт*)
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
НЕ открывает порт.

2)
В разделе описания типов переменных есть строка
com_num: PORTS:=0;(*0 - RS-485, 1 - RS-232*)

При выполнении программы она подсвечивается красным цветом и добавляется надпись ***INVALID: 0***
Видимо поэтому Com-порт не открывается

Перечисление PORTS объявляется в библиотеке SysLibCom.lib в следующем виде
TYPE PORTS : (COM1:=1, COM2, COM3, COM4, COM5, COM6, COM7, COM8);
END_TYPE
Из этого следует, что переменная типа PORTS не может принимать значение 0. Тогда не понятно как я смогу работать с RS-485, ведь для этого я должен присвоить переменной com_num значение 0(Что следует из комментария к строке описания переменной ).

capzap
27.06.2012, 22:46
:) принимает же. Вот потому что в перечислении отсутствует ноль у Вас и светится красным. Но это не показатель что порт не открылся, другие симптомы есть?

uvwxyz
27.06.2012, 22:56
Симптомы есть.
COM_SERVICE1.ready при открытии порта должно принять значение TRUE, а этого не происходит. Отсюда я делаю вывод, что порт не открывается.
Кроме того, МДВВ не принимает посылки(светодиод RS-485 не мигает).

ДЕНИС74
04.07.2012, 12:33
Уважаемые специалисты!пытаюсь соединить ПЛК-63-РРРРРР-М С МДВВ-Р.Вхожу в конфигурирование плк и пытаюсь прикрепить к нему подэлемент.но это не получается.слово подэлемент есть но оно не выделено черным цветом.проект написан на LD.помогите пожалуйста.

ASo
04.07.2012, 13:31
Надо написать свою процедуру.
На LD я не стал бы это делать. На ST у меня давно реализовано - и на вход и на выход.

ДЕНИС74
04.07.2012, 15:15
Спасибо.Буду пробовать.

uvwxyz
08.07.2012, 10:11
Уважаемые специалисты! Помогите разобраться со следующей проблемой.
ПЛК63-РРРРРР-М пытаюсь соединить с МДВВ по интерфейсу RS485. Протокол Modbus RTU. 9600N1.
Я воспользовался примерами и написал пробную программу, которая читает состояние регистра дискретных входов(0х33) МДВВ и записывает это состояние в регистр дискретных выходов(0х32) МДВВ.
В прикреплённом файле prb120708_1 приведён исходный текст отлаженной работоспособной программы. Но имеется несколько вопросов и комментариев.

1. В примерах программ дан следующий фрагмент кода, открывающий порт
(*Открываем COM-порт*)
(*COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );*)
COM_SERVICE1(Enable:=TRUE , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready
THEN
port_opened:=2;
ELSE
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=CLOSE_TSK );
END_IF;

При таком коде порт у меня не открывается. Для открытия порта использую следующий фрагмент кода

COM_SERVICE1(Enable:=TRUE , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready
THEN
port_opened:=2;
END_IF;

2. Библиотечная функция COM_SERVICE1, оказывается, пытается открывать порт только при каждом сотом обращении к ней. В начале этой функции есть следующий текст
Delay := Delay + 1;
IF (Delay MOD 100) = 0 THEN ..

Этот недостаток для моего приложения не является существенным, просто система начнёт работать на 15-20 секунд позже включения питания

3. Функции
get04_modbus: MB_RD_INP_REGS; (*функция 04 - чтение параметров типа INT*)
send16_modbus: MB_WR_REGS; (*функция 16 - запись параметров*)

используются для чтения и записи параметров в MДВВ.

Но требуется 4 раза подряд обратиться к функции get04_modbus прежде получить правильный ответ, и требуется 3 раза подряд обратиться к функции send16_modbus прежде получить правильный ответ.
Это настораживает. Я подсчитал отношение числа запросов к числу правильных ответов. Это отношение оказывается постоянным, значит, эти сбои не являются случайными, а связаны с какой-то моей ошибкой. Прошу ответить тех, кто имеет какие-то соображения на этот счёт.

ivan.korolev
07.12.2012, 19:52
Но требуется 4 раза подряд обратиться к функции get04_modbus прежде получить правильный ответ, и требуется 3 раза подряд обратиться к функции send16_modbus прежде получить правильный ответ.
Правильность чтения/записи можно проверять с помощью выходного параметра Complete соответствующего функц блока.

Иван_Васильев
13.12.2024, 10:25
Добрый день, прошло 10 лет, всплыл такой же вопрос: "....При выполнении программы она подсвечивается красным цветом и добавляется надпись ***INVALID: 0***
Видимо поэтому Com-порт не открывается..."
При этом совсем недавно....... связь была. В чем дело? Пожалуйста помогите

1exan
13.12.2024, 11:37
Добрый день, прошло 10 лет, всплыл такой же вопрос: "....При выполнении программы она подсвечивается красным цветом и добавляется надпись ***INVALID: 0***
Видимо поэтому Com-порт не открывается..."
При этом совсем недавно....... связь была. В чем дело? Пожалуйста помогите

Во втором сообщении написали же: красное - потому что в перечислении "PORTS" библиотеки "SysLibCom" отсутствует значение 0 (можете кстати открыть SysLibCom и дописать его сами: 80772).
А связи может не быть по многим другим причинам, начиная от банального обрыва линии и пропадания контакта

Иван_Васильев
16.12.2024, 13:30
Добрый день, прошло 10 лет, всплыл такой же вопрос: "....При выполнении программы она подсвечивается красным цветом и добавляется надпись ***INVALID: 0***
Видимо поэтому Com-порт не открывается..."
При этом совсем недавно....... связь была. В чем дело? Пожалуйста помогите

kondor3000
16.12.2024, 13:45
Добрый день, прошло 10 лет, всплыл такой же вопрос: "....При выполнении программы она подсвечивается красным цветом и добавляется надпись ***INVALID: 0***
Видимо поэтому Com-порт не открывается..."
При этом совсем недавно....... связь была. В чем дело? Пожалуйста помогите

Даже с ошибкой ***INVALID: 0*** программа работает, выше вам уже ответили.
Если она работала и перестала, значит либо провода оборвались, либо контакт плохой, либо слейв помер.

Иван_Васильев
17.12.2024, 04:54
Уважаемые специалисты! Помогите разобраться со следующей проблемой.
ПЛК63-РРРРРР-М пытаюсь соединить с МДВВ по интерфейсу RS485. Протокол Modbus RTU. 9600N1.
Я воспользовался примерами и написал пробную программу, которая читает состояние регистра дискретных входов(0х33) МДВВ и записывает это состояние в регистр дискретных выходов(0х32) МДВВ.
В прикреплённом файле prb120708_1 приведён исходный текст отлаженной работоспособной программы. Но имеется несколько вопросов и комментариев.

1. В примерах программ дан следующий фрагмент кода, открывающий порт
(*Открываем COM-порт*)
(*COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );*)
COM_SERVICE1(Enable:=TRUE , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready
THEN
port_opened:=2;
ELSE
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=CLOSE_TSK );
END_IF;

При таком коде порт у меня не открывается. Для открытия порта использую следующий фрагмент кода

COM_SERVICE1(Enable:=TRUE , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready
THEN
port_opened:=2;
END_IF;

2. Библиотечная функция COM_SERVICE1, оказывается, пытается открывать порт только при каждом сотом обращении к ней. В начале этой функции есть следующий текст
Delay := Delay + 1;
IF (Delay MOD 100) = 0 THEN ..

Этот недостаток для моего приложения не является существенным, просто система начнёт работать на 15-20 секунд позже включения питания

3. Функции
get04_modbus: MB_RD_INP_REGS; (*функция 04 - чтение параметров типа INT*)
send16_modbus: MB_WR_REGS; (*функция 16 - запись параметров*)

используются для чтения и записи параметров в MДВВ.

Но требуется 4 раза подряд обратиться к функции get04_modbus прежде получить правильный ответ, и требуется 3 раза подряд обратиться к функции send16_modbus прежде получить правильный ответ.
Это настораживает. Я подсчитал отношение числа запросов к числу правильных ответов. Это отношение оказывается постоянным, значит, эти сбои не являются случайными, а связаны с какой-то моей ошибкой. Прошу ответить тех, кто имеет какие-то соображения на этот счёт Пожалуйста помогите

kondor3000
17.12.2024, 08:04
Берёте готовый пример с сайта, чтение через биб-ки (Modbus чтение INT и REAL (ST) и смотрите отличия в коде.
Чтение и запись надо разнести по шагам CASE.
В конце каждого шага чтения, есть проверка на выполнение операции, на ошибки и присвоение, если ошибки =0.

(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
END_IF
master1:=1; (*переходим к выполнению следующего ФБ*)
END_IF
С записью аналогично, переход, если установлен признак завершения операции.

Примеры для ПЛК63/73,
10) Обмен через библиотеки Modbus и OwenNet https://owen.ru/product/codesys_v2/example_program

Иван_Васильев
17.12.2024, 10:45
Спасибо Вам!!! Чувствую - мы уже близко)) А КАК??? Открывая библиотечный файл блокнотом - не удается его сохранить ("отказано в доступе"). Открывая в codesys это библиотечный файл - codesys запрашивает пароль. Научите пожалуйста ... как вписать это COM0:=0 ?

kondor3000
17.12.2024, 10:51
Спасибо Вам!!! Чувствую - мы уже близко)) А КАК??? ;) Открывая библиотечный файл блокнотом - не удается его сохранить ("отказано в доступе"). Открывая в codesys это библиотечный файл - codesys запрашивает пароль. Научите пожалуйста ... как вписать это COM0:=0 ?

Биб-ку надо открыть как проект и менять уже в в стуктуре проекта, потом сохранить как .Lib. Потом заменить в папке биб-ки Codesis 2.3
Отказано в доступе, значит надо зайти под админом.

Иван_Васильев
17.12.2024, 11:23
Спасибо!!!!!

Cs-Cs
17.12.2024, 11:41
Как найти этот элемент структуры TYPE PORTS ?
Надо перейти на вкладку "Типы данных" 80873

Иван_Васильев
17.12.2024, 11:57
СПАСИБО!!!!!

Safron
10.02.2025, 13:07
добрый день
Необходимо связать плк63 по нестандартному протоколу по RS485.
Как то странно ведёт сам Кодесис.
Если я ставлю порт COM4 (DEBUG) ради экксперимента, то функция SysComWrite как положено возвращает количество записанных байт и переменная count считает как надо, но только мне стоит перейти на нужный мне COM0, то Write_Com возвращает ноль...и буфер не заполняется!! Где засада может быть?
Write_Com:= SysComWrite(com_num, ADR(Tx_Buffer) , SIZEOF(Tx_Buffer), 10);
count := count + SysComWrite(com_num, ADR(Tx_Buffer) + count, SIZEOF(Tx_Buffer) - count, 10);

81899

Валенок
10.02.2025, 14:58
Непонятно как можно заполнить буфер если Write?
Зачем 2 раза подряд?

Safron
10.02.2025, 15:37
Согласен. Не зачем два раза заполнять. Это я чисто для проверки увидеть ,что возвращает функция write. Изначально этой строки не было.