Показано с 1 по 10 из 52

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

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    накой 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.

Похожие темы

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

Ваши права

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