Страница 5 из 6 ПерваяПервая ... 3456 ПоследняяПоследняя
Показано с 41 по 50 из 52

Тема: Universal Modbus Device или библиотека Modbus.lib?

  1. #41

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    накой delay ?
    вы правы , не суть. убрал его.
    это я пытался делать чтобы enable=TRUE только один цикл,
    обрабатываем буфер, выставляем в FALSE, для сброса типа, в форуме вычитал в коде у кого-то, хотел попробовать.
    не помогло. а delay хотел прикрутить если прилетает какая либо ошибка. то через таймаут перезапуск был.

    сделал как в примере исходном, только MB_RTU и 8 регистров считываю.
    код:
    Код:
    (*Организуем счетчик, что бы передавать эти данные по сети*)
    t:=t+1;
    IF (t MOD 1000)=0 THEN
    	A := A + 1;
    		IF A > 9999 THEN
    			A := 0;
    		END_IF
    END_IF
    (*Устанавливаем настройки COM-порта*)
    IF port_opened=0 THEN
    		Settings.Port:=com_num;               (*номер COM-порта*)
    		Settings.dwBaudRate:=19200;    (*скорость*)
    		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
    
    IF port_opened=2 THEN (*Удачно проинициализировали*)
    
    CASE master1 OF
    
    0: (* функция 03 инт  - ФБ считывает значение параметра  типа int из прибора с адресом 2 в регистр с номером 8 по протоколу Modbus-ASCII*)
    get1_modbus(
    	Enable:=enabl ,			(* разрешение работы блока *)
    	Mode:=MB_RTU ,		(*режим передачи*)
    	DevAddr:=2 ,				(*адрес*)
    	FirstAddr:=8 ,				(*номер регистра*)
    	Quantity:=1,				(*количество регистров*)
    	ComHandle:=Settings.Port , (*номер COM-порта*)
    	TimeOut:=TimeOut , 		(*Таймаут T#50ms*)
    	Buffer:=Buffer ,			(* буфер данных *)
    	Complete=>cmpl ,		(* скопировать признак завершения операции *)
    	Exception=>err ,			(* скопировать регистр ошибок *)
    	ByteCnt=>DataSize );		(*кол-во считанных байтов *)
    (*если установлен признак завершения операции, то *)
    
    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
    
    1: (* функция 03 флоат - ФБ считывает значение параметра  типа int из прибора с адресом 2 в регистр с номаром 10 по протоколу Modbus-ASCII *)
    get3_modbus(
    	Enable:=enabl ,			(* разрешение работы блока *)
    	Mode:=MB_RTU ,		(*режим передачи*)
    	DevAddr:=2 ,				(*адрес*)
    	FirstAddr:=10 ,				(*номер регистра*)
    	Quantity:=2,				(*количество регистров*)
    	ComHandle:=Settings.Port ,(*номер COM-порта*)
    	TimeOut:=TimeOut , 		(*Таймаут T#50ms*)
    	Buffer:=Buffer ,			(* буфер данных *)
    	Complete=>cmpl ,		(* скопировать признак завершения операции *)
    	Exception=>err ,			(* скопировать регистр ошибок *)
    	ByteCnt=>DataSize );		(*кол-во считанных байтов *)
    
    
    (*если установлен признак завершения операции, то *)
    IF cmpl THEN
    	(*master1:=2; переходим к выполнению следующего ФБ*)
    	IF err=0 THEN (*Если нет ошибок, то получаем  данные из буфера типа FLOAT*)
    		ptr_D:=ADR(d);
    		ptr_D^:=buffer[1];
    		ptr_D:=ptr_D+1;
    		ptr_D^:=buffer[0];
    		ptr_D:=ptr_D+1;
    		ptr_D^:=buffer[3];
    		ptr_D:=ptr_D+1;
    		ptr_D^:=buffer[2];
    	END_IF
    END_IF
    
    2: (* функция 04 инт - ФБ считывает значения трех параметров типа Int из прибора с адресом 2 начиная с регистра с номeром 12*)
    get2_modbus(
    	Enable:= enabl,			(* разрешение работы блока *)
    	Mode:=MB_RTU ,		(*режим передачи*)
    	DevAddr:=2 ,				(*адрес*)
    	FirstAddr:=12 ,				(*номер регистра*)
    	Quantity:=8 ,				(*количество регистров*)
    	ComHandle:= Settings.Port,(*номер COM-порта*)
    	TimeOut:=TimeOut  , 		(*Таймаут T#50ms*)
    	Buffer:=Buffer ,			(* буфер данных *)
    	Complete=>cmpl ,		(* скопировать признак завершения операции *)
    	Exception=>err ,			(* скопировать регистр ошибок *)
    	ByteCnt=> DataSize);		(*кол-во считанных байтов *)
    (*если установлен признак завершения операции, то *)
    IF cmpl THEN
    	IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
    		x1:=BYTE_TO_WORD(BUFFER[4]) OR SHL(BYTE_TO_WORD(BUFFER[3]),8);
    		x2:=BYTE_TO_WORD(BUFFER[6]) OR SHL(BYTE_TO_WORD(BUFFER[5]),8);
    		x3:=BYTE_TO_WORD(BUFFER[8]) OR SHL(BYTE_TO_WORD(BUFFER[7]),8);
    		x4:=BYTE_TO_WORD(BUFFER[10]) OR SHL(BYTE_TO_WORD(BUFFER[9]),8);
    		x5:=BYTE_TO_WORD(BUFFER[12]) OR SHL(BYTE_TO_WORD(BUFFER[11]),8);
    		x6:=BYTE_TO_WORD(BUFFER[14]) OR SHL(BYTE_TO_WORD(BUFFER[13]),8);
    		x7:=BYTE_TO_WORD(BUFFER[16]) OR SHL(BYTE_TO_WORD(BUFFER[15]),8);
    		x8:=BYTE_TO_WORD(BUFFER[18]) OR SHL(BYTE_TO_WORD(BUFFER[17]),8);
    
    	END_IF
    	(*master1:=0; переходим к выполнению следующего ФБ*)
    END_IF
    END_CASE
    
    IF  enabl = FALSE THEN
     	enabl := TRUE;
    END_IF
    
    IF  err <> 0 THEN
     	enabl := FALSE;
    END_IF
    
    END_IF


    вот так выглядят скрины работы.
    видно что прилетает только 15 байт. и в регистрах (байтах) старше шестого нули идут.
    таймаут не помогает.
    2022-05-27_16-32-10.png
    2022-05-27_16-31-45.png
    Последний раз редактировалось Schneider; 27.05.2022 в 15:49.

  2. #42

    Thumbs up

    Цитата Сообщение от Валенок Посмотреть сообщение
    выкиньте case.1 коли не юзаете

    в принципе :

    это сильный ход ))

    но вообще - выкиньте это
    Из песни слов не выкинишь. Такой "гениальный" пример с офф сайта.
    Попробую сейчас ваши советы.

  3. #43

    По умолчанию

    вот так сделал:
    Код:
    PROGRAM PLC_PRG
    VAR
    	get_modbus: MB_RD_INP_REGS:= (Enable := TRUE);		(*функция 04 - чтение трех параметров типа INT*)
    
    	Buffer: ARRAY[0..255] OF BYTE;		(* байтовый буфер данных *)
         	cmpl: BOOL;
    	port_opened:  BYTE := 0;
    	Init: BOOL;								(* признак инициализации пользовательской программы *)
    	Settings:COMSETTINGS;				(* настройки последовательного порта *)
          	com_num: PORTS:=0;				(*0 - RS-485, 1 - RS-232*)
    	enabl: BOOL;							(*состояние работы блока*)
    	err: INT;								(*номер ошибки*)
    	TimeOut: TIME:=T#50ms;				(*таймаут*)
    	Exception: BYTE;
    	DataSize: WORD;
    
    
    	t: DWORD; 					(*переменная для организации счетчика*)
    	A: WORD := 0;					(*счетчик*)
    	x:WORD;						(*считанное значение*)
    	x1: INT;						(*переменная для записи по сети*)
    	x2: INT;						(*переменная для записи по сети*)
    	x3: INT;						(*переменная для записи по сети*)
    	d:  REAL;						(*считанное значение*)
    	ptr_D:POINTER TO BYTE;
    
    	COM_SERVICE1: COM_SERVICE;
    	x_1: INT;
    
    	x4: INT;
    	x5: INT;
    	x6: INT;
    	x7: INT;
    	x8: INT;
    END_VAR
    --------------------------------
    IF port_opened=0 THEN
    		Settings.Port:=com_num;             
    		Settings.dwBaudRate:=19200;   
    		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  );
    IF COM_SERVICE1.ready THEN
    	port_opened:=2;
    END_IF
    
    IF port_opened=2 THEN 
    
    get_modbus(
    
    	Mode:=MB_RTU ,		
    	DevAddr:=2 ,			
    	FirstAddr:=12 ,			
    	Quantity:=8 ,			
    	ComHandle:= Settings.Port,
    	TimeOut:=TimeOut  , 	
    	Buffer:=Buffer ,			
    	Complete=>get_modbus.Enable ,
    	Exception=>err ,			
    	ByteCnt=> DataSize);		
    IF get_modbus.Complete THEN
    	IF err=0 THEN 
    		x1:=BYTE_TO_WORD(BUFFER[4]) OR SHL(BYTE_TO_WORD(BUFFER[3]),8);
    		x2:=BYTE_TO_WORD(BUFFER[6]) OR SHL(BYTE_TO_WORD(BUFFER[5]),8);
    		x3:=BYTE_TO_WORD(BUFFER[8]) OR SHL(BYTE_TO_WORD(BUFFER[7]),8);
    		x4:=BYTE_TO_WORD(BUFFER[10]) OR SHL(BYTE_TO_WORD(BUFFER[9]),8);
    		x5:=BYTE_TO_WORD(BUFFER[12]) OR SHL(BYTE_TO_WORD(BUFFER[11]),8);
    		x6:=BYTE_TO_WORD(BUFFER[14]) OR SHL(BYTE_TO_WORD(BUFFER[13]),8);
    		x7:=BYTE_TO_WORD(BUFFER[16]) OR SHL(BYTE_TO_WORD(BUFFER[15]),8);
    		x8:=BYTE_TO_WORD(BUFFER[18]) OR SHL(BYTE_TO_WORD(BUFFER[17]),8);
    
    	END_IF
    END_IF
    
    END_IF


    не помогло. таже история ошибка 255 в конце. и да кстати enable один цикл крутится только.
    но в буфере только 15 байт и переменная количество байт показывает именно это число...

    библиотеку поправили, видимо с 2017 года, поскольку ф.б. enable сам переключается в disable.
    поэтому "Валенок" рекомендовал добавить Complete=>get_modbus.Enable , в код. перезапуск после завершения.

    PS. в общем я смотрю ни у кого нет на форуме вариантов где бы использовался запрос больше 2х регистров.
    походу эта библиотека не умеет больше 4 регистров получать.
    Дайте рабочий пример, если я ошибаюсь.
    Последний раз редактировалось Schneider; 28.05.2022 в 13:03.

  4. #44

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Либа рабочая и её авторам - спасибо. Код выше - рабочий.
    Я этой либой давно не пользуюсь, но сейчас её тупо попробывал и прочитал спокойно не 4, а 125 регистров. На 115200.
    понял, ок значит надо смотреть в сторону устройства, а может модбас сервера, которым я имитирую слейв устройство.

  5. #45

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    платка с 2-мя портами ?
    да, ну я поменял. там стояла плата только под MP1 выход. а сейчас + два 485 порта

  6. #46

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Либа рабочая и её авторам - спасибо. Код выше - рабочий.
    Я этой либой давно не пользуюсь, но сейчас её тупо попробывал и прочитал спокойно не 4, а 125 регистров. На 115200.

    *
    спасибо большое, что откликнулись. но все же прошу выслать ваш проект в котором у вас работает одним запросом 125 регистров считывать.
    только через "сохранить/отправить архив" чтобы вместе с либами.(такой файл можно прикрепить на форуме)

    дело в том что я только что взял МВ110 и спокойно настроив в MasterOPC сервер (в винде) через адаптер usb-rs485 считал с нее сразу 8 регистров (это 16 байт) за один запрос
    но! подключив плк 73 к MB110 получаю такую же шляпу и обрезанными данными в буфере обмена и с ошибкой по таймауту. попробовал на второй порт rs485 подключить, не помогло.
    надо же все таки разобраться с этим чудом!

  7. #47

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Выкладывайте свой проект
    сделал архив с либами, модбас либ скачана недавно с сайта owen так что должна быть последняя.
    задачу в цикле делал от 50 до 500 мс. как и таймауты разные. ничего не помогает.
    вроде RS-1 RS-2 говорят не надо настраивать, они в режиме слейв с контроллера работают вроде.
    посмотрите пожалуйста. что же я там не так сделал?

    PS. я вот думаю, может это интерфейсная плата в 73м такая глючная, может у нее буфер больше 15 байт хранить не умеет?
    а на другом плк, новее все работает.
    Вложения Вложения
    Последний раз редактировалось Schneider; 31.05.2022 в 07:21.

  8. #48

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    скачаю посмотрю - позже, или кто-то.
    пока : Какие задачи ? тасков напихали?
    каких? у меня всего одна задача
    2022-05-31_09-13-29.png
    можно конечно совсем удалить её и установить минимум и максимум
    2022-05-31_09-16-01.png
    и так пробовал , только минимум на 100 ставил. без разницы.

  9. #49

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Правильное решение. Накой задачи на 1-ядре ?

    Вот накой ? Дефолт. Даже не, просто 0
    а при чем здесь количество ядер? если мне не нужно чтобы задача выполнялась так часто, зачем же единственный процессор нагружать пустыми хлопотами?
    это как раз такой случай, мне вполне достаточно чтобы раз в секунду вообще выполнялась эта задача.
    а когда я по дефолту без менеджера задач оставляю 0 проц этой единственной задачей нагружается более 1000 раз в секунду.
    разве я не прав?
    PS. получилось понять, что у меня не так с опросами? жду с нетерпением вердикт...

  10. #50

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    goto пост 37
    Не понял, на что мне обратить внимание? Это же мой пост.

Страница 5 из 6 ПерваяПервая ... 3456 ПоследняяПоследняя

Похожие темы

  1. Чтение и запись в Universal Modbus device
    от super100 в разделе ПЛК1хх
    Ответов: 20
    Последнее сообщение: 30.10.2013, 13:18
  2. Адресация Universal Modbus device
    от super100 в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 04.10.2013, 14:05
  3. Universal device MODBUS ???
    от EFrol в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 17.01.2012, 10:43

Ваши права

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