Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 14

Тема: плк63 + му/мв110 по rs-485, modbus, st

  1. #1

    Arrow плк63 + му/мв110 по rs-485, modbus, st

    Доброго всем времени суток, и с наступающим.

    Так получилось, что один сотрудник ушел на вольные хлеба, и мне по наследству достался недоделанный проект. Вроде бы ничего сложного - контроллер с дополительными модулями по rs-485, алгоритм в принципе простейший... но я ж не знал, что плк63 не умеет это делать по-человечески.
    Поменять состав оборудования не вариант, всё уже куплено, деваться некуда.

    В общем, надо подружить между собой плк63 и модули мв110 (8АС и 16дн), мв110-16Р, всех по нескольку штук. Связь по rs-485, протокол modbus, язык ST.

    Нашел пример для МДВВ, пытаюсь его перекроить и сделать подпрограмму для 110-ого, получается не очень (пока связь есть, но команды не идут, экспериментирую с одним му110-16Р).

    Подскажите, в какую сторону работать напильником? Чего выкинуть/добавить/поменять? И стоит ли пихать все разновидности модулей в одну подпрограмму, или лучше резделить ввод/вывод и дискретные/аналоговые сигналы?

    Буду благодарен за любую помощь.

  2. #2

    По умолчанию

    Здравствуйте!

    Запись выходных значений в МУ110-16Р организуйте по битовой маске (адрес регистра - 50). Объявите все выходные переменные типа Bool (например, var out1:bool; ... out16:bool; end_var). В первые 2 байта буфера для передачи данных, который объявлен как массив из байтов, запишите эти булевые переменные (в нулевой байт - переменные out9...out16, в первый байт - переменные out1...out8), т.е.
    Buffer[0].0:=out9; Buffer[0].1:=out10; ... Buffer[0].7:=out16;
    Buffer[1].0:=out1; Buffer[1].1:=out2; ... Buffer[1].7:=out8;
    Последний раз редактировалось Гарчев Евгений; 27.12.2012 в 17:37.

  3. #3

    По умолчанию

    Примерно так?
    Код:
    IF port_opened=0 THEN
    		settings.Port:=0;	(*номер порта RS-485*)
    		settings.dwBaudRate:=baud_rate; 	(*скорость*)
    		settings.byParity:=0;
    		settings.dwTimeout:=0;
    		settings.byStopBits:=0;
    		settings.dwBufferSize:=0;
    		settings.dwScan:=0;
    END_IF
    
    (*открываем COM-порт*)
    
    com_service1(enable:=(port_opened=0), settings:=settings, task:=open_tsk);
    
    (*если COM-порт открыт, пепреходим к приему и передаче данных*)
    
    IF com_service1.Ready THEN
    			port_opened:=2;
    END_IF
    
    IF (port_opened=2) THEN
    
    Buffer[1].0:=out1;
    ...
    Buffer[0].7:=out16;
    
    		send_modbus(
    				enable:=enabl, (*резрешение работы блока*)
    				mode:=mb_rtu, (*режим передачи*)
    				DevAddr:=slave_addr, (*адрес*)
    				FirstAddr:=50, (*номер первого регистра*)
    				quantity:=16, (*количество записываемых регистров*)
    				ComHandle:=settings.Port, (*номер СОМ-порта*)
    				TimeOut:=TimeOut, (*таймаут, естессно*)
    				buffer:=buffer, (*ну буфер же*)
    				Complete=>cmpl, (*копировать признак завершения операции*)
    				Exception=>err, (*копируем регистр ошибок*)
    				RegCnt=>DataSize); (*кол-во записанных байтов*)
    END_IF
    Где-то что-то напутал, индикатор rs-485 теперь не загорается. Пойду разберу экибану, надо адрес перепроверить.

  4. #4
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    Если не моргает RS, то начните с проверки открытия порта. Видимо не открывается. Reset после загрузки ПРГ делаете?

  5. #5

    По умолчанию

    Хм, com_service1.ready=TRUE.
    Но settings.port пишет "invalid:0", а send_modbus.exception=254. И выхода в отладчике мигают, как будто я блок управления гирляндами программирую. Отмечать Новый Год вроде еще не начал...

    Другие порты ставлю - не глючит, но тогда com_service1.ready=FALSE.

    ----------
    UPD: Лампочки горят Все скопом. quantity:=1, а не 16, всего-то.
    Видно, долетел до меня запах свободы - коллега рядом сидит плату моет.

    Сейчас перерыв на бурную радость, и буду дальше разбираться: на очереди дискретные входы (со счетчиками и без) и 4-20 mA, будь они неладны. Решил на каждй тип прибора делать свою подпрограмму.

    Всем спасибо за помощь!
    Последний раз редактировалось mc_; 28.12.2012 в 10:34.

  6. #6

    По умолчанию

    Цитата Сообщение от mc_ Посмотреть сообщение
    Но settings.port пишет "invalid:0"
    То что появляется данная ошибка, это нормально, т.к. в перечислении PORTS библиотеки SysLibCom нет порта с номером COM0, поэтому и возникает данная ошибка, но порт при этом открывается.

    Цитата Сообщение от mc_ Посмотреть сообщение
    UPD: Лампочки горят Все скопом. quantity:=1, а не 16, всего-то.
    Вы записываете 16 бит=2 байта=1регистр, quantity - это кол-во регистров, поэтому quantity=1.

  7. #7

    По умолчанию

    Цепляю МВ-110-16ДН (дискретные входы).
    Вышло что-то вроде
    Код:
    IF (port_opened=2) THEN
    
    rd_regs(
    		...
    
    		FirstAddr:=51 (*регистр*)
    
    		Quantity:=1, (*кол-во регистров*)
    		.....
    );
    
    END_IF
    
    IF err=0 THEN (*если нет ошибок, потрошим байты на биты*)
    		in1:=Buffer[1].0;
    		in2:= Buffer[1].1;
    		...
    		in8:=Buffer[1].7;
    
    		in9:=Buffer[0].0;
    		in10:=Buffer[0].1;
    		...
    		in16:=Buffer[0].7;
    END_IF
    но это только входы. Сейчас буду проверять, если железку найду.
    Как бы половчее счетчики зацепить, чтобы несколько раз не гонять чтение?

  8. #8

    По умолчанию

    Цитата Сообщение от mc_ Посмотреть сообщение
    Как бы половчее счетчики зацепить, чтобы несколько раз не гонять чтение?
    Естественно, групповым чтением. Укажите в функции соответствующее число регистров.

  9. #9

    По умолчанию

    Понятно что групповым, хотел скидать в одну кучу с дискретными входами. Но, видимо, лучше все-таки отдельной подпрограммой, и сброс туда же закинуть.

    Эх, все железки на работе, ничего под рукой нет - даже дискретные входы остались в нерабочем состоянии, не пойму, где косяков напорол. Праздники вредны для мозга...

  10. #10

    По умолчанию

    Не рекомендую делать это одним запросом - есть разрыв в адресах.
    Рекомендую вынести опрос в отдельный процесс и обмениваться с основной программой через глобалы или еще как. Так проще и понятнее.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. ПЛК63 Modbus Master
    от ASo в разделе ПЛК63/73
    Ответов: 82
    Последнее сообщение: 29.01.2024, 13:14
  2. ПЛК63 + МВ110-8ДФ
    от Serban в разделе ПЛК63/73
    Ответов: 6
    Последнее сообщение: 15.02.2014, 12:29
  3. ПЛК63 + modbus проблема
    от Dmitriy_1974 в разделе ПЛК63/73
    Ответов: 5
    Последнее сообщение: 17.02.2012, 13:32
  4. ПЛК63 и MODBUS переменные
    от Alex989 в разделе ПЛК63/73
    Ответов: 6
    Последнее сообщение: 27.03.2011, 18:29
  5. ПЛК63 Modbus-ASCII
    от Доренский Алексей в разделе ПЛК63/73
    Ответов: 6
    Последнее сообщение: 20.09.2010, 10:41

Ваши права

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