Страница 1 из 8 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 73

Тема: ПЛК 154 + ModBus проблема

  1. #1

    По умолчанию ПЛК 154 + ModBus проблема

    При добавления в конфигурацию модуля ModBus проект компилируется, но после зашивки контроллера и подключении онлайн выдает ошибку.Контроллер в режиме слейв не отвечает, в режиме мастер не спрашивает !!??
    Результат. Не могу связать плк с ип 320.

    PLCInfo
    PLC model MODEL PLC 154
    Binary VERSION 2.10.4
    Need Target version 2.10
    Compiled: 10:57:13 Apr 14 2009
    MAC 6A:77:00:20:C0:8A
    IP 192.168.1.1
    GATE 10.0.6.1
    MASK 255.255.255.0
    PIC upper version is 07
    Licence unlimited
    Current DAC
    PIC lower version is 0a
    Изображения Изображения

  2. #2

    По умолчанию

    а форум почитать???
    вставьте кабель для панели. перезагрузите плк.

  3. #3

    По умолчанию

    Форум читал. Если не увидел чего, прошу прощения!
    Контроллер перезагружал неоднократно!
    Не понятен коментарий!!!
    "вставьте кабель для панели. перезагрузите плк."
    вместо панели начал исспользовать программу для мониторига Modbus с компьютера.
    Что означает эта ошибка?

    После серии эксперементов и перепрошивки плк на версию 2.10.5, определил, что проблема с портом debug rs 232 и не только по modbus, а и по овен !!!!
    Последний раз редактировалось Леонид; 02.11.2010 в 14:47.

  4. #4

    По умолчанию

    Эээх...
    Порт Debug 232 работает в двух режимах:
    1. Для программирования ПЛК.
    2. Как порт для обмена ПЛК с кем то.

    Режим работы порта определяется при включении питания ПЛК - типом кабеля, который вставлен в вышеуказанны разъем.
    Это даже в документации написано...

  5. #5

    По умолчанию

    Разобрался с портом Debug-RS232 !!!
    Спасибо за подсказку !!!
    Документацию прочитал, но про то что выбор протокола происходи при включении ПЛК не нашел!
    Так что теперь для эксперементов подключил ИП 320 обычным кабелем "с перемычкой" для зашивки и все "ОК" .
    Только при одинаковых настройках скорости обмена, по rs232 как то чуть-чуть медленнее обновляются данные, чем по rs485, но это лирика

  6. #6
    Пользователь Аватар для Пьер
    Регистрация
    26.01.2011
    Адрес
    Земля
    Сообщений
    518

    По умолчанию Modbus.lib

    С помощью б. Modbus.lib пытаюсь соединить
    ПЛК 100 с платой управления от стороннего прибора.
    Сразу скажу, Эта плата очень хорошо работает ОРС сервером мастер скада.
    У меня получилось вкл/выкл. Но считать состояния битов не могу
    Скрытый текст:

    PROGRAM PLC_PRG
    VAR
    RHR: MB_RD_HOLD_REGS; (*функция 03 - чтение параметра типа INT*)
    RIR:MB_RD_INPUTS; (*функция 02 - чтение статуса дискр вх.*)
    WrR: MB_WR_SNG_REG; (*функция 6 - запись еденичного регистра*)
    WrCoil: MB_WR_SNG_COIL; (*функция 5 - запись еденичного дискр вх. бита*)

    Buffer1: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
    Buffer2: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
    Buffer3: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
    Buffer4: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)



    cmpl: BOOL; (*признак завершенности работы функции*)
    port_opened: BYTE := 0; (*результат открытия порта*)
    Settings:COMSETTINGS; (* настройки последовательного порта *)
    com_num: PORTS:=0; (*0 - 485-1
    1 - 232 - COM1
    2 - 485-2 - COM2
    4 - DBGU - COM4 *)


    enable: BOOL; (*состояние работы блока*)
    err: INT; (*номер ошибки*)
    TimeOut: TIME:=T#500ms; (*таймаут*)
    DataSize: WORD; (*кол-во считанных байтов *)
    ptr_byte:POINTER TO BYTE; (*указатель на тип byte*)
    COM_SERVICE1: COM_SERVICE;
    state: WORD := 0; (*состояние*)

    END_VAR

    -----------------------------------------------------------------------------------------------------------------
    (*Устанавливаем настройки COM-порта*)
    IF port_opened=0 THEN
    Settings.Port:=com_num; (*номер COM-порта RS485*)
    Settings.dwBaudRate:=9600; (*скорость*)
    Settings.byParity:=0;
    Settings.dwTimeout:=0;
    Settings.byStopBits:=0;
    Settings.dwBufferSize:=0;
    Settings.dwScan:=0;
    END_IF

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


    RIR(
    Enable:=enable , (* разрешение работы блока *)
    Mode:=MB_RTU , (*режим передачи*)
    DevAddr:=1 , (*адрес №1 *)
    FirstAddr:=0 , (*номер регистра*)
    Quantity:=31 , (*количество регистров*)
    ComHandle:=Settings.Port , (*номер COM-порта*)
    TimeOut:=TimeOut , (*Таймаут *)
    Buffer:=Buffer1 , (* буфер данных *)
    Complete=>cmpl , (* признак завершения операции *)
    Exception=>err , (* регистр ошибок Исключения протокола MODBUS или ошибки:0x00 – ошибок или исключений не обнаружено, 0xFE – аппаратная ошибка ПЛК,0xFF – ошибка таймаута *)
    ByteCnt=>DataSize ); (*кол-во считанных байтов *)

    ссылка к документу на плату док
    Пробовал считывать разными функциями.
    По документу на плату мне надо считать POWER 0x00 Вентилятор вкл выкл R/W - записать функцией 05 получилось, но считать не могу. Буффер считывания в одном состоянии всегда, чтобы я там не записывал.
    Мне надо считать состояние битов POWER(вентилятор), COOL(насос), впускной клапан, сливной клапан.
    Скрытый текст:

    Адрес Описание 1 0 Чтение / запись Примечание
    0x00 Вентилятор вкл выкл R/W
    0x01 Насос вкл выкл R/W
    0x02 Свободно
    0x03 Свободно
    0x04 Свободно
    0x05 Свободно
    0x06 Свободно
    0x07 Свободно
    0x08 Свободно
    0x09 Сливной клапан откр закр R/W
    0x0a Свободно
    0x0b Свободно
    0x0c Свободно
    0x0d Свободно
    0x0e SWING вкл закр R/W
    0x0f Свободно
    0x10 Медленное заполнение наличие отсутствие R
    0x11 Переполнение наличие отсутствие R
    0x12 Свободно
    0x13 Свободно
    0x14 Медленный слив наличие отсутствие R
    0x15 Свободно
    0x16 Свободно
    0x17 Свободно
    0x18 Свободно
    0x19 Впускной клапан Откр Закр R
    0x1a Сливной клапан открыт Откр закр R
    0x1b Свободно
    0x1c Ошибка вентилятора R
    0x1d Низкий уровень наличие отсутствие R
    0x1e Средний уровень наличие отсутствие R
    0x1f Верхний уровень наличие отсутствие R


    Скидываю фотки мастер скады ОРС. Там все считывается и записывается без проблем.
    Изображения Изображения
    • Тип файла: png 01.PNG (301.0 Кб, Просмотров: 8)
    • Тип файла: png 02.PNG (275.3 Кб, Просмотров: 6)
    • Тип файла: png 03.PNG (332.3 Кб, Просмотров: 5)
    • Тип файла: png 04.PNG (412.9 Кб, Просмотров: 4)
    • Тип файла: png 05.PNG (259.7 Кб, Просмотров: 5)
    Не зная броду, не суйся в воду. (Пословица.)
    Век живи, век учись(а умрешь дураком).
    Опыт растет прямо пропорционально выведенному из строя оборудованию.

  7. #7

    По умолчанию

    В биб-ке вы используете WrCoil: MB_WR_SNG_COIL; (*функция 5 - запись еденичного дискр вх. бита*)
    то есть бит записываете, а где чтение бита функцией 0х01 ?
    На вашем месте я бы начал с конфигурации и разобрался чем чтение, запись битов отличается от чтения, записи регистров.
    И сколько надо прочитать регистров, в которых 32 бита ( и зачем вы читаете 31 регистр?)
    Как разложить регистр на биты и из битов собрать регистр.
    Последний раз редактировалось kondor3000; 05.10.2022 в 01:20.

  8. #8
    Пользователь Аватар для Пьер
    Регистрация
    26.01.2011
    Адрес
    Земля
    Сообщений
    518

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    В биб-ке вы используете WrCoil: MB_WR_SNG_COIL; (*функция 5 - запись еденичного дискр вх. бита*)
    то есть бит записываете, а где чтение бита функцией 0х01 ?
    На вашем месте я бы начал с конфигурации и разобрался чем чтение, запись битов отличается от чтения, записи регистров.
    И сколько надо прочитать регистров, в которых 32 бита ( и зачем вы читаете 31 регистр?)
    Как разложить регистр на биты и из битов собрать регистр.
    Бит я читаю фун-ей 01, но суть в том что что значения в буфере не изменяются вообще . Записываю бит ф-ей 05 . Т.е. как записал, потом считываю 01. При записи меняю ноль на единицу и наоборот. А когда считываю буфер, то он в одном положении, значения не изменяются.
    Не зная броду, не суйся в воду. (Пословица.)
    Век живи, век учись(а умрешь дураком).
    Опыт растет прямо пропорционально выведенному из строя оборудованию.

  9. #9
    Пользователь Аватар для Пьер
    Регистрация
    26.01.2011
    Адрес
    Земля
    Сообщений
    518

    По умолчанию

    Блок из программы
    Скрытый текст:


    Это чтение не работает. Т.е. я считываю наличие воды, есть вода или нет, в буфере всегда одно и тоже при чтении.

    RIRs( (*Чтение содержания входных регистров (0x04) Read Input Registers*)
    Enable:=enable3 , (*вручную включаю на 1 сек., чтобы отправить данные rr1 и rr2*)
    Mode:=MB_RTU ,
    DevAddr:=1 ,
    FirstAddr:=rr1 , (*Задаю 29 адрес*)
    Quantity:=rr2 , (*Всего 1 регистр*)
    ComHandle:=Settings.Port ,
    TimeOut:=TimeOut ,
    Buffer:=Buffer1 , (*в буфере , в массиве, [1, 4, 0, ,29, 0, 1, 161, 204], значение массива [5] меняется и равно значению rr2, а значение [4] всегда 0*)
    Complete=>cmpl ,
    Exception=>err ,
    ByteCnt=>DataSize );
    Прилагаю фото, что через орс сервер мастер скады у меня читает этот регистр. В нем информация 1 или 0.





    По другим блокам:
    Скрытый текст:


    Здесь включаю вентилятор. Этой командой вентилятор включается. АДрес 0. Выкладываю картинку из мастер скады. в ней все работает.
    WrCoil(
    Enable:=enable2 ,
    Mode:=MB_RTU ,
    DevAddr:=1 ,
    CoilAddr:=V2 , (*адрес 0*)
    Value:=Sh_1 ,
    ComHandle:=Settings.Port ,
    TimeOut:=TimeOut ,
    Complete=>cmpl ,
    Exception=>err );

    но считать этот coil я не могу
    RCoils( (*Чтение статуса дискретных выходов (0x01) Read Coils*)
    Enable:=enable ,
    Mode:=MB_RTU ,
    DevAddr:=1 ,
    FirstAddr:=rc1 , (*Задаю адрес 0*)
    Quantity:=rc2 , (*количество 1*)
    ComHandle:=Settings.Port ,
    TimeOut:=TimeOut ,
    Buffer:=Buffer1 ,
    Complete=>cmpl ,
    Exception=>err ,
    ByteCnt=>DataSize );


    Такая же с регистром данных, где частота.

    Скрытый текст:

    Задать могу.
    WrR(
    Enable:=enable4 ,
    Mode:=MB_RTU ,
    DevAddr:=1 ,
    RegAddr:=reg1 ,(*Здесь задаю регистр 3 *)
    Value:=ch1 ,(*значение частоты*)
    ComHandle:=Settings.Port ,
    TimeOut:=TimeOut ,
    Complete=>cmpl ,
    Exception=>err );

    Считать никак не получается
    В массиве значение не меняется в зависимости от заданной и записанной частоты
    RHR( (*Чтение содержания регистров (0x03) Read Holding Registers *)
    Enable:=enable5 ,
    Mode:=MB_RTU ,
    DevAddr:=1 ,
    FirstAddr:=3 ,
    Quantity:=1 ,
    ComHandle:=Settings.Port ,
    TimeOut:=TimeOut ,
    Buffer:=Buffer2 ,
    Complete=>cmpl ,
    Exception=>err ,
    ByteCnt=>DataSize );


    И программа сама, все enable задаю вручную.
    Скрытый текст:

    PROGRAM PLC_PRG
    VAR
    RHR: MB_RD_HOLD_REGS; (*ôóíêöèÿ 03 - ÷òåíèå ïàðàìåòð&# 224; òèïà INT*)
    RIR:MB_RD_INPUTS; (*ôóíêöèÿ 02 - ÷òåíèå ñòàòóñà äèñêð âõ.*)
    RCoils:MB_RD_COILS;
    WrR: MB_WR_SNG_REG; (*ôóíêöèÿ 6 - çàïèñü åäåíè÷íî&# 227;î ðåãèñòð&#224 ;*)
    WrCoil: MB_WR_SNG_COIL; (*ôóíêöèÿ 5 - çàïèñü åäåíè÷íî&# 227;î äèñêð âõ. áèòà*)
    RIRs:MB_RD_INP_REGS;

    Buffer1: ARRAY[0..255] OF BYTE; (* áàéòîâû&#233 ; áóôåð äàííûõ *)
    Buffer2: ARRAY[0..255] OF BYTE; (* áàéòîâû&#233 ; áóôåð äàííûõ *)
    Buffer3: ARRAY[0..255] OF BYTE; (* áàéòîâû&#233 ; áóôåð äàííûõ *)
    Buffer4: ARRAY[0..255] OF BYTE; (* áàéòîâû&#233 ; áóôåð äàííûõ *)



    cmpl: BOOL; (*ïðèçíàê çàâåðøåí&# 237;îñòè ðàáîòû ôóíêöèè*)
    port_opened: BYTE := 0; (*ðåçóëüòà ò îòêðûòè&#255 ; ïîðòà*)
    Settings:COMSETTINGS; (* íàñòðîéê&# 232; ïîñëåäîâ&# 224;òåëüíîã&#23 8; ïîðòà *)
    com_num: PORTS:=0; (*0 - 485-1
    1 - 232 - COM1
    2 - 485-2 - COM2
    4 - DBGU - COM4 *)


    enable: BOOL; (*ñîñòîÿíè å ðàáîòû áëîêà*)
    err: INT; (*íîìåð îøèáêè*)
    TimeOut: TIME:=T#500ms; (*òàéìàóò*)
    DataSize: WORD; (*êîë-âî ñ÷èòàííû&# 245; áàéòîâ *)
    ptr_byte:POINTER TO BYTE; (*óêàçàòåë ü íà òèï byte*)
    COM_SERVICE1: COM_SERVICE;
    state: WORD := 0; (*ñîñòîÿíè å*)


    (*ñ÷èòàííî å çíà÷åíè&#229 ;*)
    status2:WORD;
    real2: REAL;
    real3: REAL;
    status3: WORD;
    real4: REAL;
    status4: WORD;
    real5: REAL;
    status5: WORD;
    real6: REAL;
    status6: WORD;
    real7: REAL;
    status7: WORD;
    real8: REAL;
    status8: WORD;
    wrd1: WORD:=1;
    wrd_rele_0:WORD:=0;
    t21: WORD := 0; (* *)
    t12: WORD; (* *)
    t14: WORD; (* *)
    t15: WORD; (* *)
    t17: WORD; (* *)
    t16: WORD; (* *)
    t18: WORD; (* *)
    t19: WORD; (* *)
    t20: WORD; (* *)
    t25: WORD; (* *)
    t13: WORD := 0;(* *)
    t22: WORD; (* *)
    t22_2: WORD := 0; (* *)
    t24: WORD := 0; (* *)
    t24_2: WORD := 0; (* *)
    wrd_out_tok: WORD := 0;
    t30: WORD;
    count_err_30: WORD;
    RT_t1:R_TRIG;
    In_1: WORD;
    Sh_1:BOOL;
    Sh_2:BOOL;
    Sh_3:BOOL;
    Sh_4:BOOL;
    V1:WORD;
    V2:WORD;
    V3:WORD;

    enable2: BOOL;
    enable3: BOOL;
    enable4: BOOL;
    enable5: BOOL;
    ch1: WORD;
    reg1: WORD;
    rc1: WORD;
    rc2: WORD;
    rr1: WORD;
    rr2: BYTE;
    END_VAR
    +++++++++++++++++++++++++++++++++++++++++++++++++
    IF port_opened=0 THEN
    Settings.Port:=com_num; (*????? COM-????? RS485*)
    Settings.dwBaudRate:=9600; (*????????*)
    Settings.byParity:=0;
    Settings.dwTimeout:=0;
    Settings.byStopBits:=0;
    Settings.dwBufferSize:=0;
    Settings.dwScan:=0;
    END_IF

    COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
    (*???? COM-???? ??????, ?? ????????? ? ?????? ? ???????? ?????? *)
    IF COM_SERVICE1.ready THEN
    port_opened:=2;
    END_IF



    RCoils(
    Enable:=enable , (* ?????????? ?????? ????? *)
    Mode:=MB_RTU , (*????? ????????*)
    DevAddr:=1 , (*????? ?1 *)
    FirstAddr:=rc1 , (*????? ????????*)
    Quantity:=rc2 , (*?????????? ?????????*)
    ComHandle:=Settings.Port , (*????? COM-?????*)
    TimeOut:=TimeOut , (*??????? *)
    Buffer:=Buffer1 , (* ????? ?????? *)
    Complete=>cmpl , (* ??????? ?????????? ???????? *)
    Exception=>err , (* ??????? ?????? ?????????? ????????? MODBUS ??? ??????:0x00 – ?????? ??? ?????????? ?? ??????????, 0xFE – ?????????? ?????? ???,0xFF – ?????? ???????? *)
    ByteCnt=>DataSize ); (*???-?? ????????? ?????? *)
    RIRs(
    Enable:=enable3 , (* ?????????? ?????? ????? *)
    Mode:=MB_RTU , (*????? ????????*)
    DevAddr:=1 , (*????? ?1 *)
    FirstAddr:=rr1 , (*????? ????????*)
    Quantity:=rr2 , (*?????????? ?????????*)
    ComHandle:=Settings.Port , (*????? COM-?????*)
    TimeOut:=TimeOut , (*??????? *)
    Buffer:=Buffer1 , (* ????? ?????? *)
    Complete=>cmpl , (* ??????? ?????????? ???????? *)
    Exception=>err , (* ??????? ?????? ?????????? ????????? MODBUS ??? ??????:0x00 – ?????? ??? ?????????? ?? ??????????, 0xFE – ?????????? ?????? ???,0xFF – ?????? ???????? *)
    ByteCnt=>DataSize ); ;
    RT_t1(CLK:=RIRs.Complete , Q=> );
    IF RT_t1.Q THEN
    t24:=Buffer1[4]+Buffer1[5];
    END_IF

    IF RCoils.Complete THEN
    v1:=1;
    END_IF

    WrCoil(
    Enable:=enable2 ,
    Mode:=MB_RTU ,
    DevAddr:=1 ,
    CoilAddr:=V2 ,
    Value:=Sh_1 ,
    ComHandle:=Settings.Port ,
    TimeOut:=TimeOut ,
    Complete=>cmpl ,
    Exception=>err );
    WrR(
    Enable:=enable4 ,
    Mode:=MB_RTU ,
    DevAddr:=1 ,
    RegAddr:=reg1 ,
    Value:=ch1 ,
    ComHandle:=Settings.Port ,
    TimeOut:=TimeOut ,
    Complete=>cmpl ,
    Exception=>err );

    RHR(
    Enable:=enable5 , (* ?????????? ?????? ????? *)
    Mode:=MB_RTU , (*????? ????????*)
    DevAddr:=1 , (*?????*)
    FirstAddr:=3 , (*????? ????????*)
    Quantity:=1 , (*?????????? ?????????*)
    ComHandle:=Settings.Port , (*????? COM-?????*)
    TimeOut:=TimeOut , (*??????? *)
    Buffer:=Buffer2 , (* ????? ?????? *)
    Complete=>cmpl , (*??????? ?????????? ???????? *)
    Exception=>err , (* ??????? ?????? ?????????? ????????? MODBUS ??? ??????:0x00 – ?????? ??? ?????????? ?? ??????????, 0xFE – ?????????? ?????? ???,0xFF – ?????? ???????? *)
    ByteCnt=>DataSize );
    Изображения Изображения
    • Тип файла: png 001.PNG (287.5 Кб, Просмотров: 7)
    • Тип файла: png 002.PNG (326.0 Кб, Просмотров: 2)
    • Тип файла: png 003.PNG (365.2 Кб, Просмотров: 3)
    Не зная броду, не суйся в воду. (Пословица.)
    Век живи, век учись(а умрешь дураком).
    Опыт растет прямо пропорционально выведенному из строя оборудованию.

  10. #10

    По умолчанию

    У вас есть 32 БИТа (с 0 по 31), они занимают всего 2 регистра, адреса 0 и 1 (4 байта). Пишу уже второй раз сделайте в конфигурции, добавив 4 шт 8Bit Input для чтения
    и 4 шт 8Bit Output для записи. В разных UMD (Универсал модбас девайс). В UMD для записи поставьте настройку By Value Change. Функция чтения 0x01 выставляется в настройках блока 8 bit input.
    1 Чтение бит.jpg
    29 бит (Coil ) это регистр с адресом 1, бит 13.
    Если вы читаете биты используйте 01 функцию, если читаете регистры, то функция 03 - холдинг регистры, 04 - инпут регистры
    Биты это не регистры, функции 03, 04, 06 выкиньте вообще из программы. Проект выкладывайте полностью, а не кусками как вы.
    И скрины нужны работы программы, а не сервера.
    Последний раз редактировалось kondor3000; 06.10.2022 в 21:32.

Страница 1 из 8 123 ... ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •